推箱子(c语言)

徘徊边缘 提交于 2020-01-22 15:25:36

基本结构

制作三个地图,用数字分别表示不同的东西(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;
}

昨天晚上肝粗来的,太难了我,虽然写出来还是很烂,不过我真的尽力了。
上一步下一步的功能没有写,还没想好。。。
如有大佬看见,希望可以给点建议。
(切勿白嫖,收藏或关注吧(嘻嘻~😊))

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!