不知道咋玩的自己去研究一下下

建一个c控制台程序

    // ConsoleApplication1.cpp: 定义控制台应用程序的入口点。
#include "stdafx.h"
int num, map_x = 7, map_y = 9, map_mod, move, old_move;
int player_x=4, player_y=5;
int hc_x[1000];//路径缓存
int hc_y[1000];
int jd_num = 0;//节点数量
int dj_num = 0;//节点数量
char map[10][10];
char overdis[10][10];
int over;
int allconst =0;
char debug_map[20][20] =
{
    { 0,0,0,0,0,0,0,0,0 },
    { 0,0,1,1,0,0,1,1,0 },
    { 0,1,1,1,1,1,1,1,0 },
    { 0,1,1,0,1,1,0,1,0 },
    { 0,1,1,1,1,1,1,1,0 },
    { 0,1,0,1,2,0,1,1,0 },
    { 0,1,1,1,1,1,1,1,0 },
    { 0,0,0,1,1,0,0,1,0 },
    { 0,1,1,1,1,1,1,1,0 },
    { 0,0,1,1,1,1,1,1,0 },
    { 0,0,0,0,0,0,0,0,0 }
};
#define entity "[ ]"
#define hole   "   "
#define player " * "
int disover();
/*******************/
int checkwin()//检查是否胜利
{
    char i = 0, j = 0, x, y;
    x = map_x;
    y = map_y;
    for (i = 1; i <= y; i++)
    {
        for (j = 1; j <= x; j++)
        {
            if (map[j][i] == 1)
            {
                return 1;
            }
        }
    }
    return 0;
}

int displaymapandplayer(char a)//显示地图和玩家
{
    char i = 0, j = 0, x, y;
    x = map_x;
    y = map_y;
    for (i = 1; i <= y; i++)
    {
        for (j = 1; j <= x; j++)
        {
            if (player_x == j&player_y == i)
            {
                if (a == 1)
                {
                    printf(player);
                }
                map[j][i] = 0;
            }
            else
            {
                if (map[j][i] == 1)
                {
                    if (a == 1)
                    {
                        printf(entity);
                    }
                }
                if (map[j][i] == 0)
                {
                    if (a == 1)
                    {
                        printf(hole);
                    }
                }
            }
        }
        if (a == 1)
        {
            printf(" ");
        }
    }
    return 0;
}

int moveplayer(int a, int b)//移动玩家 a移动方向  b是否移动 。如果b==0只会返回这一步是否可以走,不会真的移动玩家
{
    if (a == 8)
    {
        if (map[player_x][player_y - 1] == 0)
        {
            return 0;
        }
        else
        {
            if (b == 1)
            {
                player_y = player_y - 1;
            }
            return 1;
        }
    }
    if (a == 2)
    {
        if (map[player_x][player_y + 1] == 0)
        {
            return 0;
        }
        else
        {
            if (b == 1)
            {
                player_y = player_y + 1;
            }
            return 1;
        }
    }
    if (a == 4)
    {
        if (map[player_x - 1][player_y] == 0)
        {
            return 0;
        }
        else
        {
            if (b == 1)
            {
                player_x = player_x - 1;
            }
            return 1;
        }
    }
    if (a == 6)
    {
        if (map[player_x + 1][player_y] == 0)
        {
            return 0;
        }
        else
        {
            if (b == 1)
            {
                player_x = player_x + 1;
            }
            return 1;
        }
    }



}

/*************************************************************************/
int countrun(char hl)//计算可以走的方向
{
    char a = 0;
    if (hl == 0)
    {
        if (moveplayer(8, 0))
        {
            a = 1;
        }
    }
    if (hl == 1)
    {
        if (moveplayer(2, 0))
        {
            a = 1;
        }
    }
    if (hl == 2)
    {
        if (moveplayer(4, 0))
        {
            a = 1;
        }
    }
    if (hl == 3)
    {
        if (moveplayer(6, 0))
        {
            a = 1;
        }
    }
    return a;
}

