黑白棋
黑白棋,又叫苹果棋,最早流行于西方国家。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。黑白棋非常易于上手,但精通则需要考虑许多因素,比如角边这样的特殊位置、稳定度、行动力等。本游戏取名为黑白棋大师,提供了8种难度等级的选择,从菜鸟、新手、入门、棋手到棋士、大师、宗师、棋圣,助你不断提升棋力。
本文将着重介绍黑白棋实现过程中用到的算法。
黑白棋游戏规则
游戏规则见黑白棋大师中的截图。
黑白棋大师游戏截图
游戏启动界面。
游戏过程中的一个截图。
开新局时的选项,选择先后手以及AI的水平。
几个关键的类
Rule
Rule类实现游戏规则相关的方法,包括
- 判断某一步是否合法
- 获取所有的合法走步
- 走一步并翻转敌方棋子
- 统计两方棋子个数
Algorithm
Algorithm类实现极小极大算法,包括
- 局面评估函数,对当前局面打分,越高对max越有利,越低对min越有利
- min()方法
- max()方法
- 获得一个好的走步
ReversiView
ReversiView继承自SurfaceView,实现棋盘的界面,在该类定义棋盘界面的绘制、更新等操作。
RenderThread
RenderThread继承自Thread,是控制ReversiView以一定fps更新、重绘界面的线程。
具体实现
棋盘表示
byte[][]二维数组存储棋盘,-1表示有黑子,1表示有白子,0表示棋格为空
游戏规则类Rule的实现
提供几个关于游戏规则的静态方法。
判断某一个位置是否位于棋盘内
1 2 3 |
public static boolean isLegal(int row, int col) { return row >= 0 && row < 8 && col >= 0 && col < 8; } |
判断某一方在某个位置落子是否合法
即判断该子是否能与己方棋子在某个方向上夹住敌方棋子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public static boolean isLegalMove(byte[][] chessBoard, Move move, byte chessColor) { int i, j, dirx, diry, row = move.row, col = move.col; if (!isLegal(row, col) || chessBoard[row][col] != Constant.NULL) return false; for (dirx = -1; dirx < 2; dirx++) { for (diry = -1; diry < 2; diry++) { if (dirx == 0 && diry == 0) continue; int x = col + dirx, y = row + diry; if (isLegal(y, x) && chessBoard[y][x] == (-chessColor)) { for (i = row + diry * 2, j = col + dirx * 2; isLegal(i, j); i += diry, j += dirx) { if (chessBoard[i][j] == (-chessColor)) { continue; } else if (chessBoard[i][j] == chessColor) { return true; } else { break; } } } } } return false; } |
某一方走一步子
将各个方向上被翻转的棋子的颜色改变,并返回这些棋子在棋盘的位置,方便显示翻转动画。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public static List<Move> move(byte[][] chessBoard, Move move,span>(byte[][] chessBoard, Move move, 稳定度、行动力等。本游戏取名为黑白棋大师,提供了8种难度等级的选择,从菜鸟、新手、入门、棋手到棋士、大师、宗师、棋圣,助你不断提升棋力。 本文将着重介绍黑白棋实现过程中用到的算法。 黑白棋游戏规则游戏规则见黑白棋大师中的截图。 黑白棋大师游戏截图游戏启动界面。 游戏过程中的一个截图。 开新局时的选项,选择先后手以及AI的水平。 几个关键的类RuleRule类实现游戏规则相关的方法,包括
AlgorithmAlgorithm类实现极小极大算法,包括
ReversiViewReversiView继承自SurfaceView,实现棋盘的界面,在该类定义棋盘界面的绘制、更新等操作。 RenderThreadRenderThread继承自Thread,是控制ReversiView以一定fps更新、重绘界面的线程。 具体实现棋盘表示byte[][]二维数组存储棋盘,-1表示有黑子,1表示有白子,0表示棋格为空 游戏规则类Rule的实现提供几个关于游戏规则的静态方法。 判断某一个位置是否位于棋盘内
判断某一方在某个位置落子是否合法即判断该子是否能与己方棋子在某个方向上夹住敌方棋子。
某一方走一步子将各个方向上被翻转的棋子的颜色改变,并返回这些棋子在棋盘的位置,方便显示翻转动画。
|