尼姆游戏是个著名的游戏,有很多变种玩法。两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。

在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2 的幂次方减1——也就是3,7,15,31 或63。除了堆的大小已经是2 的幂次方减1,在其他情况下这样走都是符合游戏规则的。在那种情况下,计算机就按游戏规则随机拿走一些

随机生成物品数量模块:

# 生成一个随机物品的数量
def res_num():# 随机生成一个60——100的物品数量resnum = random.randint(60,100)# 返回生成的随机物品数量return resnum

判断是否为2的n次方减一模块:

# 判断是否为2的幂次方减1
def N(n):while True:if ((n % 2) == 0)|(n == 1):if n == 1:i = 1breakelse:n = n // 2i = 1else:i = 0break# 如果是2的幂if i == 1:return 1# 不是2的幂else:return 0

当玩家未拿走2的n次方减一物品时,机器人拿走2的n次方减一个 物品模块:

# 机器拿走物品
def robot_resnum(resnum):# 机器每次只能取走剩下物品的一半num = resnum // 2i = 0if resnum >= 3:while True:# 判断取走物品数码是不是2的幂,如果是2的幂if N((num + 1)) == 1:a = numb = resnum - aprint("机器回合!")print("机器人拿走%d个物品,还剩下%d个物品!" % (a, b))break# 不是2的幂,则继续向下取else:num = num - 1else:m = resnum - numprint("机器人拿走%d个物品,还剩下3个!"%m)if (resnum - num) == 0:print("机器人拿走1个物品,还剩下0个物品。")print("恭喜你,你战胜了机器人!")return resnum - 1return (resnum - num)

当玩家拿走2的n次方个物品时,机器人随机取走一个物品模块:

# 机器人拿走物品2,玩家拿走2的幂机器人随机取一个
def robot_resnum2(resnum):if resnum > 1:a = resnum // 2b = random.randint(1, a)print("机器人拿走%d个物品,还剩下%d个物品。" % (b, resnum - b))return resnum - belse:resnum = resnum - 1print("机器人拿走1个物品,还剩下0个物品。")print("恭喜你,你战胜了机器人!")return resnum - 1

玩家取走物品模块:

# 玩家拿走物品
def people_resnum(resnum):while True:# 请输入你要取的物品数量print("你的回合!")print("请输入你要取的物品数量:")num = int(input())if (resnum - num) != 0:if num <= (resnum / 2):if N(num) == 1:print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))i = 1breakelse:print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))i = 0breakelse:print("您输入的物品数量大于该堆物品数量一半,请重新输入!")else:print("你拿走1个物品,还剩下0个物品。")print("很遗憾你败给了机器人,再接再厉!")return resnum - num,1return resnum - num, i

主函数模块:

# 获取随机生成的物品数量
resnum = res_num()
print("目前该堆物品中有%d个物品。"%resnum)
while True:# 将目前物品数量传入函数a = people_resnum(resnum)resnum = a[0]# 如果玩家拿的数量为2的幂if resnum > 0:if a[1] == 1:# 将剩余物品数量传入函数robot_resnumresnum = robot_resnum2(resnum)# 如果玩家拿的不是2的幂else:# 将剩余物品数量传入函数robot_resnumresnum = robot_resnum(resnum)# 判断最后物品数量if resnum <= 0:break

完整代码:

import randomdef res_num():# 随机生成一个60——100的物品数量resnum = random.randint(60,100)# 返回生成的随机物品数量return resnum# 判断是否为2的幂次方减1
def N(n):while True:if ((n % 2) == 0)|(n == 1):if n == 1:i = 1breakelse:n = n // 2i = 1else:i = 0break# 如果是2的幂if i == 1:return 1# 不是2的幂else:return 0# 机器拿走物品
def robot_resnum(resnum):# 机器每次只能取走剩下物品的一半num = resnum // 2i = 0if resnum >= 3:while True:# 判断取走物品数码是不是2的幂,如果是2的幂if N((num + 1)) == 1:a = numb = resnum - aprint("机器回合!")print("机器人拿走%d个物品,还剩下%d个物品!" % (a, b))break# 不是2的幂,则继续向下取else:num = num - 1else:m = resnum - numprint("机器人拿走%d个物品,还剩下3个!"%m)if (resnum - num) == 0:print("机器人拿走1个物品,还剩下0个物品。")print("恭喜你,你战胜了机器人!")return resnum - 1return (resnum - num)# 机器人拿走物品2,玩家拿走2的幂机器人随机取一个
def robot_resnum2(resnum):if resnum > 1:a = resnum // 2b = random.randint(1, a)print("机器人拿走%d个物品,还剩下%d个物品。" % (b, resnum - b))return resnum - belse:resnum = resnum - 1print("机器人拿走1个物品,还剩下0个物品。")print("恭喜你,你战胜了机器人!")return resnum - 1# 玩家拿走物品
def people_resnum(resnum):while True:# 请输入你要取的物品数量print("你的回合!")print("请输入你要取的物品数量:")num = int(input())if (resnum - num) != 0:if num <= (resnum / 2):if N(num) == 1:print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))i = 1breakelse:print("你拿走%d个物品,还剩下%d个物品。" % (num, resnum - num))i = 0breakelse:print("您输入的物品数量大于该堆物品数量一半,请重新输入!")else:print("你拿走1个物品,还剩下0个物品。")print("很遗憾你败给了机器人,再接再厉!")return resnum - num,1return resnum - num, i# 获取随机生成的物品数量
resnum = res_num()
print("目前该堆物品中有%d个物品。"%resnum)
while True:# 将目前物品数量传入函数a = people_resnum(resnum)resnum = a[0]# 如果玩家拿的数量为2的幂if resnum > 0:if a[1] == 1:# 将剩余物品数量传入函数robot_resnumresnum = robot_resnum2(resnum)# 如果玩家拿的不是2的幂else:# 将剩余物品数量传入函数robot_resnumresnum = robot_resnum(resnum)# 判断最后物品数量if resnum <= 0:break

