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('请正确输⼊数量!')
python可以做什么游戏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尼姆游戏内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论