大一学习C++的时候安排的一个结课项目,让我们做一个小程序或者小游戏。我选择了五子棋游戏。
我设计的五子棋小游戏采用了MVC的结构,使用一个二维数组来保存棋盘格。下棋部分没什么算法,应该不用多说。下面说一说检测输赢的算法。
检测结果无非就是四个方向。对于每一个符合要求的格子,检测这四个方向上的各四个格子,如果确认有连续的五个格子,则游戏结束,否则,一直运行下去,直至棋盘被填满,和局。
image.png
所以,我们先准备一个二维数组存放四个方向的坐标差(计算机中的坐标都已窗口左上角为原点,横向为x轴方向)。
class GameData {
private:
int board[ROW][COL];
const int CHECK_DIRECTION[4][2] = {{1, -1}, {1, 0}, {1, 1}, {0, 1}};
// ...
}
然后新建一个检测是否已分出胜负的方法。遍历棋盘中的每一个不为0的格子(即已经下了棋子)。检测每个格子的四个方向上的各四个格子。
int GameData::checkWin() {
// search the whole board
for (int y = 0; y < ROW; ++y) {
for (int x = 0; x < COL; ++x) {
int curr = getTile(x, y);
if (curr != BLACK && curr != WHITE)
continue;
// search the directions
for (int i = 0; i < 4; ++i) {
//
int count = 1;
for (int n = 1; n < 5; ++n) {
int nextX = x + CHECK_DIRECTION[i][0] * n;
int nextY = y + CHECK_DIRECTION[i][1] * n;
if (!inBoard(nextX, nextY) || getTile(nextX, nextY) != curr)
break;
count++;
}
if (count == 5) {
return curr;
}
}
}
}
return 0;
}
请查看 完整代码