走迷宫(c语言)

前言:

制作一个迷宫游戏是一个有趣的编程挑战。首先,我们需要设计一个二维数组来表示迷宫的布局,其中每个元素代表迷宫中的一个格子。我们可以使用不同的值来表示空格、墙壁和起点/终点。接下来,我们需生成迷宫。在生成迷宫的过程中,我们需要确保迷宫中有足够的障碍物,以便玩家需要找到一条从起点到终点的路径。最后,我们需要编写代码来显示迷宫,接收用户的输入,更新迷宫的状态,判断游戏是否结束,并提供重新开始的选项。通过完成这个迷宫游戏项目,我们可以提高自己的编程能力和逻辑思维能力。

1. 打印菜单

void menu()
{printf("|---------------------------------------|\n");printf("|                                       |\n");printf("|                走迷宫                 |\n");printf("|                1.play                 |\n");printf("|                2.exit                 |\n");printf("|                                       |\n");printf("|---------------------------------------|\n");
}int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("选择有误,请重新选择!\a\n");}} while (input);
}

2. 分析迷宫的组成要素

迷宫的组成要素无非就是:墙、路、入口、出口,根据这些要素我们可以设置一个数组然后随机给其赋值为0,1,2,3,当数组等于0时打印路(这里用空格代替),等于1时打印墙(这里用█代替),等于2打印入口(这里用S代替),等于3时打印出口(这里用E代替)。

3. 实现迷宫的组成要素

因为这些要素的生成都与随机数有关,所以这里就要使用到time函数、srand函数和rand函数来进行随机数的生成。

#include<time.h>
srand((time(NULL))
int x = rand();

3.1 生成路

给数组初始化为0生成路,后面再用随机数生成。

  for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++){maze[i][j] = 0;}}

3.2 生成围墙

还需要设置围墙将我们的迷宫围起来,防止数组的越界访问。

for (int i = 0; i < SIZE; i++)
{maze[0][i] = 1;maze[i][0] = 1;maze[SIZE - 1][i] = 1;maze[i][SIZE - 1] = 1;
}

3.3 生成入口和出口

因为入口和出口都是只有一个,所以这里我们需要单独使用随机数生成入口和出口。

 int start_x = rand() % SIZE;int start_y = rand() % SIZE;maze[start_y][start_x] = 2;int end_x = rand() % SIZE;int end_y = rand() % SIZE;maze[end_y][end_x] = 3;

3.4 防止入口或出口出现在围墙上

这里使用了goto语句

again://围墙for (int i = 0; i < SIZE; i++){maze[0][i] = 1;maze[i][0] = 1;maze[SIZE - 1][i] = 1;maze[i][SIZE - 1] = 1;}//设置入口与出口int start_x = rand() % SIZE;int start_y = rand() % SIZE;maze[start_y][start_x] = 2;int end_x = rand() % SIZE;int end_y = rand() % SIZE;maze[end_y][end_x] = 3;//防止入口或出口出现在围墙上if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1|| end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1){goto again;}

3.5 生成墙

for (int i = 0; i < SIZE; i++)
{for (int j = 0; j < SIZE; j++){if (maze[i][j] != 2 && maze[i][j] != 3){if (rand() % 4 == 0){maze[i][j] = 1;}}}
}

4. 操作移动

在这里用到了getch()函数,这个函数需要用#include <conio.h>来进行调用。

#include <conio.h>
int main()
{while (1){int x = getch(); if (x == 'w')printf("上\n");if (x == 'a')printf("左\n");if (x == 's')printf("下\n");if (x == 'd')printf("右\n");}return 0;
}

