一个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()。 else current_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。 else current_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。 else current_map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。 //下面是对人原地进行判断 if(current_map[i][j]==9) //如果之前是目的地。 current_map[i][j]=3; //人走了之后修改回目的地ID。 else current_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; else current_map[i-1][j]=6; //下面是对人原先位置进行判断,同上。 if(current_map[i][j]==9) current_map[i][j]=3; else current_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; else current_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; else current_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()。 else current_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。 else current_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。 else current_map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。 //下面是对人原地进行判断 if(current_map[i][j]==9) //如果之前是目的地。 current_map[i][j]=3; //人走了之后修改回目的地ID。 else current_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; else current_map[i+1][j]=6; //下面是对人原先位置进行判断,同上。 if(current_map[i][j]==9) current_map[i][j]=3; else current_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; else current_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; else current_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()。 else current_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。 else current_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。 else current_map[i][j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。 //下面是对人原地进行判断 if(current_map[i][j]==9) //如果之前是目的地。 current_map[i][j]=3; //人走了之后修改回目的地ID。 else current_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; else current_map[i][j-1]=6; //下面是对人原先位置进行判断,同上。 if(current_map[i][j]==9) current_map[i][j]=3; else current_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; else current_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; else current_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()。 else current_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。 else current_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。 else current_map[i][j+1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。 //下面是对人原地进行判断 if(current_map[i][j]==9) //如果之前是目的地。 current_map[i][j]=3; //人走了之后修改回目的地ID。 else current_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; else current_map[i][j+1]=6; //下面是对人原先位置进行判断,同上。 if(current_map[i][j]==9) current_map[i][j]=3; else current_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; else current_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; else current_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"); //分行输出 } }