对对碰(宝石迷阵 Bejeweled)游戏求解算法
#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;
}

阅读更多
个人分类: C++基础
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