通过数组可以做到很多的事情,你甚至可以使用数组来做一款简易的游戏,下面教大家使用二维数组实现一款简易的迷宫游戏。
项目代码放在了码云(gitee)上,有兴趣的可以下载看看。
https://gitee.com/YHF_200623/C_mazeGame

迷宫游戏

先简单介绍一下游戏,游戏玩法和传统的走迷宫一样,控制角色走到出口游戏结束。
玩家操作的角色用 @ 表示,墙壁用 # 表示,道路用空格表示。

定义并初始化数据

需要的定义的数据有:

  • 迷宫数组
  • 角色当前坐标
  • 终点坐标

角色当前坐标和终点坐标没啥好说的直接定义就可以了

    int x = 3,y = 1;   // 角色当前坐标(根据迷宫地图初始化)int final_x = 3, final_y =9;    // 终点坐标(根据迷宫地图初始化)

主要是迷宫数组的定义,因为已经确定了玩家操作的角色用 @ 表示,墙壁用 # 表示,道路用空格表示。
可以有两种表现方式:
    第一种是直接在迷宫数组中写字符的ASCII码,使用 %c 的格式符输出对应字符。
    第二种是在迷宫数组中用0、1、2指代各种符号,在打印时判断输出对应的字符。
这里为了便于在代码中观察地图,我使用第二种方法。

      //迷宫数组 墙壁=0 路=1 角色=2 int arr[10][10] = { {0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0,1,0},{0,1,0,0,0,0,0,0,1,0},{0,2,0,0,0,0,0,0,1,1},{0,1,0,0,0,0,0,0,1,0},{0,1,1,1,1,1,1,0,1,0},{0,1,1,0,0,0,1,0,1,0},{0,1,1,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}};

下面写一下显示地图语句。

显示地图

显示地图其实就是遍历迷宫数组,在打印时判断输出对应的字符,用两层for循环加switch语句即可

     //显示迷宫for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch(arr[i][j]){case 0: printf("# ");break;case 1: printf("  ");break;case 2: printf("@ ");break;}}printf("\n");}

将上述代码组合在一起,我们就有了如下代码,并可以通过运行,显示出迷宫地图。

#include<stdio.h>int main(int argc,const char* argv[])
{//迷宫数组 墙壁=0 路=1 角色=2 int arr[10][10] = {{0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0,1,0},{0,1,0,0,0,0,0,0,1,0},{0,2,0,0,0,0,0,0,1,1},{0,1,0,0,0,0,0,0,1,0},{0,1,1,1,1,1,1,0,1,0},{0,1,1,0,0,0,1,0,1,0},{0,1,1,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}};  int x = 3,y = 1;    // 角色当前坐标(根据迷宫地图初始化)int final_x = 3, final_y =9;    // 终点坐标(根据迷宫地图初始化)//显示迷宫for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch(arr[i][j]){case 0: printf("# ");break;case 1: printf("  ");break;case 2: printf("@ ");break;}}printf("\n");}
}

运行结果:

清屏

每次显示地图时,上一次的地图会残留在终端上,看着很难受。linux系统可以使用函数system调用系统命令clear,实现清屏效果,需要调用头文件stdlib.h。windows系统可以使用windows.h头文件也可以使用stdlib.h,但里面的清屏命令需要改成cls。

system("clear");

获取键盘输入

可以使用getchar等函数获取键盘的输入,但是为了界面美观。使用了一个getch.h的头文件,用来获取键盘输入,并隐藏窗口的输入信息。

百度网盘链接(getch.h)
提取码:1111

如果是windows系统,可以使用自带的 conio.h 中的,getch()方法,但是因为方向键会返回两个值,所以需要调用两次。

#include<stdio.h>
#include<conio.h>int main(int argc,const char* argv[])
{ while(1){printf("%d\n",getch()+getch());   }
}

使用 linux 系统的朋友,只需要把getch.h头文件与程序代码放在同一个目录下即可,可以通过#include"getch.h"方式调用,也可将getch.h的内容复制到程序中。

#include<stdio.h>
#include"getch.h"int main(int argc,const char* argv[])
{ while(1){printf("%d\n",getch());    }
}

windows系统中返回值与linux系统中的略有不同。建议使用前自己测试一下方向键的返回值。

方向键 window linux
向上 296 183
向下 304 184
向左 299 186
向右 301 185

顺便提一下#include""与#include<>的区别:

  • #include<> 是从系统指定的路径下加载头文件(操作系统是通过设置环境变量来指定加载头文件的路径)
  • #include “” 先从当前路径(文件路径)下加载头文件,如果找不到,再去系统指定的路径下加载

使用虚拟机的朋友可以放在共享文件夹中(程序+头文件)

玩法实现

地图有了,输入也有了,如何把通过输入控制角色(@)移动呢?角色移动其实就是通过对二维数组中的内容进行操作。

打个比方,当我按向上键时,getch函数返回给我一个值,我通过对这个返回值进行判断,执行角色向上走的操作。这个时候需要思考如何什么情况下角色可以往上走?当遇到上方是墙的时候,角色是不能移动的,只有当上方是路的时候,角色才能向上移动,这时把上方的值设为角色,把下方的值设为路,并且更新角色坐标,就实现了角色的移动,其他的操作也是如此。
代码如下

