所以我一直在Python中练习OOP,并决定采用我之前编写的程序并使用OOP方法对其进行更新。基本上,这是一款游戏,它会询问您正在与多少玩家一起玩,并使用理解生成一个列表并将其显示为记分板。我现在使用 OOP 运行所有玩家回合命令,并尝试使用列表理解生成多个玩家对象。
用于生成玩家的代码如下:
player_amount = int(input("How many players would you like to play with? "))
max_points = int(input("How many points would you like to play to? "))
scoreboard = [0 for _ in range(player_amount)]
players = [pg.Player for _ in range(player_amount)]
问题代码是我尝试访问它们以运行playerTurn命令的下一个块:
while max(scoreboard) < max_points:
for i in players:
print(f"Player {players.index(i) + 1}'s turn!")
if input("Would you like to roll? ") != 'y':
players[i].updateTotal()
scoreboard[i] = players[i].total_score
else:
players[i].playerTurn()
使用此代码,我可以看到该列表实际上从我的 Player 类生成并存储了多个对象,但是当涉及到访问和操作它们时,我遇到了问题。
问题 1:创建玩家对象 在“players = [pg.Player for _ in range(player_amount)]”行中,您实际上并没有创建新的 Player 实例;而是创建了新的 Player 实例。您将 Player 类本身多次存储在列表中。要创建新实例,您应该调用构造函数,如下所示:players = [pg.Player() for _ in range(player_amount)]。
问题 2:在循环中访问播放器对象 在循环中,您使用 i 作为对象本身,而不是索引。这导致了诸如players[i].updateTotal()和scoreboard[i] =players[i].total_score之类的行中的问题。
player_amount = int(input("How many players would you like to play with? "))
max_points = int(input("你想玩到多少分?")) 记分板 = [0 for _ in range(player_mount)]
players = [pg.Player() for _ in range(player_amount)]
同时最大(记分板)< max_points: for i, player in enumerate(players):
print(f"Player {i + 1}'s turn!")
if input("Would you like to roll? ") != 'y':
player.updateTotal()
scoreboard[i] = player.total_score
else:
player.playerTurn()
以下是主要变化:
Player 的实例是在玩家列表中使用 pg.Player() 创建的。 for循环中使用枚举函数来获取索引i和Player对象player。