Python實(shí)現(xiàn)聰明的尼姆游戲
尼姆游戲是個(gè)著名的游戲,有很多變種玩法。兩個(gè)玩家輪流從一堆物品中拿走一部分。在每一步中,玩家可以自由選擇拿走多少物品,但是必須至少拿走一個(gè)并且最多只能拿走一半物品,然后輪到下一個(gè)玩家。拿走最后一個(gè)物品的玩家則輸?shù)粲螒?br /> 在聰明模式中,計(jì)算機(jī)每次拿走一定數(shù)量的物品使得堆的大小是 2 的冪次方減 1—也就是 3、7、15、31、63 等。如果有一定數(shù)量的剩余物品,計(jì)算機(jī)就隨機(jī)拿出一些。編寫(xiě)程序,模擬聰明版本的尼姆游戲。
先創(chuàng)建兩個(gè)函數(shù),一個(gè)用于玩家拿走商品,另一個(gè)用于電腦拿走商品。題目要求電腦要隨機(jī)挑選,因此我們用到了random庫(kù)中的choice方法,用法為random.choice(iterable),就是從序列中隨機(jī)挑選一個(gè)元素。
import random
# 玩家拿走物品
def play(num):
while True:
try:
if num == 1:
print('請(qǐng)輸入要拿走物品的數(shù)量(1)')
take_num = int(input())
assert take_num == 1
else:
print('請(qǐng)輸入要拿走物品的數(shù)量(1-%d)' % (num / 2))
take_num = int(input())
assert 1 <= take_num <= num // 2
except(ValueError, AssertionError):
print('請(qǐng)正確輸入數(shù)量!')
else:
break
num -= take_num
print('玩家拿走了', take_num, '個(gè),還剩', num, '個(gè)')
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, '個(gè),還剩', num, '個(gè)')
return num
else:
take_num = random.randint(1, take_max)
num -= take_num
print('電腦拿走了', take_num, '個(gè),還剩', num, '個(gè)')
return num
while True:
try:
initial_value = int(input('請(qǐng)輸入起始數(shù)量堆的大小:'))
except(ValueError, AssertionError):
print('請(qǐng)正確輸入數(shù)量!')
else:
break
player = 1
computer_player = 1
# 依次循環(huán)玩家和電腦那走物品,若玩家先拿完則提前跳出循環(huán),若電腦先拿完則正常退出循環(huán)
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 個(gè),還剩 0 個(gè)')
print('\n玩家勝利!')
以上代碼純本人想法,若有更好的想法可留言一起探討

到此這篇關(guān)于Python實(shí)現(xiàn)聰明的尼姆游戲的文章就介紹到這了,更多相關(guān)Python尼姆游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解
今天小編就為大家分享一篇關(guān)于TensorFlow新舊版本函數(shù)接口變化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
詳解PANDAS 數(shù)據(jù)合并與重塑(join/merge篇)
這篇文章主要介紹了詳解PANDAS 數(shù)據(jù)合并與重塑(join/merge篇),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python pandas之求和運(yùn)算和非空值個(gè)數(shù)統(tǒng)計(jì)
數(shù)據(jù)處理的過(guò)程中經(jīng)常會(huì)遇到判斷空值和求和運(yùn)算的需求,所以下面這篇文章主要給大家介紹了關(guān)于Python pandas之求和運(yùn)算和非空值個(gè)數(shù)統(tǒng)計(jì)的相關(guān)資料,需要的朋友可以參考下2021-08-08
使用Python 統(tǒng)計(jì)高頻字?jǐn)?shù)的方法
今天小編就為大家分享一篇使用Python 統(tǒng)計(jì)高頻字?jǐn)?shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Tensorflow實(shí)現(xiàn)將標(biāo)簽變?yōu)閛ne-hot形式
這篇文章主要介紹了Tensorflow實(shí)現(xiàn)將標(biāo)簽變?yōu)閛ne-hot形式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
python文字轉(zhuǎn)語(yǔ)音實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了python文字轉(zhuǎn)語(yǔ)音實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
python中(str,list,tuple)基礎(chǔ)知識(shí)匯總
本文給大家匯總介紹的是python中str(字符串)、list(列表)、tuple(元組)、dict(字典)的一些基礎(chǔ)知識(shí),有需要的小伙伴可以參考下2018-02-02
基于Python 的進(jìn)程管理工具supervisor使用指南
Supervisor 是基于 Python 的進(jìn)程管理工具,可以輕松管理一些需要以守護(hù)進(jìn)程方式執(zhí)行的程序,也就是后臺(tái)任務(wù),例如用來(lái)啟動(dòng)和管理基于 Tornado 寫(xiě)的 Web 程序。2016-09-09
Python文字截圖識(shí)別OCR工具實(shí)例解析
這篇文章主要介紹了Python文字截圖識(shí)別OCR工具實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03