do
{system("cls");print_maze(maze);int x = getch();if (x == 'w')//上{if (maze[start_y - 1][start_x] != 1){maze[start_y][start_x] = 0;start_y--;maze[start_y][start_x] = 2;}}if (x == 'a')//左{if (maze[start_y][start_x - 1] != 1){maze[start_y][start_x] = 0;start_x--;maze[start_y][start_x] = 2;}}if (x == 's')//下{if (maze[start_y + 1][start_x] != 1){maze[start_y][start_x] = 0;start_y++;maze[start_y][start_x] = 2;}}if (x == 'd')//右{if (maze[start_y][start_x + 1] != 1){maze[start_y][start_x] = 0;start_x++;maze[start_y][start_x] = 2;}}if (maze[end_y][end_x] == 2){printf("恭喜你成功通关!\n");break;}
} while (1);

 其中system("cls")函数的作用是清屏,它需要使用#icnldue<stdlib.h>进行调用。

完整代码 :

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>
#define SIZE 45
//打印迷宫
void print_maze(int maze[SIZE][SIZE])
{for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++){if (maze[i][j] == 1){printf("█");}else if (maze[i][j] == 2){printf("S");//入口}else if (maze[i][j] == 3){printf("E");//出口}else{printf(" ");}}printf("\n");}printf("\n");
}void generate_maze(int maze[SIZE][SIZE])
{
again:for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++){maze[i][j] = 0;}}//围墙for (int i = 0; i < SIZE; i++){maze[0][i] = 1;maze[i][0] = 1;maze[SIZE - 1][i] = 1;maze[i][SIZE - 1] = 1;}//设置入口与出口int start_x = rand() % SIZE;int start_y = rand() % SIZE;maze[start_y][start_x] = 2;int end_x = rand() % SIZE;int end_y = rand() % SIZE;maze[end_y][end_x] = 3;//防止入口或出口出现在围墙上if (start_x == 0 || start_x == SIZE - 1 || start_y == 0 || start_y == SIZE - 1|| end_x == 0 || end_x == SIZE - 1 || end_y == 0 || end_y == SIZE - 1){goto again;}//设置迷宫for (int i = 0; i < SIZE; i++){for (int j = 0; j < SIZE; j++){if (maze[i][j] != 2 && maze[i][j] != 3){if (rand() % 4 == 0){maze[i][j] = 1;}}}}//操作S移动do{system("cls");print_maze(maze);int x = getch();if (x == 'w')//上{if (maze[start_y - 1][start_x] != 1){maze[start_y][start_x] = 0;start_y--;maze[start_y][start_x] = 2;}}if (x == 'a')//左{if (maze[start_y][start_x - 1] != 1){maze[start_y][start_x] = 0;start_x--;maze[start_y][start_x] = 2;}}if (x == 's')//下{if (maze[start_y + 1][start_x] != 1){maze[start_y][start_x] = 0;start_y++;maze[start_y][start_x] = 2;}}if (x == 'd')//右{if (maze[start_y][start_x + 1] != 1){maze[start_y][start_x] = 0;start_x++;maze[start_y][start_x] = 2;}}if (maze[end_y][end_x] == 2){printf("恭喜你成功通关!\n");break;}} while (1);
}
void menu()
{printf("|---------------------------------------|\n");printf("|                                       |\n");printf("|                走迷宫                 |\n");printf("|                1.play                 |\n");printf("|                2.exit                 |\n");printf("|                                       |\n");printf("|---------------------------------------|\n");
}void game()
{srand(time(NULL));int maze[SIZE][SIZE];//打印迷宫generate_maze(maze);
}int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏!\n");break;default:printf("选择有误,请重新选择!\a\n");}} while (input);
}

效果图: 

以上就是使用c语言写迷宫的全部内容啦,如果上述内容对你有帮助的话不要忘记点上一个小小的赞和关注呦,期待我们下次再见。

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

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

相关文章

Qt 国产嵌入式操作系统实现文字转语音功能(TTS)

1.简介 本示例使用的CPU&#xff1a;rk3588。 操作系统&#xff1a;kylin V10 架构&#xff1a;aarch64 在Windows端&#xff0c;我们很容易想到使用Qt自带的类QTextToSpeech来实现文字转语音功能&#xff0c;Qt版本得在5.11.0以上才支持。但是在嵌入式平台&#xff0c;尤其…

数据仓库(2)-认识数仓

