C语言笔记07_小游戏设计——“走迷宫”
C语言07 小游戏设计——走迷宫
目标:
我们要设计一个完整的小游戏“走迷宫”。你将可以通过控制键盘上的“W”、“S”、“A”、“D” 4个键来控制1个“小球”进行上、下、左、右,而你的目的就是让这个“小球”从起点走出迷宫。来看看这个迷宫吧。
准备知识:
请看C语言笔记06
开始
Step 01:制造一个迷宫:
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
}
Step 02:将迷宫输出到屏幕上:
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
}
for(i=0;i<=9;i++)
puts(a[i]); // 打印i行所有内容
Step 03:储存小球初始位置和迷宫的出口位置:
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
}
int i,x,y,p,q;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
Sleep(5000); // 走出迷宫后5秒自动关闭程序,而用system("pause");的话就不会自动关闭,自己选择用哪个。
Step 04:实现用WSAD控制小球:
Step 04-01:让程序识别S键。
我们先来控制小球向下走,实现当我们按一下S,小球就向下走1步。
那么如何获得“S”这个键呢?换句话说就是当按下“S”时,程序能够识别你按下的是这个键。我们知道它的本质是一个字符,所以计算机只要读取到这个字符就行了,而计算机读取字符有下面4种方法:
scanf("%c",&ch);
ch=getchar();
ch=getche();
ch=getch();
他们的区别我们在C语言笔记06中讲过,这里不再说;因为我们不需要显示输入的字符,所以我们这里选择getch()函数。
Step 04-02:实现按S键就识别墙体并且下移1单位。
我们需要用到2个if语句嵌套:
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' '; // 实现“原小球消失”
x++;
a[x][y]='O'; // 实现“小球出现在新位置”
}
}
这段代码中,我们用if语句判断是否是s字符,如果是则继续判断下一步是否是墙体“#”,如果不是,则小球往下移动一格,是则不执行其他命令。
因为小球的位置有了变化,我们还需要将新迷宫的状态打印一次。在打印之前记得要将之前屏幕清屏,代码如下:
system("cls");
for(i=0;i<=5;i++)
puts(a[i]);
到这里我们小结一下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
Sleep(5000);
return 0;
}
运行一下,按一下“S”键,是不是已经可以看到小球向下移动一步了啊?但是你只能移动一步。如何实现连续移动呢?
Step 04-03:实现向下持续移动
很简单,用while循环解决,我们暂时先用while(1)解决:
while(1)
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
完整代码为:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
while(1)
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
Sleep(5000);
return 0;
}
试试运行一下,此时我们可以一直按“S”键来实现持续向下移动了!现在我们要解决的问题就是小球要向其它3个方向也能实现持续移动!
Step 04-04:另外3个方向也要实现持续移动
其他方向和s差不多,要注意的是x在变化还是y在变化,是+1还是-1就可以了。
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
while(1)
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
if(ch=='w')
{
if(a[x-1][y]!='#')
{
a[x][y]=' ';
x--;
a[x][y]='O';
}
}
if(ch=='a')
{
if(a[x][y-1]!='#')
{
a[x][y]=' ';
y--;
a[x][y]='O';
}
}
if(ch=='d')
{
if(a[x][y+1]!='#')
{
a[x][y]=' ';
y++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
Sleep(5000);
return 0;
}
Step 05:走到出口显示“You Win!”
这一步只需要将while循环的条件改动一下并且在末尾加入清屏和打印即可。
while循环改为:
while( x!=p || y!=q)
末尾清屏+打印胜利代码;
system("cls");
printf("You win!\n");
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a[15][30]={
"#######################",
"#O ## ### #",
"# # ## # # #",
"# ## # # ## #",
"# ### ## ### ########",
"# ### ## #### ",
"# ###### ## ## ###",
"# # # ## # ## #",
"## #### #### # ### ",
"#######################",
};
int i,x,y,p,q;
char ch;
x=1;y=1;p=5;q=22;
for(i=0;i<=9;i++)
puts(a[i]);
while( x!=p || y!=q )
{
ch=getch();
if(ch=='s')
{
if(a[x+1][y]!='#')
{
a[x][y]=' ';
x++;
a[x][y]='O';
}
}
if(ch=='w')
{
if(a[x-1][y]!='#')
{
a[x][y]=' ';
x--;
a[x][y]='O';
}
}
if(ch=='a')
{
if(a[x][y-1]!='#')
{
a[x][y]=' ';
y--;
a[x][y]='O';
}
}
if(ch=='d')
{
if(a[x][y+1]!='#')
{
a[x][y]=' ';
y++;
a[x][y]='O';
}
}
system("cls");
for(i=0;i<=9;i++)
puts(a[i]);
}
system("cls");
printf("You win!\n");
Sleep(5000);
return 0;
}
运行:
结束:
终于用C语言设计完成一个“走迷宫”游戏,是不是有点成就感啦,加油。感谢《啊哈C》这本优秀的C语言入门书,感兴趣的话自己去看看吧。