[推箱子相关代码]

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<conio.h>    //按键操作需要
/*
* 1,推箱子怎么做?有些什么东西?用什么存储?
*    空地        0
*    墙        1
*    目的地    2
*    箱子        3
*    玩家        4
*    目的地+箱子 5
*    目的地+玩家 6
* 用二维数组存储
* 2,动起来,移动玩家,移动箱子
* 3,关卡的切换
*
*/

#define SPACE    0    //空地        
#define WALL    1    //墙        
#define    DEST    2    //目的地    
#define    BOX        3    //箱子        
#define    PLAYER    4    //玩家        

#define ROW 10
#define COL    10
//当前关卡
int curLevel = 0;
//定义地图
char map[3][ROW][COL] =
{
    {
        {0,0,0,0,0,0,0,0,0,0},
        {0,0,0,1,1,1,0,0,0,0},
        {0,0,0,1,2,1,0,0,0,0},
        {0,0,0,1,3,1,1,1,1,0},
        {0,1,1,1,0,3,0,2,1,0},
        {0,1,2,3,4,0,1,1,1,0},
        {0,1,1,1,1,3,1,0,0,0},
        {0,0,0,0,1,2,1,0,0,0},
        {0,0,0,0,1,1,1,0,0,0},
        {0,0,0,0,0,0,0,0,0,0}
    },
    {
        {0,0,0,0,0,0,0,0,0,0},
        {0,0,1,1,0,0,1,1,0,0},
        {0,1,0,2,1,1,2,0,1,0},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,3,4,0,3,0,0,1},
        {0,1,0,0,3,3,0,0,1,0},
        {0,0,1,0,0,0,0,1,0,0},
        {0,0,0,1,2,2,1,0,0,0},
        {0,0,0,0,1,1,0,0,0,0},
        {0,0,0,0,0,0,0,0,0,0}
    },
    {
        {1,0,0,0,0,0,0,0,0,1},
        {1,1,0,1,1,1,1,0,1,1},
        {1,0,1,1,0,0,1,1,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,1,1,0,1,1,0,1},
        {1,0,1,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,1,1,1,1,1,1,1,1,1}
    },
};
//输出map[curLevel]
void show()
{
    for (int i = 0; i < ROW; i++)
    {
        for (int k = 0; k < COL; k++)
        {
            switch (map[curLevel][i][k])
            {
            case SPACE:
                printf("  ");
                break;
            case WALL:
                printf("▓ ");
                break;
            case DEST:
                printf("☆");
                break;
            case BOX:
                printf("□");
                break;
            case PLAYER:
                printf("♀");
                break;
            case DEST + BOX:        //箱子在目的地
                printf("★");
                break;
            case DEST + PLAYER:    //玩家在目的地
                printf("♂");
                break;
            }
            //if (map[curLevel][i][k] == SPACE)
            //{
            //    printf("  ");
            //}
            //else if (map[curLevel][i][k] == WALL)
            //{
            //    printf("墙");
            //}
            //else
            //{
            //    printf("%d ", map[curLevel][i][k]);
            //}

        }
        printf("\n");
    }
}
//移动
void move()
{
    //查找玩家所在的下标
    int r = -1, c = -1;    //记录玩家的下标
    for (int i = 0; i < ROW; i++)
    {
        for (int k = 0; k < COL; k++)
        {
            if (map[curLevel][i][k] == PLAYER || map[curLevel][i][k] == DEST + PLAYER)    //这里一定能够找到玩家吗?
            {
                r = i;
                c = k;
                goto endloop;
            }
        }
    }
endloop:
    if (r == -1 || c == -1)
        return;
    //怎么样获取按键 getchar() 输入之后需要按回车                
    //还有一个函数和getchar很像,但是不需要按回车 _getch()    必须包含头文件conio.h    
    switch (_getch())
    {
    case 'W':
    case 'w':
    case 72:
        //玩家的前面是空地或者目的地
        if (map[curLevel][r - 1][c] == SPACE || map[curLevel][r - 1][c] == DEST)
        {
            //1,把玩家移动到空地
            map[curLevel][r - 1][c] += PLAYER;
            //2,把玩家从原来的位置清除掉
            map[curLevel][r][c] -= PLAYER;
        }
        //玩家的前面是箱子
        else if (map[curLevel][r - 1][c] == BOX)
        {
            //箱子的前面是空地或者是目的地
            if (map[curLevel][r - 2][c] == SPACE || map[curLevel][r - 2][c] == DEST)
            {
                //1,把箱子移动到箱子前面
                map[curLevel][r - 2][c] += BOX;
                //2,把箱子从原来的位置清除
                map[curLevel][r - 1][c] -= BOX;
                //3,把玩家移动到原来的箱子位置
                map[curLevel][r - 1][c] += PLAYER;
                //4,把玩家从原来的位置清除掉
                map[curLevel][r][c] -= PLAYER;
            }
        }
        break;
    case 'S':
    case 's':
    case 80:
        //玩家的前面是空地或者目的地
        if (map[curLevel][r + 1][c] == SPACE || map[curLevel][r + 1][c] == DEST)
        {
            //1,把玩家移动到空地
            map[curLevel][r + 1][c] += PLAYER;
            //2,把玩家从原来的位置清除掉
            map[curLevel][r][c] -= PLAYER;
        }
        //玩家的前面是箱子
        else if (map[curLevel][r + 1][c] == BOX)
        {
            //箱子的前面是空地或者是目的地
            if (map[curLevel][r + 2][c] == SPACE || map[curLevel][r + 2][c] == DEST)
            {
                //1,把箱子移动到箱子前面
                map[curLevel][r + 2][c] += BOX;
                //2,把箱子从原来的位置清除
                map[curLevel][r + 1][c] -= BOX;
                //3,把玩家移动到原来的箱子位置
                map[curLevel][r + 1][c] += PLAYER;
                //4,把玩家从原来的位置清除掉
                map[curLevel][r][c] -= PLAYER;
            }
        }
        break;
    case 'A':
    case 'a':
    case 75:
        //玩家的前面是空地或者目的地
        if (map[curLevel][r][c - 1] == SPACE || map[curLevel][r][c - 1] == DEST)
        {
            //1,把玩家移动到空地
            map[curLevel][r][c - 1] += PLAYER;
            //2,把玩家从原来的位置清除掉
            map[curLevel][r][c] -= PLAYER;
        }
        //玩家的前面是箱子
        else if (map[curLevel][r][c - 1] == BOX)
        {
            //箱子的前面是空地或者是目的地
            if (map[curLevel][r][c - 2] == SPACE || map[curLevel][r][c - 2] == DEST)
            {
                //1,把箱子移动到箱子前面
                map[curLevel][r][c - 2] += BOX;
                //2,把箱子从原来的位置清除
                map[curLevel][r][c - 1] -= BOX;
                //3,把玩家移动到原来的箱子位置
                map[curLevel][r][c - 1] += PLAYER;
                //4,把玩家从原来的位置清除掉
                map[curLevel][r][c] -= PLAYER;
            }
        }
        break;
    case 'D':
    case 'd':
    case 77:
        //玩家的前面是空地或者目的地
        if (map[curLevel][r][c + 1] == SPACE || map[curLevel][r][c + 1] == DEST)
        {
            //1,把玩家移动到空地
            map[curLevel][r][c + 1] += PLAYER;
            //2,把玩家从原来的位置清除掉
            map[curLevel][r][c] -= PLAYER;
        }
        //玩家的前面是箱子
        else if (map[curLevel][r][c + 1] == BOX)
        {
            //箱子的前面是空地或者是目的地
            if (map[curLevel][r][c + 2] == SPACE || map[curLevel][r][c + 2] == DEST)
            {
                //1,把箱子移动到箱子前面
                map[curLevel][r][c + 2] += BOX;
                //2,把箱子从原来的位置清除
                map[curLevel][r][c + 1] -= BOX;
                //3,把玩家移动到原来的箱子位置
                map[curLevel][r][c + 1] += PLAYER;
                //4,把玩家从原来的位置清除掉
                map[curLevel][r][c] -= PLAYER;
            }
        }
        break;
    }
}
//神情况下才过关?如果地图上没有箱子就可以了,没有目的地
bool judge()
{
    for (int i = 0; i < ROW; i++)
    {
        for (int k = 0; k < COL; k++)
        {
            //三维数组
            if (map[curLevel][i][k] == BOX)
            {
                return false;
            }
        }
    }
    return true;
}

int main()
{
    while (true)
    {
        system("cls");    //清屏
        show();
        if (judge())
        {
            curLevel++;
        }

        //不断地检测键盘按键,不断地绘制  72 80 75 77 上 下 左 右
        move();
    }

    return 0;
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值