首先声明,这是本人编程实习课的大作业,肝了大半天,才算是完成了这么一个丑陋但功能尚且完善的小游戏。
笔者目前才大一,代码能力还不怎么样,写这个程序也没花太多时间。因此显然,代码在算法上应该还存在一定的优化空间,代码的格式以及注释也不是那么明了。
接下来有时间的话,应该会再打磨一下。比如完善一下代码和注释,以及尝试一下多文件编程。
欢迎各位大佬多多批评指正!
运行效果:
1.启动程序会进入主界面,可以在主界面选择三个难度不同的地图。具体操作方法如程序所示。
2.进入游戏后的操作方法就和常见的推箱子一样,另外本程序可以退出游戏或返回主页面。
3.通关后,则会恭喜玩家成功通关,并显示走过了几个有效移动步数。若是按q退出游戏的,则只显示GAME OVER。3秒后程序关闭。
啥也不多说了,上代码:
#include#include #include int MAPs[3][9][11]={{{0,0,0,1,1,1,0,0,0,0,0}, {0,0,0,1,4,1,0,0,0,0,0}, {0,0,0,1,0,1,1,1,1,1,1}, {1,1,1,1,3,2,3,0,0,4,1}, {1,4,0,0,3,3,1,1,1,1,1}, {1,1,1,1,1,0,1,0,0,0,0}, {0,0,0,0,1,0,1,0,0,0,0}, {0,0,0,0,1,4,1,0,0,0,0}, {0,0,0,0,1,1,1,0,0,0,0}}, { {0,1,1,1,1,1,1,1,1,1,0}, {0,1,0,0,0,1,0,0,0,1,0}, {0,1,0,0,3,0,0,0,0,1,0}, {0,1,0,3,0,3,3,3,0,1,1}, {0,1,0,0,0,2,0,0,0,0,1}, {1,1,0,0,1,1,1,0,3,0,1}, {1,0,4,4,0,4,0,0,0,0,1}, {1,0,4,4,0,4,4,3,0,1,1}, {1,1,1,1,1,1,1,1,1,1,0}}, { {0,1,1,1,1,1,1,1,0,0,0}, {0,1,0,0,0,0,0,1,1,1,0}, {1,1,3,1,1,1,0,0,0,1,0}, {1,0,0,0,0,2,3,3,0,1,0}, {1,0,4,4,1,0,3,0,1,1,0}, {1,1,4,4,1,0,0,0,1,0,0}, {1,1,1,1,1,1,1,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0}} };//原始的图表,其中 0 代表着空白的地方; 1 代表着墙;2 代表着人; //3 代表着箱子;4 代表着箱子的终点位置。 int map[9][11]; char difficulties[3][8]={"容易", "中等", "困难"}; //图的变化要靠自己来编写数组,通过数字来进行图的构造。 void drawmap(); int push(int tui); void print_home(int id); int win_bool(); int main()//主函数 { int ID,choice,step,tui;//ID用于表示所选地图的编号 home: ID=0; step=0; do{ print_home(ID); choice=getch(); system("cls"); switch (choice) { case 'w': case 72: ID--; if(ID<0){ ID+=3; } break; case 's': case 80: ID++; if(ID>2){ ID-=3; } break; default: break; } } while (choice!='r');//该循环用于现实主页面 //将选中的矩阵赋值给map for (int i = 0; i < 9; ++i) { for (int j = 0; j < 11; ++j) { map[i][j]=MAPs[ID][i][j]; } } do { drawmap(); printf("n使用wasd或↑↓←→来移动小人,直n到把所有箱子都推到目标地点nn" "■墙 ♀人 ☆箱子 ◎终点nnn" "按h返回主界面重新开始 按q退出游戏"); tui=getch(); if(push(tui)){ step++; } system("cls"); if(tui=='h'){//输入h即返回主页面重新开始 goto home; } } while (win_bool() && tui!='q'); printf("GAME OVER n"); if(!win_bool()){ printf("恭喜通关n本次共走了%d步",step); } Sleep(3000); return 0; } //打印主界面的函数 void print_home(id){ printf(" 推箱子小游戏 nnn"); printf("请选择地图:nn"); for (int i = 0; i < 3; ++i) { if(i==id){ printf(" %s *nn", difficulties[i]); } else{ printf(" %snn", difficulties[i]); } } printf("n按ws或↑↓来选择难度 按Enter进入地图"); } //把图形刻画出来 void drawmap() { win_bool();//调用输赢的函数 for(int i=0;i<9;i++) { for(int j=0;j<11;j++) { switch(map[i][j]) { case 0: printf(" "); //空白的地方 break; case 1: printf("■"); //墙 break; case 2: printf("♀"); //人 break; case 3: printf("☆"); //箱子 break; case 4: printf("◎"); //终点地方 break; case 6: printf("♂");//人加终点位置 break; case 7: printf("★") ;//箱子加终点位置 break; } } printf("n"); } } //进行小人的移动,整个移动的过程就是数组变化的过程 int push(tui) { int row,caw=0,success=0;//行和列 for(int i=0;i<9;i++){//该处循环用于确定人的位置 for (int j=0;j<11;j++) { if(map[i][j]==2||map[i][j]==6) { row=i; caw=j; } } } switch(tui) {//上 case 'w': case 72: // 1.人的前面是空地; // 2.人的前面是终点位置; // 3.人的前面是箱子 //3.1.箱子的前面是空地; //3.2.箱子的前面是终点位置。 if(map[row - 1][caw] == 0 || map[row - 1][caw] == 4) { map[row][caw]-=2; map[row - 1][caw]+=2; success=1; } else if(map[row - 1][caw] == 3 || map[row - 1][caw] == 7) { if(map[row - 2][caw] == 0 || map[row - 2][caw] == 4) { map[row][caw]-=2; map[row - 1][caw]-=1; map[row - 2][caw]+=3; success=1; } } break; //下 case 's': case 80://键值 if(map[row + 1][caw] == 0 || map[row + 1][caw] == 4) { map[row][caw]-=2; map[row + 1][caw]+=2; success=1; } else if(map[row + 2][caw] == 0 || map[row + 2][caw] == 4) { if(map[row + 1][caw] == 3 || map[row + 1][caw] == 7) { map[row][caw]-=2; map[row + 1][caw]-=1; map[row + 2][caw]+=3; success=1; } } break; //左 case 'a': case 75: if(map[row][caw - 1] == 0 || map[row][caw - 1] == 4) { map[row][caw]-=2; map[row][caw - 1]+=2; success=1; } else if(map[row][caw - 2] == 0 || map[row][caw - 2] == 4) { if(map[row][caw - 1] == 3 || map[row][caw - 1] == 7) { map[row][caw]-=2; map[row][caw - 1]-=1; map[row][caw - 2]+=3; success=1; } } break; //右 case 'd': case 77: if(map[row][caw + 1] == 0 || map[row][caw + 1] == 4) { map[row][caw]-=2; map[row][caw + 1]+=2; success=1; } else if(map[row][caw + 2] == 0 || map[row][caw + 2] == 4) { if(map[row][caw + 1] == 3 || map[row][caw + 1] == 7) { map[row][caw]-=2; map[row][caw + 1]-=1; map[row][caw + 2]+=3; success=1; } } break; default:break; } return success; } //用于判断是否成功 int win_bool() { int k = 0;//初始化 for(int i=0;i<9;i++) { for (int j=0;j<11;j++) { if(map[i][j]==3) k++; } } if(k==0){ return 0; } else{ return 1; } }