//玩法实现
switch(getch()){   case 183:if(arr[x-1][y] == 1) {arr[x-1][y] = 2; arr[x][y] = 1; x--;}break;case 184:if(arr[x+1][y] == 1) {arr[x+1][y] =2;arr[x][y] = 1;x++;}break;case 185:if(arr[x][y+1] == 1){arr[x][y+1] = 2;arr[x][y] = 1;y++;}break;case 186:if(arr[x][y-1] == 1){arr[x][y-1] = 2;arr[x][y] = 1;y--;}break;}

确定获胜条件

什么时候游戏算结束了呢,当角色到达出口时,游戏就结束了,在程序中就是角色坐标等于终点坐标。因此可以写出游戏结束的条件:

 //结束判断if(x == final_x && y == final_y){printf("游戏结束\n");return 0;}

组合代码

我们现在已经实现的功能有:

  1. 显示地图
  2. 清屏
  3. 获取键盘输入
  4. 玩法实现
  5. 确定获胜条件

一个游戏大部分的代码都在这里了,我们需要对它们进行组装使用即可。先捋一捋游戏流程:

  1. 清屏
  2. 显示地图
  3. 判断获胜条件
  4. 获取键盘输入
  5. 控制角色移动
  6. 回到第一步

根据游戏流程,可以看出需要使用死循环。在每次循环清屏并显示地图。然后判断获胜条件,如果获胜就退出,否则游戏继续。通过获取键盘输入的返回值,执行对应的角色移动操作。然后进入下一次循环。

组合代码(linux)如下:

#include<stdio.h>
#include<stdlib.h>
#include"getch.h"int main(int argc,const char* argv[])
{//迷宫数组 墙壁=0 路=1 角色=2 int arr[10][10] = {{0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0,1,0},{0,1,0,0,0,0,0,0,1,0},{0,2,0,0,0,0,0,0,1,1},{0,1,0,0,0,0,0,0,1,0},{0,1,1,1,1,1,1,0,1,0},{0,1,1,0,0,0,1,0,1,0},{0,1,1,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}};  int x = 3,y = 1;    // 角色当前坐标(根据迷宫地图初始化)int final_x = 3, final_y =9;    // 终点坐标(根据迷宫地图初始化)//游戏开始while(1){//清屏system("clear");//显示迷宫for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch(arr[i][j]){case 0: printf("# ");break;case 1: printf("  ");break;case 2: printf("@ ");break;}}printf("\n");}//结束判断if(x == final_x && y == final_y){printf("游戏结束\n");return 0;}//玩法实现switch(getch()){case 183:if(arr[x-1][y] == 1){arr[x-1][y] = 2;arr[x][y] = 1;x--;}break;case 184:if(arr[x+1][y] == 1){arr[x+1][y] = 2;arr[x][y] = 1;x++;}break;case 185:if(arr[x][y+1] == 1){arr[x][y+1] = 2;arr[x][y] = 1;y++;}break;case 186:if(arr[x][y-1] == 1){arr[x][y-1] = 2;arr[x][y] = 1;y--;}break;}}
}

windows 需要调用conio.h头文件,并且调用两次getch()函数。同时,不同系统的键值不同,需要修改键值。最后,系统命令清屏,里面的清屏命令改成cls。

组合代码(window)如下:

#include<stdio.h>
#include<conio.h>
#include<windows.h>int main(int argc,const char* argv[])
{//迷宫数组 墙壁=0 路=1 角色=2 int arr[10][10] = {{0,0,0,0,0,0,0,0,0,0},{0,1,0,0,0,0,0,0,1,0},{0,1,0,0,0,0,0,0,1,0},{0,2,0,0,0,0,0,0,1,1},{0,1,0,0,0,0,0,0,1,0},{0,1,1,1,1,1,1,0,1,0},{0,1,1,0,0,0,1,0,1,0},{0,1,1,0,0,0,1,1,1,0},{0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0}};  int x = 3,y = 1;    // 角色当前坐标(根据迷宫地图初始化)int final_x = 3, final_y =9;    // 终点坐标(根据迷宫地图初始化)//游戏开始while(1){//清屏system("cls");//显示迷宫for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch(arr[i][j]){case 0: printf("# ");break;case 1: printf("  ");break;case 2: printf("@ ");break;}}printf("\n");}//结束判断if(x == final_x && y == final_y){printf("游戏结束\n");return 0;}//玩法实现switch(getch()+getch()){case 296:if(arr[x-1][y] == 1){arr[x-1][y] = 2;arr[x][y] = 1;x--;}break;case 304:if(arr[x+1][y] == 1){arr[x+1][y] = 2;arr[x][y] = 1;x++;}break;case 301:if(arr[x][y+1] == 1){arr[x][y+1] = 2;arr[x][y] = 1;y++;}break;case 299:if(arr[x][y-1] == 1){arr[x][y-1] = 2;arr[x][y] = 1;y--;}break;}}
}

