记录一下自己以前学习做的一些小项目,本人水平一般,如若各位大佬有什么建议,欢迎一起议论。
该Python小项目是一个基于Tkinter模块实现的五子棋小游戏,其代码分为三部分,分别为主代码部分、落子坐标运算代码部分、判断是否胜利代码部分。
首先,先来看看效果图:
第一部分、主代码部分:
主代码分为三个部分:
① 声明对象a、数组lx、ly、lz,并将数组lx与ly的每一项都赋值为0,其作用是存储黑子与白子的坐标,同时为判断双方哪一方胜利提供数据,声明一个Windows窗口对象,将窗口标题设为“五子棋”,窗口大小为840px X 930px;
② 创建菜单,其选项有“重新开局”,当点击“重新开局”选项时会调用sc()函数;
③ 创建画布,画布大小为840px X 930px,读取棋盘与棋子,同时将棋盘显示在画布上,并给棋盘绑定鼠标左键事件,调用ks()函数。
#-----------------(主函数)
#lx存储黑子的坐标,ly存储白子的坐标,lz存储棋子对象
#a为“1”为黑子回合“2”则是白子回合
a = 0; lx = []; ly = []; lz = [];
root = Tk() #创建Windows窗口对象
root.title('五子棋') #设置窗口标题
root.geometry('840x930') #设置窗口大小
#设置菜单
m = Menu(root) #创建主菜单
filemenu = Menu(m) #创建下拉菜单
filemenu.add_command(label = '重新开局',command = sc) #添加菜单项
m.add_cascade(label = '菜单',menu = filemenu) #把filemenu作为'菜单'下拉菜单
root['menu'] = m #添加主菜单到窗口
#绘制棋盘(每格x轴与y轴的距离都为54px)
cv = Canvas(root,width = 840,height = 930)
img1 = PhotoImage(file = 'E:\\Pythonsy\\img2\\棋盘.png')
img2 = PhotoImage(file = 'E:\\Pythonsy\\img2\\黑子.png')
img3 = PhotoImage(file = 'E:\\Pythonsy\\img2\\白子.png')
cv.create_image((460,460),image = img1,tags = 'r0') #绘制棋盘
cv.tag_bind('r0','<Button-1>',printRect) #给棋盘绑定一个鼠标左键事件
cv.pack()
ks()
root.mainloop() #进入消息循环,也就是显示窗口
调用的sc()函数与ks()函数的代码如下:
def sc():
global a
#删除所有已建立的绘图对象
for i in lz:
cv.delete(i)
#初始化黑子与白子的坐标
for i in range(226):
lx[i] = 0
ly[i] = 0
a = 1
def ks():
global a
a = 1
s = "黑子先手。"
showinfo(title="提示页面",message = s)
第二部分、落子坐标运算代码(鼠标左键事件)部分:
在第一部中,给棋盘绑定了一个鼠标左键事件,当鼠标点击棋盘时,会执行以下这些操作:
① 判定a的值来判断当前回合是黑子下子还是白子下子;
② 进行一次for循环,for的范围为1~15(到15是因为棋盘的规格为15x15), for循环内嵌套了一个if判断,该if判断会判断该次鼠标左键点击处的位置的y轴的坐标在棋盘内的第几行;
③ 当找到在第几行后,再进行一次for循环,for的范围为1~15(到15是因为棋盘的规格为15x15), for循环内嵌套了一个if判断,该if判断会判断该次鼠标左键点击处的位置的x轴的坐标在棋盘内的第几个位置,位置确定后声明一个qz对象,若是黑子回合则将一颗黑子显示在该次鼠标左键点击的位置处,将qz对象存入数组lz中,并且将lx数组中相对应的位置处(例如棋盘左边最上角的落子点,对应了lx数组中的第一项)所存储的0改为1(1表示为黑子),并将a赋值为2(表示下一回合为白子下子),调用victory1()函数,结束循环,若是白子回合则将一颗白子显示在该次鼠标左键点击的位置处,将qz对象存入数组lz中,并且将ly数组中相对应的位置处(例如棋盘左边最上角的落子点,对应了ly数组中的第一项)所存储的0改为2(2表示为黑子),并将a赋值为1(表示下一回合为黑子下子),调用victory2()函数,结束循环。
def printRect(event): #鼠标左键事件
global lx; global ly; global lz; global a;
x = 38; y = 142;
#绘制棋盘(每格x轴与y轴的距离都为54px)
if( a != 2 ):
for i in range(1,16):
if( event.y <= (y+(54*(i-1))+20) and event.y >= (y+(54*(i-1))-20)):
for o in range(1,16):
if( event.x <= (x+(54*(o-1))+20) and event.x >= (x+(54*(o-1))-20)):
qz = cv.create_image(((x+(54*(o-1))),(y+(54*(i-1)))),image = img2)
lz.append(qz)
lx[(15*(i-1)+o)] = 1
a = 2
victory1()
break
else:
for i in range(1,16):
if( event.y <= (y+(54*(i-1))+20) and event.y >= (y+(54*(i-1))-20)):
for o in range(1,16):
if( event.x <= (x+(54*(o-1))+20) and event.x >= (x+(54*(o-1))-20)):
qz = cv.create_image(((x+(54*(o-1))),(y+(54