前情提要
在<啊哈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')
补充了两个箱子在一起时的条件
更多可能
将键入-循环部分写为函数,可以只修改完成坐标来写出更多的关卡.