如果需要显示时间,只需要在记录下游戏开始的时间以及游戏结束的时间,两者相减即可,这里就不作演示了。

结语

希望这篇文章对你有所帮助

小白的编程经验(二维数组迷宫游戏)相关推荐

  1. 实体类 接口_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)

    原文:Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口, 视频讲解) 这里分享三道编程题, 下面是我个人的视频讲解 二维数组, 五子棋游戏, 实体类和接口_哔哩哔哩 (゜-゜)つロ ...

  2. java二维数组模拟用户登录_Java 语言基础编程题 (二维数组, 五子棋游戏, 实体类和接口)...

    这里分享三道编程题, 下面是我个人的视频讲解我的解题思路以及代码运行演示https://www.zhihu.com/video/1253424180936724480 1. 编程实现以下需求: 定义一 ...

  3. (c语言)编程输出二维数组中元素的最大值,要求用指针实现。

    (c语言)编程输出二维数组中元素的最大值,要求用指针实现. #include<stdio.h> #include<stdlib.h> #define N 6 //行数 #def ...

  4. 编程将一个二维数组元素变换为逆向存放,即按元素在内存中的物理排列位置,第一个元素变成倒数第一个元素,第二个元素变成倒数第二个元素,依此类推。

    编程将一个二维数组元素变换为逆向存放,即按元素在内存中的物理排列位置,第一个元素变成倒数第一个元素,第二个元素变成倒数第二个元素,依此类推.     例如,原始二维数组为,逆向存放后变为.试建立一个类 ...

  5. C语言用数组编程矩阵,二维数组—矩阵求和(C语言)

    昨天上机了,之前上机都觉得题目挺简单的,但昨天的题明显比以前难了好吗!字符串二维数组感觉也没教什么呀..所以我也做了蛮久,现依次把这几道题放在这里留作纪念. 题目1:请写一个程序,对于一个m行m列(2 ...

  6. C语言高级编程:二维数组、指针的指针、数组指针、指针数组

    1. 定义 int **p;  指针的指针 int (*p2)[5];  数组指针,指向一个数组 int *array[5];  指针数组,是一个int *类型数组 int array2[3][5]; ...

  7. php 二维数组 根据值 找,PHP编程根据二维数组某个字段的值查找值所在的一维数组...

    /** *根据二维数组某个字段的值查找数组 * @param $index 数组中的key * @param $value 查找的值 */ function seacharr_by_value($ar ...

  8. c语言编程实现二维数组的蛇形矩阵,蛇形矩阵 - 作业部落 Cmd Markdown 编辑阅读器...

    蛇形矩阵 C-study-code Erin最近学习了数组,她想通过数组实现一个蛇形方阵的打印,你可以帮她实现这个程序吗? input:整数n(2 output:n*n的方阵,从方阵右上角开始以顺时针 ...

  9. 【C语言】 游戏合集 《弹球》《生命游戏》《无足鸟》创作过程及思路 通过二维数组呈现游戏画面

    目录 一.弹球的2.0和3.0 弹球2.0 弹球3.0 二.无足鸟 三.生命游戏 弹球之前那个版本没有可玩性,随后又更新了两个版本,可玩性都有所提升,然后无足鸟.弹球2.0和飞机2.0的程序逻辑大体类 ...

最新文章

  1. BCH独立日最好的礼物——Token发行已实现
  2. 阿里巴巴开源项目 Druid 负责人温少访谈
  3. Winform中对xml文件进行保存时空白节点自动换行问题的解决
  4. Java Optionals获得更具表现力的代码
  5. Docker Compose 项目
  6. 我们公司也实行了OKR
  7. 玩转Google开源C++单元测试框架Google Test系列
  8. UML:图的分类及作用(共5类图,有9种图形)
  9. ajax异步验证效果展示,AJAX(二)-实现验证码异步验证功能(示例代码)
  10. python 不定参数_人生苦短,我学不会Python。——函数中不定长参数的写法
  11. 简单粗暴地理解 JS 原型链
  12. 消费品行业经销商渠道数据同步及管理
  13. ESP32/ESP8266
  14. LambdaStream
  15. 拉索检测机器人_斜拉桥拉索检测机器人控制系统设计
  16. 运维常用Mysql基本命令
  17. JSON与对象、list数组的相互转化
  18. 微信android系统升级,安卓微信7.0.22正式版更新:新增微信豆等八大更新!
  19. 测试如何做到不背锅?
  20. Dynamsoft 条码阅读器,实现条码扫描

热门文章

  1. Gentoo Linux KDE 下使用IBUS的问题
  2. web页面设计中使用阿里字体(包含图标)
  3. 数字2DPSK频带传输系统的设计(文内附完整代码)
  4. 【C语言】动态申请空间
  5. 剪不断理还乱--C#重载/重写/覆盖
  6. JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解
  7. unity_在canvas中修改text和text到底是什么
  8. 新接口——“淘特”关键词搜索的API接口
  9. 处理new Date()在safari浏览器上的某些日期格式导致的Invalid Date
  10. 大三、大四期间去实习,要不要签三方协议?