2012-04-26 90 views
0

这是一个猪骰子游戏,我使用2个策略,目标是达到63分。骰子游戏与字典

所以我得到了一个功能play_games(n_games, strategy_a, strategy_b)。(看代码的底部) 该功能可以发挥n_games,在此玩家A具有使用strategy_a和球员B必须使用strategy_b(两个参数都是字符串)。并且该函数必须返回一个字典,其中键为'A','B'和'D',其中值表示A和B多久获胜以及多少次抽签。

我已经试了两天了,不能拿出任何东西,真的很想学这个。

这是我走到这一步:

from random import randint 

def one_round(total, strategy): 
    round = 0 
    while True: 
     value = randint(1,6) 
     round = round + value 
     if Value == 1: 
      round = 0 
      break 
     if round + total >= 63: 
      break 
     if strategy == 'Sum13': 
      if round >= 13: 
       break 
     if strategy == 'Sum6': 
      if round >= 6: 
       break 

    return round 


def one_game(strategy_a, strategy_b): 
    total_a = 0 
    total_b = 0 
    while True: 
     round_a = one_round(total_a, strategy_a) 
     round_b = one_round(total_b, strategy_b) 
     total_a += round_a 
     total_b += round_b 
     while total_a >= 63 or total_b >=63: 
      break 
    if total_a >= 63: 
     return 'A' 
    elif total_b >= 63: 
     return 'B' 
    elif total_a == total_b: 
     return 'D' 

def play_games(n_games, strategy_a, strategy_b): 
    n_games = 100 
    for i in range(n_games): 
+4

你应该说明问题与代码是什么。出了什么问题。可以问一下家庭作业(请标记为“家庭作业”),但如果他们不知道该怎么帮忙,他们就无法提供帮助。你也应该描述游戏的规则。 – ninjagecko 2012-04-26 22:00:59

+0

我以为我在文本中解释过,但无论如何,所以规则如同在一个猪骰子游戏中,2个玩家掷骰子,她使用2个策略。一名球员在达到总和6时持有,其他球员在达到总和13时持有,当你达到63分时赢得。至于这个问题,我不知道如何进行,说他们玩100场比赛,我如何玩游戏并返回字典? – sharky8899 2012-04-26 22:09:22

回答

0

只是概述根据你所拥有的,到目前为止,在play_games的第一行我会像定义字典的一般步骤:

resultsDict = {A:0, B:0, D:0} 

在play_games最后一行是当然的

return resultsDict 

而且在,Y您的循环OU会碰到这样的:

resultsDict(one_game(stratA, stratB)) += 1 #increase the count for the victor or draw 

目前,play_games ETS n_games你的第一线,如果你是路过该值不使有很大的意义。您或者只是将其定义为本地值而不传递它,或者使用传递的值。第二个可能是更一般更好的策略,但这取决于你的班级。

当然,那么您需要实际调用play_games适当的值为n_games,strategy_a和strategy_b。除非这意味着要成为从其他地方调用的库,在这种情况下,“别的地方”应该叫它。如果这个脚本是直接运行的,那么你可以做的两种方式是向play_games添加一个条件调用,以便它在导入时不会自动进行调用。这看起来是这样的:

if __name__ == "__main__": 
    play_games(1000, 'Sum13', 'Sum6') 

有一件事我注意到的是,你有你的功能没有意见,没有文档字符串。一般来说,我喜欢有识字的编程风格,喜欢太多太少的评论。既然这是作业,那么重要与否取决于分级是如何完成的。

编辑:我想到,您可以通过仅为战略取得持有价值而不是目前高度特定的Sum13和Sum6策略来进行设置。这将使它更通用,同时缩短代码。

+0

谢谢你的时间和回答,非常感谢。 – sharky8899 2012-04-26 23:29:59

0

最简单的方法:

results = {} 
for i in range(n_games): 
    winner = one_game(...) 
    if not winner in results: 
     results[winner] = 0 
    results[winner] += 1 

优雅的方式:

collections.Counter(one_game(...) for _ in range(n_games)) 

另一个不太优雅(但更灵活)的方式:

results = collections.defaultdict(lambda:0) 
for i in range(n_games): 
    winner = one_game(...) 
    results[winner] += 1 
+0

实际上不需要使用''lambda:0'' - ''int''可以更快更优雅地完成同样的工作。 – 2012-04-26 22:48:05

+0

我很想谈谈lambda的主题,但第一个很有意义,非常感谢您的帮助! – sharky8899 2012-04-26 23:32:59

+0

@Lattyware:哦,有趣...我不知道'int()'是'0'......多么奇怪。 “0”和“1”之间的选择似乎相当随意。因此,虽然我会使用'defaultdict(list)',但我对'defaultdict(int)'很担心。 – ninjagecko 2012-04-27 00:32:58

1

应该现在的工作:

#I made one change in your original part. 

from random import randint 

def one_round(total, strategy): 
    round = 0 
    while True: 
     value = randint(1,6) 
     round = round + value 
     if value == 1: 
      round = 0 
      break 
     if round + total >= 63: 
      break 
     if strategy == 'Sum13': 
      if round >= 13: 
       break 
     if strategy == 'Sum6': 
      if round >= 6: 
       break 

    return round 


def one_game(strategy_a, strategy_b): 
    total_a = 0 
    total_b = 0 
    while True: 
     round_a = one_round(total_a, strategy_a) 
     round_b = one_round(total_b, strategy_b) 
     total_a += round_a 
     total_b += round_b 
     if total_a >= 63 or total_b >=63: # while to if here 
      break 
    if total_a >= 63: 
     return 'A' 
    elif total_b >= 63: 
     return 'B' 
    elif total_a == total_b: 
     return 'D' 

#The additional Part 

from collections import defaultdict 

def play_games(n_games, strategy_a, strategy_b): 
    dicto = defaultdict(int) 
    for i in xrange(n_games): 
     dicto[one_game(strategy_a, strategy_b)] += 1 
    return dicto 

结果:

>>> play_games(1000,'sum6','sum13') 
defaultdict(<type 'int'>, {'A': 495, 'B': 505}) 

我不认为游戏的设计允许“d”到不会发生,所以你还不如干脆放弃它。

+0

我想我明白了,但是说你想在字典中加上'D',那该不该出错?甚至认为这种情况的可能性很小。另外为什么你删除了函数def play_games(n_games,strategy_a,strategy_b):?感谢您的时间。 – sharky8899 2012-04-26 23:20:26

+0

如果'D'出现,它的分数将被记录下来。我想这发生在双方得到63;我对比赛并不熟悉。由于马虎复制/粘贴,我删除了该功能。我现在以一种功能的形式建立我的答案。 – Akavall 2012-04-26 23:34:31

+0

非常感谢!,这帮助了很多。 – sharky8899 2012-04-26 23:35:51