赞
踩
/********************************************************************* 程序名:推箱子小游戏 说明: *********************************************************************/ #define _CRT_SECURE_NO_WARNINGS #define _CRT_NONSTDC_NO_DEPRECATE #include <iostream> #include <conio.h> //函数getch()所需头文件 #include <windows.h> #include <string.h> #include <iomanip> //输入输出流控制符setw()所在头文件,设置字段宽度为n位 using namespace std; //宏定义二维数组下标 #define R 10 #define C 10 /*二维数组地图 1.表示墙体 3.表示目的地 4.表示箱子 5.表示人 0.表示空地 */ //存储当前使用的地图 int map[R][C] = { 0 }; int map1[R][C] = { { 0, 0, 1, 1, 1, 0, 0, 0 }, { 0, 0, 1, 3, 1, 0, 0, 0 }, { 0, 0, 1, 0, 1, 1, 1, 1 }, { 1, 1, 1, 0, 0, 4, 3, 1 }, { 1, 3, 4, 4, 0, 1, 1, 1 }, { 1, 1, 1, 5, 4, 1, 0, 0 }, { 0, 0, 0, 1, 3, 1, 0, 0 }, { 0, 0, 0, 1, 1, 1, 0, 0 } }; int map2[R][C] = { { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, { 1, 5, 0, 0, 1, 0, 0, 0, 0, 0 }, { 1, 0, 4, 4, 1, 0, 1, 1, 1, 0 }, { 1, 0, 4, 0, 1, 0, 1, 3, 1, 0 }, { 1, 1, 1, 0, 1, 1, 1, 3, 1, 0 }, { 0, 1, 1, 0, 0, 0, 0, 3, 1, 0 }, { 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 }, { 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 }, { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 } }; int map3[R][C] = { { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1 }, { 0, 0, 1, 1, 0, 0, 1, 0, 5, 1 }, { 0, 0, 1, 0, 0, 0, 1, 0, 0, 1 }, { 0, 0, 1, 4, 0, 4, 0, 4, 0, 1 }, { 0, 0, 1, 0, 4, 1, 1, 0, 0, 1 }, { 1, 1, 1, 0, 4, 0, 1, 0, 1, 1 }, { 1, 3, 3, 3, 3, 3, 0, 0, 1, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 }, }; void Game_Menu();/*初始化模块,显示游戏开始菜单*/ void Game_Description();/*初始化模块,显示游戏操作说明*/ int DrawMap();/*画图模块,绘制地图*/ void Move();/*移动模块,操作人物和箱子的移动*/ int finish();/*判断游戏是否挑战成功*/ void setmap(int n);/*游戏关卡设置 */ void color(int m);/*设置文本显示时的颜色*/ BOOL flag = true;/*定义布尔值的标记,方便在游戏时直接退出*/ int pass = 1; //关卡值 int main() { Game_Menu(); setmap(pass); bool g = true; while (g) { switch (getch()) { case 'Q': case 'q': g = false; case 'S': case 's': while (flag) { system("cls"); // 清屏 Game_Description(); DrawMap(); Move();//调用该函数时会有等待键盘输入的中断 if (finish()) { system("cls"); DrawMap(); cout << "游戏胜利!" << endl; system("PAUSE"); pass++; setmap(pass); } } break; } } } void Game_Menu()//游戏菜单,初始化模块,显示游戏开始菜单 { system("cls"); cout << "/************************************\\\n"; cout << "* *\n"; cout << "* 经 典 小 游 戏 *\n"; cout << "* 推 箱 子 *\n"; cout << "* 1.按 S 或 s 键 开 始 *\n"; cout << "* 2.按 Q 或 q 键 退 出 *\n"; cout << "* *\n"; cout << "\\***********************************/\n"; getch(); } void Game_Description()/*初始化模块,显示游戏操作说明*/ { cout << "/************************************\\\n"; cout << "* *\n"; cout << "* 操 作 提 示 *\n"; cout << "* 操作上移: W w ↑ *\n"; cout << "* 操作下移: S s ↓ *\n"; cout << "* 操作左移: A a ← *\n"; cout << "* 操作右移: D d → *\n"; cout << "* *\n"; cout << "* 退 出: Q q *\n"; cout << "* *\n"; cout << "* *\n"; cout << "\\***********************************/\n"; } int DrawMap() //画图模块,绘制地图 { cout << "关卡:" << pass << endl; for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { switch (map[i][j]) { case 0: color(0xF); cout << " "; //空地 break; case 1: color(8); cout << "■";//墙体 break; case 3: color(0xE); cout << "☆";//目的地 break; case 4: color(4); cout << "□";//箱子 break; case 5: color(3); cout << "♀"; //人 break; case 7: //4+3 箱子到达目的地 color(6); cout << "★"; break; case 8: //5+3 人与目的地重合 color(3); cout << "♀"; break; default: break; } } cout << '\n'; } return 0; } void Move() { int r, c; //保存人物位置 for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (map[i][j] == 5 || map[i][j] == 8) { r = i; c = j; } } } cout << "您当前的坐标为:(" << r << "," << c << ")" << endl; int ch;//保存键盘输入的ASCII值 ch = getch();//接受一个任意键的输入,不用按回车就返回。该函数的返回值是所输入字符 switch (ch) { case 'W':/*上移*/ case 'w': case 72: if (map[r - 1][c] == 0 || map[r - 1][c] == 3)//人物上方是空地(0)或者目的地 (3),对应情况5和情况6 { map[r - 1][c] += 5; // 人物向上移动,上方0(空地)变为5(箱子) map[r][c] -= 5; // /5(原人物)-5变为0(空地) } else if(map[r - 1][c] == 4 || map[r - 1][c] == 7)//人物上方是箱子,箱子在空格上或者箱子在目的地处,对应情况1,2,3,4 { if (map[r - 2][c] == 0 || map[r - 2][c] == 3)//箱子上方是空格或者前面是目的地,细化为情况1,2或情况3,4 { map[r - 2][c] += 4;//箱子向上移动,上一个0(空地)就变为 4(箱子) map[r - 1][c] += 1;//4(原箱子)+1变为 5(人物) map[r][c] -= 5; // /5(原人物)-5变为0(空地) } } break; case 'S': case 's': case '80': if (map[r + 1][c] == 0 || map[r + 1][c] == 3)//人下方是空地或目的地 { map[r + 1][c] += 5; map[r][c] -= 5; } else if (map[r + 1][c] == 4 || map[r + 1][c] == 7)//人下方是箱子 ,箱子在空地或者目的地上 { if (map[r + 2][c] == 0 || map[r + 2][c] == 3)//箱子下方是空地和目的地 { map[r + 2][c] += 4;//箱子向下移动,下一个0(空地)就变为 4(箱子) map[r + 1][c] += 1;//4(原箱子)+1变为 5(人物) map[r][c] -= 5;//5(原人物)-5变为0(空地) } } break; case 'A': case 'a': case 75: if (map[r][c - 1] == 0 || map[r][c - 1] == 3)//人左方是空地或目的地 { map[r][c - 1] += 5; map[r][c] -= 5; } else if (map[r][c - 1] == 4 || map[r][c - 1] == 7)//人左方是箱子 ,箱子在空地或者目的地上 { if (map[r][c - 2] == 0 || map[r][c - 2] == 3)//箱子左方是空地和目的地 { map[r][c - 2] += 4;//箱子向下移动,下一个0(空地)就变为 4(箱子) map[r][c - 1] += 1;//4(原箱子)+1变为 5(人物) map[r][c] -= 5;//5(原人物)-5变为0(空地) } } break; case 'D': case 'd': case 77: if (map[r][c + 1] == 0 || map[r][c + 1] == 3)//人右方是空地或目的地 { map[r][c + 1] += 5; map[r][c] -= 5; } else if (map[r][c + 1] == 4 || map[r][c + 1] == 7)//人右方是箱子 ,箱子在空地或者目的地上 { if (map[r][c + 2] == 0 || map[r][c + 2] == 3)//箱子右方是空地和目的地 { map[r][c + 2] += 4;//箱子向下移动,下一个0(空地)就变为 4(箱子) map[r][c + 1] += 1;//4(原箱子)+1变为 5(人物) map[r][c] -= 5;//5(原人物)-5变为0(空地) } } break; case 'Q': case 'q': flag = false; default: break; } } int finish() { for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (map[i][j] == 4)//当整个二维数组没有4(箱子) ,表明箱子都到位,返回1 { return 0; } } } return 1; } void setmap(int n){ if (n == 1) { memcpy(map, map1, sizeof(map1)); } if (n == 2) { memcpy(map, map2, sizeof(map2)); } if (n == 3) { memcpy(map, map3, sizeof(map3)); } } void color(int m) { HANDLE consolehend; consolehend = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台缓冲区句柄 SetConsoleTextAttribute(consolehend, m);//参数一为控制台缓冲区句柄,参数二为要设置的颜色 }



Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。