我目前正在制作一个yahtzee板,但我正在解决我很难搞清楚的问题,我的代码目前看起来像这样:
from terminaltables import AsciiTable
class Player:
def __init__(self,name):
self.name=name
self.ones=0
self.twos=0
self.threes=0
self.fours=0
self.fives=0
self.sixs=0
self.abovesum=0
self.bonus=0
self.onepair=0
self.twopair=0
self.threepair=0
self.fourpair=0
self.smalladder=0
self.bigladder=0
self.house=0
self.chance=0
self.yatzy=0
self.totalsum=0
def __repr__(self):
return self.name
def __str__(self):
return self.name
def welcome():
print("Welcome to the yahtzee game!")
players = int(input("How many players: "))
rounds=0
spelarlista=[]
spelarlista.append("name")
while not players==rounds:
player=input("What is your name?: ")
rounds=rounds+1
spelarlista.append(Player(player))
for i in range(len(spelarlista)):
table_data = [spelarlista,
['Ettor',spelarlista[1:i],","],
['Tvåor'],
['Treor'],
['Fyror'],
['femmor'],
['sexor']]
table = AsciiTable(table_data)
table.inner_row_border = True
print(table.table)
welcome()
让我们说,对于名字,我称“詹姆斯”,“阿尔弗雷德”和“彼得”,然后我将得到每个名称的三列,这实际上是我想要的。下一个问题是在每一栏下,我想分配球员核心。问题在于,如果我使用spelarlista而不是spelarlista [1],我将在第一列中获得一个列表,有没有办法让每一行都在一个可用的标题行中?
提前致谢!
答案 0 :(得分:1)
您需要使用单个字符串/数字列表,这些列表/数字不包含每行的其他列表。目前:
['Ettor',spelarlista[1:i],","],
看起来像'Ettor',['James', 'Alfred',","],
,看起来更像'Ettor', 0, 0, 0
。
(请注意,由于不是英语,我不知道我是否有正确的逻辑!我假设" ettors" =="些" ;)
由于您有Player
个对象的列表,并且您想要使用这些对象的分数,您可以使用列表推导从对象创建行,只选择您想要的属性(但请参阅*请注意以下内容):
['Ettor'] + [player.ones for player in spelarlista],
['Tvåor'] + [player.twos for player in spelarlista],
...
其他一些问题:
您应该使用for循环而不是while循环来获取名称,因为您知道其中有多少名称。我会使用一个更好的变量名称,因为players
听起来像存储...玩家(名字可能) - 特别是因为你使用player
来存储每个玩家的名字。 player
变量的类型应为Player
(类)。
for i in range(number_of_players):
name = input("What is your name?: ")
spelarlista.append(Player(name))
*您当前创建变量spelarlista
作为Player对象列表,其中包含字符串" name"在第一个位置。这是不一致和无益的。我上面的列表理解假设没有" name"在开始时。相反,只需添加" Name"当你在桌子上需要它时,比如:
table_data = [["Name"] + spelarlista,
您当前的代码在for循环中创建表,然后仅使用最后一个。循环是多余的。
我希望有所帮助。