准备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)方法是判断五子连线的主要逻辑,通过判断最后一颗落子的某个方向落子实现。
结束