Python实现聪明的尼姆游戏
作者:甍耜 时间:2023-07-28 13:36:52
尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家则输掉游戏
在聪明模式中,计算机每次拿走一定数量的物品使得堆的大小是 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玩家胜利!')
以上代码纯本人想法,若有更好的想法可留言一起探讨
来源:https://blog.csdn.net/m0_46457323/article/details/121594329
标签:Python,尼姆,游戏
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
bootstrap下拉列表与输入框组结合的样式调整
2024-04-22 13:25:02
![](https://img.aspxhome.com/file/2023/9/135699_0s.png)
python任务调度实例分析
2021-06-30 12:42:57
Mysql使用Describe命令判断字段是否存在
2011-04-25 18:27:00
Vue3-KeepAlive,多个页面使用keepalive方式
2024-05-02 16:33:39
![](https://img.aspxhome.com/file/2023/7/130237_0s.gif)
python pymysql链接数据库查询结果转为Dataframe实例
2024-01-16 22:07:29
Vscode 基础使用教程大全
2023-03-06 01:58:18
![](https://img.aspxhome.com/file/2023/7/132417_0s.png)
利用python模拟实现POST请求提交图片的方法
2021-02-20 05:58:21
通过Python pyecharts输出保存图片代码实例
2021-09-14 22:26:11
![](https://img.aspxhome.com/file/2023/3/97623_0s.png)
Tornado实现多进程/多线程的HTTP服务详解
2023-11-19 23:40:20
简单介绍Python虚拟环境及使用方法
2021-03-19 20:59:53
![](https://img.aspxhome.com/file/2023/9/112169_0s.png)
Python文件操作之二进制文件详解
2021-10-23 16:44:47
![](https://img.aspxhome.com/file/2023/0/87790_0s.jpg)
浅谈python中scipy.misc.logsumexp函数的运用场景
2023-11-10 17:10:56
使用Python编写一个在Linux下实现截图分享的脚本的教程
2022-04-23 13:23:11
解决Golang 中使用WaitGroup的那点坑
2024-04-28 09:11:08
快速认识CSS中的overflow属性
2009-05-29 16:36:00
![](https://img.aspxhome.com/file/UploadPic/up/2009052916595412.gif)
Go语言图片处理和生成缩略图的方法
2024-05-05 09:33:27
ASP同一站点下gb2312和utf-8页面传递参数乱码的终极解决方法
2011-02-20 11:00:00
JavaScript前端学算法题解LeetCode最大重复子字符串
2024-05-21 10:21:00
![](https://img.aspxhome.com/file/2023/2/124702_0s.png)
Python循环语句之break与continue的用法
2022-04-15 23:13:20
![](https://img.aspxhome.com/file/2023/0/115660_0s.jpg)
升级到mysql-connector-java8.0.27的注意事项
2024-01-22 20:52:08
![](https://img.aspxhome.com/file/2023/7/112647_0s.png)