创作背景

今天又是放元旦假的一天,无聊的我刷够了手机,就跑过去打开电脑······

熟悉的Dev-c++图标又映入我的眼帘,今天编点什么呢······

我绞尽脑汁,冥思苦想,终于想到了一个游戏——走迷宫。

今天的 走迷宫 游戏不会像之前的Blackjack游戏一样复杂,它只是非常简单的一个小游戏,也不太需要脑力,稍微地构造一个整体的框架,然后逐步细化就可以了。

玩法

玩家通过操纵按下键盘上的键(w--上,s--下,a--左,d--右,7--左上,9--右上,1--左下,3--右下,我个人觉得之所以我要用7、9、1、3这四个键,是因为这四个键在有小键盘的键盘上是分别居于左上、右上、左下、右下的位置,也许操控起来会更顺手)来控制移动方向,避开障碍,一直走到终点(迷宫大部分时候不存在迷宫无解的情况,因为我特地加了dfs深搜函数来确保迷宫有解,但我也不知道dfs深搜函数有没有用,如果在运行过程中遇到迷宫无解的情况,请在评论区吐槽,提前谢过)。

思路

首先在main()函数里面要输出 走迷宫 游戏的基本信息,让玩家先作了解;接着获取迷宫边长(1≤n,m≤10,也可以自己增减范围),对输入的n和m作不合法处理;然后根据n和m,随机生成一个迷宫界面;再编写一个dfs深搜函数,用来保证随机生成的迷宫界面有解(若无解就循环生成新的迷宫界面,直到迷宫界面有解),并随机确定起点坐标和终点坐标且令当前位置=起点坐标;再接下来就是走迷宫游戏的主体部分,获取玩家输入信息并作出相应移动;最后就是统计步数,结束游戏。

代码

走迷宫 游戏需要的头文件和宏定义:

#include<bits/stdc++.h>//万能头文件
#include<windows.h>//设置字体颜色
#include<conio.h>//_getch()函数
#define ge srand(static_cast<int>(time(NULL)));//产生随机数种子

走迷宫 游戏数组和变量:

int n/*长*/,m/*宽*/,u/*临时变量*/,sx/*起点x坐标*/,sy/*起点y坐标*/,ex/*终点x坐标*/,ey/*终点y坐标*/,cx/*当前位置x坐标*/,cy/*当前位置y坐标*/,stp/*当前步数*/;
int dx[]={0,-1,-1,-1,0,1,1,1,0}/*x方向*/,dy[]={0,-1,0,1,1,1,0,-1,-1}/*y方向*/;
bool b[11][11]/*标记搜索过*/,sg/*迷宫有解与否*/;
char a[11][11]/*迷宫*/,so,d;

crs(int,int)函数:为x,y作越界判断↓

​bool crs(int x,int y){return (x>0 && x<=n && y>0 && y<=m);//未越界
}

chk()函数:在玩家输入时作输入信息合法性判断↓

bool chk(){if(d!='w' && d!='s' && d!='a' && d!='d' && d!='7' && d!='9' && d!='1' && d!='3')//不是w,a,s,d,7,9,1或3中的一个return false;switch(d){case 'w':return (crs(cx-1,cy) && a[cx-1][cy]=='-');//↑case 's':return (crs(cx+1,cy) && a[cx+1][cy]=='-');//↓case 'a':return (crs(cx,cy-1) && a[cx][cy-1]=='-');//←case 'd':return (crs(cx,cy+1) && a[cx][cy+1]=='-');//→case '7':return (crs(cx-1,cy-1) && a[cx-1][cy-1]=='-');//↖case '9':return (crs(cx-1,cy+1) && a[cx-1][cy+1]=='-');//↗case '1':return (crs(cx+1,cy-1) && a[cx+1][cy-1]=='-');//↙case '3':return (crs(cx+1,cy+1) && a[cx+1][cy+1]=='-');//↘}
}

put()函数:玩家每走一步就输出当前迷宫界面状态↓

