c++迷宫游戏

1、问题描述

程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。

基本要求:

  1. 老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动;
  2. 迷宫的墙足够结实,老鼠不能穿墙而过;
  3. 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,并给出一条路径,否则提示失败。

提高要求:

  1. 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;
  2. 增加闯关和计分功能;
  3. 找出走出迷宫的所有路径,以及最短路径。

 2.需求分析

软件的基本功能:通过键盘控制光标移动实现老鼠在迷宫中的行走、全部路径和最短路径的显示、自定义地图(墙变路,路变墙)。在老鼠闯关只能在地图显示是路的地方行走,不能穿墙,有计时功能,当时间结束时若没有到达指定地点,显示game over,查看排行榜,游戏结束,若成功到达指定位置,进去下一关,直到所有关结束,程序结束;.

输入/输出形式:用户可以通过控制台,根据输入提示。

输入形式:

  • 方向键、空格键、enter键

输出形式:

  • 输出地图菜单。
  • 输出地图
  • 输出是否成功信息、输出排行榜

 3.概要设计

(1)主程序流程

图1:主程序流程图

(3)模块调用关系

本程序中函数包括:main函数,menu函数,menu2函数,mouse类内函数,path类内函数,change函数,

函数调用关系如下:

图2:函数调用关系

4.详细设计

(1)实现概要设计的数据类型:

Mouse类

class mouse

{

private:

int m_x;

int m_y;

time_t begin ,stop;

public:

int move_up(int map[x][y],int end);//向上移动

int move_down(int map[x][y],int end);//向下移动

int move_left(int map[x][y],int end);//左

int move_right(int map[x][y],int end);//右

void initialize(int map[x][y],int end){ m_x=S;m_y=S;map[end][end]=9;}

    void print(int map[x][y],int end);//打印地图

void operate(int map[x][y],int end,char name[30]);//操作

void success();

void charts(char Name[30]);//排行榜

};

Path

class Path

{public:

Path(){pa=1000;}

void path(int i,int j,int map[x][y],int &t,int end);

int check(int i, int j, int d, int map[x][y],int end);

void Print2(int map[x][y], int &t,int end);//打印每条路径

void allpath(int s,int e,int map[x][y],int &t,int end);

private:

int pa;

};

(2)主程序以及其它模块的算法描述:

主函数具体代码

int main()

