最新消息:

Python课程系列:黑白棋小游戏

Python 少儿编程 3488浏览 0评论

上次的课程做了一个井字小游戏,今天再进一步做一个黑白棋小游戏。在8×8 格子上玩家与计算机轮流下子,用OX来替代黑子与白子,游戏玩法为黑子玩家与白子玩家轮流下自己颜色的棋子,在新下的棋子与同颜色的另一个棋子之间,如果有任何对手的棋子,都将其反转,游戏的目标是让玩家自己的棋子尽可能的多。最后留下的棋子数最多者为赢家。

范例代码可由下面连结取得。

https://github.com/Ashing00/Othello/tree/master

程序执行画面如下图所示:

 

Python课程系列:黑白棋小游戏

重要的程序片段如下:

判断一次落子是否有效:

defisValidMove(self,board, tile, xstart, ystart):

为了成为一个有效的移动,在该方向上的移动第一步必须满足以下条件,(1)位置必须在游戏棋盘上,(2)必须至少能够翻转对手一个棋子,否则若没有任何可供翻转的棋子,该落子点就不是有效的落子位置,于是下面程序就是用来判断落子位置是否为有效位置,如果是有效位置还会记录需翻转的棋子位置到tilesToFlip[] 串行清单。

棋盘数据为一二维的串行结构board[x][y] xy分别代表0~7.

192行为一循环,目的是会从落子点沿着,上、下、左、右、右斜上、右斜下、左斜上、左斜下、八个方向寻找及判断是否有对手的棋子,8 次循环的执行,每一次便是寻找同一方向上是否有对手的棋子,如果有则记录每一个经过的x,y坐标,直到碰到同颜色的棋子为止,最后会存入tilesToFlip[] 串行清单,若最后tilesToFlip[] 串行没有纪录任何x,y坐标资料,则返回False,表示该次落子非有效落子点。

 

Python课程系列:黑白棋小游戏

计算棋盘得分:

def getScoreOfBoard(self,board):

以下程序则是计算每下一子,玩家与计算机A.I的得分,也就是棋子数,该函数简单,其作用可以用来判断最后谁输谁赢,以及另一个重要的作用则是作为计算机A.I下子的判断依据。

 

Python课程系列:黑白棋小游戏

计算机A.I的下子:

def getComputerMove(self,board,computerTile):

计算机AI落子的判断如下,其实并不复杂,首先在271行从 self.getValidMoves(board, computerTile)函数得到可落子的的位置列表,并将所有可下的位置随机洗牌,接下来两点策略判断决定了计算机的落子(1)如果可落子清单里,有可下在最角落的四个点,那么就下在那个位置。

不然的话,(2)计算该落子是否可获得较高的得分,这时便会使用到上述getScoreOfBoard()函数来仿真得分,如果该落子点可得分最高,便落在该点。

 

Python课程系列:黑白棋小游戏

以上就是简单的解释黑百棋小游戏程序运作的方式。

其实井字棋和黑白棋这两个小游戏可以当作为简单的AI人工智能入门,有兴趣的同学可以继续深入研究,做出自己的电脑对战棋类游戏

您必须 登录 才能发表评论!