void put(){for(int i=1;i<=n;i++)/*行循环*/{for(int j=1;j<=m;j++)/*列循环*/{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色if(i==sx && j==sy)//当前位置是起点SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);//红色if(i==ex && j==ey)//当前位置是终点SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);//绿色if(i==cx && j==cy)//当前位置是玩家所在位置{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN);//黄色cout<<"#";continue;}cout<<a[i][j];}cout<<endl;//换行}
}

dfs(int,int)函数:在系统随机生成迷宫界面时判断迷宫有无解并保证当前迷宫界面有解

void dfs(int x,int y){for(int i=1;i<9;i++)/*枚举8个方向*/{int xx=x+dx[i],yy=y+dy[i];//当前枚举坐标if(xx>0 && xx<=n && yy>0 && yy<=m && a[xx][yy]=='-' && !b[xx][yy])/*当前位置可走且未走过*/{b[xx][yy]=true;//标记当前位置走过if(xx==ex && yy==ey)/*到达终点,表示此迷宫界面有解*/{sg=true;//标记有解return;//返回}else//未到达终点dfs(xx,yy);//继续深搜当前枚举坐标b[xx][yy]=false;//回溯}}
}

main()函数:主函数,游戏主体部分的实现。

游戏图例
符号 释义
- 起点
- 终点
# 当前位置
- 可以通行
* 不可通行
移动方向 8个(w↑,s↓,a←,d→,7↖,9↗,1↙,3↘)
迷宫大小 1≤n,m≤10
int main(){memset(b,false,sizeof(b));//初始化数组bSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);//高亮(灰色) cout<<"欢迎来到迷宫小游戏\n\n";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色cout<<"'";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);//红色cout<<"-";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色cout<<"'号表示起点\n\n'";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);//绿色cout<<"-";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色cout<<"'号表示终点\n\n";cout<<"'*'号表示不可通行\n\n";cout<<"'-'号表示可以通行\n\n'";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN);//黄色cout<<"#";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色cout<<"'号表示现在位置\n\n";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);//红色cout<<"初始位置在入口处\n\n";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);//绿色cout<<"你可以往八个方向走动\n\n";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);//蓝色cout<<"迷宫长宽小于等于10\n\n\n";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色do{cout<<"请输入迷宫大小(N*M):";//询问迷宫大小cin>>n>>m;}while(n<1 || n>10 || m<1 || m>10);//对n,m作不合法处理ge//产生随机数种子(宏定义)do{sg=false;system("cls");//清屏for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){u=rand()%2;a[i][j]=(!u?'-':'*');//随机生成迷宫界面}do{sx=rand()%n+1;//起点x坐标sy=rand()%m+1;//起点y坐标}while(a[sx][sy]=='*');//起点不能在'*'上do{ex=rand()%n+1;//终点x坐标ey=rand()%m+1;//终点y坐标}while(sx==ex && sy==ey || a[ex][ey]=='*');//起点不能与终点重合且终点也不能在'*'上dfs(sx,sy);//从起点开始深搜}while(!sg);//无解put();//输出当前迷宫界面cx=sx;//当前位置x坐标=起点x坐标cy=sy;//当前位置y坐标=起点y坐标do{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN | FOREGROUND_BLUE);//蓝绿(青)色cout<<"↑w,↓s,←a,→d,↖7,↗9,↙1,↘3:";//提示8个移动方向d=_getch();//获取玩家的移动方向while(!chk())/*此方向不合法*/{d=_getch();//重新获取玩家的移动方向cout<<d;}a[cx][cy]='-';//之前的位置变为'-'switch(d){case 'w':a[--cx][cy]='#';break;//↑case 's':a[++cx][cy]='#';break;//↓case 'a':a[cx][--cy]='#';break;//←case 'd':a[cx][++cy]='#';break;//→case '7':a[--cx][--cy]='#';break;//↖case '9':a[--cx][++cy]='#';break;//↗case '1':a[++cx][--cy]='#';break;//↙case '3':a[++cx][++cy]='#';//↘}stp++;//步数增加1system("cls");//清屏put();//输出当前迷宫界面}while(cx!=ex || cy!=ey);//未到达终点system("cls");//清屏SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色cout<<"恭喜你成功走出迷宫!\n用了"<<stp<<"步";return 0;
}

走迷宫 游戏不算难,但它需要严谨的逻辑和巧妙地编写代码,所以也不可对它掉以轻心。特别是dfs深搜的地方,感觉时间复杂度太大,正在考虑优化。

今天的走迷宫游戏分享就告一段落了,代码中有任何错误或者代码有任何可以优化的地方都请在评论区指出(点赞评论请留下~)。

Dev-c++编写走迷宫游戏 思路和代码 详解相关推荐

  1. Dev-c++编写消消乐游戏 思路和代码 详解

    消消乐游戏结构 创作背景 思路 代码 总结 创作背景 最近又放寒假了.真的是作业多多,寒假少少啊--不过在赶作业之余,我也是有时间编程的,只不过没有之前那么"放肆"了.消消乐游戏( ...

  2. 简单跑酷java代码_如何实现一个简单的跑酷游戏?(代码详解)

    本篇文章给大家带来的内容是介绍如何实现一个简单的跑酷游戏?(代码详解).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 采用的物理引擎是:Phaser.js 官网地址:http:// ...

  3. C语言实现三子棋小游戏(编程思路以及代码详解)

    目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...

  4. c语言大作业走迷宫,基于C语言实现简单的走迷宫游戏

    本文实例讲述了C语言实现简单的走迷宫游戏的方法,代码完整,便于读者理解. 学数据结构时用"栈"写的一个走迷宫程序,实际上用到双向队列,方便在运行完毕后输出经过的点. #includ ...

  5. 遗传算法在走迷宫游戏中的应用

    我的数据挖掘算法库:https://github.com/linyiqun/DataMiningAlgorithm  我的算法库:https://github.com/linyiqun/lyq-alg ...

  6. 马德里烈风和java的鱼雷,碧蓝航线航母舰载机怎么搭配_碧蓝航线航母舰载机搭配思路及优缺点详解_手心游戏...

    碧蓝航线航母舰载机怎么搭配?碧蓝航线航母舰载机优缺点是什么?在碧蓝航线游戏中因为防空炮的改变让航母有了被削弱的感觉,那么舰载机怎么搭配好呢?一起来看一下碧蓝航线航母舰载机搭配思路及优缺点详解吧. 碧蓝 ...

  7. protobuf前后端解析_前端后台以及游戏中使用google-protobuf详解

    前端后台以及游戏中使用google-protobuf详解 [TOC] 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更小 ...

  8. 从零编写60%+胜率的短线择时信号!零基础python量化投资代码详解【邢不行】

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. ​ ​ 如果有人说你是百年难得一见的量化投资天才, ...

  9. [新手必备]Unity推箱子小游戏C#代码详解(第一篇-代码部分)

    完整项目请参考博客:https://blog.csdn.net/qq_41676090/article/details/96300302 本文为推箱子小游戏C#代码详解第一篇的代码部分,主要讲解 Sy ...

最新文章

  1. java判断波动的曲线是否大体平衡_基于标的物价格和波动率的期权投资策略
  2. Delphi 能不能从Ring 3进入Ring 0
  3. python3库下载_下载安装Python第三方库的方法,最全方式,值得收藏
  4. [转]c++类的构造函数详解
  5. DbHelper重用性方案 优化工具类 jdbc
  6. 【转载】java InputStream读取数据问题
  7. mybatis 一二级缓存简述
  8. pytorch常见问题之cpu占满
  9. python图片中文字识别
  10. android台式电脑系统安装,怎么在台式机上安装安卓系统
  11. ctf——逆向新手题目8 (logmein) WP
  12. 10麦客和300挖藕人
  13. (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: ‘utf-8‘ c
  14. PS 学习笔记 03-移动工具图层概念
  15. linux如何批量操作,linux批量操作命令锦集
  16. TarsGo新版本发布,支持protobuf,zipkin和自定义插件
  17. intel芯片内核linux,Linux:再见了Intel 386处理器
  18. vim插入模式小技巧
  19. js实现网页简繁体自动转换
  20. 微软云计算业务表现强劲,股价创历史新高

热门文章

  1. 厘米和磅的转换程序python_笨方法学Python 习题5:更多的变量和打印
  2. 教育新痛点:父母有手机依赖行为,其子女手机依赖的比例几乎翻倍
  3. 各大网络培训站vip课程翻录免key版 [ 不断更新ing..... ]
  4. “显示器驱动已停止响应,并且已恢复”问题的解决方法
  5. Vista/Win7 UAC兼容程序开发指南(***)
  6. 音频之各种有损编码器的比较,AAC编码器之选择,频谱、差值比较,编码器下载
  7. 【VC】 swscanf_s 函数使用,方便快捷的转换数据格式
  8. k3note Android8,增强用户体验 八款高品质音乐手机推荐
  9. 华为鸿蒙5s手机价格,华为5s报价以及外观【图文】
  10. 在腾讯云买的域名解析阿里云的服务器的ip地址