from collections import OrderedDict
move_choices = OrderedDict({(('1':, 'punch'), ('2':, 'kick'), ('3':, 'heal'})))
while Player.hp > 0 and Marco.hp > 0:
player_choice = 'place holder'
while player_choice not in move_choices:
player_choice = input('')
player_method = getattr(Player, player_choice)
setattr(Player, 'next_move', player_method)
if Marco.hp < random.choice(range(80,100)):
marco_choice = random.choice(move_choices.values())
else:
marco_choice = random.choice(move_choices.values()[:-1])
marco_method = getattr(Marco, marco_choice)
setattr(Marco, 'next_move', marco_method)
play(Player, Marco)
In addition to what was mentioned above, I also made a lot of small style changes for readability. Let me know if you have any questions or curiosities. At the end, my updated version of your code looks like:
def hp_check(function):
def decorator(self, *args, **kwargs):
if self.hp > 0:
function(self, *args, **kwargs)
else:
print(self.name, "is dead and cannot perform actions")
return decorator
class Fighter:
def __init__(self, name, hp=100, attack=75, defense=50, speed=60):
self.name = name
self.hp = hp
self.attack = attack
self.defense = defense
self.speed = speed
@hp_check
def punch(self, target, modifier=1.00):
base = 50/100.0
damage = (self.attack - target.defense) * base
target.hp = target.hp - damage
print(self.name, "punched", target.name, "for %d HP" % damage)
punch.priority = 1
@hp_check
def heal(self, target, modifier=1.00):
self.hp += 15
if self.hp > 100:
self.hp = 100
print(self.name, "healed 15 HP")
heal.priority = 2
@hp_check
def kick(self, target, modifier=1.00):
base = 100/100.0
damage = (self.attack - target.defense) * base
target.hp = target.hp - damage
self.hp = self.hp - 10
print(self.name, "kicked", target.name, "for %d HP" % damage)
kick.priority = 2
def play(Player1,Player2):
# First - Check Options Priority
if Player1.next_move is None and Player2.next_move is None:
pass
elif Player1.next_move is None:
Player2.next_move(Player1)
elif Player2.next_move is None:
Player1.next_move(Player2)
elif Player1.next_move.priority > Player2.next_move.priority:
Player1.next_move(Player2)
Player2.next_move(Player1)
elif Player1.next_move.priority < Player2.next_move.priority:
Player2.next_move(Player1)
Player1.next_move(Player2)
# Second - Check Player's Speed
elif Player1.speed > Player2.speed:
Player1.next_move(Player2)
Player2.next_move(Player1)
elif Player1.speed < Player2.speed:
Player2.next_move(Player1)
Player1.next_move(Player2)
# Third - Randomly Choose
else:
if random.choice(range(2)) == 0:
Player1.next_move(Player2)
Player2.next_move(Player1)
else:
Player2.next_move(Player1)
Player1.next_move(Player2)
Player = Fighter("you")
Marco = Fighter("Marco")
from collections import OrderedDict
move_choices = OrderedDict((('1', 'punch'), ('2', 'kick'), ('3', 'heal')))
while Player.hp > 0 and Marco.hp > 0:
player_choice = 'place holder'
while player_choice not in move_choices:
player_choice = input('')
player_method = getattr(Player, player_choice)
setattr(Player, 'next_move', player_method)
if Marco.hp < random.choice(range(80,100)):
marco_choice = random.choice(move_choices.values())
else:
marco_choice = random.choice(move_choices.values()[:-1])
marco_method = getattr(Marco, marco_choice)
setattr(Marco, 'next_move', marco_method)
play(Player, Marco)