c语言 推箱子游戏实现

#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;


int arr[9][11] =
{
    { 0,1,1,1,1,1,1,1,1,1,0 },//0代表空地
    { 0,1,0,0,0,1,0,0,0,1,0 },//1代表墙
    { 0,1,0,4,4,4,4,4,0,1,0 },//3代表目的地
    { 1,1,0,4,0,4,0,4,0,1,1 },//4代表箱子
    { 0,1,0,0,0,5,0,0,4,0,1 },//5代表人
    { 1,1,0,0,0,1,1,0,4,0,1 },
    { 1,0,3,3,3,3,3,1,0,0,1 },
    { 1,0,3,3,3,3,3,0,0,1,1 },
    { 1,1,1,1,1,1,1,1,1,1,0 }
};

void drawMap()
{
    for(int i = 0; i < 9; i++)
    {
        for(int j = 0 ; j < 11; j++)
        {
            switch(arr[i][j])
            {
                case 0:
                    cout<<"  ";//0代表空地
                    break;
                case 1:
                    cout<<"■";//1代表墙
                    break;
                case 3:
                    cout<<"☆";//3代表目的地
                    break;
                case 4:
                    cout<<"□";//4代表箱子
                    break;
                case 5:
                    cout<<"♀";//5代表人
                    break;
                case 7:
                    cout<<"★";//箱子在目的地中
                    break;
                case 8:
                    cout<<"♀";//人在目的地中
                    break;
            }
        }
        cout<<endl;
    }
}




void playGame()
{
    int r,c;  //首先要找到人的所在位置,记住人的下标
    for(int i = 0; i < 9; i++)
    {
        for(int j = 0 ; j < 11; j++)
        {
            if(arr[i][j] == 5 || arr[i][j] == 8)
            {
                r=i;
                c=j;
                break;
            }
        }
    }
    char ch;//键盘的输入保存到字符中
    ch = getch();
    //getch() 直接接受,不显示回文,getchar()显示回文可以修改 enter键结束
    /*
    有哪些情况可以移动?
    1人前面是空地
    2人前面是目的地
    3人前面是箱子
       3.1箱子前面是空地
       3.2箱子前面是目的地
    */
    switch(ch)
    {
        case 'W':     //W A S D方向 72 80 75 77
        case 'w':
        case 72:
          /*  优化为下面的代码
            if(arr[r-1][c] == 0 )
            {
                arr[r-1][c]=5;
                arr[r][c]=0;
            }
            if()
            {
                arr[r-1][c]=8;
                arr[r][c]-=5;
            }
            */
            if(arr[r-1][c] == 0 ||arr[r-1][c] == 3 )//人向上移动
            {   //人的上面是空地 或者 人的上面是木的地
                arr[r-1][c]+= 5; //人到达的地方数字加5
                arr[r][c]  -=5;  //人离开的地方数字减5
            }
            if(arr[r-1][c] == 4 || arr[r-1][c] == 7)
            {
                if(arr[r-2][c] ==0 || arr[r-2][c] ==3)
                {
                    arr[r-2][c]+=4;//箱子到了的地方原来地方+4
                    arr[r-1][c]+=1;//箱子离开-4,人来了+5所以只+1
                    arr[r][c]  -=5;//人离开了减5
                }
            }
            break;
   //搞清楚了向上运动的规律,向下arr[r+1][c],向左arr[r][c-1],向右arr[r][c+1]一样的规律
        case 'A':
        case 'a':
        case 80:
            if(arr[r][c-1] == 0 ||arr[r][c-1] == 3 )
            {
                arr[r][c-1]+= 5;
                arr[r][c]  -=5;
            }
            if(arr[r][c-1] == 4 || arr[r][c-1] == 7)
            {
                if(arr[r][c-2] ==0 || arr[r][c-2] ==3)
                {
                    arr[r][c-2]+=4;
                    arr[r][c-1]+=1;
                    arr[r][c]  -=5;
                }
            }
            break;
        case 'S':
        case 's':
        case 75:
             if(arr[r+1][c] == 0 ||arr[r+1][c] == 3 )
            {
                arr[r+1][c]+= 5;
                arr[r][c]  -=5;
            }
            if(arr[r+1][c] == 4 || arr[r+1][c] == 7)
            {
                if(arr[r+2][c] ==0 || arr[r+2][c] ==3)
                {
                    arr[r+2][c]+=4;
                    arr[r+1][c]+=1;
                    arr[r][c]  -=5;
                }
            }
            break;
        case 'D':
        case 'd':
        case 77:
            if(arr[r][c+1] == 0 ||arr[r][c+1] == 3 )
            {
                arr[r][c+1] += 5;
                arr[r][c]  -= 5;
            }
             if(arr[r][c+1] == 4 || arr[r][c+1] == 7)
            {
                if(arr[r][c+2] ==0 || arr[r][c+2] ==3)
                {
                    arr[r][c+2] += 4;
                    arr[r][c+1] += 1;
                    arr[r][c]  -= 5;
                }
            }
            break;
    }

}
int endGame(int count)
{

     for(int i = 0; i < 9; i++)
    {
        for(int j = 0 ; j < 11; j++)
        {
            if(arr[i][j] == 7)
            {
               count++;
            }
        }
    }
   return count;

}
int main()
{
    int count=0;
    while(1)
    {
        system("cls");
        drawMap();
        playGame();
       if(endGame(count) == 10)
       {
            break;
       }

    }
    cout<<"恭喜你完成了!"<<endl;
    system("pause");
    return 0;
}

程序运行效果图,可以实现推箱子游戏的各种移动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aFakeProgramer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值