骰子游戏与字典

时间:2012-04-26 21:55:03

标签: python python-2.7

这是一个猪骰子游戏,我使用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):

3 个答案:

答案 0 :(得分: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”发生,所以你不妨放弃它。

答案 1 :(得分:0)

为了概述基于你目前所拥有的一般步骤,在play_games的第一行,我将用以下内容定义你的dict:

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

play_games的最后一行当然是

return resultsDict

在你的for循环中,你会有类似的东西:

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

目前,你在play_games中的第一行ets n_games,如果你传递的那个值没有多大意义。您要么只想将其定义为本地值而不传递它,要么使用传递的值。第二种可能是更一般和更好的策略,但这取决于你的班级。

当然,那么你需要在某个地方使用适当的n_games,strategy_a和strategy_b值调用play_games。除非这是一个从其他地方调用的库,在这种情况下“其他地方”应该调用它。如果直接运行此脚本,则可以同时为play_games添加条件调用,以便在导入时不会自动进行调用。这看起来像是:

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

我注意到的一件事是你的功能没有评论也没有文档字符串。作为一般规则,我赞成一种有文化的编程风格,并且喜欢太多而不是太少的评论。由于这是家庭作业,这是否重要取决于如何进行评分。

修改:我发现您可以通过为策略取一个保留值而不是当前高度特定的Sum13和Sum6策略来进行设置。这将使其更加通用,同时缩短代码。

答案 2 :(得分: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