C++实现推箱子小游戏
时间:2022-04-08 10:45:59|栏目:C代码|点击: 次
本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下
游戏效果
简单易懂的推箱子闯关小游戏。
游戏代码
#include <bits/stdc++.h> #include <windows.h> #include <conio.h> using namespace std; #define VERSION "2.2" #define M 55 int n, m, wall[M][M], hole[M][M], box[M][M]; int step, dct, query, cross, rx[233], ry[233]; char str[M][M], title[M], o; char atlas[M][M][M] = { {"...#@.","@..*..","#*##..","..##*#","..X.&.",".@#..."}, {"########...####","########..*####","########*....##","######.*..*..##" ,"@@..##.###.#...","@@.X......*..*.","@@..#.####.####","#####......####"}, {"####..#...##","##.*..*.#.##","...#.**#....","X*.....#*##.","#.*###**....","##..##.#*..." ,"###@@@.#.*#.","###@@@@@#.*.","####@@@@@...","#######.#*.#","#######....#","#######...##"}, {"..@*.##",".@*@*..","&*@*@X.",".@*@*.#","..@*..#"} }; int A[M] = {6, 8, 12, 5}, B[M] = {6, 15, 12, 7}; struct pos { int x, y; } player; struct node { pos man; int dct; vector<pos> box; node() { box.clear (); } } rec[M * M * M]; void color (int x); void clean (); bool check (int x, int y, int cross); bool forward (int rx, int ry); bool win (); void pt (); void update (); void playing (); void in (); void pass (); void Init (); void remain (); int main() { MessageBox (NULL, "欢迎来到推箱子游戏!", "温馨提示", MB_OK); Init (); while (true) { remain (); } return 0; } void color (int x) { SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), x); } void clean () { system("cls"); color(7); } bool check (int x, int y, int cross) { if (!cross) { return x < 1 || x > n || y < 1 || y > m || wall[x][y]; } return x < 0 || x > n + 1 || y < 0 || y > m + 1; } bool forward (int rx, int ry) { int x = player.x + rx, y = player.y + ry, X = x + rx, Y = y + ry; if (check (x,y,cross)) { return false; } if(box[x][y]) { if (check (X, Y, 0) || box[X][Y]) { return false; } } return true; } bool win () { for (int i = 0; i < rec[step].box.size (); i++) { if (!hole[rec[step].box[i].x][rec[step].box[i].y]) { return false; } } return true; } void pt () { memset (box, 0, sizeof (box)); for (int i = 0; i < rec[step].box.size (); i++) { box[rec[step].box[i].x][rec[step].box[i].y] = 1; } player.x = rec[step].man.x; player.y = rec[step].man.y; dct = rec[step].dct; clean (); color (154); puts ("按方向键进行移动,按删除键进行撤销"); puts ("按空格键查询步数。"); puts ("按0返回,按Esc键退出游戏"); color (7); for (int i = 0; i <= n + 1; i++) { printf(" "); for (int j = 0; j <= m + 1; j++) { if (i == player.x && j == player.y) { color (15); if (check (i, j, 0)) { color (63); } printf ("♀"); color (7); } else if (i == 0 || i == n + 1 || j == 0 || j == m + 1 || wall[i][j]) { color (3); printf ("■"); } else if(box[i][j]) { color (14); if (hole[i][j]) { color (12); } printf ("?"); } else if (hole[i][j]) { color (3); printf ("※"); } else { printf (" "); } } puts (""); } color (7); } void update () { node temp; int i, j; for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { if (box[i][j]) { pos po; po.x = i; po.y = j; temp.box.push_back (po); } } } temp.man.x = player.x; temp.man.y = player.y; temp.dct = dct; rec[step] = temp; } void playing () { dct = 72; step = 0; update (); pt (); int winstep = -1; while (o = getch ()) { int tp = 0; if (o == 72 || o == 77 || o == 80 || o == 75) { if (forward (rx[o],ry[o])) { int x = player.x + rx[o], y = player.y + ry[o]; if (box[x][y]) { box[x][y] = 0; box[x + rx[o]][y + ry[o]] = 1; } player.x = x; player.y = y; step++; } else { tp = 1; } dct = o; update (); } else if (o == 8) { tp = 3; step = max (0, step - 1); if (step <= winstep) { winstep = -1; } } else if (o == 48) { break; } else if (o == 27) { exit (0); } else if (o == 32) { query ^= 1; } else { tp = 2; } pt (); color (154); if (query) { printf ("当前步数为%d!\n", step); } if(win () || winstep != -1) { if (winstep == -1) { winstep = step; } printf ("恭喜您,您赢了!共用了%d步。\n", winstep); MessageBox (NULL, "恭喜您,您赢了!", "温馨提示", MB_OK); } else if (tp == 1) { color (207); puts("对不起,您无法推动这个方块!"); } else if (tp == 2) { color (207); } else if (tp == 3) { puts ("撤销成功!"); } color (7); } } void in () { memset (wall, 0, sizeof (wall)); memset (hole, 0, sizeof(hole)); memset (box, 0, sizeof(box)); clean (); puts ("第一行输入两个整数n和m,表示地图的大小"); puts ("接下来n行,每行m个元素。"); puts ("'.'表示空地"); puts ("'#'表示墙"); puts ("'*'表示箱子"); puts ("'@'表示洞"); puts ("'X'表示人" ); puts ("'&'表示箱子已在洞上"); scanf ("%d %d", &n, &m); int i,j; for (i = 1; i <= n; i++) { scanf ("%s", str[i] + 1); } for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { o = str[i][j]; if (o == 'X') { player.x = i; player.y = j; } if (o == '#') { wall[i][j] = 1; } if (o == '@' || o == '&') { hole[i][j] = 1; } if (o == '*' || o =='&') { box[i][j] = 1; } } } playing (); } void pass () { memset (wall, 0, sizeof (wall)); memset (hole, 0, sizeof (hole)); memset (box, 0, sizeof (box)); clean (); puts ("1.第一关"); puts ("2.第二关"); puts ("3.第三关"); puts ("4.第四关"); puts ("\n0.返回"); puts ("Esc.退出游戏"); while (o = getch ()) { if (o >= '1' && o <= '4') { int id = o - 48 - 1; n = A[id]; m = B[id]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { char o = atlas[id][i - 1][j - 1]; if (o == 'X') { player.x = i; player.y = j; } if (o == '#') { wall[i][j] = 1; } if (o == '@' || o == '&') { hole[i][j] = 1; } if (o == '*' || o =='&') { box[i][j] = 1; } } } playing (); break; } else if (o == 48) { break; } } } void Init () { system ("mode con cols=40 lines=20"); SetConsoleTitle ("推箱子"); rx[72] = -1; rx[80] = 1; ry[77] = 1; ry[75] = -1; } void remain () { clean (); puts ("1.闯关模式"); puts ("2.输入模式"); puts ("Esc.退出游戏"); while (o = getch ()) { if (o=='1') { pass (); break; } else if (o == '2') { in (); break; } else if (o == 27) { exit (0); } } }