尼姆游戏

  • 1 实验题目
    • 1.1 游戏介绍
    • 1.2 实验要求
  • 2 实验原理
    • 2.1 计算机回合
    • 2.2 玩家回合
    • 2.3 游戏开始
  • 3 运行结果
  • 4 源代码

1 实验题目

1.1 游戏介绍

尼姆游戏是个著名的游戏,有很多变种玩法。有傻瓜模式聪明模式

傻瓜模式:两个玩家轮流从一堆物品中拿走一部分。在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家。拿走最后一个物品的玩家输掉游戏。

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

1.2 实验要求

编写程序,模拟聪明版本的尼姆游戏。

2 实验原理

2.1 计算机回合

使得计算机每次取走的数量会使得堆大小变成2的幂次方减一即可。

可以使用一个while循环,找到物品堆大小的数量处于2的几次方之间。找到这个区间的下限x,每次拿走时:拿走数量 = 物品数量 - (2x - 1)。这样就可以保证每次计算机拿走之后,物品剩下的数量为 2x-1

另外,当物品数量正是2的幂次方时,就让计算机随机产生一个符合游戏规则的数字作为拿走数量。

while True:if pow(2, x) < self.number <= pow(2, x + 1):breakx = x + 1
if self.number == pow(2, x + 1):n = random.randint(1, int(self.number / 2))
else:n = self.number - (pow(2, x) - 1)

2.2 玩家回合

判断玩家取走是否满足游戏规则,即是否大于1且小于物品总数的一半。

此处可设置一个 flag 进行标志,若用户输入数量符合游戏规则,则令 flag 为 True ;若不符合,令 flag 为 False 。

当 flag = False 时就让用户继续输入直到输入数量符合规则。当 flag = True 时就使用用户输入的数量。

n = int(input('请输入要拿走的物品个数:'))
flag = n < 1 or n > int(self.number / 2)
while flag:print('输入数据不符合游戏规则,请重新输入!')n = int(input('请输入要拿走的物品个数:'))flag = n < 1 or n > int(self.number / 2)

2.3 游戏开始

实现玩家与计算机交替拿走物品。

这里需要设置每次玩家拿走数量的变量player,以及计算机每次拿走数量的变量computer。使用while循环让游戏一直进行下去,直到判断出谁输谁赢。

while True:computer = self.computer_turn()if computer == 0:breakelse:self.number = self.number - computerprint('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))player = self.player_turn()if player == 0:breakelse:self.number = self.number - playerprint('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))

3 运行结果

4 源代码

# 尼姆游戏
import randomclass Game:def __init__(self):self.number = 0def computer_turn(self):x = 0n = 0if self.number == 2:n = 1elif self.number == 1:print('游戏结束,玩家获胜')return 0else:while True:if pow(2, x) < self.number <= pow(2, x + 1):breakx = x + 1if self.number == pow(2, x + 1):n = random.randint(1, int(self.number / 2))else:n = self.number - (pow(2, x) - 1)return ndef player_turn(self):if self.number == 1:print('游戏结束,电脑获胜')return 0n = int(input('请输入要拿走的物品个数:'))flag = n < 1 or n > int(self.number / 2)while flag:print('输入数据不符合游戏规则,请重新输入!')n = int(input('请输入要拿走的物品个数:'))flag = n < 1 or n > int(self.number / 2)return ndef begin(self):computer = 0player = 0print('欢迎来到尼姆游戏!')self.number = int(input('请输入物品总数:'))while True:computer = self.computer_turn()if computer == 0:breakelse:self.number = self.number - computerprint('电脑回合:拿走{:d}个物品,剩余{:d}个物品'.format(computer, self.number))player = self.player_turn()if player == 0:breakelse:self.number = self.number - playerprint('玩家回合:拿走{:d}个物品,剩余{:d}个物品'.format(player, self.number))if __name__ == '__main__':game = Game()game.begin()

Python程序设计实验——1.尼姆游戏相关推荐

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

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

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

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

  3. 一个傻傻的尼姆游戏及其Python实现

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

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

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

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

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

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

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

  7. Python编写尼姆游戏

    Python编写尼姆游戏 最主要的思想是要构建函数思想.就是要将玩家和电脑分模块给编写出来.玩家可以编写比较简单不多赘述.这里主要讲一讲电脑模块.首先我们要保证电脑拿走物品剩下来过后要是2∧n-1如果 ...

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

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

  9. 尼姆游戏(人机对战)的Python实现

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

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

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

最新文章

  1. matlab程序崩溃怎么解决,java – 如何避免MATLAB崩溃打开太多的数字?
  2. 你的专业知识并不等于你的能力——如何提升自我
  3. python 定义一个插入数据(可以插入到每个表中)通用的方法
  4. mysql5.6主从参数详解
  5. [JavaWeb-JavaScript]JavaScript变量
  6. 万兆网卡实际吞吐量_案例探索 | 千兆/万兆网卡每秒转发包数处理能力上限到底有多大?...
  7. python-面向对向-实例方法的继承
  8. ubuntu16.04下pycharm中无法使用中文输入法
  9. python生成10000个样本数据集_python – 为什么随机抽样比例数据集不是样本量? (pandas .sample()示例)...
  10. DNS篇之二DNS记录类型
  11. Cassandra Wiki Login JmxSecurity
  12. 阿里云服务器部署GeoServer以及跨域处理
  13. autojs之提取图片中的红色文字(通过找边界进行裁剪)
  14. CentOS Docker环境部署NextCloud
  15. 手游外挂入侵(一)某助手加速器实现原理探究
  16. win10无法启动_win10电脑开机进入不了系统如何解决?
  17. 浙商银行计算机专业笔试考什么,浙商银行笔试题目汇总
  18. uc保存html,UC浏览器如何保存网页?UC浏览器保存网页教程图文详解
  19. 李建忠设计模式之“组件协作”模式
  20. python 导入模型_scikit-learn系列之如何存储和导入机器学习模型

热门文章

  1. 从JavaEye社区被迫改名说起(转载他人博客)
  2. eXtremeComponents(简称ec)是一系列提供高级显示的开源JSP定制标签
  3. jdk6或者7Base64转码与解码
  4. [RubyOnRails]一些网址
  5. 怎么在win7上安装AIR780E的USB驱动
  6. 《UNIX网络编程 卷1》一、环境配置
  7. 强大的诺顿扼杀了alexa工具条
  8. Java实现QQ机器人
  9. 驱动精灵、人生限速曲线救国
  10. Linux vi命令修改文件内容笔记