題目:python
-
尼姆遊戲是個著名的遊戲,有不少變種玩法。兩個玩家輪流從一堆物品中拿走一部分。在每一步中,玩家能夠自由選擇拿走多少物品,可是必須至少拿走一個而且最多隻能拿走一半物品,而後輪到下一個玩家。拿走最後一個物品的玩家輸掉遊戲。web
-
在聰明模式中,計算機每次拿走必定數量的物品使得堆的大小是2的冪次方減1————也就是三、七、1五、3一、63等。若是有必定數量的剩餘物品,計算機就隨機拿走一些。app
-
編寫程序,模擬聰明版本的尼姆遊戲。dom
Code:svg
from math import log2 #導入基礎的模塊 from random import randint,choice def everyStep(n): #定義一個函數 half = n/2 m = 1 #儘量知足條件的取法 possible = [] while True: #無限循環 rest = 2**m - 1 #計算使得堆的大小是2的冪次方減1 if rest >= n: break if rest >= half: possible.append(n - rest) #在列表中添加元素 m += 1 #若是至少存在一種取法使得剩餘物品數量爲2^n - 1 if possible: #判斷possible是否爲空列表 return choice(possible) #沒法使得剩餘物品數量爲2^n - 1,隨機取走一些 return randint(1,int(half)) #用randint取隨機數 def smartNimuGame(n): while n > 1: #人類玩家先走 print('It is your turn,and we have {0} left,'.format(n)) #確保人類玩家輸入合法的整數值 while True: try: #經過try和except來處理可能出現的錯誤 num = int(input('How mang do you want to take:')) assert 1 <= num <= n//2 break #跳出循環 except: print('Must be between 1 and {0}'.format(n//2)) n -= num if n == 1: return 'I fail' #計算機玩家拿走一些 n -= everyStep(n) else: return 'You fail' print(smartNimuGame(randint(1,100)))
本文分享 CSDN - Kinght_123。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。函數