尼姆游戏(聪明版)python相关推荐

  1. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)

    题目   尼姆游戏,这是一个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须拿走一部并且最多只能拿走一半物品,然后轮到下一个玩家.拿走 ...

  2. Python代码实现尼姆游戏聪明模式

    Python代码实现尼姆游戏聪明模式 代码问题描述: 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多 ...

  3. python尼姆游戏_使用Python编写一个聪明的尼姆游戏

    关于尼姆游戏的介绍请参考上一篇文章:一个傻傻的尼姆游戏及其Python实现,本文使用Python实现一个聪明的尼姆游戏. 在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2的幂次方减1--也就是 ...

  4. python编程实验,模拟聪明版的尼姆游戏设计原理

    实验原理与内容: 本实验完成一个模拟聪明版的尼姆游戏功能: 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并 ...

  5. 使用Python编写一个聪明的尼姆游戏

    关于尼姆游戏的介绍请参考上一篇文章:一个傻傻的尼姆游戏及其Python实现,本文使用Python实现一个聪明的尼姆游戏. 在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2的幂次方减1--也就是 ...

  6. python尼姆游戏_python实现聪明的尼姆游戏(人机对战)

    尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分:在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家.拿走最后一个物品 ...

  7. Python设计和实现聪明的尼姆游戏

    Python设计和实现聪明的尼姆游戏 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品 ...

  8. Python聪明的尼姆游戏(人机对战)

    实验目的: (1)理解尼姆游戏规则. (2)了解多个函数定义与调用. (3)理解并熟练运用 while 循环. (4)理解带 else 子句的循环结构执行流程. (5)理解循环语句中的 break 语 ...

  9. (新手小白必学!)用Python设计和实现聪明的尼姆游戏(人机对战)!!!!

    题目: 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家.拿走最后 ...

最新文章

  1. corrplot包绘制相关性图
  2. pageResponse - 让H5适配移动设备全家(移动端适配)1
  3. 走火入魔通用权限管理不仅是权限设计更是总体设计规划、快速开发集成平台(集中控制体系)...
  4. 以太坊源码linux下如何编译,以太坊教程:搭建环境、编写编译一个智能合约
  5. 在微信小程序中调用本地接口
  6. 【数据竞赛】“达观杯”文本智能处理挑战赛2
  7. linux下Vim和Terminal配色
  8. html 使用ajax php函数吗,php – 为什么用AJAX加载html后jQuery更改函数不起作用?
  9. 多决策决策树_授权员工决策时,意图就是一切
  10. csharp:Compare two DataTables to rows in one but not the other
  11. 详细解读MySQL中的权限
  12. LINUX环境:MySQL和Oracle开机自启动
  13. html如何添加时钟效果,基于HTML5+CSS3实现简单的时钟效果
  14. Matter-JS collisionFilter 碰撞过滤器
  15. python标准库之collections
  16. windows7安装openssh
  17. 中级软件设计师JAVA
  18. python从键盘输入一个数、计算出大于n的最小素数_请问,可以帮忙做下这个题吗?--从键盘输入一个数,求大于该数的最小素数....
  19. 跟java有关的搞笑句子,有关懒的幽默搞笑句子
  20. Springboot整合轻量级反爬虫组件kk-anti-reptile

热门文章

  1. 基于jsp+mysql+Spring+SpringMVC+mybatis的ssm在线培训教育平台
  2. Ubuntu挂载移动硬盘方式
  3. 【ASP.NET】VS2015连接SQL Server数据库,实现登录、注册
  4. 云服务器ecs支持以下哪些运维工具
  5. devos勒索病毒解决办法|devos勒索病毒解密|devos勒索病毒专杀工具|devos勒索病毒如何感染电脑
  6. 30个珍藏的程序员超实用自学网站,干货!
  7. 数据库-MYSQL安装配置和删除
  8. 饥荒简单搭建教程与自动维护(傻瓜都能学会)
  9. 解决Windows 10 ‘.\wsvd.mexw64‘ 无效: 找不到指定的模块问题
  10. 「产品读书」硅谷增长黑客实战笔记