人机对战之五子棋 设计储存五子棋类数据结构及五子棋胜负判定
- 五子棋类数据结构设计
五子棋的核心数据结构是棋盘,可以使用二维数组表示。对于每个位置,可以用0表示空,1表示黑子,2表示白子。
在棋盘的基础上,还需要记录当前是哪一方下棋,以及棋子的数量。因此,可以设计一个五子棋类,包含以下成员变量:
- int board[15][15]:表示棋盘,使用二维数组表示。
- int player:表示当前是哪一方下棋,1表示黑方,2表示白方。
- int chessCount:表示当前棋盘上的棋子数量。
- bool gameOver:表示游戏是否结束。
五子棋类还应该包含以下成员函数:
- void init():初始化棋盘和游戏状态。
- bool move(int x, int y):在棋盘上落子,如果落子成功,则返回true,否则返回false。
- bool checkWin(int x, int y):判断是否有一方获胜,如果有,则返回true,否则返回false。
- bool isDraw():判断是否平局,如果是,则返回true,否则返回false。
- 五子棋胜负判定设计
判断五子棋胜负的算法比较简单,可以分别判断横、竖、斜线上是否连续出现五个同色棋子。
具体实现如下:
bool checkWin(int x, int y) { int color = board[x][y]; int count = 1;
// 横向
for (int i = x - 1; i >= 0 && board[i][y] == color; i--) count++;
for (int i = x + 1; i < 15 && board[i][y] == color; i++) count++;
if (count >= 5) return true;
// 竖向
count = 1;
for (int i = y - 1; i >= 0 && board[x][i] == color; i--) count++;
for (int i = y + 1; i < 15 && board[x][i] == color; i++) count++;
if (count >= 5) return true;
// 左上到右下
count = 1;
for (int i = x - 1, j = y - 1; i >= 0 && j >= 0 && board[i][j] == color; i--, j--) count++;
for (int i = x + 1, j = y + 1; i < 15 && j < 15 && board[i][j] == color; i++, j++) count++;
if (count >= 5) return true;
// 右上到左下
count = 1;
for (int i = x - 1, j = y + 1; i >= 0 && j < 15 && board[i][j] == color; i--, j++) count++;
for (int i = x + 1, j = y - 1; i < 15 && j >= 0 && board[i][j] == color; i++, j--) count++;
if (count >= 5) return true;
return false;
}
其中,x和y表示最后一步落子的位置。首先判断横向,从当前位置向左和向右遍历,如果出现了不同颜色的棋子或者超出了棋盘范围,则停止遍历。如果连续出现了五个同色棋子,则返回true,表示获胜。
竖向、左上到右下、右上到左下的判断方式类似,只需要改变遍历的方向即可。
如果所有的方向都没有出现五个同色棋子,则返回false,表示游戏继续
原文地址: https://www.cveoy.top/t/topic/en9n 著作权归作者所有。请勿转载和采集!