C语言,推箱子游戏

来源:互联网 发布:怎么联系淘宝在线客服 编辑:程序博客网 时间:2024/05/02 01:34

一个C语言简易推箱子游戏

#include <stdio.h>     #include <stdlib.h>#include <string.h>   #include <conio.h> int i,j,k; int row=8,col=8;int boxNum;int*** maps;int index=0,round_num=4;int rows[]={8,9,10,8};int cols[]={8,9,10,8};int boxNums[]={4,3,4,4};void draw_map(int** map); //声明画图函数void arrayCopy(int* src,int** des,int row,int col){int i,j;for(i=0;i<row;i++){for(j=0;j<col;j++){des[i][j] = *(src+col*i+j);}}}//2:边缘空白,0:空地,6:小人,3:目的地,7:目的地+箱子,2:空白,1:墙,4:箱子int map1[8][8] = {    //地图1{2,2,1,1,1,2,2,2},{2,2,1,3,1,2,2,2},{2,2,1,0,1,1,1,1},{1,1,1,4,0,4,3,1},{1,3,0,4,6,1,1,1},{1,1,1,1,4,1,2,2},{2,2,2,1,3,1,2,2},{2,2,2,1,1,1,2,2}};int map2[9][9] = {{1,1,1,1,1,2,2,2,2},{1,6,0,0,1,2,2,2,2},{1,0,4,4,1,2,1,1,1},{1,0,4,0,1,2,1,3,1},{1,1,1,0,1,1,1,3,1},{2,1,1,0,0,0,0,3,1},{2,1,0,0,0,1,0,0,1},{2,1,0,0,0,1,1,1,1},{2,1,1,1,1,1,2,2,2}};int map3[10][10] = {{2,1,1,1,1,1,1,1,2,2},{2,1,0,0,0,0,0,1,1,1},{1,1,4,1,1,1,0,0,0,1},{1,0,6,0,4,0,0,4,0,1},{1,0,3,3,1,0,4,0,1,1},{1,1,3,3,1,0,0,0,1,2},{2,1,1,1,1,1,1,1,1,2},{2,2,2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2,2,2}};int map4[8][8] = {    {2,1,1,1,1,2,2,2},{1,1,0,0,1,2,2,2},{1,6,4,0,1,2,2,2},{1,1,4,0,1,1,2,2},{1,1,0,4,0,1,2,2},{1,3,4,0,0,1,2,2},{1,3,3,0,3,1,2,2},{1,1,1,1,1,1,2,2}};int main(){char input;   int count=0;   //定义记分变量int** current_map;maps = (int***)malloc(sizeof(int***)*10);maps[0] = (int**)malloc(sizeof(map1));maps[0][0] = map1;maps[0][1] = map2;maps[0][2] = map3;maps[0][3] = map4;index=3;while(index<round_num){row = rows[index];col = cols[index];boxNum = boxNums[index];current_map = (int**)malloc(sizeof(int*)*row);for(k=0;k<row;k++){current_map[k] = (int*)malloc(sizeof(int)*col);}arrayCopy(maps[0][index],current_map,row,col);while (1) {  //循环,等待用户命令system("CLS");printf("Round %d:\n",index+1);printf("\n");draw_map(current_map);printf("current points: %d\n",count);//找初始位置for (i=0;i<row;i++){for (j=0;j<col;j++){if (current_map[i][j]==6||current_map[i][j]==9)break;}if (current_map[i][j]==6||current_map[i][j]==9)break;}printf("current position (%d,%d)",i,j);        input = getch();   //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。if(input<0)input = getch();switch (input){case 72://如果人前面是空地。  //0代表空地  6代表人  //3代表目的地if(current_map[i-1][j]==0){current_map[i-1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。elsecurrent_map[i][j]=0;    //否则原地ID修改为空地ID 。      }//如果人前面是目的地。else if((current_map[i-1][j]==3)||(current_map[i-1][j]==9)){current_map[i-1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。if(current_map[i][j]==9) //如果原地也是目的地(ID为)。current_map[i][j]=3; //人走后把原地ID修改回目的地ID。elsecurrent_map[i][j]=0; //否则原地ID修改为为空地ID}//如果人前面是箱子。//4代表箱子   //7箱子进入目的地else if(current_map[i-1][j]==4){//如果人前面是箱子,而箱子前面是空地。if (current_map[i-2][j]==0){ current_map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if(current_map[i-1][j]==7) //如果箱子原地为目的地。current_map[i-1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsecurrent_map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if(current_map[i][j]==9) //如果之前是目的地。current_map[i][j]=3; //人走了之后修改回目的地ID。elsecurrent_map[i][j]=0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (current_map[i-2][j]==3){ current_map[i-2][j]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。count++;//下面是对箱子原先位置的判断,同上。if(current_map[i-1][j]==7)current_map[i-1][j]=9;elsecurrent_map[i-1][j]=6;//下面是对人原先位置进行判断,同上。if(current_map[i][j]==9)current_map[i][j]=3;elsecurrent_map[i][j]=0;}}//如果人前面是已经进入某目的地的箱子(ID=7)。else if(current_map[i-1][j]==7){//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。if(current_map[i-2][j]==0){count--;current_map[i-2][j]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。current_map[i-1][j]=9;   //人自然而然的就站在了原先的目的地上了。//下面是对人原先地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。if(current_map[i-2][j]==3){current_map[i-2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。current_map[i-1][j]=9;   //人站在了目的地上。//下面是对人原先站立地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}}break;case 80:     //down//如果人前面是空地。if(current_map[i+1][j]==0){current_map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。elsecurrent_map[i][j]=0;    //否则原地ID修改为空地ID 。      }//如果人前面是目的地。else if(current_map[i+1][j]==3){current_map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。if(current_map[i][j]==9) //如果原地也是目的地(ID为)。current_map[i][j]=3; //人走后把原地ID修改回目的地ID。elsecurrent_map[i][j]=0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if(current_map[i+1][j]==4){//如果人前面是箱子,而箱子前面是空地。if (current_map[i+2][j]==0){ current_map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if(current_map[i+1][j]==7) //如果箱子原地为目的地。current_map[i+1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsecurrent_map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if(current_map[i][j]==9) //如果之前是目的地。current_map[i][j]=3; //人走了之后修改回目的地ID。elsecurrent_map[i][j]=0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (current_map[i+2][j]==3){ current_map[i+2][j]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。count++;//下面是对箱子原先位置的判断,同上。if(current_map[i+1][j]==7)current_map[i+1][j]=9;elsecurrent_map[i+1][j]=6;//下面是对人原先位置进行判断,同上。if(current_map[i][j]==9)current_map[i][j]=3;elsecurrent_map[i][j]=0;}}//如果人前面是已经进入某目的地的箱子(ID=7)。else if(current_map[i+1][j]==7){//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。if(current_map[i+2][j]==0){count--;current_map[i+2][j]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。current_map[i+1][j]=9;   //人自然而然的就站在了原先的目的地上了。//下面是对人原先地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。if(current_map[i+2][j]==3){current_map[i+2][j]=7;   //把箱子推入了另一目的地,自然,ID也应是。current_map[i+1][j]=9;   //人站在了目的地上。//下面是对人原先站立地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}}break;case 75://如果人前面是空地。if(current_map[i][j-1]==0){current_map[i][j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。elsecurrent_map[i][j]=0;    //否则原地ID修改为空地ID 。      }//如果人前面是目的地。else if(current_map[i][j-1]==3){current_map[i][j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。if(current_map[i][j]==9) //如果原地也是目的地(ID为)。current_map[i][j]=3; //人走后把原地ID修改回目的地ID。elsecurrent_map[i][j]=0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if(current_map[i][j-1]==4){//如果人前面是箱子,而箱子前面是空地。if (current_map[i][j-2]==0){ current_map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if(current_map[i][j-1]==7) //如果箱子原地为目的地。current_map[i][j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsecurrent_map[i][j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if(current_map[i][j]==9) //如果之前是目的地。current_map[i][j]=3; //人走了之后修改回目的地ID。elsecurrent_map[i][j]=0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (current_map[i][j-2]==3){ count++;current_map[i][j-2]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。//下面是对箱子原先位置的判断,同上。if(current_map[i][j-1]==7)current_map[i][j-1]=9;elsecurrent_map[i][j-1]=6;//下面是对人原先位置进行判断,同上。if(current_map[i][j]==9)current_map[i][j]=3;elsecurrent_map[i][j]=0;}}//如果人前面是已经进入某目的地的箱子(ID=7)。else if(current_map[i][j-1]==7){//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。if(current_map[i][j-2]==0){count--;current_map[i][j-2]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。current_map[i][j-1]=9;   //人自然而然的就站在了原先的目的地上了。//下面是对人原先地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。if(current_map[i][j-2]==3){current_map[i][j-2]=7;   //把箱子推入了另一目的地,自然,ID也应是。current_map[i][j-1]=9;   //人站在了目的地上。//下面是对人原先站立地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}}break;case 77://如果人前面是空地。if(current_map[i][j+1]==0){current_map[i][j+1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。if(current_map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。current_map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。elsecurrent_map[i][j]=0;    //否则原地ID修改为空地ID 。      }//如果人前面是目的地。else if(current_map[i][j+1]==3){current_map[i][j+1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。if(current_map[i][j]==9) //如果原地也是目的地(ID为)。current_map[i][j]=3; //人走后把原地ID修改回目的地ID。elsecurrent_map[i][j]=0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if(current_map[i][j+1]==4){//如果人前面是箱子,而箱子前面是空地。if (current_map[i][j+2]==0){ current_map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if(current_map[i][j+1]==7) //如果箱子原地为目的地。current_map[i][j+1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsecurrent_map[i][j+1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if(current_map[i][j]==9) //如果之前是目的地。current_map[i][j]=3; //人走了之后修改回目的地ID。elsecurrent_map[i][j]=0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (current_map[i][j+2]==3){ count++;current_map[i][j+2]=7;   //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。//下面是对箱子原先位置的判断,同上。if(current_map[i][j+1]==7)current_map[i][j+1]=9;elsecurrent_map[i][j+1]=6;//下面是对人原先位置进行判断,同上。if(current_map[i][j]==9)current_map[i][j]=3;elsecurrent_map[i][j]=0;}}//如果人前面是已经进入某目的地的箱子(ID=7)。else if(current_map[i][j+1]==7){//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。if(current_map[i][j+2]==0){count--;current_map[i][j+2]=4;   //把箱子重新推到空地上,ID=箱子ID+空地ID=4。current_map[i][j+1]=9;   //人自然而然的就站在了原先的目的地上了。//下面是对人原先地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。if(current_map[i][j+2]==3){current_map[i][j+2]=7;   //把箱子推入了另一目的地,自然,ID也应是。current_map[i][j+1]=9;   //人站在了目的地上。//下面是对人原先站立地进行判断,方法同上。if(current_map[i][j]==9) current_map[i][j]=3;elsecurrent_map[i][j]=0;}}break;}if(count==boxNum) {   //如果分数达到分system("CLS"); //清屏draw_map(current_map); break;    //退出死循环}}count = 0;printf("\nCongratulations! \n"); //过关提示index++;}return 0;}void draw_map(int** map){for(i=0;i<row;i++){for(j=0;j<col;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 7:printf("$"); //数字代表箱子进入目的地break;case 6:printf("@"); //数字代表人break;case 9:printf("@"); //数字代表人进入目的地break;}            }printf("\n");    //分行输出}}

参考地址:http://blog.csdn.net/hgj125073/article/details/8278243

0 0
原创粉丝点击