用pygame实现一个简单的五子棋游戏

sw

准备python基础相关准备:

pygame的基础知识,参考目光博客的“用Python和Pygame写游戏-从入门到精通”

安装在python官网下载,不多说。

安装pygame,命令:pipinstallpygame

如安装较慢,可以参考如下命令,更改pip源为国内镜像站点:

计划

准备完成五子棋单机人机游戏,目前已完成界面以及判定输赢等功能,还未加入电脑AI,以后有时间再加(不知是否会坑),目前实现主要功能如下:

判定黑子或白子五子连珠。

一方胜利后弹出提示,结束游戏。

游戏界面是下面这个样子:

开始设计思路

整个游戏的核心是将棋盘分成两个层面,第一个层面是物理层面上的,代表在物理像素的位置,主要用于绘图等操作,另外一个层面是将棋盘抽象成15*15的一个矩阵,黑子和白子是落在这个矩阵上的某个位置,具体位置用坐标(i,j)(0=i,j15)来表示,主要用于判断输赢和落子等。

棋盘的绘制,网上有棋盘和黑白子的图片资源可以下载使用,我下载后由于棋盘图片格子线像素位置不太精确,所以自己用ps做了一张544544的木质背景图,然后用程序来绘制棋盘线(如果PS更熟悉点的话,建议棋盘格线之类就画在棋盘背景图上),棋盘格线上下左右空20像素,棋盘格子大小36像素,网上下载的棋子大小是3232像素的。

输赢的判断,由于未出输赢的时候肯定没有五子连成线的,所以只需要判断最后落子位置的横、竖、斜、反斜四个方向上有没有五子连成线即可。

主要代码

main函数,pygame的主要控制流程,缩写代码如下:

defmain():()设置时钟game_over=Falserenju=Renju()初始化whileTrue:(20)按下的是鼠标左键i,j=_coord()检查(i,j)位置能否被占用,如未被占用返回_at(i,j)检查是否存在五子连线,如存在则返回Truetext=''_turn:棋盘格子位置相关???color=(0,0,0)黑子先手ball_coord=[]在(i,j)位置落子defdrop_at(self,i,j):pos_x=[i][j].x-int(_/2)pos_y=[i][j].y-int(_/2)ball_pos={'type':0_turnelse1,'coord':Position(i,j)}_turn:记录已落子信息_turn=_turn画棋盘上的格子线,如果棋盘背景图做的足够精确,可省略此步骤def_draw_board(self):画横线(self._chessboard,,[0][x],[][x])判断是否已产生胜方defcheck_over(self):iflen(_coord)8:横、竖、斜、反斜四个方向检查fordindirect:ifself._check_direct(d):returnTruereturnFalse存放在一条线上的棋子_coord:ifball['type']==last['type']:x=ball['coord'].x-last['coord'].xy=ball['coord'].y-last['coord'].yifdt_x==0:ifx==0:line_(ball['coord'])continueifdt_y==0:ify==0:line_(ball['coord'])continueifx*dt_y==y*dt_x:line_(ball['coord'])iflen(line_ball)=5:此点和第5个点比较y值,如相差为4则连成5子returnTrueelse:x1==sorted_line[index].xifabs(x1-x2)==4:检查(i,j)位置是否已占用defcheck_at(self,i,j):_coord:if(i,j)==item['coord']:returnFalsereturnTrue四舍五入取整oppo_y=_y0:j=round(oppo_y/)return(i,j)复制代码

Renju类有几个函数说明:

init()方法主要做了几件事:

载入资源,建立了_chessboard这个棋盘的surface对象

计算棋盘所有落子点的物理坐标,并存放如points属性中,points是个二维数组,这样points[i][j]就可以表示逻辑位置(i,j)所对应的物理坐标了。

调用_draw_board()方法,在_chessboard上画格线及标注等。

drop_at(i,j)方法,在逻辑位置(i,j)落子,至于是落白子和黑子通过Renju类的控制开关black_turn来决定。画图,并将已落子信息存入ball_coord列表中。

check_at(i,j)方法,通过遍历ball_coord列表来查看(i,j)位置是否能落子。

check_over()方法判断是否存在五子连线的情况,主要通过调用_check_direct方法分别判断四个方向上的情况。

_check_direct(direct)方法是判断五子连线的主要逻辑,通过判断最后一颗落子的某个方向落子实现。

结束
文章版权声明:除非注明,否则均为虚境探索者原创文章,转载或复制请以超链接形式并注明出处。

上一个 回合制RPG游戏推荐 不容错过的经典大作

下一个 两只企鹅在游戏里秀恩爱的下场是什么?