int mainrecursive()//递归
{
    char a = 0, b;
    for (a = 0; a < 4; a++)
    {
        if (countrun(a))
        {
            if (a == 0)
            {
                old_move = 8;
                moveplayer(8, 1);
                hc_x[jd_num] = player_x;
                hc_y[jd_num] = player_y;
            }
            else
            {
                if (a == 1)
                {
                    old_move = 2;
                    moveplayer(2,1);
                    hc_x[jd_num] = player_x;
                    hc_y[jd_num] = player_y;
                }
                else
                {
                    if (a == 2)
                    {
                        old_move = 4;
                        moveplayer(4, 1);
                        hc_x[jd_num] = player_x;
                        hc_y[jd_num] = player_y;
                    }
                    else
                    {
                        if (a == 3)
                        {
                            old_move = 6;
                            moveplayer(6, 1);
                            hc_x[jd_num] = player_x;
                            hc_y[jd_num] = player_y;
                        }
                    }
                }
            }
            //dj_num = jd_num;
            jd_num += 1;
            displaymapandplayer(0);//是否打印过程(函数必须存在)
            //disover();
            //printf("输入任意字符继续 ");
            //scanf_s("%d", &over);
            mainrecursive();
        }
    }
    if (!checkwin())
    {
        return 1;
    }
    else
    {
        //jd_num = dj_num;
        jd_num -= 1;
        map[player_x][player_y] = 1;//回溯 地图还原
        player_x = hc_x[jd_num-1];  //玩家返回上一次的位置
        player_y = hc_y[jd_num-1];
    }
    return 0;
}