{

menu();

file(1);

v: if(menu2(1,11)==1)//1,返回当前关卡菜单,0,进入下一关卡

goto v;

v2: file(2);

if(menu2(2,12)==1)

goto v2;

v3: file(3);

if(menu2(3,13)==1)

goto v3;

v4: file(4);

if(menu2(4,15)==1)

goto v4;

v5: file(5);

if(menu2(5,18)==1)

goto v5;

final();

return 0;

Menu2 函数具体代码

int menu2(int t,int e)

mouse mickey;

Path path;

int p=0;

system(”cls");

Loc1(15,3);

cout〈〈”Welcome"<<Name;

Loc1(15,5);

cout<<"△▼△▼第”〈〈t〈〈"关▼△▼△”<〈endl;

cout<<endl;

a();//菜单初始状态

char k;

int sel=1;//选中第一项

while(1){

k=getch();//移动上下方向键

switch(k){

case 72://上移

if(sel〉1)

{

sel--;

if(sel==1)

a();

else if(sel==2)

b();

else if(sel==3)

c();

else if(sel==4)

d();

else if(sel==5)

menue();

}

break;

case 80: //下移

if(sel<6)

sel++;

if(sel==1)

a();

else if(sel==2)

b();

else if(sel==3)

c();

else if(sel==4)

d();

else if(sel==5)

menue();

break;

case 13://回车确定选择

if(sel==1)//开始闯关

mickey.operate(MAP,e,Name);

return 0;

}

else if(sel==2)//查看所有路径和最短路径

{

system("cls");

path。allpath(9,9,MAP,p,e);

return 1;

}

else if(sel==3)//更改地图

{

change(2*(18—e),18-e,e);

return 1;

}

else if(sel==4)//查看排名

mickey。charts(Name);

return 1;

else if(sel==5)//退出

{

exit(0);

}

}

}

这个函数主要调用了各实现功能函数。其步骤为:用户进入菜单选项,方向键控制选中选项移动,enter进入选中选项。

(3)其它模块的算法描述

     控制老鼠移动函数

功能:方向键移动老鼠.(上方向键进入Move_up函数)

if(map[m_x-1][m_y]==1)

return 0;

else if(map[m_x-1][m_y]==9)

{

map[m_x][m_y]=0;

m_x——;

map[m_x][m_y]=3;

return -1;

else{

map[m_x][m_y]=0;

Y=-1;

X=0;

Loc(2*m_y,m_x);

cout<〈"  ”;

Loc(2*m_y+X,m_x+Y);

cout〈<"♂”;

m_x--;

map[m_x][m_y]=3;

     求全部路径

功能:输出迷宫所有路径

int dir[4][2]={{-1,0},{1,0},{0,-1},{0, 1}};//上下左右

int d,tx,ty,p;

for(d=0;d〈4;d++)

{

if(check(i,j,d,map,end)==1)//检查是否可以走

{

tx=i+dir[d][0];

ty=j+dir[d][1];

p=map[tx][ty];//记录状态

map[tx][ty]=4;//标记路径

map[end][end]=0;

if(tx==end&&ty==end)//终点

t++ ;//路径条数加一

Print2(map,t,end);//终点

}

else

{

path(tx,ty,map,t,end);

map[tx][ty]=p;

}

}

更改地图功能

char key;

Loc2(sx,sy);

while(1){

key=getch();

switch(key){

case 72:

Loc2(sx,--sy);

break;

case 80:

Loc2(sx,sy++);

break;

case 75:

Loc2(sx—=2,sy);

break;

case 77:

Loc2(sx+=2,sy);

break;

case 32:

if(MAP[sy][sx/2]==1)

MAP[sy][sx/2]=0;

Loc1(sx,sy);

cout<<"  ”;

Loc1(sx,sy);

else if(MAP[sy][sx/2]==0)

{

MAP[sy][sx/2]=1;

Loc1(sx,sy);

cout<<”■";

Loc1(sx,sy);

}

break;

case 13:

return ;

default:

break;

5、编码与调试分析

1.编码与调试过程中遇到的问题及解决办法

【问题一】通过清屏打印地图实现老鼠移动,屏幕闪烁严重

解决办法:分析得知,通过移动光标打印老鼠位置,可以解决屏闪问题

解决此问题的核心代码:

COORD pos = {a,b};

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorPosition(hOut, pos);

2.待解决问题:

时间不能实现连续变化

3、使用说明

进入菜单,根据提示进行选择:

方向键选择,enter键进入

6、测试结果

7、自学知识

在课程设计过程中,特别是在代码编写和调试的过程中,自学了很多新的知识.例如Loc()函数,包含于表头文件 #include <window.h> 。 其功能是: 移动光标位置,更改控制台输出颜色.

还有一个知识点是清屏函数,它也是包含于〈stdlib。h〉头文件中的, 使用形式为system(”CLS")。主要功能就是清空屏幕。

8、课程设计心得体会

课程设计是一次可以让我们所学的理论与实际相结合的机会。我们选择了迷宫游戏这一题目。我这次的程序准确来说还算不上一个游戏,刚开始想要自学MFC因为时间原因没有实现,这是一个遗憾。但学习不会随着课设的结束而结束,课程也给我指明了未来努力的方向.课程中最大的困难还是一些难以查出的错误,编译时查不出的错误,其被发现时很可能只是位置的错误,仅隔数行,这些微小的信息却极大地影响了整体的效果.这不仅存在于一个程序之中,因而我对于生活中的细节也有了改观,对于整体和局部的观念也有了更多的见解.

   

 参考书:

  [1]《c++面向对象程序设计》 清华大学出版社    谭浩强著

  [2]《数据结构(C++版)》清华大学出版社    王红梅、胡明、王涛著

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

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

相关文章

Springboot指定扫描路径

方式一&#xff1a;通过在启动类的SpringbootApplication中指定包扫描或类扫描 指定需要扫描的包 scanBasePackages{"待扫描包1","待扫描包2", . . . ," "} 指定需要扫描的类 scanBasePackageClasses{类1.class,类2.class,...} 方式二&#xff…

C语言函数实现:深入理解strcpy

文章目录 一、strcpy函数的基本用法二、strcpy函数的实现原理三、strcpy函数的应用场景四、strcpy函数的安全性问题五、结论 C语言函数实现&#xff1a;深入理解strcpy 在C语言编程中&#xff0c;字符串处理是一项基础且重要的任务。 strcpy函数作为C标准库中的一个基本函数&a…

CDC变更数据捕捉技术是什么?和ETL有什么不同?

一、什么是CDC技术? 变更数据捕获&#xff08;Change Data Capture&#xff0c;简称 CDC&#xff09;是一种用于识别和跟踪数据源中发生变化的数据的技术。 工作原理&#xff1a; 1.监测数据源&#xff1a;CDC 工具会持续监测指定的数据源&#xff0c;如数据库表、文件系统…

【C++复习】经典笔试题

文章目录 八大排序快排过程 卡特兰数反转链表链表的回文结构左叶子之和另一棵树的子树归并排序类与对象编程训练杨辉三角字符串乘积二叉树前序遍历成字符串数组的交集二叉树的非递归前序遍历连续子数组的最大乘积 八大排序 插冒归稳定 快排过程 以 [3,4,6,1,2,4,7] 为例&#…

MySQL 聚合函数

1. AVG函数求平均值 以 teacher 表为例&#xff0c;先查所有 teacher 信息&#xff1a; SELECT * FROM teacher;查询结果如下图&#xff1a; 可以使用 AVG() 函数求出全部教师平均年龄&#xff1a; SELECT AVG(age) FROM teacher;执行结果如下图&#xff1a; Tips&#…

Javascript 脚本查找B站限时免费番剧

目录 前言 脚本编写 脚本 前言 B站的一些番剧时不时会“限时免费”&#xff0c;白嫖党最爱&#xff0c;主打一个又占到便宜的快乐。但是在番剧索引里却没有搜索选项可以直接检索“限时免费”的番剧&#xff0c;只能自己一页一页的翻去查看&#xff0c;非常麻烦。 自己找限…

如何修改MAC地址破解网络无线网络限制-担心别人蹭网,路由器设置MAC地址过滤,限定了能访问无线网络的网卡地址-供大家学习参考

路由器都设置了MAC地址过滤&#xff0c;也就是限定了能访问无线网络的网卡的MAC地址。因为无线路由器不一定由自己控制&#xff0c;所以当更换了笔记本或者更换了无线网卡的时候&#xff0c;也许就上不了网了。我们可以修改网卡的MAC地址实现上网。 下载&#xff1a;https://do…

各种查询sql介绍

1. 关联查询&#xff08;JOIN&#xff09; 关联查询用于从多个表中检索数据。它基于两个或多个表之间的共同字段&#xff08;通常是主键和外键&#xff09;来组合数据。 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; sql SELECT a.name, b.order_date FROM custome…

计算机网络——CDN

空间编码例子&#xff1a;不是发送N个相同颜色值&#xff0c;而是仅发送2个值&#xff0c;颜色和重复个数 时间编码例子&#xff1a;不是发送i1帧的全部编码&#xff0c;而是仅发送帧i差别的地方 视频播放时&#xff0c;先下载manifest file文件——>解析&#xff08;不…

机器学习与神经网络:科技的星辰大海

前提 近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

Faster R-CNN模型微调检测航拍图像中的小物体

1. 项目简介 本项目的目标是基于Faster R-CNN模型对航拍图像中的小物体进行检测和识别。航拍图像通常具有视角广、分辨率高、小目标密集且物体尺寸较小的特点&#xff0c;因此检测难度较大。传统的目标检测模型在处理小物体时&#xff0c;容易受到物体尺寸、分辨率及背景复杂度…

大数据查询引擎之Tez

Apache Tez 是一个用于大数据处理的分布式计算框架&#xff0c;旨在提高 Hadoop 的 MapReduce 计算引擎的效率和性能。它是一个面向 DAG&#xff08;有向无环图&#xff09;任务执行的框架&#xff0c;主要用于大规模数据处理场景中&#xff0c;特别是在 Apache Hadoop 生态系统…

elementUI,设置日期,只能选择过去的和今天的日期

在 el-date-picker 组件中加&#xff1a;:picker-options"pickerOptions" <el-form-item label"票据生成日期&#xff1a;"> <el-date-picker v-model"date1" type"daterange" range-separator"至" value-format&…

大数据-172 Elasticsearch 索引操作 与 IK 分词器 自定义停用词 Nginx 服务

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

轻量级可视化数据分析报表,分组汇总表!

什么是可视化分组汇总表&#xff1f; 可视化分组汇总表&#xff0c;是一种结合了数据分组、聚合计算与视觉呈现功能的数据分析展示功能。它能够按照指定的维度&#xff08;如时间、地区、产品类型等&#xff09;对数据进行分组&#xff0c;还能自动计算各组的统计指标&#xf…

mongodb-7.0.14分片副本集超详细部署

mongodb介绍&#xff1a; 是最常用的nosql数据库&#xff0c;在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb&#xff08;分片副本&#xff09;集群。 环境准备 系统系统 BC 21.10 三台服务器&#xff1a;192.168.123.247/248/249 安装包&#xff1a…

SQL Injection | SQL 注入 —— 报错盲注

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;报错盲注 —— 理论篇 报错盲注&#xff08;Error-Based Blind SQL Injection&#xff09;是一种常见的 SQL 注入技术&#xff0c;适用于那些页面不会直接显示后端处理结果的查询方式…

安装nginx实现多ip访问多网站

关闭防火墙并停selinux&#xff1a; 挂载&#xff1a; 安装nginx&#xff1a; 判断nginx是否成功启动&#xff1a; 打开nmtui并添加多个ip&#xff1a; 重启nmtui&#xff1a; 查看多ip是否配置成功: 配置文件&#xff1a; 创建文件&#xff1a; 根据配置在主机创建数据文件&a…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十一)ESKF中融合速度观测量;发散的原因;如何解决发散;以及对slam的理解

带着问题去学习: 1、slam发散的原因? 2、如何解决/限制发散? 3、如何在已经有观察值和预测值的ESKF中,再引入一个其他其他观察量? 一、多传感器融合的思考——轮速计 反思为何需要融合多个传感器? 我认为根本上的原因,是因为有些传感器在某些场景下会失灵、效果不佳…

aws(学习笔记第七课) 私有子网使用NAT服务器

aws(学习笔记第七课) AWS的私有子网使用NAT服务器 学习内容&#xff1a; AWS的私有子网使用NAT服务器 1. AWS的私有子网使用NAT服务器 在上面的例子的网络构成图中&#xff0c;可能会发现一个问题。就是Private Subnet的Apache server无法访问互联网。比如&#xff0c;当需要…