Python程序设计实验——1.尼姆游戏
尼姆游戏
- 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.尼姆游戏相关推荐
- python编程实验,模拟聪明版的尼姆游戏设计原理
实验原理与内容: 本实验完成一个模拟聪明版的尼姆游戏功能: 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分,在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并 ...
- 使用Python编写一个聪明的尼姆游戏
关于尼姆游戏的介绍请参考上一篇文章:一个傻傻的尼姆游戏及其Python实现,本文使用Python实现一个聪明的尼姆游戏. 在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2的幂次方减1--也就是 ...
- 一个傻傻的尼姆游戏及其Python实现
尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家.拿走最后一个物品 ...
- python尼姆游戏_使用Python编写一个聪明的尼姆游戏
关于尼姆游戏的介绍请参考上一篇文章:一个傻傻的尼姆游戏及其Python实现,本文使用Python实现一个聪明的尼姆游戏. 在聪明模式中,计算机每次拿走足够多的物品使得堆的大小是2的幂次方减1--也就是 ...
- python尼姆游戏_python实现聪明的尼姆游戏(人机对战)
尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分:在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家.拿走最后一个物品 ...
- Python聪明的尼姆游戏(人机对战)
实验目的: (1)理解尼姆游戏规则. (2)了解多个函数定义与调用. (3)理解并熟练运用 while 循环. (4)理解带 else 子句的循环结构执行流程. (5)理解循环语句中的 break 语 ...
- Python编写尼姆游戏
Python编写尼姆游戏 最主要的思想是要构建函数思想.就是要将玩家和电脑分模块给编写出来.玩家可以编写比较简单不多赘述.这里主要讲一讲电脑模块.首先我们要保证电脑拿走物品剩下来过后要是2∧n-1如果 ...
- Python代码实现尼姆游戏聪明模式
Python代码实现尼姆游戏聪明模式 代码问题描述: 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多 ...
- 尼姆游戏(人机对战)的Python实现
尼姆游戏是一个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品,然后轮到下一个玩家.拿走最后一个物 ...
- Python设计和实现聪明的尼姆游戏
Python设计和实现聪明的尼姆游戏 尼姆游戏是个著名的游戏,有很多变种玩法.两个玩家轮流从一堆物品中拿走一部分.在每一步中,玩家可以自由选择拿走多少物品,但是必须至少拿走一个并且最多只能拿走一半物品 ...
最新文章
- matlab程序崩溃怎么解决,java – 如何避免MATLAB崩溃打开太多的数字?
- 你的专业知识并不等于你的能力——如何提升自我
- python 定义一个插入数据(可以插入到每个表中)通用的方法
- mysql5.6主从参数详解
- [JavaWeb-JavaScript]JavaScript变量
- 万兆网卡实际吞吐量_案例探索 | 千兆/万兆网卡每秒转发包数处理能力上限到底有多大?...
- python-面向对向-实例方法的继承
- ubuntu16.04下pycharm中无法使用中文输入法
- python生成10000个样本数据集_python – 为什么随机抽样比例数据集不是样本量? (pandas .sample()示例)...
- DNS篇之二DNS记录类型
- Cassandra Wiki Login JmxSecurity
- 阿里云服务器部署GeoServer以及跨域处理
- autojs之提取图片中的红色文字(通过找边界进行裁剪)
- CentOS Docker环境部署NextCloud
- 手游外挂入侵(一)某助手加速器实现原理探究
- win10无法启动_win10电脑开机进入不了系统如何解决?
- 浙商银行计算机专业笔试考什么,浙商银行笔试题目汇总
- uc保存html,UC浏览器如何保存网页?UC浏览器保存网页教程图文详解
- 李建忠设计模式之“组件协作”模式
- python 导入模型_scikit-learn系列之如何存储和导入机器学习模型