手把手教你用C语言写出“走迷宫”小游戏(能看懂文字就会自己敲系列)

目录

设计迷宫地图

设计主角——小球

完整代码


这次教大家编写一个简单的“走迷宫”小游戏,我们可以通过键盘上的‘W’、‘S’、‘A’、‘D’四个键来控制一个“小球”向上,下,左,右移动,目的就是让这个“小球”从起点走出迷宫。

设计迷宫地图

首先,我们可以用字符‘#’表示迷宫的墙,用大写字母‘O’来表示小球

我们可以先设计一个简单的迷宫,并用二维字符数组来存储这个迷宫。


char a[50][50] = { "######",
				   "#O #  ",
				   "# ## #",
				   "#  # #",
				   "##   #",
				   "######",
	             };

迷宫设计并存储好了之后,我们可以用for循环打印出这个迷宫在屏幕上,如下代码:

for (i = 0;i <= 5;i++)
		puts(a[i]);

上面这个for循环从0到5,共进行6次循环,依次输出迷宫的第0~5行。puts(a[i])表示输出每一行的字符串。

设计主角——小球

我们可以用变量x和y来存储小球的初始位置,用变量p和q来存储迷宫的终点(出口)

注意:字符串是从0开始计数的,千万别算错了小球的初始位置及迷宫的出口位置

然后接下来要设计如何控制小球了,这里可以用键盘上的‘w’、‘s’、‘a’、‘d’四个按键来控制小球的行走,当然也可以按照你喜欢的按键来进行设计。

那如何实现呢?我们希望当我们按下‘s’的时候,小球向下移动一步,所以可以用‘getch()’来获取字符(这里并不想显示输入的字符,并且希望输入的字符可以立即被程序获得,而不用在敲击一个字符后再敲击一个“enter”键,至于为什么用getch,可以看我前几篇博客有关‘getche’等的介绍)

ch = getch();//输入的字符串存储在变量ch中

好,我们已经实现字符串的输入了,接下来实现当敲击字符s的时候,让小球向下移动一步

if (ch == 's')
		{
			if (a[x + 1][y] != '#')
			{
				a[x][y] = ' ';
				x++;
				a[x][y] = 'O';
			}
		}

这里解释一下:首先我们用if语句判断我们输入的字符是不是‘s’,如果是字符s,我们就让小球向下移动,但是在让小球向下移动之前,需要看看下一步是否能移动(也就是说是否为‘#’)

所以再用if语句判断一下下一步是不是‘#’(这里可能有人会问为什么a[x+1][y]表示向下走一步呢?解释:向下移动时,小球当然还在这一列,不过不在这一行了,而是在下一行,因此向下移动是y不变,x加1)

如果是向右边移动,很明显还是在同一行,所以x不变,但是小球已经不在刚才的那一列了,而在它右边的那一列,因此y需要加1

方向总结:

向下移动是y不变,x加1

向上移动是y不变,x减1
向左移动是x不变,y减1

向右移动是x不变,y加1

a[x][y] = '  ';
                x++;
                a[x][y] = 'O';

 至于这三行的意思是,让小球向下移动,就是让小球原本位置上的“O”变成空格,且让下一格变成“O”。

第一句a[x][y]=‘  ’;就是让小球的当前位置变成空格,x++;这句话非常重要,它表示更改小球的位置,因为小球向下运动只需要x++就行了,y不变。最后的a[x][y]=‘O’;就是将小球新位置上的内容替换为小球‘O’。

因为小球的位置有了变化,因此还需要将新迷宫的状态重新打印一次。在打印前记得把之前的屏幕清理掉,代码如下:

system("cls");//这个是清理屏幕的,需要包含头文件<windows.h>

但是以上的代码只能只能移动一步呀,所以这里暂时用while(1)循环解决一下

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
	char a[50][50] = { "######",
					   "#O #  ",
					   "# ## #",
					   "#  # #",
			 		   "##   #",
					   "######",
	                  };
	int i, x, y, p, q;//这里定义小球的初始位置和迷宫的终点位置
	char ch;

	x = 1;y = 1;p = 1;q = 5;
	for (i = 0;i <= 5;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 <= 5;i++)
		{
			puts(a[i]);
		}
	}
	system("cls");
	Sleep(500);
	return 0;
}

