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

原创 2004年10月21日 18:01:00

在看了一篇关于连连看通路检测算发的启发下篇写的,列出代码如下:

// 连连看通路检测算法

//#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;
 for (short nChkLink1 = 0; !(Set1BufY[nChkLink1][0] == 0 && Set1BufY[nChkLink1][1] == 0); ++nChkLink1)
 {
  // 设置同轴对比加速检查标志
  bool bShortPass = false;

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

  for (short nChkLink2 = 0; !(Set2BufY[nChkLink2][0] == 0 && Set2BufY[nChkLink2][1] == 0); ++nChkLink2)
  {
   // debug
   //cout << "enter X for 2" << endl;

   // 检测是否在同一横轴
   if (Set1BufY[nChkLink1][1] == Set2BufY[nChkLink2][1])
   {
    // 因为已经检查到同轴点,所以设置同轴对比加速检查标志为真
    bShortPass = true;

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

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

    bChkOK = true;
    short tmpvy = Set1BufY[nChkLink1][1];
    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)
    {
     //cout << "Linked." << endl;
     printf("%s", "Linked/n");

     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;
 for (short nChkLink1 = 0; !(Set1BufX[nChkLink1][0] == 0 && Set1BufX[nChkLink1][1] == 0); ++nChkLink1)
 {
  // 设置同轴对比加速检查标志
  bool bShortPass = false;

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

  for (short nChkLink2 = 0; !(Set2BufX[nChkLink2][0] == 0 && Set2BufX[nChkLink2][1] == 0); ++nChkLink2)
  {
   // debug
   //cout << "enter X for 2" << endl;

   // 检测是否在同一纵轴
   if (Set1BufX[nChkLink1][0] == Set2BufX[nChkLink2][0])
   {
    // 因为已经检查到同轴点,所以设置同轴对比加速检查标志为真
    bShortPass = true;

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

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

    bChkOK = true;
    short tmpvx = Set1BufX[nChkLink1][0];
    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)
    {
     //cout << "Linked." << endl;
     printf("Linked/n");

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

     break;
    }
   }
  }
 }

 // 横向处理完毕

 // 处理过程完毕

 // 如果通路不能连通则显示不能连通信息
 if (bChkOK == false)
 {
  //cout << "Unlinked." << endl;
  printf("%s", "Unlinked/n");
 }

 return 0;
}

连连看游戏的实现

连连看是一种很经典的休闲类游戏,并且其实现并不复杂,非常适合练手。 本文旨在介绍连连看游戏中的核心算法并给出一个基于fancy2D的简单实现。 一、游戏规则 连连看游戏的规则想必大家都很清楚...
  • xueruifan
  • xueruifan
  • 2015年08月25日 03:07
  • 1088

连连看游戏的核心算法

最近想做一个连连看的游戏,但一直没动手,因为觉得自己的思路还不够成熟,我做一个小游戏,一般是思路比较成熟了,才会去动手做,哈哈。我觉得这是对了的,是应该先考虑周全了再动手做,现在做大项目都提倡先写文档...
  • mu399
  • mu399
  • 2011年11月17日 18:49
  • 8784

用 JAVA 开发游戏连连看

用 JAVA 开发游戏连连看 (注:这篇文章是在2004.12完成的,当时是为了向《电脑爱好者》投稿,这是原稿,由于此杂志面向的读者原因,因此文章中有些地方显得过“白”,在此后,稿子经过两次修改,...
  • sxchen2012
  • sxchen2012
  • 2012年04月08日 20:31
  • 1421

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

连连看的消除有以下几种情况: 1.被选择的两个图形处于一条直线上时:数组的两个坐标中有一个是相同的,凭此即可判断; 2.被选择的图形经过一次拐点可相连时:可以将这两个图形抽象为两个点,这两个点可以...
  • never_waste
  • never_waste
  • 2016年07月17日 17:48
  • 2022

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

直接附上代码算了。。   /**************** 连连看 *****************/ /************** 2012-11-18 ****************/...
  • ckcz123
  • ckcz123
  • 2012年11月20日 09:48
  • 3032

Qt小游戏开发:连连看

继续更新~ 原来csdn博客用底部的批量导入图片就不会失真 预览 步骤 项目结构 包括:游戏逻辑类,界面类,资源 1 定义游戏数据结构 // ------------ 全局...
  • u012234115
  • u012234115
  • 2016年12月16日 19:28
  • 1354

连连看游戏核心代码(C++实现)

这两天研究了一下连连看游戏的源代码,感觉它挺简单的,主要就是判断选中的两张图片能否消去。我参考了网上的源代码(抱歉的是,不记得当时下载的网址了,在此对原作者表示深深的歉意!),然后自己把核心代码整理如...
  • u013149325
  • u013149325
  • 2013年12月16日 20:04
  • 2851

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

今天晚上,我又弄了一下程序,几番捣鼓,终于把提示和跨边界消除的连连看功能加入进去了。这是加入了提示功能的: 加入了一个简单的提示功能,可以让玩家在无法发现继续游戏的时候玩连连看的时候,提示一下玩家...
  • jjfly999
  • jjfly999
  • 2016年03月05日 21:07
  • 1306

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

连连看消除实现
  • zhaoyading
  • zhaoyading
  • 2015年05月14日 15:06
  • 708

连连看核心算法代码

public class Gamelogic { private final static int UP = 0; private final static int DOWN = 1; ...
  • fx1ts
  • fx1ts
  • 2016年04月22日 19:46
  • 370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个连连看游戏的通路检测算法
举报原因:
原因补充:

(最多只允许输入30个字)