啊哈磊_编程从这里起步
标题: 高级推箱子(1) [打印本页]
作者: 桃子明 时间: 2016-9-25 16:39
标题: 高级推箱子(1)
本推箱子游戏是用画图函数
特点是编辑地图超方便
先用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;
(太长没打完)
作者: 4399APPLE 时间: 2016-9-30 19:12
这叫printf不叫画图函数真可笑
作者: 林陈芝 时间: 2017-8-15 15:17
printf的专业用语就是画图函数
欢迎光临 啊哈磊_编程从这里起步 (https://bbs.codeaha.com/) |
Powered by Discuz! X3.2 |