C++实现连连看游戏核心代码攻略
连连看游戏是一款十分流行的益智游戏,其核心代码实现在于判断两个图案能否被消去。本文将详细介绍C++实现连连看游戏核心代码的攻略。
步骤一:定义游戏盘面
在C++中实现游戏盘面通常使用二维数组,这里我们定义一个10x10的整型二维数组来表示游戏盘面。其中,0代表没有图案,正整数代表有不同种类的图案。
int board[10][10];
步骤二:定义判断函数
在游戏中,两个图案能够被消去当且仅当它们彼此之间最多有两个拐角,并且它们之间的路径上的所有棋盘空格(如果有的话)都是空的。接下来我们定义一个函数来判断两个图案是否能够被消去。
bool canBeLinked(int x1, int y1, int x2, int y2)
{
// 判断图案是否相同
if (board[x1][y1] != board[x2][y2])
return false;
// 判断路径上的棋盘空格是否为空
if (x1 == x2 && checkNoBlockX(y1, y2, x1))
return true;
if (y1 == y2 && checkNoBlockY(x1, x2, y1))
return true;
if (checkOneCorner(x1, y1, x2, y2))
return true;
if (checkTwoCorner(x1, y1, x2, y2))
return true;
return false;
}
在判断函数中,checkNoBlockX(y1, y2, x1)用来判断在同一行上,从y1到y2是否有棋盘空格,如果中间有则返回false。checkNoBlockY(x1, x2, y1)用来判断在同一列上,从x1到x2是否有棋盘空格,如果中间有则返回false。checkOneCorner(x1, y1, x2, y2)用来判断从(x1, y1)到(x2, y2)两个图案是否可以通过一个拐角的方式相连。checkTwoCorner(x1, y1, x2, y2)用来判断从(x1, y1)到(x2, y2)两个图案是否可以通过两个拐角的方式相连。
步骤三:实现上述判断函数
checkNoBlockX和checkNoBlockY函数的实现非常简单,这里我们仅给出checkNoBlockX函数的实现。
bool checkNoBlockX(int y1, int y2, int x)
{
for (int i = min(y1, y2) + 1; i < max(y1, y2); i++)
if (board[x][i] != 0)
return false;
return true;
}
checkOneCorner函数的实现如下:
bool checkOneCorner(int x1, int y1, int x2, int y2)
{
for (int i = 0; i < 10; i++)
if (board[x1][i] == board[x2][y1] && checkNoBlockX(i, y1, x1) && checkNoBlockY(x1, x2, i))
return true;
for (int i = 0; i < 10; i++)
if (board[i][y1] == board[x1][y2] && checkNoBlockY(i, x1, y1) && checkNoBlockX(y1, y2, i))
return true;
return false;
}
checkTwoCorner函数的实现如下:
bool checkTwoCorner(int x1, int y1, int x2, int y2)
{
// 左上拐角
for (int i = x1 - 1; i >= 0; i--)
if (board[i][y1] == 0 && canBeLinked(i, y1, x2, y2))
return true;
for (int i = y1 - 1; i >= 0; i--)
if (board[x1][i] == 0 && canBeLinked(x1, i, x2, y2))
return true;
// 左下拐角
for (int i = x1 + 1; i < 10; i++)
if (board[i][y1] == 0 && canBeLinked(i, y1, x2, y2))
return true;
for (int i = y1 - 1; i >= 0; i--)
if (board[x1][i] == 0 && canBeLinked(x1, i, x2, y2))
return true;
// 右上拐角
for (int i = x1 - 1; i >= 0; i--)
if (board[i][y1] == 0 && canBeLinked(i, y1, x2, y2))
return true;
for (int i = y1 + 1; i < 10; i++)
if (board[x1][i] == 0 && canBeLinked(x1, i, x2, y2))
return true;
// 右下拐角
for (int i = x1 + 1; i < 10; i++)
if (board[i][y1] == 0 && canBeLinked(i, y1, x2, y2))
return true;
for (int i = y1 + 1; i < 10; i++)
if (board[x1][i] == 0 && canBeLinked(x1, i, x2, y2))
return true;
return false;
}
示例一
执行以下代码:
board[0][0] = 1;
board[1][0] = 1;
board[2][0] = 2;
board[3][0] = 2;
board[4][0] = 3;
board[5][0] = 3;
bool result = canBeLinked(0, 0, 5, 0);
我们预期结果为true,因为(0,0)和(5,0)两个图案可以通过两个拐角的方式连接。
示例二
执行以下代码:
board[0][0] = 1;
board[1][0] = 1;
board[2][0] = 2;
board[3][0] = 2;
board[4][0] = 3;
board[5][0] = 3;
bool result = canBeLinked(0, 0, 5, 2);
我们预期结果为false,因为(0,0)和(5,2)两个图案彼此之间不超过两个拐角,但它们之间的路径上的棋盘空格坐标为(1,0)和(3,0),即它们之间有棋子阻挡。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现连连看游戏核心代码 - Python技术站