Python实现聪明的尼姆游戏
作者:甍耜 发布时间:2023-07-28 13:36:52
标签: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('请正确输入数量!')
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
0
投稿
猜你喜欢
- JavaScript中的定时器大家基本在平时的开发中都遇见过吧,但是又有多少人去深入的理解其中的原理呢?下面我们就来分析一下定时器的实现原理
- 笔者日积月累了许多精彩、实用的Web特效的制作,这些特效几乎都是比较常用的网页特效。现在我就把这些经过
- 第一题: give you two var a and b, print the value of a+b, just do it!根据提议
- 首先,建立一个Conn的连接对象,然后连接到数据库data.mdb中,取得连接句柄后,把它保存在session("conn&quo
- list.asp<%@LANGUAGE="VBSCRIPT" CODEPAGE="936&qu
- 在一些特殊的业务场景中,我们需要一次性提取一张图片中的色卡信息,并且需要使用十六进制的颜色表示方法进行展示。今天得空做了一个小工具,用来自定
- 问题:因为有的友情连接的网站关闭或者网络连接较慢导致连接的LOGO图片显示不出来或者显示很慢.在IE下面老是提示剩下几项没打开,看起来很不舒
- asp代码 <% Dim Rs,Conn Set Conn=Server.CreateObject("Adodb.Conne
- 在讨论IE6的BUG及如何修复之前,有必要讲叙一些策略去避免这些恼人的问题——正所谓防患于未然 。IE6 市场占有率据Market Shar
- 数据概况Fashion-mnist经典的MNIST数据集包含了大量的手写数字。十几年来,来自机器学习、机器视觉、人工智能、深度学习领域的研究
- 一、requests库requests是使用Apache2 licensed 许可证的HTTP库。比urllib模块更简洁。Request支
- 印象中最早看老外个人网站就挺纳闷,怎么人家都没有www,这样也可以?经过不断尝试,我发现确实不录入www要快捷的多,但不清楚怎么能做到。几年
- PHP children() 函数实例查找 note 节点的子节点:<?php $note=<<<XML<no
- 使用数据库的过程中,由于断电或其他原因,有可能导致数据库出现一些小错误,比如检索某些表特别慢,查询不到符合条件的数据等。出现这些情况的原因,
- 这段时间在处理SQL server 2000 SP4补丁打不上的问题上花了不少时间,回头想想应该总结一下:系统说明:dell1800服务器,
- 前段时间做视频时需要演示电脑端的操作,因此要用到屏幕录制,下载了个迅捷屏幕录制,但是没有vip录制的视频有水印且只能录制二分钟,于是鄙人想了
- 发现一个有意思的现象,labelimg打开图片和xml标签时候,看不到标注好的框框,仔细查看了xml文件,没发现什么异常,后面试一下,才发现
- 源码解读Bootstrap按钮按钮组按钮组和下拉菜单组件一样,需要依赖于bootstrap.js。使用“btn-group”的容器,把多个按
- 这篇文章主要介绍了Python遍历字典方式就实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 大家在使用ASP设计用户提交表单的时候,如果涉及到网址输入框,那么相信都有可能会用到这个效果,使用正则表达式验证网址合法性。代码如下:<