基本结构
制作三个地图,用数字分别表示不同的东西(0空1墙2人3箱4终点5人+终6箱+终)
改变a,b的值,实现上下左右;(想到了走迷宫的next数组)
移动时,要判断移动后的位置原本是什么,有时还要判断如果移动两次之后的位置是什么。(简化为讨论三个位置不同情况的不同变化,具体看代码)
#include<stdio.h>
#include <stdlib.h>
#include <conio.h>
int n,a,b,x,y,tx,ty,sum,all;//a,b上下左右;x,y位置;tx,ty尝试位置;sum 6的个数;all移动步数
int map[3][10][10]//地图 0空1墙2人3箱4终点5人+终6箱+终
int f()//上下左右相同部分
void up(int x,int y)//上
void down(int x,int y)//下
void left(int x,int y)//左
void right(int x,int y)//右
void pmap(int n)//打印地图
int main()//主函数
上下左右相同部分
int f()//上下左右相同部分
{
if(map[n][tx][ty]==1)//是墙,不操作
return 1;
else if(map[n][tx][ty]==0)//是空
{
if(map[n][x][y]==5)//当前是人+终
map[n][x][y]=4;//变成终,终不能消失
else
map[n][x][y]=0;//变成空
map[n][tx][ty]=2;//尝试变成人
x=tx;//位置改变
y=ty;
all++;//步数增加
return 1;
}
else if(map[n][tx][ty]==3)//是箱
{
if(map[n][tx+a][ty+b]==0)//判断移动两次的位置
{
map[n][tx][ty]=2;
if(map[n][x][y]==5)
map[n][x][y]=4;
else
map[n][x][y]=0;
map[n][tx+a][ty+b]=3;//箱子被推动
x=tx;
y=ty;all++;
return 1;
}
else if(map[n][tx+a][ty+b]==1)
return 1;
else if(map[n][tx+a][ty+b]==3)
return 1;
else if(map[n][tx+a][ty+b]==6)
return 1;
else if(map[n][tx+a][ty+b]==4)
{
map[n][tx+a][ty+b]=6;//箱被推到终点
map[n][tx][ty]=2;
if(map[n][x][y]==5)
map[n][x][y]=4;
else
map[n][x][y]=0;
x=tx;
y=ty;all++;
return 1;
}
}
else if(map[n][tx][ty]==4)
{
map[n][tx][ty]=5;
if(map[n][x][y]==5)
map[n][x][y]=4;
else
map[n][x][y]=0;
x=tx;
y=ty;all++;
return 1;
}
else if(map[n][tx][ty]==6)
{
if(map[n][tx+a][ty+b]==0)//箱子被推动
{
map[n][tx+a][ty+b]=3;
map[n][tx][ty]=5;
if(map[n][x][y]==5)
map[n][x][y]=4;
else
map[n][x][y]=0;
x=tx;
y=ty;all++;
return 1;
}
else if(map[n][tx+a][ty+b]==1)
return 1;
else if(map[n][tx+a][ty+b]==3)
return 1;
else if(map[n][tx+a][ty+b]==6)
return 1;
else if(map[n][tx+a][ty+b]==4)
{
map[n][tx+a][ty+b]=6;
map[n][tx][ty]=5;
if(map[n][x][y]==5)
map[n][x][y]=4;
else
map[n][x][y]=0;
x=tx;
y=ty;all++;
return 1;
}
}
}
以 上 为例,其他三个方向改变a,b的值即可
void up(int x,int y)//上
{
a=-1,b=0;
tx=x+a;
ty=y+b;
if(tx<0)
return ;
else if(f())
return ;
}
打印地图(游戏界面)
void pmap(int n)//打印地图
{
sum=0;
printf("第%d关:\n",n+1);
for(int i=0; i<10; i++)
{
for(int j=0; j<10; j++)
switch(map[n][i][j])
{
case 0://空
{
printf(" ");
break;
}
case 1://墙
{
printf("■");
break;
}
case 2://人
{
printf("♀");
x=i;
y=j;
break;
}
case 3://箱
{
printf("◆");
break;
}
case 4://终点
{
printf("●");
break;
}
case 5://人+终点
{
printf("♂");
x=i;
y=j;
break;
}
case 6://箱+终点
{
printf("★");
sum++;
break;
}
}
printf("\n");
}
printf("移动:%d\n",all);
}
主函数
int main()
{
n=0;
printf("请选择关卡:(本游戏共3关)");//因为感觉一次全过太难了,就设置可以选择跳关
while(1)
{
scanf("%d",&n);
if(n<=3)
{
n--;
while(n<3)
{
all=0;
pmap(n);
char k;
while(sum<5&&k!='z')//k=='z'时跳关
{
k=getch();
switch(k)
{
case 'w':
up(x,y);
break;
case 's':
down(x,y);
break;
case 'a':
left(x,y);
break;
case 'd':
right(x,y);
break;
case 'z':
break;
}
system("cls");
pmap(n);
}
n++;
k='x';
system("cls");
}
printf("恭喜你,通关啦!");
break;
}
else
printf("输入错误,请重新输入:\n");
}
return 0;
}
昨天晚上肝粗来的,太难了我,虽然写出来还是很烂,不过我真的尽力了。
上一步下一步的功能没有写,还没想好。。。
如有大佬看见,希望可以给点建议。
(切勿白嫖,收藏或关注吧(嘻嘻~😊))
来源:CSDN
作者:兔砸儿~
链接:https://blog.csdn.net/weixin_45833157/article/details/104069144