C语⾔写迷宫游戏
C语⾔写迷宫游戏
这篇⽂章是给学完并学懂了C语⾔的分⽀(选择和循环)结构和⼆维数组的朋友看的。
要做⼀个游戏或者程序先要想好有那些要求,以下是我认为⼀个迷宫必带的要求:
1. 迷宫要先打印出来(要设置墙、空⽓、⼩球的起点),是墙就不能,是空⽓就可以⾛。
2. 每次输⼊'w'、'a'、's'、'd'为上、左、下、右,并每次输⼊后,不⽤按回车或任意键继续就能输出,每次⾛⼀步(按键盘的键⾛)后,
先清屏再输出现在迷宫以及⼩球现在在哪⾥。
3. 要有起点和终点的X、Y轴,如果⼩球与终点的位置相同了,就提⽰胜利并退出游戏。
定义地图
⾸先我们要打印出地图,因为地图有长和宽的长度,所以我们要⽤⼆维数组来定义⼀个地图,代码如下:
char map[50][50]={
">#",//申请50*50的⼆维字符串当迷宫地图,但这⾥是6*6的地图
"#O # ",//'#'是墙(不可以⾛的地⽅)
"# ## #",//'O'是起点(可控制)
"# # #",//' '是空⽓(可以⾛的地⽅)
"## #",
">#",//横竖都是012345,012345(数组下标从0开始)
};
打印地图⽅法⼀
定义完⼆维数组,就要把它打印出来,代码如下:
int i,j;
for(i=0;i<6;i++)//i循环⽤来控制打印地图的⾏数
{
for(j=0;j<6;j++)//j循环⽤来控制打印地图的列数
{
printf("%c",map[i][j]);//打印每次i和j的⾏数和列数
}
printf("\n");//⼀⾏打印完毕需要换⾏
}
打印地图⽅法⼆
上⾯这段代码是通过双重循环打印出地图的每⾏每列。
如果学过puts函数来输出字符数组的朋友可以这样写,代码如下:
int i;
for(i=0;i<6;i++)//从0到5,共进⾏了6次循环,依次输出迷宫的第0⾄5⾏
puts(map[i]);//表⽰输出每⼀⾏的字符串
是不是简单了许多,不懂puts函数的朋友也没关系,你⽤第⼀种⽅法就⾏,对于puts函数你只需要知道:
1. 使⽤ puts() 显⽰字符串时,系统会⾃动在其后添加⼀个换⾏符。
2. 只有遇到 '\0' 也就是字符串结束标志符才会停⽌。
定义起点和终点位置
然后再定义起点和终点的X、Y轴位置(当然上⾯定义⼆维数组时已经看得出来了),代码如下:
i nt x,y,p,q;//x,y为⼩球(起点"O")初始位置竖横轴
//p,q为空⽩(终点" ")结束位置竖横轴
x=1;y=1;//x为竖轴初始位置为1,y为初始横轴位置为1
p=1;q=5;//p为竖轴结束位置为1,q为结束横轴位置为5
总结以上代码
⽬前为⽌,我们做了定义地图、打印地图、定义起点终点的X、Y轴,⽬前全部代码如下:
#include<stdio.h>//printf("");的头⽂件
#include<stdlib.h>//system("");的头⽂件
#include<Windows.h>//Sleep();的头⽂件
int m1ain(void)
{
char map[50][50]={
">#",//申请50*50的⼆维字符串当迷宫地图,但这⾥是6*6的地图
"#O # ",//'#'是墙(不可以⾛的地⽅)
"# ## #",//'O'是起点(可控制)
"# # #",//' '是空⽓(可以⾛的地⽅)
"## #",
">#",//横竖都是012345,012345(数组下标从0开始)
};
int i,x,y,p,q;//x,y为⼩球(起点"O")初始位置竖横轴
//p,q为空⽩(终点" ")结束位置竖横轴
int ch;//申请需要输⼊的字符(名称是ch),当移动(w,a,s,d)
x=1;y=1;p=1;q=5;//x为竖轴初始位置为1,y为初始横轴位置为1
//p为竖轴结束位置为1,q为结束横轴位置为5
for(i=0;i<6;i++)//从0到5,共进⾏了6次循环,依次输出迷宫的第0⾄5⾏
puts(map[i]);//表⽰输出每⼀⾏的字符串
Sleep(5000);//上⾯代码全部执⾏完毕后过五秒⾃动关闭程序
return 0;
}
现在我们就要想办法控制⼩球了,这⾥利⽤键盘上的'w''s''a''d'四个键来控制这个⼩球进⾏上、下、左、右移动,当然你如果喜欢,也可以⽤别的按键。
第⼀步:先来控制⼩球向下移动,也就是当你按下's'键时,⼩球向下移动⼀步。
那么如何获得's'这个按键呢,换句话说:当你按下's'键时,我们的程序怎样知道你按的是's'键呢?
实现读取按键
很简单,因为你按下's'键时,本质上是输⼊了1个字符's',我们只需要读取这个字符's'就可以了,读取⼀个字符有4种⽅法:
char ch;
scanf("%c",&ch);//读取⼀个字符,输⼊后等待⽤户按"Enter"键结束(带回显)
ch=getchar;//读取⼀个字符,输⼊后等待⽤户按"Enter"键结束(带回显)
ch=getche;//读取⼀个字符,输⼊后⽴即获取字符,不⽤按"Enter"键结束(带回显)
ch=getch;//读取⼀个字符,输⼊后⽴即获取字符,不⽤按"Enter"键结束(不带回显)
⽽我们并不想显⽰输⼊的字符,并且希望输⼊的字符可以⽴即被程序获得,⽽不⽤在敲击⼀个字符后再敲击⼀个"Enter"键。
因此我们选⽤最后⼀个语句ch=getch();。
实现⼩球下向下移动⼀步
接下来,我们要把在键盘上敲击的字符存储在字符变量ch中,再接下来实现当敲击's'时。让⼩球向下移动⼀步,代码如下:
i f(ch=='s')//判断你是否输⼊(按)'s'这个字符
{
if(map[x+1][y]!='#')//确认输⼊(按)的是's'时,就执⾏[x+1][y](往下⾛,x为竖轴,+1为往下,y不变),提前是还
要判断往下⾛是否为'#'(墙)
{
map[x][y]=' ';//确认往下⾛不是墙时,把当前的'O'输出成' '
x++;//为向下⾛
map[x][y]='O';//确认往下⾛不是墙时,把下⼀步的' '输出成'O'
}
}
在上⾯代码中,我们通过if语句来判断敲击的字符是否是字符's',如果是字符's',我们就让⼩球向下移动⼀步,但在⼩球向下移动之前,需要⾸先判断下⾯⼀步是否能移动,只有下⼀步不是墙'#'时⼩球才能移动。
也就是说当if(map[x+1][y]!='#')条件成⽴时,就表⽰下⼀步不是墙,⼩球可以移动。
可能有些朋友会问:为什么[x+1][y]就表⽰向下⾛⼀部的格⼦呢?
其实很简单:向下移动时,⼩球当然还在当前这个列,不过不在这⼀⾏,⽽是在下⼀⾏,因此向下移动是y不变,x加1。
如果是向右边移动,很显然还是在同⼀⾏,所以x不变,但是⼩球已经不在刚才那⼀竖列了,⽽在右边的⼀个竖列,因此y需要加1。
总结⼩球移动规律
向下移动是y不变,x加1。
向上移动是y不变,x减1。
向左移动是x不变,y减1。
向右移动是x不变,y加1。
接下来我们来讲解下⾯这3句话的意思:
map[x][y]=' ';//确认往下⾛不是墙时,把当前的'O'输出成' '
x++;//为向下⾛
map[x][y]='O';//确认往下⾛不是墙时,把下⼀步的' '输出成'O'
让⼩球向下移动,就是让⼩球原本位置上的'O'变成空格,⽽让下⼀个空格变成'O'。
第⼀句:map[x][y]=' ';(注意此处两个单引号之间中间有⼀个空格)就是让⼩球的当前位置变为空格,
第⼆句:x++;这句话⾮常重要,它表⽰更改⼩球的位置,因为⼩球向下运动只需要x++就可以了,y不变。
第三句:a[x][y]='O';语句就是将⼩球新位置上的内容替换为⼩球'O'。
请注意上⾯⼀个代码,可不能写成:
map[x][y]=' ';
map[x+1][y]='O';
⾄于为什么,⼤家⾃⼰去想想吧!
实现重新打印地图
因为⼩球的位置有了变化,因此还需要将新迷宫的状态重新打印⼀次,在打印之前记得要将之前的屏幕清屏,代码如下:
int i;
system("cls");//每次移动了⼩球就清屏⼀次
for(i=0;i<6;i++)//清屏了再次循环输出新的地图
puts(map[i]);//清屏了再次输出新的地图
总结以上代码
#include<stdio.h>//printf("");的头⽂件
#include<stdlib.h>//system("");的头⽂件
#include<Windows.h>//Sleep();的头⽂件
#include<conio.h>//getch();的头⽂件
int main(void)
{
char map[50][50]={
">#",//申请50*50的⼆维字符串当迷宫地图,但这⾥是6*6的地图
"#O # ",//'#'是墙(不可以⾛的地⽅)
"# ## #",//'O'是起点(可控制)
"# # #",//' '是空⽓(可以⾛的地⽅)
"## #",
">#",//横竖都是012345,012345(数组下标从0开始)
};
int i,x,y,p,q;//x,y为⼩球(起点"O")初始位置竖横轴
//p,q为空⽩(终点" ")结束位置竖横轴
int ch;//申请需要输⼊的字符(名称是ch),当移动(w,a,s,d)
x=1;y=1;p=1;q=5;//x为竖轴初始位置为1,y为初始横轴位置为1
//p为竖轴结束位置为1,q为结束横轴位置为5
for(i=0;i<6;i++)//从0到5,共进⾏了6次循环,依次输出迷宫的第0⾄5⾏
puts(map[i]);//表⽰输出每⼀⾏的字符串
ch=getch();//这语句表⽰给ch变量输⼊的字符可以⽴即被程序获取(不⽤按任意键继续),也不会回显
if (ch=='s')//判断你是否输⼊(按)'s'这个字符
{
if (map[x+1][y]!='#')//确认输⼊(按)的是's'时,就执⾏[x+1][y](往下⾛,x为竖轴,+1为往下,y不变),提前是还要判断往下⾛是否为'#'(墙) {
map[x][y]=' ';//确认往下⾛不是墙时,把当前的'O'输出成' '
x++;//为向下⾛
map[x][y]='O';//确认往下⾛不是墙时,把下⼀步的' '输出成'O'
}
}
system("cls");//每次移动了⼩球就清屏⼀次
for(i=0;i<6;i++)//清屏了再次循环输出新的地图
puts(map[i]);//清屏了再次输出新的地图
Sleep(5000);//上⾯代码全部执⾏完毕后过五秒⾃动关闭程序
return 0;
}
运⾏⼀下,然后按⼀下's'键,是不是已经可以看到⼩球向下移动了⼀步了呢?
但是你只能移动⼀步,如何实现连续移动呢?
实现连续移动
很简单,实现连续移动我们可以通过while循环来解决问题:
#include<stdio.h>//printf("");的头⽂件
#include<stdlib.h>//system("");的头⽂件
#include<Windows.h>//Sleep();的头⽂件
#include<conio.h>//getch();的头⽂件
int m1ain(void)
{
char map[50][50]={
system的头文件">#",//申请50*50的⼆维字符串当迷宫地图,但这⾥是6*6的地图
"#O # ",//'#'是墙(不可以⾛的地⽅)
"# ## #",//'O'是起点(可控制)
"# # #",//' '是空⽓(可以⾛的地⽅)
"## #",
">#",//横竖都是012345,012345(数组下标从0开始)
};
int i,x,y,p,q;//x,y为⼩球(起点"O")初始位置竖横轴
//p,q为空⽩(终点" ")结束位置竖横轴
int ch;//申请需要输⼊的字符(名称是ch),当移动(w,a,s,d)
x=1;y=1;p=1;q=5;//x为竖轴初始位置为1,y为初始横轴位置为1
//p为竖轴结束位置为1,q为结束横轴位置为5
for(i=0;i<6;i++)//从0到5,共进⾏了6次循环,依次输出迷宫的第0⾄5⾏
puts(map[i]);//表⽰输出每⼀⾏的字符串
while(1)//暂时⽆限循环
{
ch=getch();//这语句表⽰给ch变量输⼊的字符可以⽴即被程序获取(不⽤按任意键继续),也不会回显
if(ch=='s')//判断你是否输⼊(按)'s'这个字符
{
if(map[x+1][y]!='#')//确认输⼊(按)的是's'时,就执⾏[x+1][y](往下⾛,x为竖轴,+1为往下,y不变),提前是还要判断往下⾛是否为'#'(墙)
{
map[x][y]=' ';//确认往下⾛不是墙时,把当前的'O'输出成' '
x++;//为向下⾛
map[x][y]='O';//确认往下⾛不是墙时,把下⼀步的' '输出成'O'
}
}
system("cls");//每次移动了⼩球就清屏⼀次
for(i=0;i<6;i++)//清屏了再次循环输出新的地图
puts(map[i]);//清屏了再次输出新的地图
}
Sleep(5000);//上⾯代码全部执⾏完毕后过五秒⾃动关闭程序
return 0;
}
暂时先使⽤while(1)⽆限循环来解决这个问题,好了,运⾏⼀下吧。
此时⼩球是不是可以连续移动了?
当然,⽬前⼩球还只能朝⼀个⽅向运动,接下来我们来实现⼩球向其它3个⽅向的运动。
实现⼩球下向上下左右移动
向其它3个⽅向移动其实和"向下移动"是差不多的,只要注意是x在变化还是y在变化,是加1还是减1就可以了。⽆限移动4个⽅向代码如下:
#include<stdio.h>//printf("");的头⽂件
#include<stdlib.h>//system("");的头⽂件
#include<Windows.h>//Sleep();的头⽂件
#include<conio.h>//getch();的头⽂件
int m1ain(void)
{
char map[50][50]={
">#",//申请50*50的⼆维字符串当迷宫地图,但这⾥是6*6的地图
"#O # ",//'#'是墙(不可以⾛的地⽅)
"# ## #",//'O'是起点(可控制)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
超级好用的C++万能头文件
« 上一篇
C#读取XML文件
下一篇 »
推荐文章
热门文章
-
随机森林特征选择原理
2024-10-02 -
自动驾驶系统中的随机森林算法解析
2024-10-02 -
随机森林算法及其在生物信息学中的应用
2024-10-02 -
监督学习中的随机森林算法解析(六)
2024-10-02 -
随机森林算法在数据分析中的应用
2024-10-02 -
机器学习——随机森林,RandomForestClassifier参数含义详解
2024-10-02 -
随机森林 的算法
2024-10-02 -
随机森林算法作用
2024-10-02 -
监督学习中的随机森林算法解析(十)
2024-10-02 -
随机森林算法案例
2024-10-02 -
随机森林案例
2024-10-02 -
二分类问题常用的模型
2024-10-02 -
绘制ssd框架训练流程
2024-10-02 -
一种基于信息熵和DTW的多维时间序列相似性度量算法
2024-10-02 -
SVM训练过程范文
2024-10-02 -
如何使用支持向量机进行股票预测与交易分析
2024-10-02 -
二分类交叉熵损失函数binary
2024-10-02 -
tinybert_训练中文文本分类模型_概述说明
2024-10-02 -
基于门控可形变卷积和分层Transformer的图像修复模型及其应用
2024-10-02 -
人工智能开发技术的测试和评估方法
2024-10-02
最新文章
-
基于随机森林的数据分类算法改进
2024-10-02 -
人工智能中的智能识别与分类技术
2024-10-02 -
基于人工智能技术的随机森林算法在医疗数据挖掘中的应用
2024-10-02 -
随机森林回归模型的建模步骤
2024-10-02 -
r语言随机森林预测模型校准曲线
2024-10-02 -
《2024年随机森林算法优化研究》范文
2024-10-02
发表评论