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