【c语言】迷宫游戏

之前想写的迷宫游戏今天终于大功告成,解决了随机生成迷宫地图的问题,使用的是深度优先算法递归版本,之前的迷宫找通路问题用的是深度优先算法的非递归实现.之前写过推箱子,推箱子用到了人物的移动,以及碰到墙就不会走,我们可以稍微变一下就变成了迷宫游戏

1.游戏演示

迷宫演示

2.游戏整体思路

1.迷宫的生成(难点)
2.人物的移动
3.走到出口的判定
4.使用图形库添加人物图片,墙,路的图片

3.预备准备

将每个状态用数字表示,则创建一个枚举类型,以及定义地图的高和宽

#define Height 9
#define Width 9
enum  Mine
{Road,Wall, Start,End, Player };

由枚举类型可知,Road(路)为0,Wall(墙)为1,Start(起点)为2,End(终点)为3,Player(玩家)为4,初始化地图大小为9*9;

int map[Height+2][Width+2];
int flag = 0;

定义一个二维数组大小为11*11;

4.迷宫的初始化

迷宫的创建

void create_map(int x, int y)
{int c[4][2] = { 0,1,1,0,0,-1,-1,0 };int i, j, t;for (i = 0; i < 4; i++){j = rand() % 4;t = c[i][0]; c[i][0] = c[j][0]; c[j][0] = t;t = c[i][1]; c[i][1] = c[j][1]; c[j][1] = t;}map[x][y] = Road;for (int i = 0; i < 4; i++){if (map[x + 2 * c[i][0]][y + 2 * c[i][1]] == Wall){map[x + c[i][0]][y + c[i][1]] = Road;create_map(x + 2 * c[i][0], y + 2 * c[i][1]);}}}
void init()
{for (int i = 0; i <= Height + 1; i++){for (int j = 0; j <= Width + 1; j++){if (i == 0 || i == Height + 1 || j == 0 || j == Width + 1)map[i][j] = Road;elsemap[i][j] = Wall;}}create_map(2 * (rand() % (Height / 2) + 1), 2 * (rand() % (Width / 2) + 1));for (int i = 0; i <= Height + 1; i++){map[i][0] = Wall;map[i][Width + 1] = Wall;}for (int j = 0; j <= Height + 1; j++){map[0][j] = Wall;map[Height + 1][j] = Wall;}map[2][1] = Start+Player;map[Height - 1][Width] = End;
}

5.键盘控制人物移动

这里推箱子那节有讲,稍微改变一下即可

