c++迷宫游戏

news2024/10/21 9:44:50

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.coloradmin.cn/o/2219946.html

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

相关文章

博弈论学习笔记【施工中】

SG函数 首先定义就不用我讲了吧&#xff0c;还不会的自己看看 传送门 再进一步理解一下吧&#xff1a; 黑色数字是节点编号&#xff0c;红色是 S G SG SG 函数值 看下它的过程&#xff1a; 首先 5 5 5 和 6 6 6 没有后继节点&#xff0c;为必败态&#xff0c;先赋值为 …

OpenCV和HALCON

OpenCV和HALCON是两种广泛用于图像处理和计算机视觉的开发库&#xff0c;它们各有优缺点&#xff0c;适合不同的应用场景。以下是两者的比较&#xff1a; 1. 开发背景与定位 OpenCV (Open Source Computer Vision Library)&#xff1a; 开源库&#xff0c;最初由Intel开发&…

【图解版】力扣第146题:LRU缓存

力扣第146题&#xff1a;LRU缓存 一、LRU算法1. 基本概念2. LRU 和 LFU 的区别&#xff1a;3. 为什么 LRU 不需要记录使用频率&#xff1f; 二、Golang代码实现三、代码图解1. LRUCache、DLinkedNode两个结构体2. 初始化结构体对象3. addToHead函数4. removeNode函数5. moveToH…

基于单片机的多功能鱼缸控制系统设计

本设计以STC12C5A60S2单片机为核心的多功能鱼缸控制系统&#xff0c;该系统可分别利用温度传感器、水位传感器和浑浊度传感器来检测鱼缸内部的水温、液体高度和浑浊程度&#xff0c;并在显示屏上进行显示。若检测结果超出阈值范围&#xff0c;则继电器工作从而控制内部环境。通…

LeetCode102. 二叉树的层序遍历(2024秋季每日一题 43)

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入…

白嫖正版xshell和XFTP

在哪里可以下载正版免费的xshell和XFTP&#xff0c;并且还能够获得官网免费持久更新 白嫖步骤 首先直接在浏览器搜索xshell官网 点进官网之后直接点击下载 接着点击免费授权页面 进入之后就可以免费下载了 下载安装完成后填写用户名和邮箱并提交&#xff0c;这里就以xshell为…

Veritas NetBackup 10.5 发布,新增功能概览

Veritas NetBackup 10.5 发布&#xff0c;新增功能概览 Veritas NetBackup 10.5 (Unix, Linux, Windows) - 领先的企业备份解决方案 The #1 enterprise backup and recovery solution. 请访问原文链接&#xff1a;https://sysin.org/blog/veritas-netbackup-10/ 查看最新版。…

EditPlus的安装软件包

解压并粘贴到C:\Program Files (x86)中 点击激活密匙,并一直同意 确认并选择默认的位置: 关闭并重新激活密匙 就好了 无需添加快捷方式: 只需要选择任意文件 并选择该应用打开一次即可 通过百度网盘分享的文件&#xff1a;EditPlus_5.0.611.zip 链接&#xff1a;https://pa…

在Debian 11/Debian 10上安装MySQL 5.7

本文借鉴 如何在 Debian 11/Debian 10 上安装 MySQL 5.7 |https://cn.linux-console.net/?p20728 下载安装存储库 安装 根据提示选择mysql5.7即可(会车键选择) wget https://dev.mysql.com/get/mysql-apt-config_0.8.16-1_all.debsudo dpkg -i mysql-apt-config_0.8.16-1_a…

MFC工控项目实例二十四模拟量校正值输入

承接专栏《MFC工控项目实例二十三模拟量输入设置界面》 对模拟量输入的零点校正值及满量程对应的电压值进行输入。 1、在SenSet.h文件中添加代码 #include "BtnST.h" #include "ShadeButtonST.h"/ // SenSet dialogclass SenSet : public CDialog { // Co…

AWD初步学习

一般的AWD不提供外网环境&#xff0c; AWD比赛中一般准备语言环境&#xff0c;工具、exploit及相关脚本框架。 1.脚本环境 一般在/var/www/html目录的下面&#xff0c;需要提前PHP和常用的Web开发语言环境在本地进行配置&#xff0c;且统一语言尽量多配置环境&#xff0c;比如P…

基于stm32的4G模块点灯实验

led模块功能封装 #include "led.h" #include "sys.h"//初始化GPIO函数 void led_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin GPIO_PIN_8 | GPIO_PIN_9;gpio_inits…

如何将LiDAR坐标系下的3D点投影到相机2D图像上

将激光雷达点云投影到相机图像上做数据层的前融合&#xff0c;或者把激光雷达坐标系下标注的物体点云的3d bbox投影到相机图像上画出来&#xff0c;都需要做点云3D点坐标到图像像素坐标的转换计算&#xff0c;也就是LiDAR 3D坐标转像素坐标。 看了网上一些文章都存在有错误或者…

Android 第5种启动模式:singleInstancePerTask

Android 第5种启动模式&#xff1a;singleInstancePerTask 随着 Android 版本的更新&#xff0c;应用启动模式逐渐丰富。在 Android 12 中&#xff0c;新增了一种启动模式——singleInstancePerTask。它是继 standard、singleTop、singleTask 和 singleInstance 之后的第五种启…

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装

一起搭WPF架构之LiveCharts.Wpf的简单了解与安装 前言LiveCharts.Wpf介绍LiveCharts.Wpf的安装总结 前言 根据项目需求&#xff0c;我单独留了一个界面用于进行数据分析。数据分析的内容考虑是采用图表的形式将SQLite数据库中存储的数据进行绘制成图&#xff0c;以便数据分析。…

HTB:Broker[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which open TCP port is running the ActiveMQ service? 使用fscan对靶机开放端口进行扫描 使用nmap对靶机开放端口进行脚本、服务信息扫描 2.What is the version of the ActiveMQ service running on the box? 3.What is the 2023 …

windows下安装VirtualBox7.1.4

记录详细的安装过程与遇到的问题&#xff1b; 下载地址 virtualbox官网 清华镜像源下载 下载完成后文件&#xff1a; 双击打开&#xff1b; 报错了 意思是需要pc上先安装Microsoft Visual C 2019 https://learn.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redi…

C++ 中的线程、锁、条件变量。

线程 0.Linux中有POSIX标准的线程&#xff0c;Boost库中也支持线程&#xff08;比如thread_group 和 upgrade_lock &#xff09;&#xff0c;C11<thread>头文件中也提供了相应的API支持我们使用线程。它们三个&#xff0c;你学会一个&#xff0c;自然触类旁通。 1.创建…

Java-类与对象-下篇

关于类与对象&#xff0c;内容较多&#xff0c;我们分为两篇进行讲解&#xff1a; &#x1f4da; Java-类与对象-上篇&#xff1a;————<传送门:Java-类与对象-上篇-CSDN博客> &#x1f4d5; 面向对象的概念 &#x1f4d5; 类的定义格式 &#x1f4d5; 类的使用 …

特斯拉Optimus:展望智能生活新篇章

近日&#xff0c;特斯拉举办了 "WE ROBOT" 发布会&#xff0c;发布会上描绘的未来社会愿景&#xff0c;让无数人为之向往。在这场吸引全球无数媒体的直播中&#xff0c;特斯拉 Optimus 人形机器人一出场就吸引了所有观众的关注。从多家媒体现场拍摄的视频可以看出来&…