C++推箱子

上代码:

​
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
#define red \
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED) // 红色
#define nop \
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY) // 原色
#define white \
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) // 白色
using namespace std;
void ycgb() {
    // 光标隐藏部分
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
string mapp[50][50] = {
    {""},
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P os###",
        "####o#  ",
        "   #P#  ",
        "   ###  ",
    },
    {
        "#####    ",
        "#s  #    ",
        "# oo# ###",
        "# o # #P#",
        "### ###P#",
        " ##    P#",
        " #   #  #",
        " #   ####",
        " #####   "
    },
    {
        " #######  ",
        " #     ###",
        "##o###   #",
        "# so   o #",
        "# PP# o ##",
        "##PP#   # ",
        " ######## "
    },
    {
        " #### ",
        "##  # ",
        "#so # ",
        "##o ##",
        "## o #",
        "#Po  #",
        "#PP@P#",
        "######"
    },
    {
        " #####  ",
        " #  ### ",
        " #so  # ",
        "### # ##",
        "#P# #  #",
        "#Po  # #",
        "#P   o #",
        "########"
    },
    {
        "   #######   ",
        "####     #   ",
        "#   P### #   ",
        "# # #    ##  ",
        "# # o o#P #  ",
        "# #  @  # #  ",
        "# P#o o # #  ",
        "##    # # ###",
        " # ###P    s#",
        " #     ##   #",
        " ############",
    },
    {
        "   #######",
        "  ##  # s#",
        "  #   #  #",
        "  #o o o #",
        "  # o##  #",
        "### o # ##",
        "#PPPPP  # ",
        "######### "
    },
    {
        "   ###### ",
        " ###    # ",
        "##P o## ##",
        "#PPo o  s#",
        "#PP o o ##",
        "######  # ",
        "     #### "
    },
    {
        " ######### ",
        " #  ##   # ",
        " #   o   # ",
        " #o ### o# ",
        " # #PPP# # ",
        "## #PPP# ##",
        "# o  o  o #",
        "#     # s #",
        "###########"
    },
    {
        "  ######",
        "  #    #",
        "###ooo #",
        "#s oPP #",
        "# oPPP##",
        "####  # ",
        "   #### "
    },
    {
        " ####  #####",
        "##  #  #   #",
        "# o ####o  #",
        "#  oPPPP o #",
        "##    # s ##",
        " ########## "
    },
    {
        "  ##### ",
        "###  s# ",
        "#  oP ##",
        "#  PoP #",
        "### @o #",
        "  #   ##",
        "  ##### ",
    },
    {
        "  ####  ",
        "  #PP#  ",
        " ## P## ",
        " #  oP# ",
        "## o  ##",
        "#  #oo #",
        "#  s   #",
        "########"
    },
    {
        "########",
        "#  #   #",
        "# oPPo #",
        "#soP@ ##",
        "# oPPo #",
        "#  #   #",
        "########"
    },
    {
        " #######",
        "##    ##",
        "# o oo #",
        "#PPPPPP#",
        "# oo o #",
        "### s###",
        "  ####  "
    },
    {
        "  ######  ",
        "  #    ###",
        "  # o    #",
        "### o ## #",
        "#PPP o   #",
        "#PPPo#o ##",
        "#### # o #",
        "   #  s  #",
        "   #######"
    },
    {
        "######   ",
        "#    #   ",
        "# ooo##  ",
        "#  #PP###",
        "##  PPo #",
        " # s    #",
        " ########"
    },
    {
        "  ########",
        "  #   #P #",
        " ##  oPPP#",
        " #  o #@P#",
        "## ##o# ##",
        "#   o  o #",
        "#   #    #",
        "#######  #",
        "      ####"
    },
    {
        " #######  ",
        " #PPPP #  ",
        "###PPPo###",
        "#  o#o o #",
        "# oo  #o #",
        "#    #   #",
        "#### s ###",
        "   #####  "
    },
    {
        "#######",
        "#PPoPP#",
        "#PP#PP#",
        "# ooo #",
        "#  o  #",
        "# ooo #",
        "#  #s #",
        "#######"
    },
    {
        "   ######  ",
        "   # PPP#  ",
        "####PPPP#  ",
        "#  ###o ###",
        "# o o  oo #",
        "#s o o    #",
        "#   ###   #",
        "##### #####"
    },
    {
        "######## ",
        "#      # ",
        "# #oo  # ",
        "# PPP# # ",
        "##PPPo ##",
        " # ## o #",
        " #o  o  #",
        " #  #  s#",
        " ########"
    },
    {
        "  #####   ",
        "###   ####",
        "#   o o  #",
        "# o   o s#",
        "###oo#####",
        "  #  PP#  ",
        "  #PPPP#  ",
        "  ######  "
    },
    {
        "######   #####",
        "#    ### #  P#",
        "#  o o # #PPP#",
        "# #  o ###  P#",
        "#  ooo   o sP#",
        "###  o  o#  P#",
        "  #  o#o #PPP#",
        "  ##     #  P#",
        "   ###########"
    },
    {
        "     ######",
        " #####P   #",
        " #  #PP## #",
        " #  oPP   #",
        " #  # P# ##",
        "### ##o#  #",
        "# o    oo #",
        "# #o#  #  #",
        "#s  #######",
        "#####      "
    },
    {
        " #########   ",
        " #   ##  ####",
        " # o        #",
        " ##o### ##  #",
        " #  ## @ # ##",
        " # oPPPPPP # ",
        "## ### P # # ",
        "#     o###o# ",
        "#   #    os# ",
        "#####o# #### ",
        "    #   #    ",
        "    #####    "
    },
    {
        "      #########",
        "      #       #",
        "      # # # # #",
        "      #  o o# #",
        "#######   o   #",
        "#PP#  ## o o# #",
        "#PP   ## o o  #",
        "#PP#  ## ######",
        "#PP# # o o #   ",
        "#PP     o  #   ",
        "#  ### s ###   ",
        "#### #####     "
    },
    {
        "    ####        ",
        "#####  #        ",
        "#  o o # #######",
        "#   o  # #@P@P@#",
        "## o o ###P@P@P#",
        " #o o  #  @P@P@#",
        " #so o    P@P@##",
        " #o o  #  @P@P@#",
        "## o o ###P@P@P#",
        "#   o  # #@P@P@#",
        "#  o o # #######",
        "#####  #        ",
        "    ####        "
    },
    {
        "######## ",
        "#PPPPPP# ",
        "#  o # ##",
        "# o # o #",
        "##o o o #",
        " #  s   #",
        " ########"
    },
    {
        "  ##########",
        "###   P    #",
        "#   ##o##  #",
        "# soP P Po##",
        "## o##o## # ",
        " #    P   # ",
        " ########## "
    },
    {
        "   ######",
        "####P  s#",
        "#  ooo  #",
        "#P##P##P#",
        "#   o   #",
        "#  oP# ##",
        "####   # ",
        "   ##### "
    },
    {
        " ###### ",
        " #P PP# ",
        " #P oP# ",
        "###  o##",
        "# o  o #",
        "# #o## #",
        "#   s  #",
        "########"
    },
    {
        "    ######    ",
        "  ###    ###  ",
        "  #   #o   ###",
        "  #   o   oo #",
        "  # oo #o    #",
        "  ##   o   o #",
        "###### #o#####",
        "#PPs #o  #    ",
        "#P#PP  o##    ",
        "#PPPPo# #     ",
        "#PPPP   #     ",
        "#########     "
    },
    {
        "###############",
        "#      #      #",
        "# o #o # o##o #",
        "# #  o #      #",
        "#   ##o#o##oo #",
        "# # # PPP #   #",
        "# o  P # Po # #",
        "# o#soPPP  #  #",
        "#    P # P  o #",
        "# ##Po###oP # #",
        "# # oPPPPP ## #",
        "#             #",
        "###############"
    },
    {
        "######### ",
        "#   ##  # ",
        "# # o o # ",
        "#  @P#  # ",
        "## #PsP## ",
        "##o###@###",
        "#        #",
        "#   ## # #",
        "######   #",
        "     #####"
    },
    {
        "########       ",
        "#      #       ",
        "# oo   ###     ",
        "#  o ooo ##### ",
        "## ## PPP    ##",
        " # #s#PPP###o #",
        " # # oPPP     #",
        "## # oPPPo # ##",
        "#  ##### ### # ",
        "#      o   o # ",
        "###########  # ",
        "          #### "
    },
    {
        "   ##### ",
        "   # s # ",
        "   #ooo# ",
        "####   # ",
        "#   P#o##",
        "# oPoP P#",
        "#  #P#P##",
        "######## "
    },
    {
        "############",
        "#PPP #     #",
        "#PP  # ##  #",
        "#PP     #  #",
        "#PP  # o## #",
        "#PPP #o o  #",
        "######  oo #",
        " ##  o oo  #",
        " #s ooo  # #",
        " ## o ##   #",
        "  #        #",
        "  ##########"
    },
    {
        "#########  ",
        "#       #  ",
        "#  o o o#  ",
        "## #o## #  ",
        " # PP PP## ",
        " ##PP PP # ",
        "  # ##o# ##",
        "  #o o o  #",
        "  #      s#",
        "  #########"
    },
    {
        "     #####",
        " #####   #",
        " # PP o# #",
        " # #P@   #",
        "## @P#o ##",
        "# o  o  # ",
        "#   ## s# ",
        "######### "
    }
};
int hang[50] = {0, 8, 9, 7, 8, 8, 11, 8, 7, 9, 7,
                6, 7, 8, 7, 7, 9, 7, 9, 8, 8,
                8, 8, 8, 9, 10, 12, 12, 13, 7, 7,
                8, 8, 12, 13, 10, 12, 8, 12, 10, 8
               };
