前言
最近在做一个五子棋游戏,发现其中的五子相连判断算法非常的好,所以总结出来给大家。
算法思路
我们大家都玩过五子棋,棋子在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 };