手把手教你用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;
}

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


http://www.niftyadmin.cn/n/5193069.html

相关文章

IO流-框架

一&#xff0c;框架概念 二&#xff0c;Commons-io框架 三&#xff0c;使用案例 package BigDecimal;import org.apache.commons.io.FileUtils;import java.io.File; import java.io.IOException;public class Main12 {public static void main(String[] args) throws IOExcept…

​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第15章 面向服务架构设计理论与实践&#xff08;P527~554&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

C# System.Array.CopyTo() 和 System.Array.Clone() 有什么区别

System.Array.CopyTo() 和 System.Array.Clone() 是用于数组复制的两种不同方法&#xff0c;它们在实现和用途上有一些区别。 System.Array.CopyTo() 方法&#xff1a; CopyTo() 方法用于将数组的元素复制到另一个数组。它是 Array 类的实例方法&#xff0c;可以用于复制一个…

游戏工作中用到的一些第3方软件和作用

记录下平时工作中发现的一些好用的软件: Snipaste:截屏软件 最好用的功能就是可以将截的图留在屏幕上,用来做提醒或者对比. RenderDoc:图形调试器 图形图像开\分析和捕捉时要用到的强大工具,可以捕捉图形帧并分析和调试.涵盖Vulkan,D3D11,D3D12.OpenGL,OpenGL ES以及windows …

谷歌投资Character.AI,展现AI领域的战略布局和创新能力

谷歌&#xff08;Google&#xff09;作为全球最大的互联网公司之一&#xff0c;一直在人工智能&#xff08;AI&#xff09;领域发挥着引领和推动的作用。近日&#xff0c;据消息人士透露&#xff0c;谷歌正与人工智能初创公司 Character.AI 进行投资谈判&#xff0c;计划投资数…

CI/CD - jenkins

目录 一、部署 1、简介 2、部署 二、配置 三、实时触发 四、自动化构建docker镜像 五、通过ssh插件交付任务 六、添加jenkins节点 七、RBAC 八、pipeline 九、jenkins结合ansible参数化构建 1、安装ansible 2、新建gitlab项目 3、jenkins新建项目playbook 一、部…

C# 结构体介绍、ref struct

文章目录 定义结构体实例化结构体结构体的值类型特性结构体和类的区别限制ref structref return C# 中的结构体&#xff08;Struct&#xff09;是一种值类型数据结构&#xff0c;用于封装不同或相同类型的数据成一个单一的实体。结构体非常适合用来表示轻量级的对象&#xff0c…