目前小球还只能朝一个方向运动,我们接下来实现小球向其他三个方向的运动

向其他三个方向移动其实和“向下移动”差不多,只要注意x在变化还是y在变化,是加一还是减一就行了。

while (x != p || y != q)//这里把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';
			}
		}

最最后,我们可以在后面游戏结束时打印“你获胜了”。

完整代码

如下:

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
int main()
{
	char a[50][50] = { "######",
					   "#O #  ",
					   "# ## #",
					   "#  # #",
					   "##   #",
					   "######",
	                 };
	int i,x, y, p, q;
	char ch;

	x = 1;y = 1;p = 1;q = 5;
	for (i = 0;i <= 5;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 <= 5;i++)
		{
			puts(a[i]);
		}
	}
		system("cls");
		printf("you win!\n");
		Sleep(500);
	return 0;
}

感谢各位观看,看完自己敲一下玩玩吧,当然也可以设计更加复杂的地图,参数自己改下就行啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/161360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3语法总结-数据转换②

Python3语法总结-数据转换② Python3语法总结二.Python数据类型转换隐式类型转换显示类型转换 Python3语法总结 二.Python数据类型转换 有时候我们&#xff0c;需要对数据内置的类型进行转换&#xff0c;数据类型的转换。 Python 数据类型转换可以分为两种&#xff1a; 隐式类…

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列4

文章目录 原型网络进行分类的基本流程一、原始代码---计算欧氏距离&#xff0c;设计原型网络&#xff08;计算原型开始训练&#xff09;二、每一行代码的详细解释总结 原型网络进行分类的基本流程 利用原型网络进行分类&#xff0c;基本流程如下&#xff1a; 1.对于每一个样本…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(十):有损传输线在时域中的表现

如果高频衰减大于低频衰减&#xff0c;随着信号传输&#xff0c;上升时间将会增加。上升时间通常定义为边沿在最终值的 10% 到 90% 之间过渡的时间。这假设信号的边缘轮廓看起来有点高斯分布&#xff0c;中间是最快的斜率区域。对于该波形&#xff0c;10%−90% 的上升时间是有意…

MIB 6.1810实验Xv6 and Unix utilities(4)primes

难度: hard/moderate Write a concurrent prime sieve program for xv6 using pipes and the design illustrated in the picture halfway down this page and the surrounding text. This idea is due to Doug McIlroy, inventor of Unix pipes. Your solution should be in …

让你的Mac体验更便捷,快速启动工具Application Wizard为你助力!

亲爱的Mac用户们&#xff0c;你是否经常感到在繁琐的软件启动过程中浪费了太多时间&#xff1f;你是否希望能够以更快的速度找到并启动你所需的应用程序&#xff1f;如果是的话&#xff0c;那么不要犹豫&#xff0c;让我们来介绍一款强大的软件快速启动工具——Application Wiz…

23年宁波职教中心CTF竞赛-决赛

Web 拳拳组合 进去页面之后查看源码&#xff0c;发现一段注释&#xff0c;写着小明喜欢10的幂次方&#xff0c;那就是10、100、1000、10000 返回页面&#xff0c;在点击红色叉叉的时候抓包&#xff0c;修改count的值为10、100、1000、10000 然后分别获得以下信息 ?count1…

Spring面试题:(八)Spring事务

Spring事务概述 Spring事务基于数据库&#xff0c;基于数据库的事务封装了统一的接口。 编程式事务和声明式事务。 声明式事务分为Xml声明式或者注解声明式 实现事务相关的三个类 事务管理器 事务定义 事务状态 XML声明式事务的使用方法 导入坐标配置目标类配置切面 导入…

JS判断是否存在某个元素(includes、indexOf、find、findeIndex、some)(every 数组内所有值是否相同)

方法一&#xff1a;array.includes(searcElement[,fromIndex]) 此方法判断数组中是否存在某个值&#xff0c;如果存在返回true&#xff0c;否则返回false。 searchElement&#xff1a;需要查找的元素&#xff0c;必选。fromIndex&#xff1a;可选&#xff0c;从该索引处开始查…

