Python小项目(第一期):基于Tkinter模块实现五子棋小游戏

记录一下自己以前学习做的一些小项目,本人水平一般,如若各位大佬有什么建议,欢迎一起议论。

该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
  • 10
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值