C++实现推箱子小游戏

时间:2021-05-20

本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下

游戏效果

简单易懂的推箱子闯关小游戏。

游戏代码

#include <bits/stdc++.h>#include <windows.h>#include <conio.h>using namespace std;#define VERSION "2.2"#define M 55int 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); } }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章