2012-04-26 212 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