Tkinter模块GUI图形化编程实战(八)——中国象棋(含超详解及完整源码、完整程序免费下载链接)
时间:2023-04-29 18:37:00
【上期回顾:Tkinter模块GUI界面编程实战(7)-人机对战五子棋
博客介绍了如何使用它Python Tkinter该模块编写了一款界面化的中国象棋游戏,完整的源代码,帮助您理解代码(最后,可以免费下载附件)
注:下载文件100%它可以运行,因为下载文件包含包装Python程序(exe文件)!】
中国象棋
版本 - 1.0
【效果展示】
文章末尾下载链接的完整程序!

有些功能没做好就不展示(嘻嘻)
【功能详细说明】
①主界面有六个透明按钮,两个信息显示框,可以用相应的键盘按钮触发(帮助界面解释)
②每一步的走法都会显示在下棋记录中,可以上下滑动()
③界面切换类似于手机滑屏,非常流畅无卡顿
④在制作人的界面中,一些信息会滑动
⑤悔棋,字面意思,只是每次悔棋都是双方一步一步撤销的
⑥设置界面有很多东西可以设置,但有些功能还没有实现(重置按钮、突破设置和音效设置)
⑦对于模式,我打算做五种模式,但由于某些原因,我只做了双人游戏模式,人机模式只做了一点(人机很愚蠢)
⑧在设置中,您可以更改第一手、子(最多支持双车、双枪、双马、左右区分)和游戏模式(目前只有游戏模式和人机模式的一些功能有效)
【教学教程】
特别说明
这是该程序的第一代版本。由于部分功能不完善,我将继续更新v2.0版本,2.0版将完善人机对战模式,增加网络对战(局域网)、计算机对战和突破模式,并添加音乐,修复一点BUG!希望大家多支持我!
基本思路是将多个功能转化为多个功能python用启动文件调用文件。
以下是所有文件和功能:
序号 | 文件名 | 描述 |
1 | Luncher.py | 启动文件 |
2 | initialization.py | 界面初始化文件布局界面样式 |
3 | mouse.py | 移动显示鼠标 |
4 | play.py | 设置游戏逻辑 |
5 | buttonbind.py | 按钮关联设置 |
6 | buttonfunction.py | 与按钮相关的事件 |
7 | setpage.py | 设置页面的布局和功能(不够完善) |
8 | value.py | 各项常数和值 |
9 | rule.py | 一些游戏规则的设定(有些小BUG) |
10 | AI.py | 人机代码(很拉垮) |
每一个python文件中的内容我都把它以一个类的形式写出来,然后相关函数就作为这个类的方法,目的是为了方便其他引用python文件(类)引用。
界面的初始化文件我就不说了,可以到下面找源代码看看,每一部分是什么功能在源代码里面已经说的很清楚了。
看源代码的时候要穿插着看看value.py的内容,因为我大部分的值和常量都是放在这个文件里面的,就类似一个大容器,程序运行需要的东西都放在里面,而其他文件相当于执行各个功能的程序,时不时的从value.py文件里取或存放东西,各个文件之间的联系也是通过value.py实现的。
这里我不会介绍那个人机是怎么做到的(确切的说,那不能算是人机,只是一个半成品)。
下面我将着重说明一些特殊的操作是怎么做到的。
【透明的按钮】
这个透明是真真确确的透明,但这个按钮是假的,它并非tkinter模块中自带的那个Button类,也不是我重写继承于它的类,这个里面的按钮和tkinter里面自带的按钮完全不是一个品种!
我们知道,在tkinter模块里面只有少数的几种控件可以插入图片,如Label控件、Button控件和Canvas控件等等。一般我们都是用Canvas控件来插入图片的,毕竟Canvas控件叫画布控件,专门就是来搞这个事的。
这里,我们有两种方法使得按钮透明
第一种,给按钮插入图片,只不过这个图片就是背景的一部分(背景一般由Canvas控件插入),这样就看起来按钮透明,但是!这样就要裁剪背景图片来产生那些插入按钮的图片,过于复杂和繁琐。如果我要10000个透明的按钮,每一个位置都不一样,那岂不是要裁剪出10000个图片?不仅占用内存,而且也不现实。
第二种,也是我这里采用的方法,用Canvas控件,结合bind函数进行事件绑定,我们就能做到“以假乱真”,简单说,我这里的按钮是在Canvas控件上画出来的,只不过在我们鼠标经过它的位置范围和点击的时候会呈现出不同的效果,看起来就像是一个按钮了。以我这里的按钮为例,它实际就是俩矩形框加上一个文字罢了!
后面的操作,想必大家都知道了,就不用我说了,强烈建议大家用第二种方法。
【流畅的画面切换】
屏幕录像时有点卡,导致动图看起来卡,实际上是很流畅的。
其实这个有很多方法都可以实现的,比如每个页面可以用Frame控件“框”起来,然后就写一个时间函数,让当前的页面与你要切换的页面一起按照一个速度平移就行,我的速度函数是三角函数的一部分(并非半个周期,而是偏移了一点,这样就会有一个回弹的效果),这样就能让它先慢后快再慢,看起来就有内味儿了。
对了,棋盘上棋子移动的动画效果也是这个原理。
【主题设置的实现】
其实在同一目录下的资源文件夹resources里面,有一个cache.txt的文件,里面只写了一个数字(1~5),代表下次打开程序时的主题号,所以每次更换主题要重启(其实可以不用这样,但要实现随点随改的话,代码里面有很多很多部分要修改,没有必要)。主题颜色是由很多部分组成的,value.py源代码里面有,我就不详说了。
【文本滚动效果】
还记得那个“制作人员”的界面吗?切换后会有一个滚动的文本效果(【效果展示】里面有)
那个背景是一个Canvas控件实现的,而那个滚动的文本其实也是一个Canvas控件,只是小一点,两个Canvas控件的图片是同一张,小控件的图片并非由第一张裁剪得到,它只是展示原图片的一部分(适当的部分),导致我们看不出来罢了!
修改一下展示的部分(value.py中修改),效果就是这样的(如下图):
滚动的文本也只是在小Canvas控件里面,所以不会滚动到外面去。
关于文本会动这件事,实际上就是反复修改文本显示的位置的纵坐标,按时间以一定的速度向上移动。
对了,鼠标放在小Canvas控件上时,文本会停止滚动哦!
同样的道理,在主界面右上角的那个“下棋记录”显示框里显示的文本也是滚动的,只不过这里的滚动由玩家控制(鼠标中键滚动),也是一样,不会滚出那个框(看起来好像没有框,实际上有的)
【小插曲】
其实本来还有一个我想实现的操作,就是在进行人机对战的时候,我们走了一步,人机需要运算一会儿(大概0.5秒)才会走一步,这短暂的时间里程序会“卡”(未响应),为了解决这个问题,(个人认为)应该要用多线程模块,将人机的运算与界面的显示分成两个线程。
只可惜,不知道是什么BUG,我实在是没能实现(容我以后再研究研究吧!)
【其他】
关于其他一些是怎么实现的,实际上看源代码就很容易的了解了(有注释的)
整个程序除了AI.py文件中引入了deepcopy模块以外,其他的文件都只引入了tkinter模块,没有其他的内置模块了。
可能比较难懂的地方就是play.py中的“路径计算”部分了,那一部分是在解决判定哪个地方能不能走的问题,以方便显示出选中子可以走(黄色框显示)和可以吃子的位置(红色框显示)。对于每一类子都有不同的走法,大部分都比较容易实现,除了两个恶心玩意儿 —— 炮(隔子吃)和将与帅的“白脸将”(将帅碰面)情形。
棋盘上的子在程序运行时,实际上只是一个二维列表罢了(如下):
[[ 7, 5, 3, 1, 0, 2, 4, 6, 8],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1, 9,-1,-1,-1,-1,-1,10,-1],
[11,-1,12,-1,13,-1,14,-1,15],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
# 楚河 · 汉界 #
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[27,-1,28,-1,29,-1,30,-1,31],
[-1,25,-1,-1,-1,-1,-1,26,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[23,21,19,17,16,18,20,22,24]]
其中,0~31分别代表黑方16个棋子和红方16个棋子,而-1则代表“空”,棋子的移动也只是该列表的值发生相应变化,而棋盘上棋子的变化只是对该列表的变化做出相应的反应而已。
至于为什么要用-1代表空,而不用0这件事,是为了方便后续对其他棋子的操控(它们的代号为0到31,恰好是一个32长度的列表的元素索引)
【源代码展示】
【注:源代码由多个文件构成,启动文件为:Luncher.py】
【Luncher.py】
# 启动程序 #
from tkinter import *
from initialization import initialization
from buttonbind import buttonbind
from mouse import mouse
from value import value
from play import play
from rule import rule
initialization() #界面初始化
buttonbind() #关联处理
mouse() #实时显示鼠标位置
play() #玩家走子
rule() #执行规则
value.game.mainloop() #启动窗口
【initialization.py】
# 界面初始化 #
from tkinter import *
from value import value
class initialization:
def __init__(self):
self.board_initialization()#棋盘初始化
self.peice_initialization()#棋子初始化
self.face_initialization()#图像初始化
def board_initialization(self,w=3,l=12):#棋盘初始化
value.canvas.place(width=960,height=500)
value.canvas.create_image(480,250,image=value.background)#背景
value.canvas.create_rectangle(275,20,685,480,width=3,outline=value.colorlis[0])#外框
value.canvas.create_rectangle(280,25,680,475,outline=value.colorlis[0])#内框
value.canvas.create_line(430,25,530,125,fill=value.colorlis[0])#两个“×”
value.canvas.create_line(430,375,530,475,fill=value.colorlis[0])
value.canvas.create_line(430,125,530,25,fill=value.colorlis[0])
value.canvas.create_line(430,475,530,375,fill=value.colorlis[0])
for y in [175,325]:#“十”字形
for i in [(280,y),(380,y),(480,y),(580,y),(680,y),(330,y+50*(-1)**(y//150)),(630,y+50*(-1)**(y//150))]:
if i[0] != 280:
value.canvas.create_line(i[0]-w,i[1]-w,i[0]-w-l,i[1]-w,width=2,fill=value.colorlis[0])#左上
value.canvas.create_line(i[0]-w,i[1]-w,i[0]-w,i[1]-w-l,width=2,fill=value.colorlis[0])
value.canvas.create_line(i[0]-w,i[1]+w+1,i[0]-w-l,i[1]+w+1,width=2,fill=value.colorlis[0])#左下
value.canvas.create_line(i[0]-w,i[1]+w+1,i[0]-w,i[1]+w+l+1,width=2,fill=value.colorlis[0])
if i[0] != 680:
value.canvas.create_line(i[0]+w+1,i[1]-w,i[0]+w+l+1,i[1]-w,width=2,fill=value.colorlis[0])#右上
value.canvas.create_line(i[0]+w+1,i[1]-w,i[0]+w+1,i[1]-w-l,width=2,fill=value.colorlis[0])
value.canvas.create_line(i[0]+w+1,i[1]+w+1,i[0]+w+l+1,i[1]+w+1,width=2,fill=value.colorlis[0])#右下
value.canvas.create_line(i[0]+w+1,i[1]+w+1,i[0]+w+1,i[1]+w+l+1,width=2,fill=value.colorlis[0])
for i in range(75,425+1,50):
value.canvas.create_line(280,i,680,i,fill=value.colorlis[0])#横线
for i in range(330,630+1,50):#竖线
value.canvas.create_line(i,25,i,225,fill=value.colorlis[0])
value.canvas.create_line(i,275,i,475,fill=value.colorlis[0])
value.canvas.create_text(480,250,text='楚河 · 汉界',font=('华文新魏',35),fill=value.colorlis[0])#“楚河 · 汉界”
def peice_initialization(self,count=-1):#棋子初始化
for ylis in value.board_lists:#摆子
count += 1
for i in ylis:
if i != -1:
x,y = count,ylis.index(i)
s_x,s_y = x*50+25,y*50+280
value.peice_lists[i] = value.canvas.create_image(s_y,s_x,image=value.resourcelists[i])
def button_initialization(self):#按钮初始化 (allbind.py中进行)
self.bo1 = value.canvas.create_rectangle(720,315,940,360,width=3,outline=value.colorlis[1])#“设置”按钮
self.bi1 = value.canvas.create_rectangle(725,320,935,355,outline=value.colorlis[1])
self.bt1 = value.canvas.create_text(830,338,text='设 置',font=('华文新魏',20),fill=value.colorlis[0])
self.bo2 = value.canvas.create_rectangle(720,375,940,420,width=3,outline=value.colorlis[1])#“悔棋”按钮
self.bi2 = value.canvas.create_rectangle(725,380,935,415,outline=value.colorlis[1])
self.bt2 = value.canvas.create_text(830,398,text='悔 棋',font=('华文新魏',20),fill=value.colorlis[0])
self.bo3 = value.canvas.create_rectangle(720,435,940,480,width=3,outline=value.colorlis[1])#“退出”按钮
self.bi3 = value.canvas.create_rectangle(725,440,935,475,outline=value.colorlis[1])
self.bt3 = value.canvas.create_text(830,458,text='退 出',font=('华文新魏',20),fill=value.colorlis[0])
self.bo4 = value.canvas.create_rectangle(20,315,240,360,width=3,outline=value.colorlis[1])#“帮助”按钮
self.bi4 = value.canvas.create_rectangle(25,320,235,355,outline=value.colorlis[1])
self.bt4 = value.canvas.create_text(130,338,text='帮 助',font=('华文新魏',20),fill=value.colorlis[0])
self.bo5 = value.canvas.create_rectangle(20,375,240,420,width=3,outline=value.colorlis[1])#“重新开始”按钮
self.bi5 = value.canvas.create_rectangle(25,380,235,415,outline=value.colorlis[1])
self.bt5 = value.canvas.create_text(130,398,text='重新开始',font=('华文新魏',20),fill=value.colorlis[0])
self.bo6 = value.canvas.create_rectangle(20,435,240,480,width=3,outline=value.colorlis[1])#“制作人员”按钮
self.bi6 = value.canvas.create_rectangle(25,440,235,475,outline=value.colorlis[1])
self.bt6 = value.canvas.create_text(130,458,text='制作人员',font=('华文新魏',20),fill=value.colorlis[0])
self.button_lists =[self.bo1,self.bi1,self.bt1,self.bo2,self.bi2,self.bt2,self.bo3,self.bi3,self.bt3,
self.bo4,self.bi4,self.bt4,self.bo5,self.bi5,self.bt5,self.bo6,self.bi6,self.bt6]
def face_initialization(self):#图像初始化
value.canvas.create_rectangle(720,20,940,300,width=3,outline=value.colorlis[1])#步骤显示板
value.canvas.create_rectangle(725,25,935,295,outline=value.colorlis[1])
value.canvas.create_text(830,40,text='下棋记录',font=('华文新魏',20),fill=value.colorlis[0])
value.canvas2.place(width=205,height=240,x=728,y=52)
value.canvas2.create_image(480-728,240-52,image=value.background)
value.canvas2.create_image(100,100,image=value.face)
def back(event):
if len(value.steptextlis) > 12:
if event.delta < 0 and value.firststep > 250-len(value.steptextlis)*20:
for i in value.steptextlis:
value.canvas2.move(i,0,-20)
value.firststep -= 20
elif event.delta > 0 and value.firststep <= -10:
for i in value.steptextlis:
value.canvas2.move(i,0,20)
value.firststep += 20
value.canvas2.bind('',back)
value.canvas.create_rectangle(20,20,240,300,width=3,outline=value.colorlis[1])#信息显示板
value.canvas.create_rectangle(25,25,235,295,outline=value.colorlis[1])
value.canvas.create_image(130,160,image=value.face)
value.canvas.create_text(130,40,text='游戏信息',font=('华文新魏',20),fill=value.colorlis[0])
def buttonchange(self,n,mode):#按钮皮肤
if mode == 'change1':#模式一:经过
for i in self.button_lists:
if (n-1)*3<=self.button_lists.index(i)
【mouse.py】
# 鼠标位置显示 #
from tkinter import *
from value import value
class mouse:
def __init__(self):
self.tempx,self.tempy = 0,0#初始化鼠标位置
value.game.bind('',self.callback)#关联鼠标移动事件
def callback(self,event,color=value.colorlis[-1],dv1=25,dv2=10,w=2):
if 250< event.x <705:#判断是否越界
event.x,event.y = 50*int((event.x-255)/50)+280,50*int(event.y/50)+25#处理鼠标位置
if (event.x,event.y) != (self.tempx,self.tempy):#显示框
self.tempx,self.tempy = event.x,event.y
try:#删除之前的位置
for i in [self.l1,self.l2,self.l3,self.l4,self.l5,self.l6,self.l7,self.l8]:
value.canvas.delete(i)
except:pass
self.l1 = value.canvas.create_line(event.x-dv1,event.y-dv1,event.x-dv1,event.y-dv2,width=w,fill=color)#左上
self.l2 = value.canvas.create_line(event.x-dv1,event.y-dv1,event.x-dv2,event.y-dv1,width=w,fill=color)
self.l3 = value.canvas.create_line(event.x-dv1,event.y+dv1,event.x-dv1,event.y+dv2,width=w,fill=color)#左下
self.l4 = value.canvas.create_line(event.x-dv1,event.y+dv1,event.x-dv2,event.y+dv1,width=w,fill=color)
self.l5 = value.canvas.create_line(event.x+dv1,event.y-dv1,event.x+dv1,event.y-dv2,width=w,fill=color)#右上
self.l6 = value.canvas.create_line(event.x+dv1,event.y-dv1,event.x+dv2,event.y-dv1,width=w,fill=color)
self.l7 = value.canvas.create_line(event.x+dv1,event.y+dv1,event.x+dv2,event.y+dv1,width=w,fill=color)#右下
self.l8 = value.canvas.create_line(event.x+dv1,event.y+dv1,event.x+dv1,event.y+dv2,width=w,fill=color)
【play.py】
# 玩家移动模块 #
from tkinter import *
from value import value
from rule import rule
class play():
def __init__(self):
value.canvas.bind('',self.move)
def move(self,event):#移动操作
if 250< event.x <705:
value.play_count = 1 if value.play_count == 0 else 0
x,y = int((event.x-255)/50),int(event.y/50)
if value.play_count == 1 and value.board_lists[y][x] in value.team and value.DEAD == 0:#选中棋子
self.peice_info(x,y,1)
value.play_tampvalue = value.board_lists[y][x]
value.play_tamp_x,value.play_tamp_y = x,y
value.board_lists[y][x] = -1
elif value.play_count == 0 and value.info_lists[y][x] != 0:#移动棋子
self.peice_info(x,y,0)
if value.board_lists[y][x] != -1:
value.canvas.move(value.peice_lists[value.board_lists[y][x]],0,600)
value.board_lists[y][x] = value.play_tampvalue
if [value.play_tamp_x,value.play_tamp_y] != [x,y]:
dx,dy = (x-value.play_tamp_x)*50,(y-value.play_tamp_y)*50
self.fluent(dx,dy)
rule.Dead(self)
value.step += 1
rule.stepinfo(self,dy,x)
rule.Modes(self)
rule.gameinfo(self)
value.regretuselis.append(eval(str(value.board_lists)))
rule.AIprocess(self)
elif value.play_count == 0 and value.info_lists[y][x] == 0:#换选棋子
value.board_lists[value.play_tamp_y][value.play_tamp_x] = value.play_tampvalue
self.peice_info(x,y,0)
if value.board_lists[y][x] in value.team and [value.play_tamp_x,value.play_tamp_y] != [x,y]:
self.peice_info(x,y,1)
value.play_tampvalue = value.board_lists[y][x]
value.play_tamp_x,value.play_tamp_y = x,y
value.board_lists[y][x] = -1
value.play_count = 1
else:
value.play_count = 1 if value.play_count == 0 else 0#清除操作
def fluent(self,dx,dy,flu=0,lis=[0.02,0.02,0.06,0.1,0.18,0.3,0.18,0.1,0.06,0.02,0.02,-0.06]):#移动流畅函数
value.canvas.move(value.peice_lists[value.play_tampvalue],lis[flu]*dx,lis[flu]*dy)
if flu < 11:
value.canvas.after(10,self.fluent,dx,dy,flu+1)
def peice_info(self,x,y,count):#路径计算
if count == 1:
i = value.board_lists[y][x]
if i in [0,16]:#将帅
self.info(x,y,M=2)
for sx,sy in zip([x+1,x-1,x,x],[y,y,y+1,y-1]):
if 0+7*(i//16)<=sy<=2+7*(i//16) and 3<=sx<=5:
try:
if value.board_lists[sy][sx] == -1:
self.info(sx,sy)
else:
self.info(sx,sy,M=1,i=i)
except:
pass
start_y = y+(-1)**(i//16)# “白脸将” #
key_y = 7*(1-(i//16))
for sy in range(start_y,start_y+9*(-1)**(i//16),(-1)**(i//16)):
if key_y<=sy<=key_y+2:
if value.board_lists[sy][x] in [0,16]:
self.info(x,sy,M=1,i=i)
else:
try:
if value.board_lists[sy][x] != -1:
break
except:
break
if i in [1,2,17,18]:#士仕
self.info(x,y,M=2)
for sx,sy in zip([x+1,x-1,x+1,x-1],[y+1,y-1,y-1,y+1]):
if 0+7*(i//17)<=sy<=2+7*(i//17) and 3<=sx<=5:
try:
if value.board_lists[sy][sx] == -1:
self.info(sx,sy)
else:
self.info(sx,sy,M=1,i=i)
except:
pass
elif i in [3,4,19,20]:#象相(撇腿)
self.info(x,y,M=2)
for sx,sy in zip([x+2,x-2,x+2,x-2],[y+2,y-2,y-2,y+2]):
if 0+5*(i//19)<=sy<=4+5*(i//19) and 0<=sx<=8 and value.board_lists[(sy+y)//2][(sx+x)//2] == -1:
try:
if value.board_lists[sy][sx] == -1:
self.info(sx,sy)
else:
self.info(sx,sy,M=1,i=i)
except:
pass
elif i in [5,6,21,22]:#马(撇腿)
self.info(x,y,M=2)
for sx,sy in zip([x+2,x+2,x-2,x-2,x+1,x+1,x-1,x-1],[y+1,y-1,y+1,y-1,y+2,y-2,y+2,y-2]):
if 0<=sy<=9 and 0<=sx<=8 and value.board_lists[round((sy+2*y)/3)][round((sx+2*x)/3)] == -1:
try:
if value.board_lists[sy][sx] == -1:
self.info(sx,sy)
else:
self.info(sx,sy,M=1,i=i)
except:
pass
elif i in [7,8,23,24]:#车
self.info(x,y,M=2)
for lis in [range(1,10),range(-1,-10,-1)]:
for d in lis:
try:
if x+d>=0:
if value.board_lists[y][x+d] == -1:
self.info(x+d,y)
else:
self.info(x+d,y,M=1,i=i);break
else:
break
except:
pass
for d in lis:
try:
if y+d>=0:
if value.board_lists[y+d][x] == -1:
self.info(x,y+d)
else:
self.info(x,y+d,M=1,i=i);break
else:
break
except:
pass
elif i in [9,10,25,26]:#炮
self.info(x,y,M=2)
for lis in [range(1,10),range(-1,-10,-1)]:
self.pao_c = 0
for d in lis:
try:
if x+d>=0:
if value.board_lists[y][x+d] == -1 and self.pao_c == 0:
self.info(x+d,y)
elif value.board_lists[y][x+d] != -1:
self.pao_c += 1
if self.pao_c == 2:
self.info(x+d,y,M=1,i=i)
break
else:
break
except:
pass
self.pao_c = 0
for d in lis:
try:
if y+d>=0:
if value.board_lists[y+d][x] == -1 and self.pao_c == 0:
self.info(x,y+d)
elif value.board_lists[y+d][x] != -1:
self.pao_c += 1
if self.pao_c == 2:
self.info(x,y+d,M=1,i=i)
break
else:
break
except:
pass
elif i in [11,12,13,14,15,27,28,29,30,31]:#卒兵
self.info(x,y,M=2)
if (y<5 and i//27==0)or(415)or(i>15 and 0<=value.board_lists[sy][sx]<=15):
value.info_lists[sy][sx] = 2
s_x,s_y = sx*50+280,sy*50+25
value.play_tampvalue = value.canvas.create_rectangle(s_x-25,s_y-25,s_x+25,s_y+25,outline=value.colorlis[8],width=2)
elif M == 2:#自己
s_x,s_y = sx*50+280,sy*50+25
value.play_tampvalue = value.canvas.create_rectangle(s_x-25,s_y-25,s_x+25,s_y+25,outline=value.colorlis[9],width=2)
value.templists.append(value.play_tampvalue)
【buttonbind.py】
# 关联处理 #
from tkinter import *
from value import value
from buttonfunction import function
from initialization import initialization
class buttonbind:
def __init__(self):
self.changelis = ['change1','change2','change3']
value.game.bind('',lambda event:self.buttonchange(event,1,mode=2))#按下
value.canvas.bind('',lambda event:self.buttonchange(event,0,mode=1))#经过及离开
value.canvas.bind('',lambda event:self.buttonchange(event,1,mode=2))#按下
value.canvas.bind('',lambda event:self.buttonchange(event,0,0,0))#松开
value.game.bind('',self.keypress_bind)#键盘响应
self.setbind()
initialization.button_initialization(self)#按钮初始化
def buttonchange(self,event,change,mode=0,m=''):
x,y = event.x,event.y
change = self.changelis[change]
if (720<=x<=935 and 320<=y<=355)or m=='s':#关联“设置”按钮
initialization.buttonchange(self,1,change)
if m in ['s',0]:
function.b1_func(self)
elif(720<=x<=935 and 380<=y<=415)or m=='r':#关联“悔棋”按钮
initialization.buttonchange(self,2,change)
if m in ['r',0]:
function.b2_func(self)
elif(720<=x<=935 and 440<=y<=475)or m=='q':#关联“退出”按钮
initialization.buttonchange(self,3,change)
if m in ['q',0]:
function.b3_func(self)
elif (20<=x<=235 and 320<=y<=355)or m=='h':#关联“帮助”按钮
initialization.buttonchange(self,4,change)
if m in ['h',0]:
function.b4_func(self)
elif (20<=x<=235 and 380<=y<=415)or m=='a':#关联“重新开始”按钮
initialization.buttonchange(self,5,change)
if m in ['a',0]:
function.b5_func(self)
elif (20<=x<=235 and 440<=y<=475)or m=='m':#关联“制作人员”按钮
initialization.buttonchange(self,6,change)
if m in ['m',0]:
function.b6_func(self)
elif mode == 1:
initialization.buttonchange(self,0,'change3')#关联离开按钮
elif mode == 2:
self.buttonchange(event,0,mode=1)#按下
def keypress_bind(self,event,count=0):#键盘响应
m = event.char
if count == 0:
if m == 's':
initialization.buttonchange(self,1,'change1')
elif m == 'r':
initialization.buttonchange(self,2,'change1')
elif m == 'q':
initialization.buttonchange(self,3,'change1')
elif m == 'h':
initialization.buttonchange(self,4,'change1')
elif m == 'i':
initialization.buttonchange(self,5,'change1')
elif m == 'm':
initialization.buttonchange(self,6,'change1')
value.game.after(1,self.keypress_bind,event,1)
elif count == 1:
self.buttonchange(event,0,0,m)
value.game.after(80,self.keypress_bind,event,2)
else:
self.buttonchange(event,0,mode=1)
def setbind(self):
for i in value.slis+[value.sbt1,value.sbt2]:
i.bind('',lambda event,i=i:enter(i))
i.bind('',lambda event,i=i:leave(i))
def enter(i):
i.config(bg=value.colorlis[4])
def leave(i):
i.config(bg=value.colorlis[3])
【buttonfunction.py】
# 按钮功能 #
from tkinter import *
from rule import rule
from value import value
from setpage import setpage
from initialization import initialization
class function:
def b1_func(self):#“设置”按钮
for i in value.slis:
i.place(width=200,height=50,x=30,y=value.slis.index(i)*50+70)
for i in value.slis:
i.config(command=lambda i=i:setpage.set_button(self,value.slis.index(i)+1))
value.sbt1.config(command=lambda:func(2))
value.sbt2.config(command=lambda:reset())
def func(m,c=0,flulis=value.flulis):#页面切换
if m == 1:
x1,x2 = -960*flulis[c],960*(1-flulis[c])
elif m==2:
x1,x2 = 960*(flulis[c]-1),960*flulis[c]
value.canvas.place(width=960,height=500,x=x1)
value.set_canvas.place(width=960,height=500,x=x2)
if c == 7 and value.step == 0:
rule.pleaseprocess(self)
rule.gameinfo(self)
if c<14:
value.game.after(30,func,m,c+1)
def reset():pass########################
func(1)
def b2_func(self):#“悔棋”按钮
if len(value.steptextlis) > 1:
try:
if len(value.steptextlis) > 12:
for i in value.steptextlis:
value.canvas2.move(i,0,250-len(value.steptextlis)*20-value.firststep)
value.firststep = 250-len(value.steptextlis)*20
except:
pass
for i in value.steptextlis:
value.canvas2.move(i,0,40)
value.canvas2.delete(value.steptextlis[-1])
value.canvas2.delete(value.steptextlis[-2])
value.steptextlis = value.steptextlis[:-2]
value.firststep += 40
value.step -= 2
for i in value.peice_lists:
value.canvas.delete(i)
value.board_lists = eval(str(value.regretuselis[-3]))
initialization.peice_initialization(self)
value.regretuselis = value.regretuselis[:-2]
value.info_lists = [[0]*9 for _ in range(10)]
for i in value.templists:
value.canvas.delete(i)
value.templists = []
value.play_count = 0
value.play_temp_x,value.play_temp_y = -2,-2
value.play_tempvalue = -2
value.DEAD = 0
value.regret += 1
rule.gameinfo(self)
def b3_func(self):#“退出”按钮
value.game.quit()
def b4_func(self):#“帮助”按钮
value.help_canvas.bind('',lambda event:func(2))
def func(m,c=0,flulis=value.flulis):#页面切换
if m == 1:
x1,x2 = 960*flulis[c],960*(flulis[c]-1)
elif m==2:
x1,x2 = 960*(1-flulis[c]),-960*flulis[c]
value.canvas.place(width=960,height=500,x=x1)
value.help_canvas.place(width=960,height=500,x=x2)
if c<14:
value.game.after(30,func,m,c+1)
func(1)
def b5_func(self):#“重新开始”按钮
value.board_lists =[[ 7, 5, 3, 1, 0, 2, 4, 6, 8],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1, 9,-1,-1,-1,-1,-1,10,-1],
[11,-1,12,-1,13,-1,14,-1,15],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[27,-1,28,-1,29,-1,30,-1,31],
[-1,25,-1,-1,-1,-1,-1,26,-1],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[23,21,19,17,16,18,20,22,24]]
value.info_lists = [[0]*9 for _ in range(10)]
for i in value.peice_lists:
value.canvas.delete(i)
for i in value.templists:
value.canvas.delete(i)
initialization.peice_initialization(self)
value.templists = []
value.play_count = 0
value.play_temp_x,value.play_temp_y = -2,-2
value.play_tempvalue = -2
value.DEAD = 0
for i in value.steptextlis:
value.canvas2.delete(i)
value.steptextlis = []
value.firststep = 250
value.step = 0
value.r_please,value.b_please = '无','无'
for i in range(6):
value.p_r[i] == 0
value.p_b[i] == 0
value.regret = 0
value.regretuselis = [eval(str(value.board_lists))]
value.player = '红方' if value.first == '黑方' else '黑方'
rule.Modes(self)
rule.gameinfo(self)
def b6_func(self):#“制作人员”按钮
text = value.make_canvas2.create_text(150,580,text=value.maketext,font=('华文新魏',20),fill='yellow',justify='center')
value.make_canvas.bind('',lambda event:func(2))
value.make_canvas2.bind('',lambda event:func(2))
value.make_canvas2.bind('',lambda event:speed(0))
value.make_canvas2.bind('',lambda event:speed(1))
def speed(n):
value.textspeed = 0 if n == 0 else -1
def makefunc(i=580):
value.make_canvas2.move(text,0,value.textspeed)
if i>-360:
value.make_canvas2.after(60,makefunc,i-1)
def func(m,c=0,flulis=value.flulis):#页面切换
if m == 1:
x1,x2 = 960*flulis[c],960*(flulis[c]-1)
elif m == 2:
x1,x2 = 960*(1-flulis[c]),-960*flulis[c]
if c == 14:
value.make_canvas2.delete(text)
value.canvas.place(width=960,height=500,x=x1)
value.make_canvas.place(width=960,height=500,x=x2)
if c<14:
value.game.after(30,func,m,c+1)
else:
makefunc()
func(1)
【setpage.py】
# 设置页面 #
from tkinter import *
from value import value
class setpage:
def set_button(self,n):
try:#切换时删除之前的
value.text_canvas.unbind('')
value.text_canvas.unbind('')
value.text_canvas.unbind('')
value.text_canvas.unbind('')
for i in value.s1_+value.s2_+value.s3_+value.s4_+value.s5_+value.s6_+value.s7_+value.s8_:
value.text_canvas.delete(i)
except:pass
if n == 1:#模式设置
a = value.text_canvas.create_text(100,25,text='模式设置',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50,fill=value.colorlis[0])
c = value.text_canvas.create_rectangle(30,60,130,90,outline=value.colorlis[1])
d = value.text_canvas.create_text(80,75,text='人机模式',font=('华文新魏',15))
e = value.text_canvas.create_rectangle(150,60,250,90,outline=value.colorlis[1])
f = value.text_canvas.create_text(200,75,text='对弈模式',font=('华文新魏',15))
g = value.text_canvas.create_rectangle(270,60,370,90,outline=value.colorlis[1])
h = value.text_canvas.create_text(320,75,text='机机模式',font=('华文新魏',15))
i = value.text_canvas.create_rectangle(390,60,490,90,outline=value.colorlis[1])
j = value.text_canvas.create_text(440,75,text='网络模式',font=('华文新魏',15))
k = value.text_canvas.create_rectangle(510,60,610,90,outline=value.colorlis[1])
l = value.text_canvas.create_text(560,75,text='闯关模式',font=('华文新魏',15))
m = value.text_canvas.create_rectangle(30,100,680,200,outline=value.colorlis[1])#描述框
n = value.text_canvas.create_text(180,220,text='(只有未下棋时才可设置该选项!)',font=('华文新魏',15))
text1 = '人类与电脑之间的决斗!\n你以为你能战胜电脑吗?不!你错了!\n真正的答案是:我也不知道!'
text2 = '人与人之间的对决!\n不会吧,不会吧,居然有人认为有和棋?\n这只是场你死我活的战斗!'
text3 = '电脑和电脑战斗!\n有些人啊,就喜欢坐在那儿看戏!\n这明明不关你的事,这只是个烧电脑的实验罢了!'
text4 = '想和网上的朋友玩,那就来这里吧!\n通过局域网的方式,你将和对面的那个傻子对局!\n啊对对对,对面也在和傻子(你)对局!'
text5 = '接手残局,勇闯鬼门关!\n你今天要是走不出鬼门关,就别回来了!\n因为你回不来了!'
text = [text1,text2,text3,text4,text5]
value.text_canvas.itemconfig([d,f,h,j,l][value.modelis.index(value.mode)],fill=value.colorlis[6])
txt = value.text_canvas.create_text(355,150,text=text[value.modelis.index(value.mode)],font=('华文新魏',15),justify='center')
value.s1_ = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,txt]
def callback11(event):
for s,t in zip(range(30,511,120),[d,f,h,j,l]):
if s<=event.x<=s+100 and 60<=event.y<=90 and value.step == 0:
for z in [d,f,h,j,l]:
value.text_canvas.itemconfig(z,fill='black')
value.text_canvas.itemconfig(t,fill=value.colorlis[6])
value.text_canvas.itemconfig(txt,text=text[(s-30)//120])
value.mode = value.modelis[(s-30)//120]
def callback12(event):
if 30<=event.x<130 and 60<=event.y<=90:
value.text_canvas.itemconfig(c,fill=value.colorlis[4])
elif 150<=event.x<250 and 60<=event.y<=90:
value.text_canvas.itemconfig(e,fill=value.colorlis[4])
elif 270<=event.x<370 and 60<=event.y<=90:
value.text_canvas.itemconfig(g,fill=value.colorlis[4])
elif 390<=event.x<490 and 60<=event.y<=90:
value.text_canvas.itemconfig(i,fill=value.colorlis[4])
elif 510<=event.x<610 and 60<=event.y<=90:
value.text_canvas.itemconfig(k,fill=value.colorlis[4])
else:
for z in [c,e,g,i,k]:
value.text_canvas.itemconfig(z,fill=value.colorlis[3])
value.text_canvas.bind('',callback11)
value.text_canvas.bind('',callback12)
elif n == 2:#棋局设置
a = value.text_canvas.create_text(100,25,text='棋局设置',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50,fill=value.colorlis[0])
c = value.text_canvas.create_text(70,75,text='先下棋方',font=('华文新魏',15))
d = value.text_canvas.create_rectangle(30,100,130,130,outline=value.colorlis[0])
e = value.text_canvas.create_text(80,115,text='红方',font=('华文新魏',15))
f = value.text_canvas.create_rectangle(150,100,250,130,outline=value.colorlis[0])
g = value.text_canvas.create_text(200,115,text='黑方',font=('华文新魏',15))
h = value.text_canvas.create_text(180,360,text='(只有未下棋时才可设置该选项!)',font=('华文新魏',15))
i = value.text_canvas.create_text(70,160,text='让子设置',font=('华文新魏',15))
j = value.text_canvas.create_text(50,200,text='黑方',font=('华文新魏',15))
k = value.text_canvas.create_text(50,270,text='红方',font=('华文新魏',15))
j1= value.text_canvas.create_rectangle(30,220,130,250,outline=value.colorlis[0])
j2= value.text_canvas.create_rectangle(140,220,240,250,outline=value.colorlis[0])
j3= value.text_canvas.create_rectangle(250,220,350,250,outline=value.colorlis[0])
j4= value.text_canvas.create_rectangle(360,220,460,250,outline=value.colorlis[0])
j5= value.text_canvas.create_rectangle(470,220,570,250,outline=value.colorlis[0])
j6= value.text_canvas.create_rectangle(580,220,680,250,outline=value.colorlis[0])
k1= value.text_canvas.create_rectangle(30,290,130,320,outline=value.colorlis[0])
k2= value.text_canvas.create_rectangle(140,290,240,320,outline=value.colorlis[0])
k3= value.text_canvas.create_rectangle(250,290,350,320,outline=value.colorlis[0])
k4= value.text_canvas.create_rectangle(360,290,460,320,outline=value.colorlis[0])
k5= value.text_canvas.create_rectangle(470,290,570,320,outline=value.colorlis[0])
k6= value.text_canvas.create_rectangle(580,290,680,320,outline=value.colorlis[0])
l1= value.text_canvas.create_text(80,235,text='左车',font=('华文新魏',15))
l2= value.text_canvas.create_text(190,235,text='右车',font=('华文新魏',15))
l3= value.text_canvas.create_text(300,235,text='左炮',font=('华文新魏',15))
l4= value.text_canvas.create_text(410,235,text='右炮',font=('华文新魏',15))
l5= value.text_canvas.create_text(520,235,text='左马',font=('华文新魏',15))
l6= value.text_canvas.create_text(630,235,text='右马',font=('华文新魏',15))
m1= value.text_canvas.create_text(80,305,text='左车',font=('华文新魏',15))
m2= value.text_canvas.create_text(190,305,text='右车',font=('华文新魏',15))
m3= value.text_canvas.create_text(300,305,text='左炮',font=('华文新魏',15))
m4= value.text_canvas.create_text(410,305,text='右炮',font=('华文新魏',15))
m5= value.text_canvas.create_text(520,305,text='左马',font=('华文新魏',15))
m6= value.text_canvas.create_text(630,305,text='右马',font=('华文新魏',15))
value.s2_ = [a,b,c,d,e,f,g,h,i,j,k,j1,j2,j3,j4,j5,j6,k1,k2,k3,k4,k5,k6,l1,l2,l3,l4,l5,l6,m1,m2,m3,m4,m5,m6]
value.text_canvas.itemconfig([e,g][value.playerlis.index(value.first)//1],fill=value.colorlis[6])
for x,y,k in zip(value.p_r,value.p_b,range(6)):
if x == 1:
value.text_canvas.itemconfig([m1,m2,m3,m4,m5,m6][k],fill=value.colorlis[6])
if y == 1:
value.text_canvas.itemconfig([l1,l2,l3,l4,l5,l6][k],fill=value.colorlis[6])
def please(w,n,m):#w哪一方;n第几个;m修改值
if w == 'r':
value.p_r[n] = m
if w == 'b':
value.p_b[n] = m
def callback21(event):
if value.step == 0 and value.mode not in ['网络','闯关']:
for s,t in zip([30,150],[e,g]):
if s<=event.x<=s+100 and 100<=event.y<=130:
for z in [e,g]:
value.text_canvas.itemconfig(z,fill='black')
value.text_canvas.itemconfig(t,fill=value.colorlis[6])
value.first = value.playerlis[(s-30)//120]
value.player = value.first
if value.mode in ['对弈','网络']:
if value.player == '红方':
value.team = value.r_team
else:
value.team = value.b_team
elif value.mode == '机机':value.team = []
else:
if value.player == '红方':
value.team = value.r_team
else:
value.team = []
for s,t1,t2 in zip(range(30,581,110),[l1,l2,l3,l4,l5,l6],[m1,m2,m3,m4,m5,m6]):
if s<=event.x<=s+100 and 220<=event.y<=250:
if value.text_canvas.itemcget(t1,'fill') == 'black':
value.text_canvas.itemconfig(t1,fill=value.colorlis[6])
please('b',(s-30)//110,1)
else:
value.text_canvas.itemconfig(t1,fill='black')
please('b',(s-30)//110,0)
if s<=event.x<=s+100 and 290<=event.y<=320:
if value.text_canvas.itemcget(t2,'fill') == 'black':
value.text_canvas.itemconfig(t2,fill=value.colorlis[6])
please('r',(s-30)//110,1)
else:
value.text_canvas.itemconfig(t2,fill='black')
please('r',(s-30)//110,0)
def callback22(event):
if 30<=event.x<=130 and 100<=event.y<=130:
value.text_canvas.itemconfig(d,fill=value.colorlis[4])
elif 150<=event.x<=250 and 100<=event.y<=130:
value.text_canvas.itemconfig(f,fill=value.colorlis[4])
elif 30<=event.x<=130 and 220<=event.y<=250:
value.text_canvas.itemconfig(j1,fill=value.colorlis[4])
elif 140<=event.x<=240 and 220<=event.y<=250:
value.text_canvas.itemconfig(j2,fill=value.colorlis[4])
elif 250<=event.x<=350 and 220<=event.y<=250:
value.text_canvas.itemconfig(j3,fill=value.colorlis[4])
elif 360<=event.x<=460 and 220<=event.y<=250:
value.text_canvas.itemconfig(j4,fill=value.colorlis[4])
elif 470<=event.x<=570 and 220<=event.y<=250:
value.text_canvas.itemconfig(j5,fill=value.colorlis[4])
elif 580<=event.x<=680 and 220<=event.y<=250:
value.text_canvas.itemconfig(j6,fill=value.colorlis[4])
elif 30<=event.x<=130 and 290<=event.y<=320:
value.text_canvas.itemconfig(k1,fill=value.colorlis[4])
elif 140<=event.x<=240 and 290<=event.y<=320:
value.text_canvas.itemconfig(k2,fill=value.colorlis[4])
elif 250<=event.x<=350 and 290<=event.y<=320:
value.text_canvas.itemconfig(k3,fill=value.colorlis[4])
elif 360<=event.x<=460 and 290<=event.y<=320:
value.text_canvas.itemconfig(k4,fill=value.colorlis[4])
elif 470<=event.x<=570 and 290<=event.y<=320:
value.text_canvas.itemconfig(k5,fill=value.colorlis[4])
elif 580<=event.x<=680 and 290<=event.y<=320:
value.text_canvas.itemconfig(k6,fill=value.colorlis[4])
else:
for z in [d,f,j1,j2,j3,j4,j5,j6,k1,k2,k3,k4,k5,k6]:
value.text_canvas.itemconfig(z,fill=value.colorlis[3])
value.text_canvas.bind('',callback21)
value.text_canvas.bind('',callback22)
elif n == 3:#闯关设置
a = value.text_canvas.create_text(100,25,text='闯关设置',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50)
value.s3_ = [a,b]
elif n == 4:#主题设置
a = value.text_canvas.create_text(100,25,text='主题设置',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50,fill=value.colorlis[0])
c = value.text_canvas.create_text(70,75,text='颜色主题',font=('华文新魏',15))
d= value.text_canvas.create_rectangle(30,100,130,130,outline=value.colorlis[0])
e= value.text_canvas.create_rectangle(140,100,240,130,outline=value.colorlis[0])
f= value.text_canvas.create_rectangle(250,100,350,130,outline=value.colorlis[0])
g= value.text_canvas.create_rectangle(360,100,460,130,outline=value.colorlis[0])
h= value.text_canvas.create_rectangle(470,100,570,130,outline=value.colorlis[0])
i = value.text_canvas.create_text(80,115,text='系统默认',font=('华文新魏',15))
j = value.text_canvas.create_text(190,115,text='黑白灰',font=('华文新魏',15))
k = value.text_canvas.create_text(300,115,text='梦幻蓝',font=('华文新魏',15))
l = value.text_canvas.create_text(410,115,text='和谐绿',font=('华文新魏',15))
m = value.text_canvas.create_text(520,115,text='典雅粉',font=('华文新魏',15))
n = value.text_canvas.create_text(120,155,text='效果展示(一部分)',font=('华文新魏',15))
o = value.text_canvas.create_text(170,330,text='(该设置项将在游戏重启后生效)',font=('华文新魏',15))
p = value.text_canvas.create_rectangle(30,180,680,300,fill=value.colorlis[3],outline=value.colorlis[1])
q = value.text_canvas.create_rectangle(280,210,430,270,outline=value.colorlis[5],fill=value.colorlis[4],width=3)
r = value.text_canvas.create_text(335,240,text='中国',font=('华文新魏',15))
s = value.text_canvas.create_text(375,240,text='象棋',font=('华文新魏',15),fill=value.colorlis[6])
value.s4_ = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s]
value.text_canvas.itemconfig([i,j,k,l,m][value.theme-1],fill=value.colorlis[6])
def callback41(event):
if 30<=event.x<=130 and 100<=event.y<=130:
value.text_canvas.itemconfig(d,fill=value.colorlis[4])
elif 140<=event.x<=240 and 100<=event.y<=130:
value.text_canvas.itemconfig(e,fill=value.colorlis[4])
elif 250<=event.x<=350 and 100<=event.y<=130:
value.text_canvas.itemconfig(f,fill=value.colorlis[4])
elif 360<=event.x<=460 and 100<=event.y<=130:
value.text_canvas.itemconfig(g,fill=value.colorlis[4])
elif 470<=event.x<=570 and 100<=event.y<=130:
value.text_canvas.itemconfig(h,fill=value.colorlis[4])
else:
for z in [d,e,f,g,h]:
value.text_canvas.itemconfig(z,fill=value.colorlis[3])
def callback42(event):
for x in range(30,471,110):
if x<=event.x<=x+100 and 100<=event.y<=130:
for z in [i,j,k,l,m]:
value.text_canvas.itemconfig(z,fill='black')
value.text_canvas.itemconfig([i,j,k,l,m][(x-30)//110],fill=value.colorlis[6])
value.theme = (x-30)//110+1
with open('resources\\cache.txt','w') as infile:
infile.write(str(value.theme))
themeprocess(value.theme)
def themeprocess(n):
value.text_canvas.itemconfig(p,fill=value.colorlists[n-1][3],outline=value.colorlists[n-1][1])
value.text_canvas.itemconfig(q,fill=value.colorlists[n-1][4],outline=value.colorlists[n-1][5])
value.text_canvas.itemconfig(s,fill=value.colorlists[n-1][6])
value.text_canvas.bind('',callback41)
value.text_canvas.bind('',callback42)
elif n == 5:#音效设置
a = value.text_canvas.create_text(100,25,text='音效设置',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50)
value.s5_ = [a,b]
elif n == 6:#窗口设置
self.x = int((1-value.alpha)*500+59)
text1 = '设置范围为0~100,0为不透明,100为完全透明,默认为0(不透明)'
a = value.text_canvas.create_text(100,25,text='窗口设置',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50,fill=value.colorlis[0])
c = value.text_canvas.create_text(100,75,text='设置窗口透明度',font=('华文新魏',15))
d = value.text_canvas.create_rectangle(30,100,680,150,outline=value.colorlis[0])
e = value.text_canvas.create_line(60,125,590,125,fill=value.colorlis[0])
f = value.text_canvas.create_rectangle(self.x,115,self.x+30,135,fill=value.colorlis[6])
g = value.text_canvas.create_text(340,180,text=text1,font=('华文新魏',15))
h = value.text_canvas.create_text(45,125,text='0',font=('华文新魏',15))
i = value.text_canvas.create_text(610,125,text='100',font=('华文新魏',15))
j = value.text_canvas.create_line(630,110,630,140,fill=value.colorlis[0])
k = value.text_canvas.create_text(655,125,text=str((self.x-59)//5),font=('华文新魏',15),fill=value.colorlis[6])
value.s7_ = [a,b,c,d,e,f,g,h,i,j,k]
value.text_canvas.bind('',lambda event:callback61(event))
value.text_canvas.bind('',lambda event:callback62(event))
def callback61(event):
self.temp_x = event.x
def callback62(event):
if 100<=event.y<=150 and 60<=event.x<=590:
if (event.x-self.temp_x > 0 and self.x <=560)or(event.x-self.temp_x < 0 and self.x >=60):
value.text_canvas.move(f,event.x-self.temp_x,0)
self.x += event.x-self.temp_x
self.temp_x = event.x
v = (self.x-59)//5
value.text_canvas.itemconfig(k,text=str(v))
value.alpha = 1-v/100
value.game.wm_attributes('-alpha',value.alpha)
elif n == 7:#系统说明
text1 = '游戏名称:中国象棋\n游戏版本:1.0\n人机内核:垃圾测试内核\n发布日期:2022/07/14\n运行内存:30MB左右\n占用空间:暂无数据'
text2 = '更多详细信息:\n\nhttps://blog.csdn.net/weixin_62651706'
text3 = '版权声明:\n\n 本游戏完全由小康独立开发,为该游戏的版权所有者,\n如盗窃程序内部资源,必究哦!'
a = value.text_canvas.create_text(100,25,text='系统说明',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50,fill=value.colorlis[0])
c = value.text_canvas.create_text(125,125,text=text1,font=('华文新魏',15))
d = value.text_canvas.create_text(200,250,text=text2,font=('华文新魏',15))
e = value.text_canvas.create_text(300,350,text=text3,font=('华文新魏',15))
value.s7_ = [a,b,c,d,e]
elif n == 8:#暂无设置
a = value.text_canvas.create_text(100,25,text='暂无设置',font=('华文新魏',25))
b = value.text_canvas.create_line(30,50,680,50,fill=value.colorlis[0])
value.s8_ = [a,b]
【value.py】
# 初始化变量 #
from tkinter import *
class value:
# 窗口变量 #
game = Tk()#创建窗口
game.title('中国象棋')#窗口标题
game.geometry('960x500+150+100')#窗口大小及位置
game.resizable(0,0)#窗口大小固定
game.iconbitmap('resources\\icon.ico')#窗口图标
canvas = Canvas(game,highlightthickness=0)#创建画布
canvas2 = Canvas(canvas,highlightthickness=0)
# 基本变量 #
modelis = ['人机','对弈','机机','网络','闯关'] #游戏模式
mode = modelis[1] #默认模式
levellis = ['暂无数据','简单','普通','困难'] #人机难度
level = levellis[0] #默认难度
playerlis = ['红方','黑方'] #玩家列表
player = '红方' #当前玩家
first = playerlis[0] #先下棋方
challenge = '暂无数据' #闯关关数
r_please = '无' #红方让子
b_please = '无' #黑方让子
regret = 0 #悔棋次数
alpha = 1 #窗口透明
max_depth = 3 #搜索深度
colorlis1 = ['black','black','white','lightyellow','lightgreen','springgreen','orange','yellow','red','white','springgreen']
colorlis2 = ['black','black','white','white','grey','black','grey','grey','black','white','white']
colorlis3 = ['blue','deepskyblue','skyblue','skyblue','deepskyblue','blue','white','deepskyblue','blue','skyblue','cyan']
colorlis4 = ['darkgreen','green','white','lightgreen','yellowgreen','springgreen','white','green','darkgreen','lightgreen','springgreen']
colorlis5 = ['purple','purple','white','pink','hotpink','fuchsia','red','pink','red','plum','plum']
#字体颜色[0] 框架颜色[1] 按钮框按下[2] 浅背景[3] 深按钮背景[4] 高亮按钮框[5] 高亮文本[6] 路径色[7] 敌人标记[8] 自己标记[9] 鼠标位置显示[10]
colorlists = [colorlis1,colorlis2,colorlis3,colorlis4,colorlis5]
with open('resources\\cache.txt','r') as infile:data = infile.readline()
theme = int(data)
colorlis = colorlists[theme-1]
# 游戏变量 #
flulis = [0.01,0.03,0.07,0.14,0.24,0.39,0.67,0.82,0.92,0.99,1.03,1.05,1.06,1.04,1]
info_lists = [[0]*9 for _ in range(10)]
b_j,b_s1,b_s2,b_x1,b_x2,b_m1,b_m2,b_c1,b_c2,b_p1,b_p2,b_z1,b_z2,b_z3,b_z4,b_z5 = [0]*16
r_j,r_s1,r_s2,r_x1,r_x2,r_m1,r_m2,r_c1,r_c2,r_p1,r_p2,r_z1,r_z2,r_z3,r_z4,r_z5 = [0]*16
peice_lists = [b_j,b_s1,b_s2,b_x1,b_x2,b_m1,b_m2,b_c1,b_c2,b_p1,b_p2,b_z1,b_z2,b_z3,b_z4,b_z5,
r_j,r_s1,r_s2,r_x1,r_x2,r_m1,r_m2,r_c1,r_c2,r_p1,r_p2,r_z1,r_z2,r_z3,r_z4,r_z5]
board_lists = [[ 7, 5, 3, 1, 0, 2, 4, 6, 8],#初始棋子摆法
[-1,-1,-1,-1,-1,-1,-1,-1,-1],
[-1, 9,-1,-1,-1,-1,-1,10,-1],
[11,-1,12,-1,13,-1,14,-1,15],
[-1,-1,-1,-1,-1,-1,-1,-1,-1],