卷毛杨小白-python五子棋代码分享以及解析(已开源)

559 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

前言

之前做过的一个python五子棋小游戏,实现了重新开始,悔棋,结束游戏功能,总代码只有150行左右,适合初学python的同学,作为自己的第一个能做出有效展示效果的小项目!

代码分享放在了文章最后。

python五子棋代码分享以及解析

image.png

首先,我们这里选用的是tkinter包,优势在于不需要额外下载,直接导包即用。

image.png

声明全局变量,这里的_al将记录所有棋子的(x,y)坐标,_white将记录白色棋子的(x,y)坐标,_black将记录黑色棋子的(x,y)坐标。stop和boss是用来控制循环的变量,black是个boolean类型是值,true是时候表示该由黑色棋子下棋,反之该由白色棋子下棋。

image.png

全局初始化函数中,主要是绘制了棋盘,和初始化一些数据,包括按钮所对应的功能函数。

image.png

第一个函数是on_regret悔棋,基本思路为:检查现在该由谁下棋?如果现在是黑棋要落子,则悔掉最后一粒白棋;如果现在是白棋要落子,则悔掉最后一粒黑棋。并且_al记录了所有的棋子,也要把最后一粒棋子毁掉。

这里提一个小bug,希望大家也可以解决一下。大家会发现在悔棋的时候,画布会一闪消失后再出现。这是因为棋子是直接画在画布上的,没有办法擦掉,那么我的做法是将画布毁掉,重新new了一个新的画布,调用init函数,再把所有的棋子画入画布中。

image.png

第二个函数是重新开始on_start,倒没什么好说的,直接将所有的数据清空重置就可以了。小bug同悔棋中的一样,期待进一步完善。

image.png

第三个是结束游戏的函数on_end,大家在最上面变量的定义中会发现有两个来控制循环的变量boss和_start,这是由于悔棋和重新开始都会跳出下棋的循环,但是由没有结束游戏,所以用_start来作为控制变量。on_end是要跳出整个大循环结束游戏,这里就引入了一个boss变量。

image.png

第四个是检查胜负的函数,这里直接暴力的遍历了整个_white和_black,检测是否有连着的五颗棋子(横着,竖着,左斜着,右斜着)所以大家可以看到里面有四个大循环,由于五子棋的数据并不大,直接暴力遍历是可以的。

image.png

    有心思的小伙伴可以优化一下此处的代码:

    1.如果下完这步棋有人胜出,那么一定是下棋的这个人,那就可以只搜索刚刚下棋颜色的库内是否有五个相连的棋子。

    2.如果下完这步棋有人胜出,那么一定包含这一步棋,从这个棋,左右,上下,斜着遍历去数,是否有五个相连的棋子。(此处需要考虑的问题还是有不少,1.每种情况需要向两个方向一起找,可能左边有两颗,右边有两颗。2.考虑边界问题)

最后是callback函数,画布每一次点击,都会进入到这个函数来,他通过像素点,计算出你下棋的位置,转化为坐标,存入对应的棋子库里。然后计算是否有人胜出,更改画布显示内容。

image.png

此处再提出一点完善思路,大家能否为本项目增加保存棋局,和继续游戏的功能呢?

    在保存棋局时,只需要将_al,_white,_black,black等全局变量记录下来,储存到一个文件中。

    恢复棋局时,增加一个选择文件读取文件的功能,将之前保存的变量重新读入并赋值,就可以继续游戏啦~

    好啦~ 解析就到这里了,这个小游戏是不是很简单呢?无论是学习pyhton的基础用法,还是作为一个小的课程作业,相信都是不错的选择呢。如果能自己再添加些保存棋局,多客户端对战等其他更高端的功能,相信就算是大学课程也可以拿高分吧。哈哈哈~

最后的最后,附上项目地址

python五子棋代码github仓库地址:github.com/yangxiaozhu…

python五子棋代码gitee仓库地址:gitee.com/yang-xiao-b…

百度网盘链接:链接:pan.baidu.com/s/1IkfJsh67… 提取码:xbai