int disover()
{
    int a;
    char i = 0, j = 0, x, y;
    x = map_x;
    y = map_y;
    printf("解法:");
    printf("%d ", allconst);
    for (a = 0; a < jd_num; a++)
    {
        overdis[hc_x[a]][hc_y[a]] = a;
        //printf("%d", hc_x[a]);
        //printf(":");
        //printf("%d", hc_y[a]);
        //printf(" ");
    }
    for (i = 1; i <= y; i++)
    {
    for (j = 1; j <= x; j++)
    {
    if (overdis[j][i])
    {
            printf("[");
        printf("%2d", overdis[j][i]);
        printf("]");
    }
    else
    {
            printf("    ");
    }
    }

    printf(" ");

    }
    printf(" ");
    return 0;

}
void allmainrecursive()//递归
{
    char a = 0, b;
    for (a = 0; a < 4; a++)
    {
        if (countrun(a))
        {
            if (a == 0)
            {
                //old_move = 8;
                moveplayer(8, 1);
                hc_x[jd_num] = player_x;
                hc_y[jd_num] = player_y;
            }
            else
            {
                if (a == 1)
                {
                    //old_move = 2;
                    moveplayer(2, 1);
                    hc_x[jd_num] = player_x;
                    hc_y[jd_num] = player_y;
                }
                else
                {
                    if (a == 2)
                    {
                        //old_move = 4;
                        moveplayer(4, 1);
                        hc_x[jd_num] = player_x;
                        hc_y[jd_num] = player_y;
                    }
                    else
                    {
                        if (a == 3)
                        {
                            //old_move = 6;
                            moveplayer(6, 1);
                            hc_x[jd_num] = player_x;
                            hc_y[jd_num] = player_y;
                        }
                    }
                }
            }
            //dj_num = jd_num;
            jd_num += 1;
            displaymapandplayer(0);//是否打印过程(函数必须存在)
                                   //disover();
                                   //printf("输入任意字符继续 ");
                                   //scanf_s("%d", &over);
            allmainrecursive();
        }
    }
    if (!checkwin())
    {
        allconst += 1;
        disover();
    }
                //jd_num = dj_num;
        jd_num -= 1;
        map[player_x][player_y] = 1;//回溯 地图还原
        player_x = hc_x[jd_num-1];  //玩家返回上一次的位置
        player_y = hc_y[jd_num-1];
}
int main()
{
RGO:
    char i = 0, j = 0;
    jd_num = 0;//节点数量
    dj_num = 0;//节点数量
    allconst = 0;
    do
    {
        printf("输入布局模式: ");
        printf("0:输入布局 ");
        printf("1:自带布局 ");
        scanf_s("%d", &map_mod);
    } while ((map_mod != 1)&(map_mod != 0));
    if (map_mod == 0)
    {
        printf("布局输入方式: ");
        printf(" x--------------> ");
        printf("y nnnnnnnnnnnnnn ");
        printf("| nnnnnnnnnnnnnn ");
        printf("| nnnnnnnnnnnnnn ");
        printf("| nnnnnnnnnnnnnn ");
        printf("| nnnnnnnnnnnnnn ");
        printf("| nnnnnnnnnnnnnn ");
        printf("v                ");
        printf(" ");
        do
        {
            printf("输入地图长度:X(1-9) ");
            scanf_s("%d", &map_x);
        } while (map_x<1 | map_x>9);
        do
        {
            printf("输入地图宽度:Y(1-9) ");
            scanf_s("%d", &map_y);
        } while (map_y<1 | map_y>9);
        printf("输入地图布局:(输入内容0|1,从左到右,从上到下) ");
        for (i = 1; i <= map_y; i++)
        {
            for (j = 1; j <= map_x; j++)
            {
                do
                {
                    printf("%d,%d:", j, i);
                    scanf_s("%d", &map[j][i]);
                } while ((map[j][i] != 1)&(map[j][i] != 0));
                printf("%d ", map[j][i]);
            }
        }
        do
        {
            printf("输入玩家X轴:(1-9) ");
            scanf_s("%d", &player_x);
        } while (map_x<1 | map_x>9);
        do
        {
            printf("输入玩家Y轴:(1-9) ");
            scanf_s("%d", &player_y);
        } while (map_y<1 | map_y>9);
        printf(" ");
        displaymapandplayer(1);
    }
    if (map_mod == 1)
    {
        for (i = 1; i <= map_y; i++)
        {
            for (j = 1; j <= map_x; j++)
            {
                //printf("%d,%d:", j, i);
                //printf("%d ", debug_map[i][j]);
                map[j][i] = debug_map[i][j];
            }
        }
        //printf(" ");
        displaymapandplayer(1);
    }
    hc_x[jd_num] = player_x;
    hc_y[jd_num] = player_y;
    jd_num += 1;
    printf(" ");
    do
    {
        printf("0:玩家模式 ");
        printf("1:归递方法求解 ");
        printf("2:非归递方法求解 ");
        printf("3:计算所有解 ");
        scanf_s("%d", &num);
    } while (num<0 | num>3);
    if (num == 0)
    {
        while (checkwin())
        {
            do
            {
                printf("输入移动方向: ");
                printf("8:上 ");
                printf("2:下 ");
                printf("4:左 ");
                printf("6:右 ");
                scanf_s("%d", &move);
            } while ((move != 8)&(move != 2)&(move != 4)&(move != 6));
            moveplayer(move, 1);
            displaymapandplayer(1);
        }
            printf("YOU WIN! ");
    }
    if (num == 1)
    {
        if (mainrecursive())
        {
            allconst += 1;
            printf("计算完成! ");
            disover();
        }
        else
        {
            printf("无解! ");

        }
    }
    if (num == 3)
    {
            allmainrecursive();    
            printf("计算完成! ");    
    }
    printf("0:结束 ");
    printf("1:再来一次 ");
    scanf_s("%d", &over);
    if (over == 1)
    {
        goto RGO;
    }
    return 0;
}
最后修改:2020 年 06 月 28 日
声明:无闻风博客|版权所有,违者必究|如未注明,均为原创| 转载:转载请注明原文链接