对对碰(宝石迷阵 Bejeweled)游戏求解算法

原创 2012年03月25日 02:50:57
#include <iostream>=
using namespace std;

const int nGridCount = 8;

int s_color[nGridCount][nGridCount] = {
    34, 92, 26, 34, 93, 10, 34, 39,
    10, 10, 34, 39, 15, 15, 39, 93,
    15, 26, 26, 93, 93, 39, 10, 15,
    26, 34, 39, 15, 39, 34, 34, 26,
    34, 39, 39, 34, 52, 26, 10, 10,
    26, 34, 10, 15, 52, 52, 15, 39,
    93, 15, 26, 26, 15, 39, 93, 93,
    34, 52, 93, 10, 93, 10, 39, 26
};

#define OUTPUT_PAIR(x1, y1, x2, y2) printf("(%d, %d), (%d, %d)\n", x1, y1, x2, y2);\
printf("%d     %d\n", s_color[x1][y1], s_color[x2][y2])

int main()
{
    // 横向地检查一遍
    for (int i = 0; i < nGridCount; i++)
    {
        for (int j = 0; j < nGridCount - 1; j++)
        {
            // xx  |   x |  xx | x   | x xx | xx x
            //   x | xx  | x   |  xx |      |      这些情况的处理
            if ( s_color[i][j] == s_color[i][j+1])
            {

                //   ?
                // xx   检查后端这两个点
                //   ?
                if (i - 1 >= 0 && j + 2 < nGridCount &&
                    s_color[i-1][j+2] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j+2, i-1, j+2);
                }
                if (i + 1 < nGridCount && j + 2 < nGridCount &&
                    s_color[i+1][j+2] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j+2, i+1, j+2);
                }

                // ?
                //  xx   检查前端这两个点
                // ?
                if (i - 1 >= 0 && j - 1 >= 0 &&
                    s_color[i-1][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j-1, i-1, j-1);
                }
                if (i + 1 < nGridCount && j - 1 >= 0 &&
                    s_color[i+1][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j-1, i+1, j-1);
                }

                // ? xx ? 检查这两个点
                if (j - 2 >= 0 && s_color[i][j-2] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j-2, i, j-1);
                }
                if (j + 3 < nGridCount && s_color[i][j+3] == s_color[i][j])
                {
                    OUTPUT_PAIR(i, j+3, i, j+2);
                }
            }
        }

        // x x |  x
        //  x  | x x  这些情况的处理
        for (int j = 0; j < nGridCount - 2; j++)
        {
            if (s_color[i][j] == s_color[i][j+2])
            {
                if (i - 1 >= 0 && s_color[i][j] == s_color[i-1][j+1])
                {
                    OUTPUT_PAIR(i, j+1, i-1, j+1);
                }
                if (i + 1 < nGridCount && s_color[i][j] == s_color[i+1][j+1])
                {
                    OUTPUT_PAIR(i, j+1, i+1, j+1);
                }
            }
        }
    }

    puts("- - - - - - - - - - ");
    // 再纵向地看一遍
    for (int j = 0; j < nGridCount; j++)
    {
        for (int i = 0; i < nGridCount - 1; i++)
        {
            // x  |  x |  x | x
            //  x | x  |  x |  x  这些情况的处理
            //  x | x  | x  |  x
            if ( s_color[i][j] == s_color[i+1][j])
            {

                //  x
                //  x   检查后端这两个点
                // ? ?
                if (j - 1 >= 0 && i + 2 < nGridCount &&
                    s_color[i+2][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i+2, j, i+2, j-1);
                }
                if (j + 1 < nGridCount && i + 2 < nGridCount &&
                    s_color[i+2][j+1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i+2, j, i+2, j+1);
                }


                // ? ?
                //  x   检查前端这两个点
                //  x
                if (j - 1 >= 0 && i - 1 >= 0 &&
                    s_color[i-1][j-1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i-1, j, i-1, j-1);
                }
                if (j + 1 < nGridCount && i - 1 >= 0 &&
                    s_color[i-1][j+1] == s_color[i][j])
                {
                    OUTPUT_PAIR(i-1, j, i-1, j+1);
                }

                // ? xx ? 检查这两个点
                if (i - 2 >= 0 && s_color[i-2][j] == s_color[i][j])
                {
                    OUTPUT_PAIR(i-2, j, i-1, j);
                }
                if (i + 3 < nGridCount && s_color[i+3][j] == s_color[i][j])
                {
                    OUTPUT_PAIR(i+3, j, i+2, j);
                }
            }
        }

        //  x  | x
        // x   |  x  这些情况的处理
        //  x  | x
        for (int i = 0; i < nGridCount - 2; i++)
        {
            if (s_color[i][j] == s_color[i+2][j])
            {
                if (j - 1 >= 0 && s_color[i][j] == s_color[i+1][j-1])
                {
                    OUTPUT_PAIR(i+1, j, i+1, j-1);
                }
                if (j + 1 < nGridCount && s_color[i][j] == s_color[i+1][j+1])
                {
                    OUTPUT_PAIR(i+1, j, i+1, j+1);
                }
            }
        }
    }
    cin >> ws;
}

相关文章推荐

排列宝石问题回溯算法

问题描述: 现有n种不同形状的宝石,每种n颗,共n*n颗。同一形状的n颗宝石分别具有n种不同的颜色c1,c2,…,cn中的一种颜色。欲将这n*n颗宝石排列成n行n列的一个方阵,使方阵中每一行和每一列...

消消乐游戏算法实现(三消乐)

先上前端效果图 3消乐地图初始化的时候不允许有下面两种情况的发生,就是不允许3个(3个以上已经包含3个,所以只要判断3个就可以了)相同颜色的格子连在一起, 下图是两种情况,细分分为6种情况,就是初始...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Java实战_仿QQ连连看

关于这个项目,真的是花了很多心思在上面,从开始构思,到最后完成,真的是花了整整一个月。大概是11月初开始学java swing的时候有的想法,然后开始构思整个思路,相关算法讨论以及调试。 最开始先对...

对连连看一种算法的分析与思考

对连连看一种算法的分析与思考      最近在用JAVA做一个经典游戏连连看,而连连看游戏的难点是在连线的判断上。下面是在在老师的提点下自己所写的一个连通判定算法的实现和问题分析: 约定:...
  • lihe758
  • lihe758
  • 2009年07月23日 10:32
  • 2853

Pygame游戏源代码:宝石迷阵

  • 2012年07月26日 16:56
  • 188KB
  • 下载

Android版宝石迷阵游戏完整源码

  • 2017年04月27日 12:24
  • 6.01MB
  • 下载

一个采用BF算法的宝石迷阵的消除解法

刚学C++编程一个多月,我就是个渣渣啊,算法啊数据结构啊基础为负。 测试输入为 2//有几次测试 4 5//地图规模,4行5列,都是自己输入的,可以更改的 .D.M. .DCAE .A...

桌面游戏--宝石迷阵

  • 2008年12月06日 20:56
  • 9.78MB
  • 下载

宝石迷阵3Android游戏源码

  • 2014年06月08日 14:03
  • 7.3MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对对碰(宝石迷阵 Bejeweled)游戏求解算法
举报原因:
原因补充:

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