int lie[50] = {0, 8, 9, 10, 6, 8, 13, 10, 10, 11, 8,
               12, 8, 8, 8, 8, 10, 9, 10, 10, 7,
               11, 9, 10, 14, 11, 13, 15, 16, 9, 12,
               9, 8, 14, 15, 10, 15, 9, 12, 11, 10
              };

string zhuyi[50][50] = {
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P os###",
        "####o#  ",
        "   #P#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P o ###",
        "####s#  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P os###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#Pos ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#@s  ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#@ s ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  #o####",
        "###s oP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  #s####",
        "###  oP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  # ####",
        "###s oP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  # ####",
        "### soP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  # ####",
        "###  s@#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    }
};
string s[50];
int n, m;
int bbb, ccc, ex, ey;
string ss[50];
int o[10000][2];
int P[10000][2];
int cnt = 2, flagg = 0;
int zn = 0, tim = 0;
void readcnt() {
    FILE *pf = fopen("推箱子关卡记录.txt", "r"); // 以只读的方式打开文件

    if (pf == NULL) {
        // 打开文件失败
        pf = fopen("推箱子关卡记录.txt", "w"); // 以只写的方式打开文件
        fwrite(&cnt, sizeof(int), 1, pf);
    }

    fseek(pf, 0, SEEK_SET);          // 使文件指针pf指向文件开头
    fread(&cnt, sizeof(int), 1, pf); // 读取文件当中的最高得分到max当中
    fclose(pf);                      // 关闭文件
    pf = NULL;                       // 文件指针及时置空
}
// 更新最高分到文件
void writecnt() {
    FILE *pf = fopen("推箱子关卡记录.txt", "w"); // 以只写的方式打开文件

    if (pf == NULL) {
        // 打开文件失败
        printf("写入失败\n");
        exit(0);
    }

    fwrite(&cnt, sizeof(int), 1, pf); // 将本局游戏得分写入文件当中
    fclose(pf);                       // 关闭文件
    pf = NULL;                        // 文件指针及时置空
    cout << "写入成功!";
}
int jieshu() {
    int flag = 0;

    for (int i = 0; i < bbb; i++) {
        for (int j = 0; j < bbb; j++) {
            if (o[i][0] == P[j][0] && o[i][1] == P[j][1]) {
                s[o[i][0]][o[i][1]] = '@';
                flag++;
                break;
            }
        }
    }

    if (flag == bbb)
        return 1;
    else
        return 0;
}
void chushihua() {
    for (int i = 0; i < n; i++)
        s[i] = ss[i];

    bbb = ccc = 0;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (s[i][j] == 'o')
                o[bbb][0] = i, o[bbb][1] = j, bbb++;

            if (s[i][j] == 'P')
                P[ccc][0] = i, P[ccc][1] = j, ccc++;

            if (s[i][j] == '@')
                o[bbb][0] = i, o[bbb][1] = j, bbb++, P[ccc][0] = i, P[ccc][1] = j, ccc++;

            if (s[i][j] == 's')
                ex = i, ey = j;
        }
    }

    return;
}
char op[1005], xx[1005];
int cc = 0;
void XIANG(int guan) {
    char t = xx[cc--];

    if (t == 'w') {
        s[ex - 1][ey] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        ++ex;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex - 2 && o[i][1] == ey) {
                o[i][0]++;
                break;
            }
        }
    }

    if (t == 's') {
        s[ex + 1][ey] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        --ex;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex + 2 && o[i][1] == ey) {
                o[i][0]--;
                break;
            }
        }
    }

    if (t == 'a') {
        s[ex][ey - 1] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        ++ey;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex && o[i][1] == ey - 2) {
                o[i][1]++;
                break;
            }
        }
    }

    if (t == 'd') {
        s[ex][ey + 1] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        --ey;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex && o[i][1] == ey + 2) {
                o[i][1]--;
                break;
            }
        }
    }
}
bool tuixiangzi(int flag, int guan) {
    if (flag == 1) {
        cout << "\n          推箱子小游戏第" << guan <<
             "关重新开始!\n\n       点击空格开始游戏,点击z键退出游戏。\n";

        while (1) {
            if (kbhit()) {
                char gg = getch();

                if (gg == 'z')
                    return 0;

                if (gg == ' ') {
                    system("cls");
                    break;
                }
            }
        }
    }

    int step = 0;
    system("cls");
    cout << "\n\n                   开始游戏!\n";
    Sleep(1000);
    system("cls");

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            char r = s[i][j];

            if (r == ' ')
                cout << "  ";

            if (r == '#')
                cout << "■";

            if (r == 's') {
                red;
                cout
                        << "♀";
                white;
            }

            if (r == 'o')
                cout << "□";

            if (r == 'P')
                cout << "☆";

            if (r == '@')
                cout << "★";
        }

        cout << "\n";
    }

    cc = 0;
    cout << "\n  关卡:第" << guan << "关     "
         << "步数:0步";
    char g;

    while (1) {
        if (kbhit()) {
            g = getch();

            if (g == 'r') {
                chushihua();
                system("cls");
                Sleep(100);
                return tuixiangzi(1, guan);
            }

            // 撤销
            bool flag = 0;

            if (g == 'z' && cc > 0) {
                if (xx[cc] != ' ') {
                    --step;
                    XIANG(guan);
                } else {
                    flag = 1;
                    g = op[cc];
                }
            } else if (!(g == 'a' || g == 75 || g == 'd' || g == 77 || g == 'w' || g == 72 || g == 's' || g == 80)) {
                continue;
            } else {
                if (g == 'a' || g == 75)
                    op[++cc] = 'd';

                if (g == 'd' || g == 77)
                    op[++cc] = 'a';

                if (g == 'w' || g == 72)
                    op[++cc] = 's';

                if (g == 's' || g == 80)
                    op[++cc] = 'w';

                if (g == 'a' || g == 75)
                    xx[cc] = 'a';

                if (g == 'd' || g == 77)
                    xx[cc] = 'd';

                if (g == 'w' || g == 72)
                    xx[cc] = 'w';

                if (g == 's' || g == 80)
                    xx[cc] = 's';
            }

            // 左移
            if (g == 'a' || g == 75) {
                if (s[ex][ey - 1] == ' ' || s[ex][ey - 1] == 'P')
                    s[ex][ey] = ' ', ey--, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex][ey - 1] == 'o' || s[ex][ey - 1] == '@') && (s[ex][ey - 2] == ' ' || s[ex][ey - 2] == 'P')) {
                    int sx = ex, sy = ey - 1;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][1]--;
                            s[sx][sy - 1] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ey--;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            //
            // 右移
            if (g == 'd' || g == 77) {
                if (s[ex][ey + 1] == ' ' || s[ex][ey + 1] == 'P')
                    s[ex][ey] = ' ', ey++, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex][ey + 1] == 'o' || s[ex][ey + 1] == '@') && (s[ex][ey + 2] == ' ' || s[ex][ey + 2] == 'P')) {
                    int sx = ex, sy = ey + 1;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][1]++;
                            s[sx][sy + 1] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ey++;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            //
            // 上移
            if (g == 'w' || g == 72) {
                if (s[ex - 1][ey] == ' ' || s[ex - 1][ey] == 'P')
                    s[ex][ey] = ' ', ex--, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex - 1][ey] == 'o' || s[ex - 1][ey] == '@') && (s[ex - 2][ey] == ' ' || s[ex - 2][ey] == 'P')) {
                    int sx = ex - 1, sy = ey;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][0]--;
                            s[sx - 1][sy] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ex--;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            //
            // 下移
            if (g == 's' || g == 80) {
                if (s[ex + 1][ey] == ' ' || s[ex + 1][ey] == 'P')
                    s[ex][ey] = ' ', ex++, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex + 1][ey] == 'o' || s[ex + 1][ey] == '@') && (s[ex + 2][ey] == ' ' || s[ex + 2][ey] == 'P')) {
                    int sx = ex + 1, sy = ey;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][0]++;
                            s[sx + 1][sy] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ex++;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            if (flag)
                --cc;

            system("cls");

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (i == ex && j == ey) {
                        red;
                        cout << "♀";
                        white;
                    } else {
                        for (int k = 0; k < bbb; k++) {
                            int flag = 0;

                            for (int l = 0; l < bbb; l++) {
                                if (o[l][0] != P[k][0] || o[l][1] != P[k][1])
                                    flag++;
                            }

                            if (flag == bbb)
                                s[P[k][0]][P[k][1]] = 'P';
                        }

                        char r = s[i][j];

                        if (r == ' ')
                            cout << "  ";

                        if (r == '#')
                            cout << "■";

                        if (r == 's') {
                            red;
                            cout << "♀";
                            white;
                        }

                        if (r == 'o')
                            cout << "□";

                        if (r == 'P')
                            cout << "☆";

                        if (r == '@')
                            cout << "★";
                    }
                }

                cout << "\n";
            }

            cout << "\n  关卡:第" << guan << "关     "
                 << "步数:" << step << "步";

            if (jieshu()) {
                Sleep(200);
                break;
            }
        }
    }

    system("cls");
    cout << "\n                恭喜你成功了!\n";
    cout << "         你共用了" << step << "步完成了第" << guan << "关卡。\n\n";
    cout << "        按z键退出,按空格键进入下一关。\n";

    while (1) {
        if (kbhit()) {
            char gg = getch();

            if (gg == 'z') {
                if (guan == cnt)
                    cnt++;

                flagg++;
                return 0;
            }

            if (gg == ' ') {
                if (guan == cnt)
                    cnt++;

                guan++, flagg++;
                n = hang[guan], m = lie[guan];

                for (int i = 0; i < n; i++)
                    s[i] = ss[i] = mapp[guan][i];

                bbb = ccc = 0;

                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < m; j++) {
                        if (s[i][j] == 'o')
                            o[bbb][0] = i, o[bbb][1] = j, bbb++;

                        if (s[i][j] == 'P')
                            P[ccc][0] = i, P[ccc][1] = j, ccc++;

                        if (s[i][j] == '@')
                            o[bbb][0] = i, o[bbb][1] = j, bbb++, P[ccc][0] = i, P[ccc][1] = j, ccc++;

                        if (s[i][j] == 's')
                            ex = i, ey = j;
                    }
                }

                return 0;
            }
        }
    }

    return 1;
}
int sum = 4;
string zhu[15] = {
    "",
    "         +---------推 箱 子---------+",
    "",
    "                   选择关卡",
    "                -> 游戏规则",
    "                   读取记录",
    "                   保存记录",
    "                   查看记录",
    "                   修改记录",
    "                   查看样例",
    "                   退出游戏",
    "",
    "    按↑(w)和↓(s)选择项目,按空格键确认。"
};
int nn = 13;
void yangli() {
    while (1) {
        system("cls");

        if (kbhit()) {
            char qqq = getch();

            if (qqq == 'q') {
                return;
            }
        }

        cout << "\n";

        for (int i = 0; i < 8; i++) {
            cout << "              ";

            for (int j = 0; j < 8; j++) {
                char r = zhuyi[zn][i][j];

                if (r == ' ')
                    cout << "  ";

                if (r == '#')
                    cout << "■";

                if (r == 's') {
                    red;
                    cout << "♀";
                    white;
                }

                if (r == 'o')
                    cout << "□";

                if (r == 'P')
                    cout << "☆";

                if (r == '@')
                    cout << "★";
            }

            cout << "\n";
        }

        zn = (zn + 1) % 11;
        cout << "\n按Q键退出";
        Sleep(500);
    }
}
int main() {
	system("colr 1f");
    white;
    ycgb();
    system("mode con cols=46 lines=18");
    for (int i = 0; i < nn; i++)
        cout << zhu[i] << "\n";

    while (1) {
        if (kbhit()) {
            char gg = getch();

            if ((gg == 's' || gg == 80) && sum != 10) {
                system("cls");
                zhu[sum + 1][16] = '-', zhu[sum + 1][17] = '>';
                zhu[sum][16] = zhu[sum][17] = ' ';

                for (int i = 0; i < nn; i++) {
                    cout << zhu[i] << "\n";
                }

                sum++;
            }

            if ((gg == 'w' || gg == 72) && sum != 3) {
                system("cls");
                zhu[sum - 1][16] = '-', zhu[sum - 1][17] = '>';
                zhu[sum][16] = zhu[sum][17] = ' ';

                for (int i = 0; i < nn; i++) {
                    cout << zhu[i] << "\n";
                }

                sum--;
            }

            if (gg == ' ') {
                zn = tim = 0;

                if (sum == 10) {
                    system("cls");
                    cout << "本游戏原作者为:CSDN:shit5418(剑客泰菲同学),邮箱shit54188_CSDN@163.com";
                    cout << "创作不易,请各位大佬多多指教\n\n";
                    system("pause");
                    return 0;
                }

                if (sum == 9) {
                    system("cls");
                    yangli();
                }

                if (sum == 8) {
                    system("cls");
                    cout << "请输入跳关编号:";
                    cin >> cnt;
                    cout << "正在保存记录...\n";
                    writecnt();
                    Sleep(1000);
                }

                if (sum == 5) {
                    system("cls");
                    cout << "正在读取记录...";
                    readcnt();
                    system("cls");
                    cout << "读取记录成功!\n";
                    cout << "当前记录为:";
                    red;
                    cout
                            << cnt << endl;
                    white;
                    system("pause");
                }

                if (sum == 6) {
                    system("cls");
                    cout << "正在写入记录...\n";
                    writecnt();
                    cout << endl;
                    system("pause");
                }

                if (sum == 7) {
                    system("cls");
                    cout << "当前记录为:";
                    red;
                    cout << cnt << endl;
                    white;
                    system("pause");
                }

                if (sum == 4) {
                    system("cls");
                    cout << "游戏目标:\n";
                    cout << "控制小人(";
                    red;
                    cout << "♀";
                    white;
                    cout << ")将所有箱子(□)推入指定地点(☆)。\n";
                    cout << "若指定地点已有箱子,则显示★。\n\n";
                    cout << "游戏规则:\n";
                    cout << "小人在没有障碍物(■)的情况下只能推动一个箱子。\n";
                    cout << "小人只能推箱子,不能拉。\n\n";
                    cout << "按键设置:\n";
                    cout << "用↑(w)、↓(s)、←(a)、→(d)控制小人移动。\n";
                    cout << "按z键撤销。\n";
                    cout << "按r键重玩或退出。\n";
                    cout << "计步方式:推着箱子走的有效步数\n";

                    if (cnt > 5)
                        cout << "点击v键跳转游戏解答网址\n",
                             cout << "注意,网址内顺序并非本游戏里关卡顺序\n";
                    else
                        cout << "自行玩到第六关会有游戏解答哦。\n\n";

                    cout << "                按空格键退出。\n";

                    while (1) {
                        if (kbhit()) {
                            char ggg = getch();

                            if (ggg == ' ') {
                                system("cls");

                                for (int i = 0; i < nn; i++)
                                    cout << zhu[i] << "\n";

                                break;
                            } else if (ggg == 'v' && cnt > 5) {
                                system("start http://v.4399pk.com/xiaoyouxi/game_1875.htm");
                            }
                        }
                    }
                }

                if (sum == 3) {
                    white;
                    system("cls");
                    cout << "\n                   选择关卡\n\n";
                    int k = cnt;

                    for (int i = 1; i <= 40; i++) {
                        if (i > cnt)
                            nop;
                        else if (i == k)
                            red;
                        else
                            white;

                        printf("%8d", i);

                        if (i % 5 == 0)
                            cout << "\n";
                    }

                    white;
                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";

                    while (1) {
                        if (kbhit()) {
                            char ggg = getch();

                            if (ggg == 'z') {
                                system("cls");

                                for (int i = 0; i < nn; i++)
                                    cout << zhu[i] << "\n";

                                break;
                            }

                            if (ggg == 'a' || ggg == 75) {
                                if (k - 1 >= 1) {
                                    k--;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == 'd' || ggg == 77) {
                                if (k + 1 <= cnt) {
                                    k++;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == 'w' || ggg == 72) {
                                if (k - 5 >= 1) {
                                    k -= 5;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == 's' || ggg == 80) {
                                if (k + 5 <= cnt) {
                                    k += 5;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == ' ') {
                                flagg = 0;
                                n = hang[k], m = lie[k];

                                for (int i = 0; i < n; i++)
                                    s[i] = ss[i] = mapp[k][i];

                                bbb = ccc = 0;

                                for (int i = 0; i < n; i++) {
                                    for (int j = 0; j < m; j++) {
                                        if (s[i][j] == 'o')
                                            o[bbb][0] = i, o[bbb][1] = j, bbb++;

                                        if (s[i][j] == 'P')
                                            P[ccc][0] = i, P[ccc][1] = j, ccc++;

                                        if (s[i][j] == '@')
                                            o[bbb][0] = i, o[bbb][1] = j, bbb++, P[ccc][0] = i, P[ccc][1] = j, ccc++;

                                        if (s[i][j] == 's')
                                            ex = i, ey = j;
                                    }
                                }

                                tuixiangzi(0, k);
                                k += flagg;
                                white;
                                system("cls");
                                cout << "\n                   选择关卡\n\n";

                                for (int i = 1; i <= 40; i++) {
                                    if (i > cnt)
                                        nop;
                                    else if (i == k)
                                        red;
                                    else
                                        white;

                                    printf("%8d", i);

                                    if (i % 5 == 0)
                                        cout << "\n";
                                }

                                white;
                                cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                            }
                        }
                    }
                }
            }

            system("cls");

            for (int i = 0; i < nn; i++)
                cout << zhu[i] << "\n";
        }
    }

    return 0;
}


​

#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
#define red \
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED) // 红色
#define nop \
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY) // 原色
#define white \
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) // 白色
using namespace std;
void ycgb() {
    // 光标隐藏部分
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
string mapp[50][50] = {
    {""},
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P os###",
        "####o#  ",
        "   #P#  ",
        "   ###  ",
    },
    {
        "#####    ",
        "#s  #    ",
        "# oo# ###",
        "# o # #P#",
        "### ###P#",
        " ##    P#",
        " #   #  #",
        " #   ####",
        " #####   "
    },
    {
        " #######  ",
        " #     ###",
        "##o###   #",
        "# so   o #",
        "# PP# o ##",
        "##PP#   # ",
        " ######## "
    },
    {
        " #### ",
        "##  # ",
        "#so # ",
        "##o ##",
        "## o #",
        "#Po  #",
        "#PP@P#",
        "######"
    },
    {
        " #####  ",
        " #  ### ",
        " #so  # ",
        "### # ##",
        "#P# #  #",
        "#Po  # #",
        "#P   o #",
        "########"
    },
    {
        "   #######   ",
        "####     #   ",
        "#   P### #   ",
        "# # #    ##  ",
        "# # o o#P #  ",
        "# #  @  # #  ",
        "# P#o o # #  ",
        "##    # # ###",
        " # ###P    s#",
        " #     ##   #",
        " ############",
    },
    {
        "   #######",
        "  ##  # s#",
        "  #   #  #",
        "  #o o o #",
        "  # o##  #",
        "### o # ##",
        "#PPPPP  # ",
        "######### "
    },
    {
        "   ###### ",
        " ###    # ",
        "##P o## ##",
        "#PPo o  s#",
        "#PP o o ##",
        "######  # ",
        "     #### "
    },
    {
        " ######### ",
        " #  ##   # ",
        " #   o   # ",
        " #o ### o# ",
        " # #PPP# # ",
        "## #PPP# ##",
        "# o  o  o #",
        "#     # s #",
        "###########"
    },
    {
        "  ######",
        "  #    #",
        "###ooo #",
        "#s oPP #",
        "# oPPP##",
        "####  # ",
        "   #### "
    },
    {
        " ####  #####",
        "##  #  #   #",
        "# o ####o  #",
        "#  oPPPP o #",
        "##    # s ##",
        " ########## "
    },
    {
        "  ##### ",
        "###  s# ",
        "#  oP ##",
        "#  PoP #",
        "### @o #",
        "  #   ##",
        "  ##### ",
    },
    {
        "  ####  ",
        "  #PP#  ",
        " ## P## ",
        " #  oP# ",
        "## o  ##",
        "#  #oo #",
        "#  s   #",
        "########"
    },
    {
        "########",
        "#  #   #",
        "# oPPo #",
        "#soP@ ##",
        "# oPPo #",
        "#  #   #",
        "########"
    },
    {
        " #######",
        "##    ##",
        "# o oo #",
        "#PPPPPP#",
        "# oo o #",
        "### s###",
        "  ####  "
    },
    {
        "  ######  ",
        "  #    ###",
        "  # o    #",
        "### o ## #",
        "#PPP o   #",
        "#PPPo#o ##",
        "#### # o #",
        "   #  s  #",
        "   #######"
    },
    {
        "######   ",
        "#    #   ",
        "# ooo##  ",
        "#  #PP###",
        "##  PPo #",
        " # s    #",
        " ########"
    },
    {
        "  ########",
        "  #   #P #",
        " ##  oPPP#",
        " #  o #@P#",
        "## ##o# ##",
        "#   o  o #",
        "#   #    #",
        "#######  #",
        "      ####"
    },
    {
        " #######  ",
        " #PPPP #  ",
        "###PPPo###",
        "#  o#o o #",
        "# oo  #o #",
        "#    #   #",
        "#### s ###",
        "   #####  "
    },
    {
        "#######",
        "#PPoPP#",
        "#PP#PP#",
        "# ooo #",
        "#  o  #",
        "# ooo #",
        "#  #s #",
        "#######"
    },
    {
        "   ######  ",
        "   # PPP#  ",
        "####PPPP#  ",
        "#  ###o ###",
        "# o o  oo #",
        "#s o o    #",
        "#   ###   #",
        "##### #####"
    },
    {
        "######## ",
        "#      # ",
        "# #oo  # ",
        "# PPP# # ",
        "##PPPo ##",
        " # ## o #",
        " #o  o  #",
        " #  #  s#",
        " ########"
    },
    {
        "  #####   ",
        "###   ####",
        "#   o o  #",
        "# o   o s#",
        "###oo#####",
        "  #  PP#  ",
        "  #PPPP#  ",
        "  ######  "
    },
    {
        "######   #####",
        "#    ### #  P#",
        "#  o o # #PPP#",
        "# #  o ###  P#",
        "#  ooo   o sP#",
        "###  o  o#  P#",
        "  #  o#o #PPP#",
        "  ##     #  P#",
        "   ###########"
    },
    {
        "     ######",
        " #####P   #",
        " #  #PP## #",
        " #  oPP   #",
        " #  # P# ##",
        "### ##o#  #",
        "# o    oo #",
        "# #o#  #  #",
        "#s  #######",
        "#####      "
    },
    {
        " #########   ",
        " #   ##  ####",
        " # o        #",
        " ##o### ##  #",
        " #  ## @ # ##",
        " # oPPPPPP # ",
        "## ### P # # ",
        "#     o###o# ",
        "#   #    os# ",
        "#####o# #### ",
        "    #   #    ",
        "    #####    "
    },
    {
        "      #########",
        "      #       #",
        "      # # # # #",
        "      #  o o# #",
        "#######   o   #",
        "#PP#  ## o o# #",
        "#PP   ## o o  #",
        "#PP#  ## ######",
        "#PP# # o o #   ",
        "#PP     o  #   ",
        "#  ### s ###   ",
        "#### #####     "
    },
    {
        "    ####        ",
        "#####  #        ",
        "#  o o # #######",
        "#   o  # #@P@P@#",
        "## o o ###P@P@P#",
        " #o o  #  @P@P@#",
        " #so o    P@P@##",
        " #o o  #  @P@P@#",
        "## o o ###P@P@P#",
        "#   o  # #@P@P@#",
        "#  o o # #######",
        "#####  #        ",
        "    ####        "
    },
    {
        "######## ",
        "#PPPPPP# ",
        "#  o # ##",
        "# o # o #",
        "##o o o #",
        " #  s   #",
        " ########"
    },
    {
        "  ##########",
        "###   P    #",
        "#   ##o##  #",
        "# soP P Po##",
        "## o##o## # ",
        " #    P   # ",
        " ########## "
    },
    {
        "   ######",
        "####P  s#",
        "#  ooo  #",
        "#P##P##P#",
        "#   o   #",
        "#  oP# ##",
        "####   # ",
        "   ##### "
    },
    {
        " ###### ",
        " #P PP# ",
        " #P oP# ",
        "###  o##",
        "# o  o #",
        "# #o## #",
        "#   s  #",
        "########"
    },
    {
        "    ######    ",
        "  ###    ###  ",
        "  #   #o   ###",
        "  #   o   oo #",
        "  # oo #o    #",
        "  ##   o   o #",
        "###### #o#####",
        "#PPs #o  #    ",
        "#P#PP  o##    ",
        "#PPPPo# #     ",
        "#PPPP   #     ",
        "#########     "
    },
    {
        "###############",
        "#      #      #",
        "# o #o # o##o #",
        "# #  o #      #",
        "#   ##o#o##oo #",
        "# # # PPP #   #",
        "# o  P # Po # #",
        "# o#soPPP  #  #",
        "#    P # P  o #",
        "# ##Po###oP # #",
        "# # oPPPPP ## #",
        "#             #",
        "###############"
    },
    {
        "######### ",
        "#   ##  # ",
        "# # o o # ",
        "#  @P#  # ",
        "## #PsP## ",
        "##o###@###",
        "#        #",
        "#   ## # #",
        "######   #",
        "     #####"
    },
    {
        "########       ",
        "#      #       ",
        "# oo   ###     ",
        "#  o ooo ##### ",
        "## ## PPP    ##",
        " # #s#PPP###o #",
        " # # oPPP     #",
        "## # oPPPo # ##",
        "#  ##### ### # ",
        "#      o   o # ",
        "###########  # ",
        "          #### "
    },
    {
        "   ##### ",
        "   # s # ",
        "   #ooo# ",
        "####   # ",
        "#   P#o##",
        "# oPoP P#",
        "#  #P#P##",
        "######## "
    },
    {
        "############",
        "#PPP #     #",
        "#PP  # ##  #",
        "#PP     #  #",
        "#PP  # o## #",
        "#PPP #o o  #",
        "######  oo #",
        " ##  o oo  #",
        " #s ooo  # #",
        " ## o ##   #",
        "  #        #",
        "  ##########"
    },
    {
        "#########  ",
        "#       #  ",
        "#  o o o#  ",
        "## #o## #  ",
        " # PP PP## ",
        " ##PP PP # ",
        "  # ##o# ##",
        "  #o o o  #",
        "  #      s#",
        "  #########"
    },
    {
        "     #####",
        " #####   #",
        " # PP o# #",
        " # #P@   #",
        "## @P#o ##",
        "# o  o  # ",
        "#   ## s# ",
        "######### "
    }
};
int hang[50] = {0, 8, 9, 7, 8, 8, 11, 8, 7, 9, 7,
                6, 7, 8, 7, 7, 9, 7, 9, 8, 8,
                8, 8, 8, 9, 10, 12, 12, 13, 7, 7,
                8, 8, 12, 13, 10, 12, 8, 12, 10, 8
               };
int lie[50] = {0, 8, 9, 10, 6, 8, 13, 10, 10, 11, 8,
               12, 8, 8, 8, 8, 10, 9, 10, 10, 7,
               11, 9, 10, 14, 11, 13, 15, 16, 9, 12,
               9, 8, 14, 15, 10, 15, 9, 12, 11, 10
              };

string zhuyi[50][50] = {
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P os###",
        "####o#  ",
        "   #P#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P o ###",
        "####s#  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#P os###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#Pos ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#@s  ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  # ####",
        "###o oP#",
        "#@ s ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #P#   ",
        "  #o####",
        "###s oP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  #s####",
        "###  oP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  # ####",
        "###s oP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  # ####",
        "### soP#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    },
    {
        "  ###   ",
        "  #@#   ",
        "  # ####",
        "###  s@#",
        "#@   ###",
        "#### #  ",
        "   #@#  ",
        "   ###  ",
    }
};
string s[50];
int n, m;
int bbb, ccc, ex, ey;
string ss[50];
int o[10000][2];
int P[10000][2];
int cnt = 2, flagg = 0;
int zn = 0, tim = 0;
void readcnt() {
    FILE *pf = fopen("推箱子关卡记录.txt", "r"); // 以只读的方式打开文件

    if (pf == NULL) {
        // 打开文件失败
        pf = fopen("推箱子关卡记录.txt", "w"); // 以只写的方式打开文件
        fwrite(&cnt, sizeof(int), 1, pf);
    }

    fseek(pf, 0, SEEK_SET);          // 使文件指针pf指向文件开头
    fread(&cnt, sizeof(int), 1, pf); // 读取文件当中的最高得分到max当中
    fclose(pf);                      // 关闭文件
    pf = NULL;                       // 文件指针及时置空
}
// 更新最高分到文件
void writecnt() {
    FILE *pf = fopen("推箱子关卡记录.txt", "w"); // 以只写的方式打开文件

    if (pf == NULL) {
        // 打开文件失败
        printf("写入失败\n");
        exit(0);
    }

    fwrite(&cnt, sizeof(int), 1, pf); // 将本局游戏得分写入文件当中
    fclose(pf);                       // 关闭文件
    pf = NULL;                        // 文件指针及时置空
    cout << "写入成功!";
}
int jieshu() {
    int flag = 0;

    for (int i = 0; i < bbb; i++) {
        for (int j = 0; j < bbb; j++) {
            if (o[i][0] == P[j][0] && o[i][1] == P[j][1]) {
                s[o[i][0]][o[i][1]] = '@';
                flag++;
                break;
            }
        }
    }

    if (flag == bbb)
        return 1;
    else
        return 0;
}
void chushihua() {
    for (int i = 0; i < n; i++)
        s[i] = ss[i];

    bbb = ccc = 0;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (s[i][j] == 'o')
                o[bbb][0] = i, o[bbb][1] = j, bbb++;

            if (s[i][j] == 'P')
                P[ccc][0] = i, P[ccc][1] = j, ccc++;

            if (s[i][j] == '@')
                o[bbb][0] = i, o[bbb][1] = j, bbb++, P[ccc][0] = i, P[ccc][1] = j, ccc++;

            if (s[i][j] == 's')
                ex = i, ey = j;
        }
    }

    return;
}
char op[1005], xx[1005];
int cc = 0;
void XIANG(int guan) {
    char t = xx[cc--];

    if (t == 'w') {
        s[ex - 1][ey] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        ++ex;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex - 2 && o[i][1] == ey) {
                o[i][0]++;
                break;
            }
        }
    }

    if (t == 's') {
        s[ex + 1][ey] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        --ex;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex + 2 && o[i][1] == ey) {
                o[i][0]--;
                break;
            }
        }
    }

    if (t == 'a') {
        s[ex][ey - 1] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        ++ey;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex && o[i][1] == ey - 2) {
                o[i][1]++;
                break;
            }
        }
    }

    if (t == 'd') {
        s[ex][ey + 1] = ' ';

        if (mapp[guan][ex][ey] == 'P') {
            s[ex][ey] = '@';
        } else {
            s[ex][ey] = 'o';
        }

        --ey;
        s[ex][ey] = 's';

        for (int i = 0; i < bbb; i++) {
            if (o[i][0] == ex && o[i][1] == ey + 2) {
                o[i][1]--;
                break;
            }
        }
    }
}
bool tuixiangzi(int flag, int guan) {
    if (flag == 1) {
        cout << "\n          推箱子小游戏第" << guan <<
             "关重新开始!\n\n       点击空格开始游戏,点击z键退出游戏。\n";

        while (1) {
            if (kbhit()) {
                char gg = getch();

                if (gg == 'z')
                    return 0;

                if (gg == ' ') {
                    system("cls");
                    break;
                }
            }
        }
    }

    int step = 0;
    system("cls");
    cout << "\n\n                   开始游戏!\n";
    Sleep(1000);
    system("cls");

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            char r = s[i][j];

            if (r == ' ')
                cout << "  ";

            if (r == '#')
                cout << "■";

            if (r == 's') {
                red;
                cout
                        << "♀";
                white;
            }

            if (r == 'o')
                cout << "□";

            if (r == 'P')
                cout << "☆";

            if (r == '@')
                cout << "★";
        }

        cout << "\n";
    }

    cc = 0;
    cout << "\n  关卡:第" << guan << "关     "
         << "步数:0步";
    char g;

    while (1) {
        if (kbhit()) {
            g = getch();

            if (g == 'r') {
                chushihua();
                system("cls");
                Sleep(100);
                return tuixiangzi(1, guan);
            }

            // 撤销
            bool flag = 0;

            if (g == 'z' && cc > 0) {
                if (xx[cc] != ' ') {
                    --step;
                    XIANG(guan);
                } else {
                    flag = 1;
                    g = op[cc];
                }
            } else if (!(g == 'a' || g == 75 || g == 'd' || g == 77 || g == 'w' || g == 72 || g == 's' || g == 80)) {
                continue;
            } else {
                if (g == 'a' || g == 75)
                    op[++cc] = 'd';

                if (g == 'd' || g == 77)
                    op[++cc] = 'a';

                if (g == 'w' || g == 72)
                    op[++cc] = 's';

                if (g == 's' || g == 80)
                    op[++cc] = 'w';

                if (g == 'a' || g == 75)
                    xx[cc] = 'a';

                if (g == 'd' || g == 77)
                    xx[cc] = 'd';

                if (g == 'w' || g == 72)
                    xx[cc] = 'w';

                if (g == 's' || g == 80)
                    xx[cc] = 's';
            }

            // 左移
            if (g == 'a' || g == 75) {
                if (s[ex][ey - 1] == ' ' || s[ex][ey - 1] == 'P')
                    s[ex][ey] = ' ', ey--, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex][ey - 1] == 'o' || s[ex][ey - 1] == '@') && (s[ex][ey - 2] == ' ' || s[ex][ey - 2] == 'P')) {
                    int sx = ex, sy = ey - 1;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][1]--;
                            s[sx][sy - 1] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ey--;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            //
            // 右移
            if (g == 'd' || g == 77) {
                if (s[ex][ey + 1] == ' ' || s[ex][ey + 1] == 'P')
                    s[ex][ey] = ' ', ey++, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex][ey + 1] == 'o' || s[ex][ey + 1] == '@') && (s[ex][ey + 2] == ' ' || s[ex][ey + 2] == 'P')) {
                    int sx = ex, sy = ey + 1;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][1]++;
                            s[sx][sy + 1] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ey++;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            //
            // 上移
            if (g == 'w' || g == 72) {
                if (s[ex - 1][ey] == ' ' || s[ex - 1][ey] == 'P')
                    s[ex][ey] = ' ', ex--, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex - 1][ey] == 'o' || s[ex - 1][ey] == '@') && (s[ex - 2][ey] == ' ' || s[ex - 2][ey] == 'P')) {
                    int sx = ex - 1, sy = ey;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][0]--;
                            s[sx - 1][sy] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ex--;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            //
            // 下移
            if (g == 's' || g == 80) {
                if (s[ex + 1][ey] == ' ' || s[ex + 1][ey] == 'P')
                    s[ex][ey] = ' ', ex++, s[ex][ey] = 's', xx[cc] = ' ';
                else if ((s[ex + 1][ey] == 'o' || s[ex + 1][ey] == '@') && (s[ex + 2][ey] == ' ' || s[ex + 2][ey] == 'P')) {
                    int sx = ex + 1, sy = ey;

                    for (int i = 0; i < bbb; i++) {
                        if (o[i][0] == sx && o[i][1] == sy) {
                            s[sx][sy] = ' ';
                            o[i][0]++;
                            s[sx + 1][sy] = 'o';
                            break;
                        }
                    }

                    s[ex][ey] = ' ';
                    ex++;
                    s[ex][ey] = 's';
                    step++;
                } else {
                    --cc;
                }
            }

            if (flag)
                --cc;

            system("cls");

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (i == ex && j == ey) {
                        red;
                        cout << "♀";
                        white;
                    } else {
                        for (int k = 0; k < bbb; k++) {
                            int flag = 0;

                            for (int l = 0; l < bbb; l++) {
                                if (o[l][0] != P[k][0] || o[l][1] != P[k][1])
                                    flag++;
                            }

                            if (flag == bbb)
                                s[P[k][0]][P[k][1]] = 'P';
                        }

                        char r = s[i][j];

                        if (r == ' ')
                            cout << "  ";

                        if (r == '#')
                            cout << "■";

                        if (r == 's') {
                            red;
                            cout << "♀";
                            white;
                        }

                        if (r == 'o')
                            cout << "□";

                        if (r == 'P')
                            cout << "☆";

                        if (r == '@')
                            cout << "★";
                    }
                }

                cout << "\n";
            }

            cout << "\n  关卡:第" << guan << "关     "
                 << "步数:" << step << "步";

            if (jieshu()) {
                Sleep(200);
                break;
            }
        }
    }

    system("cls");
    cout << "\n                恭喜你成功了!\n";
    cout << "         你共用了" << step << "步完成了第" << guan << "关卡。\n\n";
    cout << "        按z键退出,按空格键进入下一关。\n";

    while (1) {
        if (kbhit()) {
            char gg = getch();

            if (gg == 'z') {
                if (guan == cnt)
                    cnt++;

                flagg++;
                return 0;
            }

            if (gg == ' ') {
                if (guan == cnt)
                    cnt++;

                guan++, flagg++;
                n = hang[guan], m = lie[guan];

                for (int i = 0; i < n; i++)
                    s[i] = ss[i] = mapp[guan][i];

                bbb = ccc = 0;

                for (int i = 0; i < n; i++) {
                    for (int j = 0; j < m; j++) {
                        if (s[i][j] == 'o')
                            o[bbb][0] = i, o[bbb][1] = j, bbb++;

                        if (s[i][j] == 'P')
                            P[ccc][0] = i, P[ccc][1] = j, ccc++;

                        if (s[i][j] == '@')
                            o[bbb][0] = i, o[bbb][1] = j, bbb++, P[ccc][0] = i, P[ccc][1] = j, ccc++;

                        if (s[i][j] == 's')
                            ex = i, ey = j;
                    }
                }

                return 0;
            }
        }
    }

    return 1;
}
int sum = 4;
string zhu[15] = {
    "",
    "         +---------推 箱 子---------+",
    "",
    "                   选择关卡",
    "                -> 游戏规则",
    "                   读取记录",
    "                   保存记录",
    "                   查看记录",
    "                   修改记录",
    "                   查看样例",
    "                   退出游戏",
    "",
    "    按↑(w)和↓(s)选择项目,按空格键确认。"
};
int nn = 13;
void yangli() {
    while (1) {
        system("cls");

        if (kbhit()) {
            char qqq = getch();

            if (qqq == 'q') {
                return;
            }
        }

        cout << "\n";

        for (int i = 0; i < 8; i++) {
            cout << "              ";

            for (int j = 0; j < 8; j++) {
                char r = zhuyi[zn][i][j];

                if (r == ' ')
                    cout << "  ";

                if (r == '#')
                    cout << "■";

                if (r == 's') {
                    red;
                    cout << "♀";
                    white;
                }

                if (r == 'o')
                    cout << "□";

                if (r == 'P')
                    cout << "☆";

                if (r == '@')
                    cout << "★";
            }

            cout << "\n";
        }

        zn = (zn + 1) % 11;
        cout << "\n按Q键退出";
        Sleep(500);
    }
}
int main() {
    system("colr 1f");
    white;
    ycgb();
    system("mode con cols=46 lines=18");
    for (int i = 0; i < nn; i++)
        cout << zhu[i] << "\n";

    while (1) {
        if (kbhit()) {
            char gg = getch();

            if ((gg == 's' || gg == 80) && sum != 10) {
                system("cls");
                zhu[sum + 1][16] = '-', zhu[sum + 1][17] = '>';
                zhu[sum][16] = zhu[sum][17] = ' ';

                for (int i = 0; i < nn; i++) {
                    cout << zhu[i] << "\n";
                }

                sum++;
            }

            if ((gg == 'w' || gg == 72) && sum != 3) {
                system("cls");
                zhu[sum - 1][16] = '-', zhu[sum - 1][17] = '>';
                zhu[sum][16] = zhu[sum][17] = ' ';

                for (int i = 0; i < nn; i++) {
                    cout << zhu[i] << "\n";
                }

                sum--;
            }

            if (gg == ' ') {
                zn = tim = 0;

                if (sum == 10) {
                    system("cls");
                    cout << "本游戏原作者为:CSDN:shit5418(剑客泰菲同学),邮箱shit54188_CSDN@163.com";
                    cout << "创作不易,请各位大佬多多指教\n\n";
                    system("pause");
                    return 0;
                }

                if (sum == 9) {
                    system("cls");
                    yangli();
                }

                if (sum == 8) {
                    system("cls");
                    cout << "请输入跳关编号:";
                    cin >> cnt;
                    cout << "正在保存记录...\n";
                    writecnt();
                    Sleep(1000);
                }

                if (sum == 5) {
                    system("cls");
                    cout << "正在读取记录...";
                    readcnt();
                    system("cls");
                    cout << "读取记录成功!\n";
                    cout << "当前记录为:";
                    red;
                    cout
                            << cnt << endl;
                    white;
                    system("pause");
                }

                if (sum == 6) {
                    system("cls");
                    cout << "正在写入记录...\n";
                    writecnt();
                    cout << endl;
                    system("pause");
                }

                if (sum == 7) {
                    system("cls");
                    cout << "当前记录为:";
                    red;
                    cout << cnt << endl;
                    white;
                    system("pause");
                }

                if (sum == 4) {
                    system("cls");
                    cout << "游戏目标:\n";
                    cout << "控制小人(";
                    red;
                    cout << "♀";
                    white;
                    cout << ")将所有箱子(□)推入指定地点(☆)。\n";
                    cout << "若指定地点已有箱子,则显示★。\n\n";
                    cout << "游戏规则:\n";
                    cout << "小人在没有障碍物(■)的情况下只能推动一个箱子。\n";
                    cout << "小人只能推箱子,不能拉。\n\n";
                    cout << "按键设置:\n";
                    cout << "用↑(w)、↓(s)、←(a)、→(d)控制小人移动。\n";
                    cout << "按z键撤销。\n";
                    cout << "按r键重玩或退出。\n";
                    cout << "计步方式:推着箱子走的有效步数\n";

                    if (cnt > 5)
                        cout << "点击v键跳转游戏解答网址\n",
                             cout << "注意,网址内顺序并非本游戏里关卡顺序\n";
                    else
                        cout << "自行玩到第六关会有游戏解答哦。\n\n";

                    cout << "                按空格键退出。\n";

                    while (1) {
                        if (kbhit()) {
                            char ggg = getch();

                            if (ggg == ' ') {
                                system("cls");

                                for (int i = 0; i < nn; i++)
                                    cout << zhu[i] << "\n";

                                break;
                            } else if (ggg == 'v' && cnt > 5) {
                                system("start http://v.4399pk.com/xiaoyouxi/game_1875.htm");
                            }
                        }
                    }
                }

                if (sum == 3) {
                    white;
                    system("cls");
                    cout << "\n                   选择关卡\n\n";
                    int k = cnt;

                    for (int i = 1; i <= 40; i++) {
                        if (i > cnt)
                            nop;
                        else if (i == k)
                            red;
                        else
                            white;

                        printf("%8d", i);

                        if (i % 5 == 0)
                            cout << "\n";
                    }

                    white;
                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";

                    while (1) {
                        if (kbhit()) {
                            char ggg = getch();

                            if (ggg == 'z') {
                                system("cls");

                                for (int i = 0; i < nn; i++)
                                    cout << zhu[i] << "\n";

                                break;
                            }

                            if (ggg == 'a' || ggg == 75) {
                                if (k - 1 >= 1) {
                                    k--;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == 'd' || ggg == 77) {
                                if (k + 1 <= cnt) {
                                    k++;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == 'w' || ggg == 72) {
                                if (k - 5 >= 1) {
                                    k -= 5;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == 's' || ggg == 80) {
                                if (k + 5 <= cnt) {
                                    k += 5;
                                    white;
                                    system("cls");
                                    cout << "\n                   选择关卡\n\n";

                                    for (int i = 1; i <= 40; i++) {
                                        if (i > cnt)
                                            nop;
                                        else if (i == k)
                                            red;
                                        else
                                            white;

                                        printf("%8d", i);

                                        if (i % 5 == 0)
                                            cout << "\n";
                                    }

                                    white;
                                    cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                                }
                            }

                            if (ggg == ' ') {
                                flagg = 0;
                                n = hang[k], m = lie[k];

                                for (int i = 0; i < n; i++)
                                    s[i] = ss[i] = mapp[k][i];

                                bbb = ccc = 0;

                                for (int i = 0; i < n; i++) {
                                    for (int j = 0; j < m; j++) {
                                        if (s[i][j] == 'o')
                                            o[bbb][0] = i, o[bbb][1] = j, bbb++;

                                        if (s[i][j] == 'P')
                                            P[ccc][0] = i, P[ccc][1] = j, ccc++;

                                        if (s[i][j] == '@')
                                            o[bbb][0] = i, o[bbb][1] = j, bbb++, P[ccc][0] = i, P[ccc][1] = j, ccc++;

                                        if (s[i][j] == 's')
                                            ex = i, ey = j;
                                    }
                                }

                                tuixiangzi(0, k);
                                k += flagg;
                                white;
                                system("cls");
                                cout << "\n                   选择关卡\n\n";

                                for (int i = 1; i <= 40; i++) {
                                    if (i > cnt)
                                        nop;
                                    else if (i == k)
                                        red;
                                    else
                                        white;

                                    printf("%8d", i);

                                    if (i % 5 == 0)
                                        cout << "\n";
                                }

                                white;
                                cout << "\n    按↑(w)、↓(s)、←(a)、→(d)选择关卡。\n           按空格键进入,按z键退出。\n";
                            }
                        }
                    }
                }
            }

            system("cls");

            for (int i = 0; i < nn; i++)
                cout << zhu[i] << "\n";
        }
    }

    return 0;
}

DEVC是一种实现箱子小游戏的开发环境。在引用中,给出了详细介绍和示例代码,可以作为参考。在箱子游戏中,玩家需要通过移动来箱子到目标位置。在引用中提供了一部分代码示例,展示了当玩家移动一步时,箱子和目标位置的变化。具体代码如下: ``` else if(a[x+1][y]=='O') { if(a[x+2][y]==' ') { a[x][y]=' '; x++; a[x][y]='S'; a[x+1][y]='O'; } else if(a[x+2][y]=='*') { a[x][y]=' '; x++; a[x][y]='S'; a[x+1][y]=' '; cnt++; } } ``` 这段代码展示了当玩家向下移动时,如果目标位置是空地,那么箱子和玩家都会向下移动,并且箱子会出现在新的目标位置上。如果目标位置是已经有箱子的地方,那么箱子会被到下一个空地,并且计数器会增加。而DEVC开发环境可以帮助开发者更方便地实现箱子游戏的逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [DEVC++实现箱子小游戏](https://download.csdn.net/download/weixin_38728464/12743680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [如何用DevC++做箱子?(2)](https://blog.csdn.net/xiaohubushihu/article/details/128430031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值