# 一个连连看游戏的通路检测算法

// 连连看通路检测算法

//#include <iostream>
//using namespace std;
#include <stdio.h>

int main ()
{
// 地图设置
short mapX = 6, mapY = 5;
// （要改进）横纵参数应该可以设置
short map[5][6] =  {0, 0, 0, 0, 0, 0,
0, 1, 3, 2, 3, 0,
0, 2, 2, 1, 2, 0,
0, 1, 3, 1, 3, 0,
0, 0, 0, 0, 0, 0};

// 设置选中坐标
// （要改进）要检测位置是否相同，值是否相同
short Set1X = 4, Set1Y = 1, Set2X = 2, Set2Y = 3;

// 处理过程

// 纵向处理

// 缓存初始
// （要改进）缓存长度应该可以设置
short Set1BufY[6][2] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
short Set2BufY[6][2] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

// 基点放入缓存
Set1BufY[0][0] = Set1X;
Set1BufY[0][1] = Set1Y;
Set2BufY[0][0] = Set2X;
Set2BufY[0][1] = Set2Y;

// 纵向检测：基点1以上
short nBufY = 1;
for (short TmpY = Set1Y - 1; TmpY >= 0; --TmpY)
{
if (map[TmpY][Set1X] == 0)
{
Set1BufY[nBufY][0] = Set1X;
Set1BufY[nBufY][1] = TmpY;
++nBufY;
}
else
{
break;
}
}

// 纵向检测：基点1以下
for (short TmpY = Set1Y + 1; TmpY < mapY; ++TmpY)
{
if (map[TmpY][Set1X] == 0)
{
Set1BufY[nBufY][0] = Set1X;
Set1BufY[nBufY][1] = TmpY;
++nBufY;
}
else
{
break;
}
}
Set1BufY[nBufY][0] = 0;
Set1BufY[nBufY][1] = 0;

// 纵向检测：基点2以上
nBufY = 1;
for (short TmpY = Set2Y - 1; TmpY >= 0; --TmpY)
{
if (map[TmpY][Set2X] == 0)
{
Set2BufY[nBufY][0] = Set2X;
Set2BufY[nBufY][1] = TmpY;
++nBufY;
}
else
{
break;
}
}

// 纵向检测：基点2以下
for (short TmpY = Set2Y + 1; TmpY < mapY; ++TmpY)
{
if (map[TmpY][Set2X] == 0)
{
Set2BufY[nBufY][0] = Set2X;
Set2BufY[nBufY][1] = TmpY;
++nBufY;
}
else
{
break;
}
}
Set2BufY[nBufY][0] = 0;
Set2BufY[nBufY][1] = 0;

// 纵向检测：横向通路检测
// 连通标志
bool bChkOK = false;
{
// 设置同轴对比加速检查标志
bool bShortPass = false;

// debug
//cout << "enter X for 1" << endl;

{
// debug
//cout << "enter X for 2" << endl;

// 检测是否在同一横轴
{
// 因为已经检查到同轴点，所以设置同轴对比加速检查标志为真
bShortPass = true;

// debug
//cout << "enter X for 2-if" << endl;

// 计算对比点间距离
// 偏移量
short OpNum;
if (nStep > 0)
{
OpNum = -1;
--nStep;
}
else
{
OpNum = 1;
++nStep;
}

bChkOK = true;
for (short mStep = nStep; mStep != 0; mStep += OpNum)
{
// debug
//cout << "enter X for 3" << endl;

if (map[tmpvy][Set1BufY[nChkLink1][0] - mStep] == 0)
{
// 继续检测下一点
continue;
}
else
{
// 通路有障碍无法连通
bChkOK = false;
break;
}
}

// 如果通路连通则显示连通信息
if (bChkOK == true)
{

return 0;
}
}
else
{
// 判断同轴对比加速检查标志，以实行检查加速
if (bShortPass == true)
{
// debug
//cout << "enter shortpass" << endl;

break;
}
}
}
}

// 纵向处理完毕

// 横向处理

// 缓存初始
// （要改进）缓存长度应该可以设置
short Set1BufX[7][2] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
short Set2BufX[7][2] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

// 基点放入缓存
Set1BufX[0][0] = Set1X;
Set1BufX[0][1] = Set1Y;
Set2BufX[0][0] = Set2X;
Set2BufX[0][1] = Set2Y;

// 横向检测：基点1以左
short nBufX = 1;
for (short TmpX = Set1X - 1; TmpX >= 0; --TmpX)
{
if (map[Set1Y][TmpX] == 0)
{
Set1BufX[nBufX][0] = TmpX;
Set1BufX[nBufX][1] = Set1Y;
++nBufX;
}
else
{
break;
}
}

// 横向检测：基点1以右
for (short TmpX = Set1X + 1; TmpX < mapX; ++TmpX)
{
if (map[Set1Y][TmpX] == 0)
{
Set1BufX[nBufX][0] = TmpX;
Set1BufX[nBufX][1] = Set1Y;
++nBufX;
}
else
{
break;
}
}
Set1BufX[nBufX][0] = 0;
Set1BufX[nBufX][1] = 0;

// 横向检测：基点2以左
nBufX = 1;
for (short TmpX = Set2X - 1; TmpX >= 0; --TmpX)
{
if (map[Set2Y][TmpX] == 0)
{
Set2BufX[nBufX][0] = TmpX;
Set2BufX[nBufX][1] = Set2Y;
++nBufX;
}
else
{
break;
}
}

// 横向检测：基点2以右
for (short TmpX = Set2X + 1; TmpX < mapX; ++TmpX)
{
if (map[Set2Y][TmpX] == 0)
{
Set2BufX[nBufX][0] = TmpX;
Set2BufX[nBufX][1] = Set2Y;
++nBufX;
}
else
{
break;
}
}
Set2BufX[nBufX][0] = 0;
Set2BufX[nBufX][1] = 0;

// 横向检测：纵向通路检测
// 连通标志
bChkOK = false;
{
// 设置同轴对比加速检查标志
bool bShortPass = false;

// debug
//cout << "enter X for 1" << endl;

{
// debug
//cout << "enter X for 2" << endl;

// 检测是否在同一纵轴
{
// 因为已经检查到同轴点，所以设置同轴对比加速检查标志为真
bShortPass = true;

// debug
//cout << "enter X for 2-if" << endl;

// 计算对比点间距离
// 偏移量
short OpNum;
if (nStep > 0)
{
OpNum = -1;
--nStep;
}
else
{
OpNum = 1;
++nStep;
}

bChkOK = true;
for (short mStep = nStep; mStep != 0; mStep += OpNum)
{
// debug
//cout << "enter X for 3" << endl;

if (map[Set1BufX[nChkLink1][1] - mStep][tmpvx] == 0)
{
// 继续检测下一点
continue;
}
else
{
// 通路有障碍无法连通
bChkOK = false;
break;
}
}

// 如果通路连通则显示连通信息
if (bChkOK == true)
{

return 0;
}
}
else
{
// 判断同轴对比加速检查标志，以实行检查加速
if (bShortPass == true)
{
// debug
//cout << "enter shortpass" << endl;

break;
}
}
}
}

// 横向处理完毕

// 处理过程完毕

// 如果通路不能连通则显示不能连通信息
if (bChkOK == false)
{
}

return 0;
}

• 本文已收录于以下专栏：

## 连连看游戏的实现

• xueruifan
• 2015年08月25日 03:07
• 1088

## 连连看游戏的核心算法

• mu399
• 2011年11月17日 18:49
• 8784

## 用 JAVA 开发游戏连连看

• sxchen2012
• 2012年04月08日 20:31
• 1421

## 连连看程序判断消除的算法

• never_waste
• 2016年07月17日 17:48
• 2022

## 连连看游戏。。c++编写。。

• ckcz123
• 2012年11月20日 09:48
• 3032

## Qt小游戏开发：连连看

• u012234115
• 2016年12月16日 19:28
• 1354

## 连连看游戏核心代码（C++实现）

• u013149325
• 2013年12月16日 20:04
• 2851

## 连连看提示功能的增加(添加了代码)

• jjfly999
• 2016年03月05日 21:07
• 1306

## 连连看消除算法的C++代码实现

• 2015年05月14日 15:06
• 708

## 连连看核心算法代码

public class Gamelogic { private final static int UP = 0; private final static int DOWN = 1; ...
• fx1ts
• 2016年04月22日 19:46
• 370

举报原因： 您举报文章：一个连连看游戏的通路检测算法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)