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

news2024/11/22 20:31:30

目录

设计迷宫地图

设计主角——小球

完整代码


这次教大家编写一个简单的“走迷宫”小游戏,我们可以通过键盘上的‘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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element表格头部加入图标

首先看看效果 下面是代码 <el-table-column prop"integralBalance"><template slot"header" slot-scope"scope"><div style"display: flex;justify-content: center;align-items: center;">积分余额<i class&qu…

mac无法向移动硬盘拷贝文件怎么解决?不能读取移动硬盘文件怎么解决

有时候我们在使用mac的时候&#xff0c;会遇到一些问题&#xff0c;比如无法向移动硬盘拷贝文件或者不能读取移动硬盘文件。这些问题会给我们的工作和生活带来不便&#xff0c;所以我们需要找到原因和解决办法。本文将为你介绍mac无法向移动硬盘拷贝文件怎么回事&#xff0c;以…

Mysql -常见函数

目录 字符串函数 数值函数 日期函数 流程函数 字符串函数 -- 拼接 SELECT CONCAT(Hello, World); -- 小写 SELECT LOWER(Hello); -- 大写 SELECT UPPER(Hello); -- 左填充 SELECT LPAD(01, 5, -); -- 右填充 SELECT RPAD(01, 5, -); -- 去除空格 SELECT TRIM( Hello World )…

sqli-labs关卡20(基于http头部报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第二十关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚…

基于 gin + websocket 即时通讯项目 (一、项目初始化)

基于 gin websocket 即时通讯项目 1、安装环境与初始化 搜索各种包官网 https://pkg.go.dev/ 1.1 安装 grom go get -u gorm.io/grom 1.2 安装 MySQL 驱动 go get -u gorm.io/driver/sqlite go get -u gorm.io/driver/mysql 1.3 安装 gin go get -u github.com/gin-gonic/gi…

深入了解Java 8 新特性:lambda表达式基础

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#xf…

RIP路由信息协议

RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议&#xff0c;最大优点是简单要求网络中的每个路由器都要维护一张表&#xff0c;表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议&#xff0c;它在传输层使用UDP&#xff0c;RIP报文作为UD…

Git 简介及使用

前言 假设有这样一个场景&#xff0c;老板让员工做一个档案&#xff0c;员工这个档案做好了之后交给老板看&#xff0c;此时老板不满意&#xff0c;又让回去改&#xff0c;改完给老板看&#xff0c;但是老板又不是很满意&#xff0c;就这样改了又改&#xff0c;给老板看过之后&…

WPF中行为与触发器的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 一、行为 (Behaviors) behaviors的简单测试 <Window x:Class"Test_05.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

YOLOv8改进 | DAttention (DAT)注意力机制实现极限涨点

论文地址&#xff1a; DAT论文地址 官方地址&#xff1a;官方代码的地址 代码地址&#xff1a;文末有修改了官方代码BUG的代码块复制粘贴即可 一、本文介绍 本文给大家带来的是YOLOv8改进DAT(Vision Transformer with Deformable Attention)的教程&#xff0c;其发布于2022…

java.net.UnknownHostException: eureka

java.net.UnknownHostException: eureka 哦。HOST漏了 #linux /etc/hosts #windows C:\Windows\System32\drivers\etc\hosts 127.0.0.1 eureka7000 127.0.0.1 eureka7001 127.0.0.1 eureka7002

Echarts柱状图配置代码详解,含常用图例代码

一、初识柱状图 从echarts官网引入基础的柱状图后&#xff0c;可以看到他有如下的配置项。我们可以改变各个配置项的属性&#xff0c;将图例调整为我们期望的效果。 二、常用配置项 因为引入echarts图例后&#xff0c;改变图例的东西都在option配置项中&#xff0c;所以其他部…

腾讯云轻量级服务器和云服务器什么区别?轻量服务器是干什么用的

随着互联网的迅速发展&#xff0c;服务器成为了许多人必备的工具。然而&#xff0c;面对众多的服务器选择&#xff0c;我们常常会陷入纠结之中。在这篇文章中&#xff0c;我们将探讨轻量服务器和标准云服务器的区别&#xff0c;帮助您选择最适合自己需求的服务器。 腾讯云双十…

python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例

文章目录 前言1. 数据清洗&#xff1a;使用 sklearn.preprocessing 中的 StandardScaler 和 MinMaxScaler 进行数据规范化。2. 缺失值处理&#xff1a;使用 sklearn.impute 中的 SimpleImputer 来填充缺失值。3. 数据编码&#xff1a;使用 sklearn.preprocessing 中的 OneHotEn…

python中的NumPy和Pandas往往都是同时使用,NumPy和Pandas的在数据分析中的联合使用

文章目录 前言一、numpy的介绍与用法二、pandas的介绍与用法三、numpy与pandas的联合使用说明四、numpy与pandas的联合使用程序代码4.1 读取CSV文件并进行数据清洗&#xff0c;如去除NaN值4.2 矩阵操作和特征工程&#xff0c;如标准化处理4.3 使用Pandas进行数据筛选和分组聚合…

ogrinfo不是内部或者外部命令

这个是GDAL的问题&#xff0c;我是通过OSGeo4w安装的&#xff0c;出来就是这个问题&#xff0c;教程没有仔细看干。 第一次安装&#xff0c;选择express install&#xff01;&#xff01;&#xff01;&#xff01; 第一次安装&#xff0c;选择express install&#xff01;&…

代码随想录算法训练营第三十九天【动态规划part02】 | 62.不同路径、63. 不同路径 II

62.不同路径 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 动规五部曲 确定dp数组及其下标含义&#xff1a;dp[i][j] 表示从&#xff08;0,0&#xff09;出发&#xff0c;到&#xff08;i,j&#x…

【算法】最短路径——弗洛伊德 (Floyd) 算法

目录 1.概述2.代码实现3.扩展3.应用 1.概述 &#xff08;1&#xff09;弗洛伊德 (Floyd) 算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c;与 Dijkstra 算法类似。该算法名称以创始人之一、1978 年图灵奖获得者、…

Matalab插值详解和源码

转载&#xff1a;Matalab插值详解和源码 - 知乎 (zhihu.com) 插值法 插值法又称“内插法”&#xff0c;是利用函数f (x)在某区间中已知的若干点的函数值&#xff0c;作出适当的特定函数&#xff0c;在区间的其他点上用这特定函数的值作为函数f (x)的近似值&#xff0c;这种方…

腾讯云服务器租用价格,腾讯云服务器价格流量怎么算?

首先&#xff0c;让我们来看看腾讯云服务器租用价格。根据您的需求不同&#xff0c;腾讯云提供了多种不同的配置选项&#xff0c;从轻量级应用服务器到高性能的GPU服务器&#xff0c;都可以满足您的需求。以下是一些常见的腾讯云服务器租用价格&#xff1a; 一、腾讯云服务器租…