NIM游戏的Python实现
可执行程序下载:
链接:https://pan.baidu.com/s/1n1lPpsI_y53wp6vONWbF-A
提取码:nxgy
Nim游戏是博弈论中最经典的模型(之一),它又有着十分简单的规则和无比优美的结论 Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”(以下简称ICG)。
条件
满足以下条件的游戏是ICG(可能不太严谨):1、有两名选手;2、两名选手交替对游戏进行移动(move),每次一步,选手可以在(一般而言)有限的合法移动集合中任选一种进行移动;3、对于游戏的任何一种可能的局面,合法的移动集合只取决于这个局面本身,不取决于轮到哪名选手操作、以前的任何操作、骰子的点数或者其它什么因素; 4、如果轮到某名选手移动,且这个局面的合法的移动集合为空(也就是说此时无法进行移动),则这名选手负。根据这个定义,很多日常的游戏并非ICG。例如象棋就不满足条件3,因为红方只能移动红子,黑方只能移动黑子,合法的移动集合取决于轮到哪名选手操作。
定义
#NIM
import pygame
import random
import time
#pygame的初始化#######################################
pygame.init()
screen = pygame.display.set_mode([815,600])
pygame.display.set_caption("NIM V1.1 2020/2/27") #变量的声明##########################################
WHITE = (255,255,255)
PINK = (255,146,154)
BLUE = (180,209,217)
BLACK = (10,10,10)
width = 120
lengh = 50
num = [random.randint(1,10),random.randint(1,10),random.randint(1,10)]
LEFT = [10-num[0],10-num[1],10-num[2]] #字样的声明###########################################
font = pygame.font.SysFont("Times",24)
text1 = font.render("Congratulaton! You win!",True,BLACK)
text1_rect=text1.get_rect()
text1_rect.centerx=screen.get_rect().centerx
text1_rect.y=550
text2 = font.render("GAME OVER!",True,BLACK)
text2_rect=text2.get_rect()
text2_rect.centerx=screen.get_rect().centerx
text2_rect.y=550
text3 = font.render("Press F1 to play again",True,BLACK)
text3_rect=text3.get_rect()
text3_rect.x=50
text3_rect.y=550 #初始化地图#################################
def draw_the_map():
screen.fill((255,255,255))
for y in range(3):
for i in range(num[y]):
pygame.draw.rect(screen,BLACK,((9-i)*85,y*200,lengh,width))
pic = pygame.image.load("exit.png")
screen.blit(pic,(750,540))
pygame.display.update() #更新地图####################################
def refresh_the_map(a,b,color):
global LEFT,num
for i in range(a-LEFT[b]+1):
pygame.draw.rect(screen,color,((LEFT[b]+i)*85,b*200,lengh,width))
pygame.display.update()
time.sleep(0.05)
LEFT[b]=a+1
if(LEFT[b]>10):
LEFT[b]=10
num[b]=9-a
# if(num[b]<0):
# num[b]=0
# print(num) #玩家取子####################################
def player_draw():
global LEFT,num
player_done = True
while(player_done):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
if(x>=760 and y>=550):
pygame.quit()
exit()
a=x//85
b=y//200
if(x>=LEFT[b]*85):
if(x<=(a*85+50) and y<=(b*200+120)):
refresh_the_map(a,b,PINK)
return #获取二进制下的最高位################################
def get_high(a):
flag = True
k=1
while(flag):
if(a>>1==0):
break
a=a>>1
k=k+1
return k #检测二进制下a在b位上是否为1##########################
def check_high(b,a):
if(len(bin(a))<b):
return False
if (bin(a)[len(bin(a))-b]==''):
return True
else:
return False #电脑取子#############################################
def machine_draw():
global LEFT,num
k=random.randint(0,2)
while(num[k]==0):
k=random.randint(0,2)
result = num[0]^num[1]^num[2]
if(result==0):
refresh_the_map(LEFT[k]-1+random.randint(1,num[k]),k,BLUE)
return
high=get_high(result)
if(check_high(high,num[0])):
k=0
elif(check_high(high,num[1])):
k=1
else:
k=2
answer=num[k]-(num[k]^result)
refresh_the_map(LEFT[k]+answer-1,k,BLUE) def win_judge():
if(num[0]==0 and num[1]==0 and num[2]==0):
return True
else:return False def replay():
global LEFT,num
flag = True
while(flag):
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
if(x>=760 and y>=550):
pygame.quit()
exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_F1:
num = [random.randint(1,10),random.randint(1,10),random.randint(1,10)]
LEFT = [10-num[0],10-num[1],10-num[2]]
draw_the_map()
flag= False
return def main():
draw_the_map()
keep_going =True
while(keep_going):
player_draw()
if(win_judge()):
screen.blit(text1,text1_rect)
screen.blit(text3,text3_rect)
pygame.display.update()
break
machine_draw()
if(win_judge()):
screen.blit(text2,text2_rect)
screen.blit(text3,text3_rect)
pygame.display.update()
break
replay() if __name__ == '__main__':
while(1):
main()
NIM游戏的Python实现的更多相关文章
- leetcode 292. Nim游戏(python)
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断 ...
- Nim游戏
目前有3堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:1)每一步应取走至少一枚石子:每一步只能从某一堆中取走部分或全部石子:2)如果谁不能取谁就失败. Bouton定理: 必败状态当 ...
- BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基
[题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...
- 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心
3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 490[Submit][Stat ...
- 【BZOJ】3105: [cqoi2013]新Nim游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...
- BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基
一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...
- 编程之美----NIM游戏
: 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,Alice与Bob.Alice与Bob总是在进行各种各样的比试,今天他 ...
- Nim游戏变种——取纽扣游戏
(2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和D ...
- 2014 网选 5011 Game(Nim游戏,数学题)
/* 题意:Nim游戏! 思路:通过异或,判断将n个数表示成二进制的形式之后,是否对应位的数字1 的个数是偶数! */ #include<iostream> using namespace ...
随机推荐
- 为什么用nginx:它的5个主要优点
1.高并发,高性能 2.可扩展性好啊 3.高可靠性 4.热部署 5.BSD许可证
- 【WPF学习】第四十二章 透明
WPF支持真正的透明效果.这意味着,如果在一个性质或元素上层叠另外几个形状或元素,并让所有这些形状和元素具有不同的透明度,就会看到所期望的效果.通过该特性能够创建透过上面的元素可以看到的的图像背景,这 ...
- LAMP: 分布式 HTTP 2.4.25 + PHP 5.4.13 + MySQL 5.5.28 分离部署
目录 A. 环境说明:B. 效果截图:C. HTTP编译安装D. MySQL二进制安装E. PHP源码编译安装F. PHP连接HTTPG. PHP支持扩展功能xcacheH. PHP连接MySQLI. ...
- 如何高效地远程部署?自动化运维利器 Fabric 教程
关于 Python 自动化的话题,在上一篇文章中,我介绍了 Invoke 库,它是 Fabric 的最重要组件之一.Fabric 也是一个被广泛应用的自动化工具库,是不得不提的自动化运维利器,所以,本 ...
- 全网最详细的Linux命令系列-Screen远程会话命令
screen 管理你的远程会话 你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份.ftp 传输等等.通常情况下我们都 ...
- 1276:【例9.20】P2758 编辑距离
题目传送门[(https://www.luogu.com.cn/problem/P2758)] 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作 ...
- linux下命令的全称,方便记忆(转)-修改补充版
su:Swith user 切换用户,切换到root用户 cat: Concatenate 串联(cat(Concatenate)命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容, ...
- Python Special Methods - 特殊方法
特殊方法 特殊方法的存在是为了给 Python 解释器调用的,通常自己并不需要直接调用它们.也就是说不应该使用 my_object.__len__() 这种写法,而应该使用 len(my_object ...
- 【转】Android WiFi 经常掉线出现的几个原因分析!
原因1.从Log分析来看,这个是由于Dhcp request fail 导致最终disconnect . Log 分析如下: 16:53:31.659 958 6525 D NetUtils: dhc ...
- 创建PyCharm工程