C语言小游戏:推箱子

前情提要

在<啊哈C>一书中学了简易小游戏走迷宫的写法,之后的挑战是写一个推箱子,于是尝试去写一下.

代码

此段代码是我在摸索中更改之后的最终代码,存在改动痕迹.


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include<conio.h>

int main()
{
    char a[50][50] =
    {
    "#########",
    "####E####",
    "####X####",
    "#E XoX E#",
    "####X####",
    "####E####",
    "#########",
    };
    int x, y;
    char in, out;
    x = 3; y = 4;
    out = 'X';
   // for (int i = 0; i <= 7; i = i + 1)
   // {
    //    puts(a[i]);
    //}
    while (a[1][4] != out || a[3][1] != out || a[3][7] != out || a[5][4] != out)
    {
        for (int i = 0; i <= 7; i = i + 1)
        {
            puts(a[i]);
        }
        in = getch();
        if (in == 'w')
        {
            if (a[x - 1][y] != '#')//&& a[x-2][y]!='#')
            {
                if (a[x - 1][y] == 'X' && a[x - 2][y] != '#' && a[x - 2][y] != 'X')
                {
                    a[x][y] = ' ';
                    x = x - 1;
                    a[x][y] = 'o';
                    a[x - 1][y] = 'X';
                }
                else if (a[x - 1][y] == ' ')
                {
                    a[x][y] = ' ';
                    x = x - 1;
                    a[x][y] = 'o';
                }

            }
        }
        if (in == 's')
        {
            if (a[x + 1][y] != '#') //&& a[x + 2][y] != '#')
            {
                if (a[x + 1][y] == 'X' && a[x + 2][y] != '#' && a[x + 2][y] != 'X')
                {
                    a[x][y] = ' ';
                    x = x + 1;
                    a[x][y] = 'o';
                    a[x + 1][y] = 'X';
                }
                else if (a[x + 1][y] == ' ')
                {
                    a[x][y] = ' ';
                    x = x + 1;
                    a[x][y] = 'o';
                }

            }
        }
        if (in == 'a')
        {
            if (a[x][y - 1] != '#')// && a[x][y-2] != '#')
            {
                if (a[x][y - 1] == 'X' && a[x][y - 2] != '#' && a[x][y - 2] != 'X')
                {
                    a[x][y] = ' ';
                    y = y - 1;
                    a[x][y] = 'o';
                    a[x][y - 1] = 'X';
                }
                else if (a[x][y - 1] == ' ')
                {
                    a[x][y] = ' ';
                    y = y - 1;
                    a[x][y] = 'o';
                }

            }
        }
        if (in == 'd')
        {
            if (a[x][y + 1] != '#')// && a[x][y + 2] != '#')
            {
                if (a[x][y + 1] == 'X' && a[x][y + 2] != '#' && a[x][y + 2] != 'X')
                {
                    a[x][y] = ' ';
                    y = y + 1;
                    a[x][y] = 'o';
                    a[x][y + 1] = 'X';
                }
                else if (a[x][y + 1] == ' ')
                {
                    a[x][y] = ' ';
                    y = y + 1;
                    a[x][y] = 'o';
                }

            }
        }
        system("cls");
    }
    system("cls");
    printf("恭喜你赢啦\n");
    Sleep(5000);
    return 0;
}

遇到的问题

1.编译器读不出getch();

所用的是VS2019,安装easyX插件后扔存在问题,解决方法参考了这位老哥的回答.
错误 1 error C4996.

2.二维数组的序号

数组的序号从0开始,一开始忽略了这件事,实在是惭愧.

3.游戏的完成条件

刚开始把循环条件写成了四个坐标 &&
实际上 完成条件是四个坐标&&是X,

a[1][4] == out && a[3][1] == out && a[3][7] == out && a[5][4] == out

循环条件需是它的逆否命题,即

while (a[1][4] != out || a[3][1] != out || a[3][7] != out || a[5][4] != out)

4.可能有的bug

if (in == 'w')
       {
           if (a[x - 1][y] != '#')                //&& a[x-2][y]!='#')
           {
               if (a[x - 1][y] == 'X' && a[x - 2][y] != '#')

如果用我一开始的写法

if (in == 'w')
       {
           if (a[x - 1][y] != '#')&& a[x-2][y]!='#')
           {
               if (a[x - 1][y] == 'X' )

会出现卡墙的bug.
#######
###O###
###O###
###X###
键入两次W后,第二次W会发现无法移动

   if (a[x - 1][y] != '#')//&& a[x-2][y]!='#')
            {
                if (a[x - 1][y] == 'X' && a[x - 2][y] != '#')
                {
                    a[x][y] = ' ';
                    x = x - 1;
                    a[x][y] = 'o';
                    a[x - 1][y] = 'X';
                }
                else if (a[x - 1][y] == ' ')
                {
                    a[x][y] = ' ';
                    x = x - 1;
                    a[x][y] = 'o';
                }

忽略了两个箱子在一起的情况.
更改为

 if (a[x - 1][y] == 'X' && a[x - 2][y] != '#' && a[x - 2][y] != 'X')

补充了两个箱子在一起时的条件

更多可能

将键入-循环部分写为函数,可以只修改完成坐标来写出更多的关卡.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值