void keyevent()
{int i = 0; int j = 0;for (i = 1; i <= Height; i++){for (j = 1; j <= Width; j++){if (map[i][j] == Player|| map[i][j] == Player +Start|| map[i][j] == Player +End)//,遍历二维数组,如果二维数组某个元素为4,6,7的话直接跳出两个循环,{goto end;}}}
end:;//获取当前人物坐标char ch = _getch();//printf("%d    %c", ch, ch);//w 119 a 97 s 115  d 100switch (ch){case 119:case 'w ':case 'W':if (map[i - 1][j] == Road|| map[i - 1][j]== End|| map[i - 1][j] ==Start)//当人物当前位置上面是路或者出口或者入口都可以走{map[i - 1][j] += Player;//移动后的位置+4,表示玩家出现在此坐标map[i][j] -= Player;//起始位置-4,表示玩家消失在此坐标}break;case 97:case 'a ':case'A':if (map[i][j - 1]== Road || map[i][j - 1] == End || map[i][j - 1] ==Start){map[i][j - 1] += Player;map[i][j] -= Player;}break;case 115:case 's ':case'S':if (map[i + 1][j] == Road || map[i + 1][j] == End|| map[i + 1][j] == Start){map[i + 1][j] += Player;map[i][j] -= Player;}break;case 100:case 'd ':case'D':if (map[i][j + 1] == Road || map[i][j + 1] == End|| map[i][j + 1]==Start){map[i][j + 1] += Player;map[i][j] -= Player;}break;}for (i = 1; i <= Height; i++){for (j = 1; j <= Width; j++){if (map[i][j] == Player || map[i][j] == Player + Start || map[i][j] == Player + End){goto end1;}}}
end1:;//移动后找到玩家当前位置}

6.打印地图函数

void gamedraw()
{for (int i = 1; i <=Height; i++)//遍历二维数组{for (int j = 1; j <=Width; j++){switch (map[i][j]){case Road:printf("  ");  //路        //一个中文字符相当于二个英文字符break;case Wall:printf("■");//墙break;case Start:printf("入");//入口break;case End:printf("出");//出口break;case Player:printf("♂");//玩家break;case Player+ Start:printf("♂");//玩家在起点break;case Player +End://玩家在终点printf("♂");break;}}printf("\n");}}

7.判断到出口函数

void iswin()
{if (map[Height - 1][Width]==Player+End){flag = 1;}}

如果终点的坐标map[Height - 1][Width]7,说明玩家到终点,将flag置为1;
然后 在主函数中加个判断语句,如果flag
1,退出 程序

8.主函数

int main()
{  srand((unsigned)time(NULL));init();//初始化地图//initgraph(Height * 40, Width * 40);//bgm();//loadimg();while (1){gamedraw();//画地图函数keyevent();//获取方向函数iswin();//判断是否到终点if (flag == 1){exit(-1);//到了退出程序}system("cls");//清屏函数,如果不知道为什么加这一步的话,你可以先不加试试}getchar();return 0;}

9.不加图形库的话的头文件

#include<stdio.h>
#include<time.h>//time的头文件
#include <stdlib.h>//srand的头文件
#include <conio.h>//-getch()头文件
#include <windows.h>//清屏函数头文件

10.不加图形库游戏源码

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>#define Height 9
#define Width 9enum  Mine
{Road,Wall, Start,End, Player };
int map[Height+2][Width+2];
int flag = 0;void iswin()
{if (map[Height - 1][Width]==Player+End){flag = 1;}}void gamedraw()
{for (int i = 1; i <=Height; i++){for (int j = 1; j <=Width; j++){switch (map[i][j]){case Road:printf("  ");          //一个中文字符相当于二个英文字符break;case Wall:printf("■");break;case Start:printf("入");break;case End:printf("出");break;case Player:printf("♂");break;case Player+ Start:printf("♂");break;case Player +End:printf("♂");break;}}printf("\n");}}
void keyevent()
{int i = 0; int j = 0;for (i = 1; i <= Height; i++){for (j = 1; j <= Width; j++){if (map[i][j] == Player|| map[i][j] == Player +Start|| map[i][j] == Player +End){goto end;}}}
end:;char ch = _getch();//printf("%d    %c", ch, ch);//w 119 a 97 s 115  d 100switch (ch){case 119:case 'w ':case 'W':if (map[i - 1][j] == Road|| map[i - 1][j]== End|| map[i - 1][j] ==Start){map[i - 1][j] += Player;map[i][j] -= Player;}break;case 97:case 'a ':case'A':if (map[i][j - 1]== Road || map[i][j - 1] == End || map[i][j - 1] ==Start){map[i][j - 1] += Player;map[i][j] -= Player;}break;case 115:case 's ':case'S':if (map[i + 1][j] == Road || map[i + 1][j] == End|| map[i + 1][j] == Start){map[i + 1][j] += Player;map[i][j] -= Player;}break;case 100:case 'd ':case'D':if (map[i][j + 1] == Road || map[i][j + 1] == End|| map[i][j + 1]==Start){map[i][j + 1] += Player;map[i][j] -= Player;}break;}for (i = 1; i <= Height; i++){for (j = 1; j <= Width; j++){if (map[i][j] == Player || map[i][j] == Player + Start || map[i][j] == Player + End){goto end1;}}}
end1:;}
void create_map(int x, int y)
{//8,8int c[4][2] = { 0,1,1,0,0,-1,-1,0 };int i, j, t;for (i = 0; i < 4; i++){j = rand() % 4;t = c[i][0]; c[i][0] = c[j][0]; c[j][0] = t;t = c[i][1]; c[i][1] = c[j][1]; c[j][1] = t;}map[x][y] = Road;for (int i = 0; i < 4; i++){if (map[x + 2 * c[i][0]][y + 2 * c[i][1]] == Wall){map[x + c[i][0]][y + c[i][1]] = Road;create_map(x + 2 * c[i][0], y + 2 * c[i][1]);}}}
void init()
{for (int i = 0; i <= Height + 1; i++){for (int j = 0; j <= Width + 1; j++){if (i == 0 || i == Height + 1 || j == 0 || j == Width + 1)map[i][j] = Road;elsemap[i][j] = Wall;}}create_map(2 * (rand() % (Height / 2) + 1), 2 * (rand() % (Width / 2) + 1));for (int i = 0; i <= Height + 1; i++){map[i][0] = Wall;map[i][Width + 1] = Wall;}for (int j = 0; j <= Height + 1; j++){map[0][j] = Wall;map[Height + 1][j] = Wall;}map[2][1] = Start+Player;map[Height - 1][Width] = End;
}
int main()
{  srand((unsigned)time(NULL));init();//initgraph(Height * 40, Width * 40);//bgm();//loadimg();while (1){gamedraw();keyevent();iswin();if (flag == 1){exit(-1);}system("cls");}getchar();return 0;}

11.加图形库版本

12.头文件改变

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <graphics.h>//图形库头文件
#include<mmsystem.h>//包含多媒体设备接口头文件
#pragma comment(lib,"winmm.lib")//加载静态库

13.加载图片

这里将游戏的素材,墙,玩家,路,起点,终点的图片放到.cpp的统一目录下,这里可以去看一下我写的推箱子.

void loadimg()
{for (int i = 0; i < 5; i++){char file[20] = "";sprintf(file, "./image/%d.png", i);loadimage(ima_all + i, file, 40, 40);}}

14.gamedraw函数修改

因为不会在控制台玩游戏,所以要修改这个函数,这里也可以借鉴推箱子那节的

void gamedraw()
{for (int i =1; i <= Height; i++){for (int j = 1; j <=Width; j++){int x = (j-1)* 40;int y = (i-1) * 40;switch (map[i][j]){case Road:putimage(x, y, ima_all);         //一个中文字符相当于二个英文字符break;case Wall:putimage(x, y, ima_all + 1);break;case Player:putimage(x, y, ima_all+4);break;case Player +Start:putimage(x, y, ima_all+4);break;case Start:putimage(x, y, ima_all+2);break;case End:putimage(x, y, ima_all+3);break;case Player+End:putimage(x, y, ima_all+4);break;}}}}

具体说一下为什么这里的int x = (j-1)* 40;int y = (i-1) * 40;x,y表示要贴的图片的左上角贴在游戏的哪个位置,因为二维数组是将1,1的坐标贴在界面的左上角,界面的左上角坐标就是0,0.x表示行,y表示列.

15.主函数的修改

int main()
{  srand((unsigned)time(NULL));init();initgraph(Height * 40, Width * 40);//bgm();loadimg();while (1){gamedraw();keyevent();iswin();if (flag == 1){exit(-1);}system("cls");}getchar();return 0;}

16.加图形库的程序源码

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<time.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <graphics.h>
//#include<mmsystem.h>//包含多媒体设备接口头文件
//#pragma comment(lib,"winmm.lib")//加载静态库
#define Height 9 //如果要修改难度可以修改这里,必须是奇数
#define Width 9  //如果要修改难度可以修改这里,必须是奇数enum  Mine
{Road,Wall, Start,End, Player };
int map[Height+2][Width+2];
int flag = 0;
IMAGE  ima_all[5];
//void bgm()
//{    //打开音乐
//	mciSendString("open ./music.MP3", 0, 0, 0);//后面参数不用管//播放音乐
//	mciSendString("play ./music.MP3", 0, 0, 0);//后面参数不用管
//}
void loadimg()
{for (int i = 0; i < 5; i++){char file[20] = "";sprintf(file, "./image/%d.png", i);loadimage(ima_all + i, file, 40, 40);//修改难度时将图片大小放成10,地图才能放得下}}
void iswin()
{if (map[Height - 1][Width]==Player+End){flag = 1;}}
void gamedraw()
{for (int i =1; i <= Height; i++){for (int j = 1; j <=Width; j++){int x = (j-1)* 40;//修改难度时将图片大小放成10,地图才能放得下*40改为*10int y = (i-1) * 40;//修改难度时将图片大小放成10,地图才能放得下*40改为*10switch (map[i][j]){case Road:putimage(x, y, ima_all);         break;case Wall:putimage(x, y, ima_all + 1);break;case Player:putimage(x, y, ima_all+4);break;case Player +Start:putimage(x, y, ima_all+4);break;case Start:putimage(x, y, ima_all+2);break;case End:putimage(x, y, ima_all+3);break;case Player+End:putimage(x, y, ima_all+4);break;}}}}void keyevent()
{int i = 0; int j = 0;for (i = 1; i <= Height; i++){for (j = 1; j <= Width; j++){if (map[i][j] == Player|| map[i][j] == Player +Start|| map[i][j] == Player +End){goto end;}}}
end:;char ch = _getch();//printf("%d    %c", ch, ch);//w 119 a 97 s 115  d 100switch (ch){case 119:case 'w ':case 'W':if (map[i - 1][j] == Road|| map[i - 1][j]== End|| map[i - 1][j] ==Start){map[i - 1][j] += Player;map[i][j] -= Player;}break;case 97:case 'a ':case'A':if (map[i][j - 1]== Road || map[i][j - 1] == End || map[i][j - 1] ==Start){map[i][j - 1] += Player;map[i][j] -= Player;}break;case 115:case 's ':case'S':if (map[i + 1][j] == Road || map[i + 1][j] == End|| map[i + 1][j] == Start){map[i + 1][j] += Player;map[i][j] -= Player;}break;case 100:case 'd ':case'D':if (map[i][j + 1] == Road || map[i][j + 1] == End|| map[i][j + 1]==Start){map[i][j + 1] += Player;map[i][j] -= Player;}break;}for (i = 1; i <= Height; i++){for (j = 1; j <= Width; j++){if (map[i][j] == Player || map[i][j] == Player + Start || map[i][j] == Player + End){goto end1;}}}
end1:;}
void create_map(int x, int y)
{//8,8int c[4][2] = { 0,1,1,0,0,-1,-1,0 };int i, j, t;for (i = 0; i < 4; i++){j = rand() % 4;t = c[i][0]; c[i][0] = c[j][0]; c[j][0] = t;t = c[i][1]; c[i][1] = c[j][1]; c[j][1] = t;}map[x][y] = Road;for (int i = 0; i < 4; i++){if (map[x + 2 * c[i][0]][y + 2 * c[i][1]] == Wall){map[x + c[i][0]][y + c[i][1]] = Road;create_map(x + 2 * c[i][0], y + 2 * c[i][1]);}}}
void init()
{for (int i = 0; i <= Height + 1; i++){for (int j = 0; j <= Width + 1; j++){if (i == 0 || i == Height + 1 || j == 0 || j == Width + 1)map[i][j] = Road;elsemap[i][j] = Wall;}}create_map(2 * (rand() % (Height / 2) + 1), 2 * (rand() % (Width / 2) + 1));for (int i = 0; i <= Height + 1; i++){map[i][0] = Wall;map[i][Width + 1] = Wall;}for (int j = 0; j <= Height + 1; j++){map[0][j] = Wall;map[Height + 1][j] = Wall;}map[2][1] = Start+Player;map[Height - 1][Width] = End;
}
int main()
{  srand((unsigned)time(NULL));init();initgraph(Height * 40, Width * 40);//bgm();这个音乐也不加了loadimg();while (1){gamedraw();keyevent();iswin();if (flag == 1){exit(-1);}//system("cls");这里不需要,因为用不到控制台}getchar();return 0;}

注意不用图形库的铁铁们可以直接复制10.不加图形库的程序源码可以直接运行的
这里给大家推荐一个电影心迷宫巨巨巨巨巨好看,直接点题,真有我小汁的
请添加图片描述

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

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

相关文章

【ALO-BP预测】基于蚁狮算法优化BP神经网络回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python学习----Day08

函数变量的作用域 全局作用域 全局作用域在程序执行时创建&#xff0c;在程序执行结束时销毁。所有函数以外的区域都是全局作用域。在全局作用域中定义的变量&#xff0c;都属于全局变量&#xff0c;全局变量可以在程序的任意位置被访问。 函数作用域 函数作用域在函数调用…

【Eclipse】解决插件下载速度太慢

解决方案&#xff1a;修改镜像 下面列出几个国内的镜像网站&#xff1a; 中国科学技术大学(5.6MB/s) http://mirrors.ustc.edu.cn/eclipse/ 北京理工大学&#xff08;600KB/s&#xff09; http://mirror.bit.edu.cn/eclipse/ 大连东软信息学院(400KB/s) http://mirrors.neuso…

Linux网络编程系列之服务器编程——阻塞IO模型

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

Ubuntu:VS Code IDE安装ESP-IDF【保姆级】

物联网开发学习笔记——目录索引 参考&#xff1a; VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined 乐鑫官网&#xff1a;ESP-IDF 编程指南 - ESP32 VSCode ESP-ID Extension Install 一、前提条件 Visual Studio Code IDE安装ESP-IDF扩展&…

读写锁ReentrantReadWriteLockStampLock详解

如何设计一把读写锁&#xff1f;ReentrantReadWriteLock 读写锁设计思路 读写状态的设计 设计的精髓&#xff1a;用一个变量如何维护多种状态 在 ReentrantLock 中&#xff0c;使用 Sync ( 实际是 AQS )的 int 类型的 state 来表示同步状态&#xff0c;表示锁被一个线程重复获…

ChatGPT AIGC 完成Excel跨多表查找操作vlookup+indirect

VLOOKUP和INDIRECT的组合在Excel中用于跨表查询,其中VLOOKUP函数用于在另一张表中查找数据,INDIRECT函数则用于根据文本字符串引用不同的工作表。具体操作如下: 1.假设在工作表1中,A列有你要查找的值,B列是你希望查询的工作表名称。 2.在工作表1的C列输入以下公式:=VLO…

Unity基础课程之物理引擎6-关于物理材质的使用和理解

每个物体都有着不同的摩擦力。光滑的冰面摩擦力很小&#xff0c;而地毯表面的摩擦力则很大。另外每种材料也有着不同的弹性&#xff0c;橡皮表面的弹性大&#xff0c;硬质地面的弹性小。在Unity中这些现象都符合日常的理念。虽然从原理上讲&#xff0c;物体的摩擦力和弹性有着更…

【交付高质量,用户高增长】-用户增长质量保证方法论 | 京东云技术团队

前言 俗话说&#xff0c;“测试是质量的守护者”&#xff0c;但单凭测试本身却远远不够。大多数情况下&#xff0c;测试像“一面镜子”&#xff0c;照出系统的面貌&#xff0c;给开发者提供修改代码的依据&#xff0c;这个“照镜子”的过程&#xff0c;就是质量评估的过程&…

在 VSCode 中使用 PlantUML

最近&#xff0c;因为工作需要绘制一些逻辑图&#xff0c;我自己现在使用的是 PlantUML 或者 mermaid&#xff0c;相比之下前者更加强大。不过它的环境也麻烦一些&#xff0c;mermaid 在一些软件上已经内置了。但是 PlantUML 一般需要自己本地安装或者使用远程服务器&#xff0…

Paddle GPU版本需要安装CUDA、CUDNN

完整的教程 深度学习环境配置&#xff1a;linuxwindows系统下的显卡驱动、Anaconda、Pytorch&Paddle、cuda&cudnn的安装与说明 - 知乎这篇文档的内容是尽量将深度学习环境配置(使用GPU)所需要的内容做一些说明&#xff0c;由于笔者只在windows和linux下操作过&#xf…

浏览器本地存储之Cookie和webStorage

浏览器本地存储主要包括 Cookie 和 Web Storage 两种机制。它们都是用来在客户端存储数据&#xff0c;以便在浏览器会话之间保持信息或在同一会话中的页面之间共享信息。 一、Cookie 1.1 概念 cookie是客户端与服务器端进行会话使用的一个能够在浏览器本地化存储的技术。简言…

nocos注册中心使用教程

1.下载和安装 进入到官网下载就好了 解压 启动 2.新建提供者模块 2.1新建提供者模块cloudalibaba-provider-payment9001 2.1.1在父项目中新加入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-depend…

2022 年中职组“ 网络安全 ”赛项-web加固阶段题目

前言 大家好&#xff0c;本章节我将复现一次web加固阶段的操作&#xff0c;给大家看看该怎么操作和截图的具体事项&#xff0c;懂的大佬可以在评论区留言改进&#xff0c;感谢大家的支持&#xff01;接下来就跟随我的步伐一起来操作吧&#xff01; 阶段题目概览 环境搭建 底层…

【Eclipse】Plug-in Development 插件的安装

先按路线找到需要的页面&#xff1a;eclipse–Window–Preferences–Java–Editor–Content Assist 在Work with框中输入&#xff1a;http://download.eclipse.org/releases/2019-06 PS&#xff1a;后面的2019-06是eclipse发行的时间 选择&#xff1a;General Purpose Tools 下…

rhel8 nmcli学习

rhel8我自己用过的配置网路方法有以下几个&#xff1a; &#xff08;1)手动配置ifcfg文件&#xff0c;通过NM来生效。 (2)手动配置ifcfg文件&#xff0c;通过重启NetworkManager.service生效。 (3)通过NM自带工具配置网络&#xff0c;比如nmcli。 (4)使用命令 nutui命令&am…

4x4矩阵键盘设计Verilog矩阵式键盘控制,视频/代码

名称&#xff1a;4x4矩阵键盘设计Verilog矩阵式键盘控制 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 键盘控制电路设计&#xff0c;设计一个4x4矩阵式键盘控制电路&#xff0c;并实现按键的显示。 演示视频&#xff1a;4x4矩阵键盘设计Verilo…

【Java】jvm 元空间、常量池(了解)

JDK1.8 以前的 HotSpot JVM 有方法区&#xff0c;也叫永久代&#xff08;permanent generation&#xff09;方法区用于存放已被虚拟机加载的类信息&#xff0c;常量、静态遍历&#xff0c;即编译器编译后的代码JDK1.7 开始了方法区的部分移除&#xff1a;符号引用&#xff08;S…

docker之Harbor私有仓库

目录 一、什么是Harbor 二、Harbor的特性 三、Harbor的构成 1、六个组件 2、七个容器 四、私有镜像仓库的上传与下载 五、部署docker-compose服务 把项目中的镜像数据进行打包持久数据&#xff0c;如镜像&#xff0c;数据库等在宿主机的/data/目录下&#xff0c; 一、什么…

Kafka 开启SASL/SCRAM认证 及 ACL授权(二)ACL

Kafka 开启SASL/SCRAM认证 及 ACL授权(二)ACL。 官网地址:https://kafka.apache.org/ kafka authentorization:https://docs.confluent.io/platform/current/kafka/authorization.html 一、开启ZK ACL(可选,内网环境,用户无机器访问权限时) 给kafka meta都加上zk的ac…