五子棋小游戏【控制台版】

大一学习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;
}

请查看 完整代码

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容