我正在尝试在代码中创建属性“得分”和“学习”。 我收到这些错误:
AttributeError:“ HumanPlayer”对象没有属性“ score”,并且 “学习”。
请参阅以下代码的某些部分:
#Create random player class
class RandomPlayer:
def __init__(self):
Player.__init__(self)
def move(self):
self.move = RandomPlayer
#use imported random function
RandomPlayer = random.randint(1,3)
#Computer choice is either rock, paper, or scissors
if RandomPlayerMove == ("Rock"):
print("The computer choses ROCK")
elif RandomPlayerMove == ("Paper"):
print("The computer choses PAPER")
else:
print("The computer choses SCISSORS")
#return value
return RandomPlayer
#Create human player class
class HumanPlayer:
def __init__(self):
Player.__init__(self)
def move(self):
while True:
HumanPlayer = input("'Rock', 'Paper', or 'Scissors' ")
#Detect invalid entry
if HumanPlayer.lower() not in moves:
print('Please choose Paper, Rock or Scissors: ')
else:
break
return HumanPlayer
class Game:
def __init__(self, HumanPlayer, RandomPlayer):
self.player1 = HumanPlayer
self.player2 = RandomPlayer
self.player1_score = 0
self.player2_score = 0
def play_round(self):
move1 = self.player1.move()
move2 = self.player2.move()
print(f"Player 1: {move1} Player 2: {move2}")
self.player1.learn(move1, move2)
self.player2.learn(move2, move1)
if (move1 == move2):
print("it's a tie!")
elif beats(move1, move2) is True:
self.player1_score += 1
elif beats(move2, move1) is True:
self.player2_score += 1
print("It's Tie, Play again!")
print(f"Scores, HumanPlayer: {self.player1.score} RandomPlayer: {self.player2.score}")
print("Game over!")
答案 0 :(得分:0)
我很确定这是由于错字造成的。您可能不需要self.player1.score
,而不是在倒数第二条print
中使用self.player1_score
,因为这是您在__init__
中定义的属性。同样,您以后可能希望以相同格式的字符串代替self.player2_score
来使用self.player2.score
。
虽然这似乎不是造成您当前问题的原因,但我想提出另一个建议:避免在不同的事物上使用相同的名称。在很多地方,实例和类都使用相同的名称。例如,您的Game
类采用名为HumanPlayer
和RandomPlayer
的参数,它们用这些名称隐藏了这些类。您还在每个move
方法中将类名用作变量名。这将使错误解决噩梦!使用唯一的名称。 Python约定是对类使用CapitalizedNames
,对其他大多数变量(包括函数和方法名)使用lowercase_names_with_underscores
,对常量使用ALL_CAPS
(在极少数情况下需要使用它们),但是如果您愿意,可以使用自己的风格(只需保持一致!)。