我在Yatzee中有一个协议,包含列表中每个玩家的e dict对象,称为协议。
我正在寻找一种方法来对dict中的一些值求和? 每个词都有这些时刻:
Ettor
Tvåor
Treor
Fyror
Femmor
Sexor
Summa
Bonus
Par
Tvåpar
Triss
Fyrtal
Stege(liten)
Stege(stor)
Kåk
Chans
Yatzy
Summa
连接到一个值。我想总结前6和后来的总和除了最后一个(这应该是总和)。
感谢您的帮助
答案 0 :(得分:0)
字典不记得元素的顺序。我认为对于这种情况,使用orderDict会有点矫枉过正。尽量保持您的类型尽可能简单(除非您需要print语句的订单)。
我个人认为最好的方法是为玩家提供两个词典。一个用于前6种类型的卷(如果我记得正确地玩yahtzee)和一个用于特殊卷和奖励。
其次,因为卷的名称独立于玩家,我会将它们作为静态参数添加到类中。这样您就不必将它们作为构造函数的参数传递。它使制作新玩家更清晰(也更合乎逻辑)。我建议你阅读面向对象编程(OOP)。这将大大改善您的编码。
将得分的和函数添加到玩家类也是合乎逻辑的。每个玩家都有一个通过游戏更新的分数(或者在游戏结束时计算)。该课程将如下所示:
Class Player(Object):
#static variables valid for all players:
momentList1=() #add the names of the first 6 moments here
momentList2=() #add the names of the other moments here
def __init__(self, namn):
self.namn = namn
self.moment1 = {}
self.moment2 = {}
for ett_moment in Player.momentlist1:
self.moment1[ett_moment]= 0
for moment in Player.momentList2:
self.moment2[moment]=0
def gepoang(self, v_moment, v_poang):
self.moment[v_moment]= v_poang
def __str__(self):
return self.namn + str(self.moment)
def sumScore(self):
# reset sum to 0, this allows multiple calls of sumScore without introducing errors
sum1=0
sum2=0
# loop over the first dict containing the rolls 1 -> 6
for key in self.moment1: sum1+=self.moment1[key]
# add the sum of the first 6 rolls to the second dict
self.moment2[summa]=sum1
# add the bonus to the second dict
if (self.moment2[summa]>63): self.moment2[bonus]=50
for key in self.moment2: sum2+=self.moment2[key]
return sum2
如果您只想使用一个字典(而不是更改您的对象)来保存所有项目,您可以使用要首先求和的元素迭代列表:
def sumFirstSix(self):
"""
sums the first six moments and returns the sum of the values
"""
l=('Ettor','Tvåor','Treor','Fyror','Femmor','Sexor')
sum=0
for item in l:
sum+=self.moment[item]
return sum
答案 1 :(得分:0)
首先我们要提一下,moment
是OrderedDict
。因为没有订购术语前六个没有任何意义正常的dict。
有了这个,您可以简单地遍历kv
中的键值对OrderedDict
,并对值求和。因此,如果您想要对moment
的前六项的值求和,它将看起来像
sum([kv[1] for i, kv in enumerate(moment.iteritems()) if i < 6])
这有帮助吗?