浏览器页面被恶意控制时的解决方法

解决360流氓软件控制浏览器页面 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、接受360安全卫士的好意&#xff08;尽量不要选&#xff09;二、拒绝360安全卫士的好意&#xff08;强烈推荐&#xff09;第…

【Vue渲染】 条件渲染 | v-if | v-show | 列表渲染 | v-for

目录 前言 v-if和v-show的区别和联系 v-show和v-if如何选择 条件渲染|v-if|v-show v-if v-if v-else v-if v-else-if v-else template v-show 列表渲染|v-for v-for 前言 本文介绍Vue渲染&#xff0c;包含条件渲染v-if和v-show的区别和联系以及列表渲染v-for v-if和…

“腾易视连”构建汽车生态新格局 星选计划赋能创作者价值提升

11月16日&#xff0c;在2023年广州国际车展前夕&#xff0c;以“腾易视连&#xff0c;入局视频号抓住增长新机会”为主题的腾易创作者大会在广州隆重举办。此次大会&#xff0c;邀请行业嘉宾、媒体伙伴、生态伙伴、视频号汽车领域原生达人等共济一堂&#xff0c;结合汽车行业数…

轻量级的资源授权:基于 OAuth 规范

了解 OAuth 感觉 OAuth 太负盛名了&#xff0c;以至于后来在 OIDC 反而难以企及前辈 OAuth。倒是大家谈论比较多的是 JWT&#xff08;例如https://www.cnblogs.com/lyzg/p/6132801.html&#xff09;&#xff0c;——实际谈 JWT 就是在实现 OIDC&#xff0c;反而 OIDC 大家不怎…

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用

文章目录 Android跨进程通信&#xff0c;IPC&#xff0c;RPC&#xff0c;Binder系统&#xff0c;C语言应用层调用&#xff08;&#xff09;1.概念2.流程3.bctest.c3.1 注册服务&#xff0c;打开binder驱动3.2 获取服务 4.binder_call Android跨进程通信&#xff0c;IPC&#xf…

组件插槽,生命周期,轮播图组件的封装,自定义指令的封装等详解以及axios的卖座案例

3.组件插槽 3-1组件插槽 注意 插槽内容可以访问到父组件的数据作用域,因为插槽内容本身就是在父组件模版中定义的 插槽内容无法访问子组件的数据.vue模版中的表达式只能访问其定义时所处的作用域,这和JavaScript的词法作用域是一致的,换言之: 父组件模版的表达式只能访问父组…

计算机毕业设计选题推荐-掌心办公微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

模块一、任务一.数据分析概述

一、module1 预测未来-总统大选 样本偏差 二、module2 优化现状-化妆品销售 1、数据分析师从业务类型上划分 2、目标&#xff1a;总销量 达到 目标销量 3、固定基本流程 &#xff08;1&#xff09;确定 一、目标值节节升高&#xff0c;是否合理&#xff1f;根据什么定的&…

zabbix-proxy分布式监控

Zabbix是一款开源的企业级网络监控软件&#xff0c;可以监测服务器、网络设备、应用程序等各种资源的状态和性能指标。在大型环境中&#xff0c;如果只有一个Zabbix Server来监控所有的节点&#xff0c;可能会遇到性能瓶颈和数据处理难题。 为了解决这个问题&#xff0c;Zabbi…

爱拖延怎么办?如何改变拖延症?

拖延症是我们日常生活中多见的问题&#xff0c;也是不怎么受重视的问题&#xff0c;大多数人都会认为拖延不是什么大问题&#xff0c;办事拖拉怎么也不可能和心理疾病扯上关系。这里小猫测试网分不同情况来讨论。 偶尔的拖延没什么关系&#xff0c;建议忘掉这种偶然性拖延&…

[C国演义] 第二十一章

第二十一章 最长公共子序列不相交的线 最长公共子序列 力扣链接 单个数组的子序列问题 – dp[i] -- 以nums[i] 为结尾的所有子序列中, xxx xxx. 然后状态转移方程根据 最后一个位置的归属问题进行讨论 两个数组的子序列问题 – 以小见大, 分别分析nums1中的一个区间 和 nums…