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

3 回答 3

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'发生,所以你最好放弃它。

于 2012-04-26T22:44:21.323 回答
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 中的第一行设置为 n_games,如果您传入该值,这没有多大意义。您要么只想将其定义为本地值而不传递它,要么使用传递的值。第二个可能是更通用和更好的策略,但这取决于你的班级。

当然,您需要在某个地方实际调用 play_games,并为 n_games、strategy_a 和 strategy_b 设置适当的值。除非这是一个从其他地方调用的库,在这种情况下,“其他地方”应该调用它。如果此脚本直接运行,您可以同时执行这两种操作的方法是添加对 play_games 的条件调用,这样在导入时它不会自动进行调用。这看起来像:

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

我注意到的一件事是您的函数没有注释和文档字符串。作为一般规则,我喜欢有文化的编程风格,喜欢太多而不是太少的评论。由于这是家庭作业,这是否重要取决于评分的完成方式。

编辑:在我看来,您可以通过为策略设置一个保持值而不是当前高度具体的 Sum13 和 Sum6 策略来进行设置。这将使它更通用,同时使代码更短。

于 2012-04-26T22:28:38.480 回答
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
于 2012-04-26T22:28:47.447 回答