Python實現聰明的尼姆遊戲
尼姆遊戲是個著名的遊戲,有很多變種玩法。兩個玩傢輪流從一堆物品中拿走一部分。在每一步中,玩傢可以自由選擇拿走多少物品,但是必須至少拿走一個並且最多隻能拿走一半物品,然後輪到下一個玩傢。拿走最後一個物品的玩傢則輸掉遊戲
在聰明模式中,計算機每次拿走一定數量的物品使得堆的大小是 2 的冪次方減 1—也就是 3、7、15、31、63 等。如果有一定數量的剩餘物品,計算機就隨機拿出一些。編寫程序,模擬聰明版本的尼姆遊戲。
先創建兩個函數,一個用於玩傢拿走商品,另一個用於電腦拿走商品。題目要求電腦要隨機挑選,因此我們用到瞭random庫中的choice方法,用法為random.choice(iterable),就是從序列中隨機挑選一個元素。
import random # 玩傢拿走物品 def play(num): while True: try: if num == 1: print('請輸入要拿走物品的數量(1)') take_num = int(input()) assert take_num == 1 else: print('請輸入要拿走物品的數量(1-%d)' % (num / 2)) take_num = int(input()) assert 1 <= take_num <= num // 2 except(ValueError, AssertionError): print('請正確輸入數量!') else: break num -= take_num print('玩傢拿走瞭', take_num, '個,還剩', num, '個') return num # 電腦拿走物品 def computer(num): take_max = num // 2 lst = [] for i in range(1, num): temp = 2 ** i - 1 if temp <= num - 1: lst.append(temp) else: break lst = list(filter(lambda y: num - y <= num // 2, lst)) if lst: temp_lst = [] for i in lst: x = num - i temp_lst.append(x) take_num = random.choice(temp_lst) num -= take_num print('電腦拿走瞭', take_num, '個,還剩', num, '個') return num else: take_num = random.randint(1, take_max) num -= take_num print('電腦拿走瞭', take_num, '個,還剩', num, '個') return num while True: try: initial_value = int(input('請輸入起始數量堆的大小:')) except(ValueError, AssertionError): print('請正確輸入數量!') else: break player = 1 computer_player = 1 # 依次循環玩傢和電腦那走物品,若玩傢先拿完則提前跳出循環,若電腦先拿完則正常退出循環 while computer_player and player: initial_value = play(initial_value) player = initial_value if player == 0 or player == 1: break initial_value = computer(initial_value) computer_player = initial_value if player == 0: print('\n電腦勝利!') else: print('電腦拿走瞭 1 個,還剩 0 個') print('\n玩傢勝利!')
以上代碼純本人想法,若有更好的想法可留言一起探討
到此這篇關於Python實現聰明的尼姆遊戲的文章就介紹到這瞭,更多相關Python尼姆遊戲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python撲克牌21點遊戲實例代碼
- python中的斷言(assert語句)
- 100 個 Python 小例子(練習題二)
- Python真題案例之小學算術 階乘精確值 孿生素數 6174問題詳解
- 使用python怎樣產生10個不同的隨機數