手把手教你用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.hqwc.cn/news/190971.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【0基础学Java第十课】-- 认识String类

10. 认识String类 10.1 String类的重要性10.2 常用方法10.2.1 字符串构造10.2.2 String对象的比较10.2.3 字符串查找10.2.4 转化10.2.5 字符串替换10.2.6 字符串拆分10.2.7 字符串截取10.2.8 字符串的不可变性10.2.9 字符串修改 10.3 StringBuilder和StringBuffer10.3.1 String…

制作翻页电子相册,这个工具你必须了解!

电子相册作为一种很有纪念意义的载体&#xff0c;无论是生日、旅行、结婚、毕业纪念等等&#xff0c;可以应用在很多场合当中&#xff0c;如何制作呢&#xff1f; 而对于不会制作电子相册的人来说&#xff0c;使用套用模板是最直接快速的方式了。所以&#xff0c;推荐大家使用…

关于SPJ表的数据库作业

打字不易&#xff0c;且复制且珍惜 建表 use 库名;create table S( --供应商 SNO char(6) not null, SNAME char(10) not null, STATUS INT, CITY char(10), primary key(SNO));create table P( --零件 PNO char(6) not null, PNAME char(12)not null, COLOR char(4), WEIGHT…

小命令,大世界

Linux是一个大系统&#xff0c;功能丰富&#xff0c;好比是一台巨型机器&#xff0c;而命令&#xff0c;就是这台机器的操作台。要想控制好这台机器&#xff0c;用好这台机器&#xff0c;就得会看仪表&#xff0c;会操作各种按钮。《Linux常用命令自学手册》就是介绍如何操作这…

1334. 阈值距离内邻居最少的城市/Floyd 【leetcode】

1334. 阈值距离内邻居最少的城市 有 n 个城市&#xff0c;按从 0 到 n-1 编号。给你一个边数组 edges&#xff0c;其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边&#xff0c;距离阈值是一个整数 distanceThreshold。 返回能通过某些路径…

无重复最长字符串(最长无重复子字符串),剑指offer,力扣

目录 原题&#xff1a; 力扣地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 难度算中下吧&#xff0c;这个总体不算很难&#xff0c;而且滑动窗口&#xff0c;以及哈希都比较常见 审题目事例提示&#xff1a; 解题思路&#xff08;…

纯CSS自定义滚动条样式

.my-carousel{height: 474px;overflow-y: auto; } /*正常情况下滑块的样式*/ .my-carousel::-webkit-scrollbar {width: 5px; } .my-carousel::-webkit-scrollbar-thumb {border-radius: 8px;background-color: #ccc; } .my-carousel::-webkit-scrollbar-track {border-radius:…

Linux上编译和安装SOFA23.06

前言 你可以直接使用编译安装好的SOFA版本Installing from all-included binaries (v23.06.00)&#xff1a; 如果你想自己编译&#xff0c;可以看我下面写的内容&#xff0c;不过绝大多数是从官网来的&#xff0c;如果和官网有出入&#xff0c;建议还是以官网为准。 在Linux下…

多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 …

springBoot 配置druid多数据源 MySQL+SQLSERVER

1:pom 文件引入数据 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.0</version> </dependency>…

深入理解Linux网络笔记(六):深度理解TCP连接建立过程

本文为《深入理解Linux网络》学习笔记&#xff0c;使用的Linux源码版本是3.10&#xff0c;网卡驱动默认采用的都是Intel的igb网卡驱动 Linux源码在线阅读&#xff1a;https://elixir.bootlin.com/linux/v3.10/source 5、深度理解TCP连接建立过程 1&#xff09;、深入理解liste…

【算法基础】筛质数

文章目录 问题描述解决方法朴素筛法线性筛法 问题描述 给定一个正整数 n n n&#xff0c;请你求出 1 ∼ n 1∼n 1∼n 中质数的个数。 输入格式 共一行&#xff0c;包含整数 n。 输出格式 共一行&#xff0c;包含一个整数&#xff0c;表示 1∼n 中质数的个数。 数据范围 …