五子棋---五子相连判断

前言

最近在做一个五子棋游戏,发现其中的五子相连判断算法非常的好,所以总结出来给大家。

算法思路

我们大家都玩过五子棋,棋子在4方向直线上有五个子,那么就表示玩家得胜。4方向分别是横向,纵向,斜向上和斜向下。
棋子4个方向
如果棋手每下一步棋,我们遍历已经下的棋子,判断其4个方向是否够5个棋子,那么这样的效率是不高的。因为我们在下棋之前,那么我们可以知道,棋盘上一定没有5子相连,所以我们就不用去判断已经下的所有棋子,而是直接判断刚下的棋子4个方向的的情况。相对于判断所有棋子,我们这个方法更简单。
因为相邻棋子相差1个长度单位,所以:

  • 棋子横向 X轴 每次变化1,Y 轴不变;
  • 棋子纵向 X轴 不变,Y 轴每次变化1;
  • 棋子斜向上 X轴 每次变化1,Y 每次变化1;
  • 棋子斜向下 X轴 每次变化1,Y 每次变化1;
    以上4个方向,是x轴的正向,那么他们的反向也要同时计算。如果计算下一个步骤不是本棋手的棋子,那么本次方向的查询结束,接着查询反方向的棋子,如果总共的相邻棋子数大于等于5,那么棋手胜利,比赛结束。

代码

bool OXGame::is5inRow(int x, int y)
{
    // const int DX[4] = { 1, 0, 1, 1 };
    // const int DY[4] = { 0, 1, 1, -1 };
    //DX[0] DY[0] 表示X 轴正向检查是否在一行
    //DX[1] DY[1] 表示Y 轴正向检查是否在一行
    //DX[2] DY[2] 表示右上 轴正向检查是否在一行
    //DX[3] DY[3] 表示右下 轴正向检查是否在一行
    OXPiece a = _cell[x][y];
    int k, c1, c2, xx, yy;
    for (k = 0; k < 4; k++) {
        c1 = c2 = 0;
        // 如果当前棋子类型与本方向上的棋子是同一类则,继续判断
        // 正方向逐个比较
        for (xx = x + DX[k], yy = y + DY[k]; cell(xx, yy) == a; xx += DX[k], yy += DY[k]) {
            c1++;
        }
        // 相反方向逐个比较
        for (xx = x - DX[k], yy = y - DY[k]; cell(xx, yy) == a; xx -= DX[k], yy -= DY[k]) {
            c2++;
        }

        if (c1 + c2 >= 4) {  // 不包含当前,已经有4个连续的,直接判胜利,保存胜利数据
            // 将胜利的棋子保存到数组中
            xx = x - c2 * DX[k];//将起始位置定位到最末端
            yy = y - c2 * DY[k];
            for (int i = 0; i < 5; i++) {//逐个添加
                _winPoint[i] = OXPoint(xx, yy);
                xx += DX[k];
                yy += DY[k];
            }
            return true;
        }
    }
    return false;
}

可以下载本人开发的五子棋游戏,下载试玩一下。
如果您觉得本文对你有帮助,欢迎打赏。
这里写图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页