1、数据仓库是什么 数据仓库 &#xff0c;由数据仓库之父比尔恩门&#xff08;Bill Inmon&#xff09;于1990年提出&#xff0c;主要功能仍是将组织透过资讯系统之联机事务处理(OLTP)经年累月所累积的大量资料&#xff0c;透过数据仓库理论所特有的资料储存架构&#xff0c;做…

springboot第49集:【思维导图】多线程,常用类与基础API,集合框架,泛型,数据结构源码...

多线程创建方式一&#xff1a;继承Thread类多线程创建方式二&#xff1a;实现Runnable接口jdk5.0新增两种创建多线程的方式 image.png image.png image.png image.png image.png new Thread(new Runnable() {public void run() {for (int i 1; i < 100; i) {if (i % 2 0) …

Linux 入门命令大全汇总 + Linux 集锦大全 【20240115】

文章目录 Linux 入门命令大全汇总Linux 集锦大全更多信息 Linux 入门命令大全汇总 别有一番风趣的alias 刚刚好合适的 apropos 命令 迷你计算器 bc 可看黄道吉日的 cal 全文可查看&#xff1a; Linux入门命令大全全文 Linux 集锦大全 linux终端中最漂亮的几款字体介绍及…

RK3568笔记八: Display子系统

modetest 是由 libdrm 提供的测试程序&#xff0c;可以查询显示设备的特性&#xff0c;进行基本的显示测试&#xff0c;以及设置显示的模式。 我们可以借助该工具来学习 Linux DRM 应用编程&#xff0c;另外为了深入分析 Rockchip DRM driver&#xff0c;有必要先了解一下这个…

【JaveWeb教程】(26) Mybatis基础操作(新增、修改、查询、删除) 详细代码示例讲解(最全面)

目录 1. Mybatis基础操作1.1 需求1.2 准备1.3 删除1.3.1 功能实现1.3.2 日志输入1.3.3 预编译SQL1.3.3.1 介绍1.3.3.2 SQL注入1.3.3.3 参数占位符 1.4 新增1.4.1 基本新增1.4.2 主键返回 1.5 更新1.6 查询1.6.1 根据ID查询1.6.2 数据封装1.6.3 条件查询1.6.4 参数名说明 1. Myb…

HCIA——11计算机网络分层结构——OSI/ISO、TCP/IP

学习目标&#xff1a; 参考模型 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本…

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法

SpringBoot教程(十七) | SpringBoot中ApplicationEvent用法 对不起大家&#xff0c;昨天文章里的告别说早了&#xff0c;这个系列还不能就这么结束。 我们前面的文章中讲解过RabbitMQ的用法&#xff0c;所谓MQ就是一种发布订阅模式的消息模型。在Spring中其实本身也为我们提供…

【上分日记】第380场周赛(数位dp+ KMP + 位运算 + 二分 + 双指针 )

文章目录 前言正文1.3005. 最大频率元素计数2.3007.价值和小于等于 K 的最大数字3.3008. 找出数组中的美丽下标 II 总结尾序 前言 本场周赛&#xff0c;博主也只写出两道题(前两道, hhh菜鸡勿喷)&#xff0c;第三道涉及位运算 &#xff0c;数位dp&#xff0c;第四道涉及KMP。 下…

江科大STM32 下

目录 ADC数模转换器DMA直接存储器存取USART串口9-2 串口发送接受9-3 串口收发HEX数据包 I2C(mpu6050陀螺仪和加速度计)SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件读写W25Q64 BKP、RTC11.0 Unix时间戳11.1 读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR1…

[Linux 进程(四)] 再谈环境变量,程序地址空间初识

文章目录 1、前言2、环境变量2.1 main函数第三个参数 -- 环境参数表2.2 本地环境变量和env中的环境变量2.3 配置文件与环境变量的全局性2.4 内建命令与常规命令2.5 环境变量相关的命令 3、程序地址空间 1、前言 上一篇我们讲了环境变量&#xff0c;如果有不明白的先读一下上一…

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…