本推箱子游戏是用画图函数
特点是编辑地图超方便
先用txt文档把以下两个内容打出:
(复杂的命名为map2,简单的命名为map1)
8 8 12 0
1 1 1 1 1 1 1 1
1 0 3 3 3 0 0 1
1 0 4 4 4 4 3 1
1 3 4 0 0 4 3 1
1 3 4 0 6 4 3 1
1 3 4 4 4 4 0 1
1 0 0 3 3 3 0 1
1 1 1 1 1 1 1 1
11 13 5 1
2 2 2 1 1 1 1 1 1 1 2 2 2
1 1 1 1 0 0 0 0 0 1 2 2 2
1 0 0 0 3 1 1 1 0 1 2 2 2
1 0 1 0 1 0 0 0 0 1 1 2 2
1 0 1 0 4 0 4 1 3 0 1 2 2
1 0 1 0 0 7 0 0 1 0 1 2 2
1 0 3 1 4 0 4 0 1 0 1 2 2
1 1 0 0 0 0 1 0 1 0 1 1 1
2 1 0 1 1 1 3 0 0 0 0 6 1
2 1 0 0 0 0 0 1 1 0 0 0 1
2 1 1 1 1 1 1 1 1 1 1 1 1
记得把代码和地图放在一起
代码:
#include <stdio.h> #include <stdlib.h> #include <conio.h> int map[50][50]; int row,col; void Hrun(); void Erun(); void help(); void sitting(); //画图函数 void draw_map() { int i,j; for(i=1;i<=row;i++){ for(j=1;j<=col;j++){ switch(map[j]){ case 0: printf(" ");break; //数字0代表道路 case 1: printf("■");break; //数字1代表墙壁 case 2: printf(" ");break; //数字2是游戏边框的空白部分 case 3: printf("·");break; //数字3代表目的地 case 4: printf("□");break; //数字4代表箱子 case 7: printf("☆");break; //数字7代表箱子进入目的地 case 6: printf("♀");break; //数字6代表人 case 9: printf("♀");break; //数字9代表人进入目的地 } } printf("\n"); //分行输出 } } int main() { printf("推箱子\n\n"); printf("开始(a)\n"); printf("帮助(b)\n"); printf("设置(c)\n\n"); printf("注:先把输入法调成英文"); switch(getch()) { while(1) { case 'a': Erun(); break; case 'b': help(); break; case 'c': sitting(); break; default: printf("错误"); } } return 0; } void help() { system("CLS"); printf("本游戏使用英文 W S A D 控制\n"); printf("你:♀\n"); printf("墙:■\n"); printf("箱子:□\n"); printf("目标点:·\n"); printf("达到目标的箱子:☆\n\n"); printf("任意键开始 . . .\n"); getch(); system("CLS"); sitting(); } void sitting() { system("CLS"); printf("简单(d)\n"); printf("困难(e)\n"); switch(getch()) { while(1) { case 'd': Erun(); break; case 'e': Hrun(); break; default: printf("错误"); } } } void Erun() { char input; int i,j,target,count,a,book=0; //定义记分变量 FILE *fin=fopen("map1.txt","r"); if(fin==NULL){ printf("read file error"); } fscanf(fin,"%d%d%d%d",&row,&col,&target,&count); for(i=1;i<=row;i++) for(j=1;j<=col;j++) fscanf(fin,"%d",&map[j]); while (1) //死循环,等待用户命令 { system("CLS"); draw_map(map); printf("step:%d\n",book); printf("score:%d/%d\n",count,target); //找初始位置 for(i=1;i<=row;i++){ for(j=1;j<=col;j++){ if (map[j]==6||map[j]==9) break; } if (map[j]==6||map[j]==9) break; } printf("coordinate%d,%d)\n",i,j); input = getch(); //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。 switch (input) { case 'w': book++; //如果人前面是空地。 //0代表空地 6代表人 3代表目的地 if(map[i-1][j]==0) { map[i-1][j]=6+0; //人往前走一步,ID为人的ID加上空地的ID。 if(map[j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID加上目的地ID)。 map[j]=3; //将人往前走一步后原地的ID修改为目的地ID。 else map[j]=0; //否则原地ID修改为空地ID。 } //如果人前面是目的地。 else if((map[i-1][j]==3)||(map[i-1][j]==9)) { map[i-1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。 if(map[j]==9) //如果原地也是目的地(ID为9)。 map[j]=3; //人走后把原地ID修改回目的地ID。 else map[j]=0; //否则原地ID修改为为空地ID } //如果人前面是箱子。//4代表箱子 7箱子进入目的地 else if(map[i-1][j]==4) { //如果人前面是箱子,而箱子前面是空地。 if (map[i-2][j]==0) { map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID //下面是对箱子原地进行判断 if(map[i-1][j]==7) //如果箱子原地为目的地。 map[i-1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。 else map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。 //下面是对人原地进行判断 if(map[j]==9) //如果之前是目的地。 map[j]=3; //人走了之后修改回目的地ID。 else map[j]=0; //否则就是空地。 } //如果人的前面是箱子,而箱子前面是目的地。 else if (map[i-2][j]==3) { map[i-2][j]=7; //ID为(目的地ID+箱子ID=7),表示已经把箱子推入了目的地。 count++; //下面是对箱子原先位置的判断,同上。 if(map[i-1][j]==7) map[i-1][j]=9; else map[i-1][j]=6; //下面是对人原先位置进行判断,同上。 if(map[j]==9) map[j]=3; else map[j]=0; } } //如果人前面是已经进入某目的地的箱子(ID=7)。 else if(map[i-1][j]==7) { //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。 if(map[i-2][j]==0) { count--; map[i-2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。 map[i-1][j]=9; //人自然而然的就站在了原先的目的地上了。 //下面是对人原先地进行判断,方法同上。 if(map[j]==9) map[j]=3; else map[j]=0; } //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。 if(map[i-2][j]==3) { map[i-2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。 map[i-1][j]=9; //人站在了目的地上。 //下面是对人原先站立地进行判断,方法同上。 if(map[j]==9) map[j]=3; else map[j]=0; } } break; case 's': book++; //如果人前面是空地。 if(map[i+1][j]==0) { map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。 if(map[j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。 map[j]=3; //将人往前走一步后原地的ID修改为空地ID()。 else map[j]=0; //否则原地ID修改为空地ID 。 } //如果人前面是目的地。 else if(map[i+1][j]==3) { map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。 if(map[j]==9) //如果原地也是目的地(ID为)。 map[j]=3; //人走后把原地ID修改回目的地ID。 else map[j]=0; //否则原地ID修改为为空地ID } //如果人前面是箱子。 else if(map[i+1][j]==4) { //如果人前面是箱子,而箱子前面是空地。 if (map[i+2][j]==0) { map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID() //下面是对箱子原地进行判断 if(map[i+1][j]==7) //如果箱子原地为目的地。 map[i+1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。 else map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。 //下面是对人原地进行判断 if(map[j]==9) //如果之前是目的地。 map[j]=3; //人走了之后修改回目的地ID。 else map[j]=0; //否则就是空地。 } //如果人的前面是箱子,而箱子前面是目的地。 else if (map[i+2][j]==3) { map[i+2][j]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。 count++; //下面是对箱子原先位置的判断,同上。 if(map[i+1][j]==7) map[i+1][j]=9; else map[i+1][j]=6; //下面是对人原先位置进行判断,同上。 if(map[j]==9) map[j]=3; else map[j]=0; } } //如果人前面是已经进入某目的地的箱子(ID=7)。 else if(map[i+1][j]==7) { //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。 if(map[i+2][j]==0) { count--; map[i+2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。 map[i+1][j]=9; //人自然而然的就站在了原先的目的地上了。 //下面是对人原先地进行判断,方法同上。 if(map[j]==9) map[j]=3; else map[j]=0; } //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。 if(map[i+2][j]==3) { map[i+2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。 map[i+1][j]=9; //人站在了目的地上。 //下面是对人原先站立地进行判断,方法同上。 if(map[j]==9) map[j]=3; else map[j]=0; } } break; case 'a': book++; //如果人前面是空地。 if(map[j-1]==0) { map[j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。 if(map[j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。 map[j]=3; //将人往前走一步后原地的ID修改为空地ID()。 else map[j]=0; //否则原地ID修改为空地ID 。 } //如果人前面是目的地。 else if(map[j-1]==3) { map[j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。 if(map[j]==9) //如果原地也是目的地(ID为)。 map[j]=3; //人走后把原地ID修改回目的地ID。 else map[j]=0; //否则原地ID修改为为空地ID } //如果人前面是箱子。 else if(map[j-1]==4) { //如果人前面是箱子,而箱子前面是空地。 if (map[j-2]==0) { map[j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID() //下面是对箱子原地进行判断 if(map[j-1]==7) //如果箱子原地为目的地。 map[j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。 else map[j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。 //下面是对人原地进行判断 if(map[j]==9) //如果之前是目的地。 map[j]=3; //人走了之后修改回目的地ID。 else map[j]=0; //否则就是空地。 } //如果人的前面是箱子,而箱子前面是目的地。 else if (map[j-2]==3) { count++; map[j-2]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。 //下面是对箱子原先位置的判断,同上。 if(map[j-1]==7) map[j-1]=9; else map[j-1]=6; //下面是对人原先位置进行判断,同上。 if(map[j]==9) map[j]=3; else map[j]=0; } } //如果人前面是已经进入某目的地的箱子(ID=7)。 else if(map[j-1]==7) { //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。 if(map[j-2]==0) { count--; map[j-2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。 map[j-1]=9; //人自然而然的就站在了原先的目的地上了。 //下面是对人原先地进行判断,方法同上。 if(map[j]==9) map[j]=3; else map[j]=0; } //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。 if(map[j-2]==3) { map[j-2]=7; //把箱子推入了另一目的地,自然,ID也应是。 map[j-1]=9; //人站在了目的地上。 //下面是对人原先站立地进行判断,方法同上。 if(map[j]==9) map[j]=3; else map[j]=0; } } break; (太长没打完)
|