C++实践 走出迷宫
c和c++学了快一个学期了,感觉也编不出什么像样的程序,不是解决数学问题就是打印图形,感觉没什么劲。今天找了一个有趣的题目来做做,这是imooc上老师布置的一个案例。先不管算法好坏,来实现一个人走出迷宫的程序,要求能在屏幕上显示出人在走迷宫,并显示出走了几步。
第一次写这种面向对象的程序,很多地方写得都比较臃肿orz,枚举类型也不太会用,实践中遇到了各种各样的困难,暴露了我好多知识的漏洞,但最终还是一一克服了,这种感觉真的是挺好的,我以后还是要多做一些这样的实践才行,其实编这样的程序真的挺有趣的hh
先给个实现后的效果图吧
设计思路:
定义两个类,分别来表示人和迷宫。迷宫用数组来表示,迷宫的墙用1来表示,路用0来表示。
小人通过右手法则走迷宫,每次先判断右手边的是不是墙,如果不是就往右走,否则就往左转,再继续判断右手边是否为墙,一直循环,直到走出迷宫为止。
代码:
头文件maze.h 用来定义枚举类型方向和速度,常量路、墙,还有坐标的结构体
#pragma onceenum direction { up, right, down, left }; //方向
enum speed { FAST = 100, NORMAL = 300, SLOW = 500 }; //速度
const int ROAD = 0; //路
const int WALL = 1; //墙
struct POX { //坐标int x;int y;
};
头文件MyMazer.h 用来声明人类
#pragma once
#include "maze.h"
#include "MyMazeMap.h"class MyMazeMap;
class MyMazer
{
public:MyMazer(int x = 0, int y = 0, speed s = NORMAL, direction d = direction::right, char Person_Char = 'T');//构造函数,初始化数据成员void setPersonPosition(int x, int y); //设置人物位置void setPersonDirection(direction d); //设置人物朝向void setPersonSpeed(speed s); //设置人物速度void setPersonChar(char c); //设置人物符号void setMap(MyMazeMap *m); //设置地图对象void start(); //开始游戏void turn(int d = 0); //转向 d=0顺时针 d=1逆时针void gotoxy(int x, int y); //移动光标到(x,y)void move(); //向前移动人物移动void display(); //更新人物在屏幕上的位置direction getManRightSide(); //返回人物的右侧方向
private:char m_cPerson; //人物字符direction m_dDirection; //人物朝向speed m_sSpeed; //人物速度POX m_sPosition; //人物当前位置POX m_sLastPosition; //人物上次的位置,为了制作动画效果MyMazeMap *m_pcMap; //地图对象int m_iSteps; //步数
};
头文件MyMazeMap.h 用来声明迷宫类
#pragma once
#include "maze.h"
#include "MyMazer.h"class MyMazeMap
{
public:MyMazeMap(); //构造函数,初始化数据成员void setMazeMap(int* map, int r, int c); //设置地图,高,宽void setMazeWall(char wall); //设置墙的符号void drawMap(); //绘制地图bool isMazeBound(int x, int y, direction d); //判断(x,y)的d方向上是否是墙bool isBound(int x, int y); //判断(x,y)是否是墙bool isOut(int x, int y); //判断是否走出迷宫int getR(); //返回地图高int getC(); //返回的图宽
private:char m_cWall; //墙的符号char m_cRoad; //路的符号int m_r; //高int m_c; //宽int* m_piMap; //地图
};
源文件MyMazer.cpp 用来实现MyMazer类的成员函数
#include "MyMazer.h"
#include <Windows.h>
#include <iostream>MyMazer::MyMazer(int x, int y, speed s, direction d, char Person_Char) :m_sPosition{ x,y }, m_sSpeed(s), m_dDirection(d), m_cPerson(Person_Char)
{ //初始化m_sLastPosition = m_sPosition;m_pcMap = NULL;m_iSteps = 0;
}void MyMazer::setPersonPosition(int x, int y)
{ //设置人物的位置m_sPosition.x = x;m_sPosition.y = y;
}void MyMazer::setPersonDirection(direction d)
{ //设置人物的朝向m_dDirection = d;
}void MyMazer::setPersonSpeed(speed s)
{ //设置人物的速度m_sSpeed = s;
}void MyMazer::setPersonChar(char c)
{ //设置人物字符m_cPerson = c;
}void MyMazer::setMap(MyMazeMap * m)
{ //设置地图对象m_pcMap = m;
}void MyMazer::start()
{ //游戏开始,使用右手规则走迷宫if (!m_pcMap) {std::cout << "You haven't set map, please use setMap() to continue" << std::endl;return;}gotoxy(m_sPosition.x, m_sPosition.y);std::cout << m_cPerson;while (1) {while(m_pcMap->isMazeBound(m_sPosition.x, m_sPosition.y, getManRightSide())) {turn(1);}turn();move();if (m_pcMap->isOut(m_sPosition.x, m_sPosition.y)) break;display();}gotoxy(0, m_pcMap->getR());std::cout << "闯关成功!!!" << std::endl << "总共走了" << m_iSteps << "步" << std::endl;
}void MyMazer::turn(int d)
{if (d == 0) { //顺时针转向if (m_dDirection == direction::up) m_dDirection = direction::right;else if (m_dDirection == direction::right) m_dDirection = direction::down;else if (m_dDirection == direction::down) m_dDirection = direction::left;else m_dDirection = direction::up;}else { //逆时针转向if (m_dDirection == direction::up) m_dDirection = direction::left;else if (m_dDirection == direction::left) m_dDirection = direction::down;else if (m_dDirection == direction::down) m_dDirection = direction::right;else m_dDirection = direction::up;}
}void MyMazer::gotoxy(int x, int y)
{ //将光标移动至(x,y)if (x < 0 || y < 0) return;COORD cd;cd.X = x;cd.Y = y;HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(handle, cd);
}void MyMazer::move()
{ //向前移动一步m_sLastPosition = m_sPosition;switch (m_dDirection) {case direction::up: m_sPosition.y--; break;case direction::right: m_sPosition.x++; break;case direction::down: m_sPosition.y++; break;case direction::left: m_sPosition.x--; break;}m_iSteps++;
}void MyMazer::display()
{ //显示函数Sleep(m_sSpeed);gotoxy(m_sLastPosition.x, m_sLastPosition.y);std::cout << " ";gotoxy(m_sPosition.x, m_sPosition.y);std::cout << m_cPerson;gotoxy(0, m_pcMap->getR());std::cout << "已经走了" << m_iSteps << "步了" << std::endl;
}direction MyMazer::getManRightSide()
{ //读取人物朝向右侧的方向direction ret;switch (m_dDirection) {case direction::up:ret = direction::right; break;case direction::right:ret = direction::down; break;case direction::down:ret = direction::left; break;case direction::left:ret = direction::up; break;}return ret;
}
源文件MyMazeMap.cpp 用来实现MyMazeMap类的成员函数
#include "MyMazeMap.h"
#include <iostream>
#include <cstdlib>MyMazeMap::MyMazeMap()
{ //初始化数据成员m_c = 0;m_r = 0;m_cRoad = ' ';m_cWall = '*';
}void MyMazeMap::setMazeMap(int * map, int r, int c)
{ //设置迷宫m_piMap = map;m_r = r;m_c = c;
}void MyMazeMap::setMazeWall(char wall)
{ //设置表示墙的符号m_cWall = wall;
}void MyMazeMap::drawMap()
{ //绘制地图system("cls");for (int i = 0; i < m_r; i++) {for (int j = 0; j < m_c; j++) {if (*(m_piMap + m_c*i + j) == WALL) std::cout << m_cWall;else std::cout << m_cRoad;}std::cout << std::endl;}
}bool MyMazeMap::isMazeBound(int x, int y, direction d)
{ //判断面前的是不是墙bool Bound = false;switch (d) {case direction::up:if (isBound(x, y - 1)) Bound = true;break;case direction::right:if (isBound(x + 1, y)) Bound = true;break;case direction::down:if (isBound(x, y + 1)) Bound = true;break;case direction::left:if (isBound(x - 1, y)) Bound = true;break;}return Bound;
}bool MyMazeMap::isBound(int x, int y)
{ //判断(x,y)是不是墙if (isOut(x,y)) return false;if (*(m_piMap + m_c*y + x) == WALL) return true;return false;
}bool MyMazeMap::isOut(int x, int y)
{ //判断是否走出迷宫if (x > m_c - 1 || x<0 || y> m_r - 1 || y < 0) return true;return false;
}int MyMazeMap::getR()
{ //返回迷宫的行数return m_r;
}int MyMazeMap::getC()
{ //返回迷宫的列数return m_c;
}
最后就是源文件maze.cpp了 main函数在这里呢
#include <iostream>
#include <cstdlib>
#include "maze.h"
#include "MyMazeMap.h"
#include "MyMazer.h"using namespace std;const int SUCCESS = 0;
int main()
{int map[10][18] = {{ WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL, },{ WALL,ROAD,WALL,WALL,WALL,WALL,WALL,WALL,WALL,ROAD,ROAD,ROAD,ROAD,WALL,WALL,WALL,WALL,WALL, },{ WALL,ROAD,ROAD,WALL,WALL,WALL,WALL,WALL,WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,WALL,ROAD,WALL, },{ WALL,WALL,ROAD,WALL,WALL,WALL,WALL,WALL,WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,WALL,ROAD,WALL, },{ WALL,WALL,ROAD,ROAD,ROAD,ROAD,ROAD,ROAD,ROAD,ROAD,ROAD,WALL,ROAD,WALL,ROAD,ROAD,ROAD,WALL, },{ WALL,WALL,ROAD,WALL,ROAD,WALL,WALL,WALL,ROAD,WALL,ROAD,ROAD,ROAD,WALL,ROAD,WALL,WALL,WALL, },{ WALL,ROAD,ROAD,WALL,ROAD,WALL,WALL,WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,WALL, },{ WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,WALL, },{ WALL,ROAD,WALL,WALL,ROAD,WALL,WALL,WALL,ROAD,WALL,WALL,ROAD,ROAD,ROAD,ROAD,WALL,WALL,WALL, },{ WALL,ROAD,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL, },};MyMazeMap maze;maze.setMazeMap(&map[0][0], 10, 18); //设置地图maze.drawMap(); //绘制地图MyMazer mazer;mazer.setPersonPosition(16, 2); //设置开始时人物位置mazer.setPersonDirection(direction::up); //设置开始时人物朝向 up right down leftmazer.setPersonSpeed(FAST); //设置速度 FAST NORMAL SLOWmazer.setPersonChar('#'); //设置表示人的字符mazer.setMap(&maze); //设置人物所在地图mazer.start(); //游戏开始system("pause");return SUCCESS;
}
以上,就是走出迷宫的所有代码了
C++实践 走出迷宫相关推荐
- 搜索4--noi6264:走出迷宫
搜索4--noi6264:走出迷宫 一.心得 可以去看看别人的代码,吸收精华 二.题目 6264:走出迷宫 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 当 ...
- 信息学奥赛一本通(1254:走出迷宫)
1254:走出迷宫 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9105 通过数: 4245 [题目描述] 当你站在一个迷宫里的时候,往往会被错综复杂的 ...
- 【NOI】6264:走出迷宫/ 2.5基本算法之搜索
6264:走出迷宫 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会 ...
- 信息学奥赛一本通 1254:走出迷宫 | OpenJudge NOI 2.5 6264:走出迷宫
[题目链接] ybt 1254:走出迷宫 OpenJudge NOI 2.5 6264:走出迷宫 [题目考点] 1. 广搜 迷宫问题 [解题思路] 广搜,迷宫问题模板题. 当数据量很小时,用深搜的方法 ...
- 【浙大脑机接口实验室探秘】人类与AI控制大鼠走出迷宫,C10背负的混合智能未来(视频)...
(文/杨静 )我对浙江大学的脑机接口研究长久以来抱有朝圣般的浓厚兴趣,主要是受浙江大学计算机学院潘纲教授的影响.他在一次演讲里展示了脑控大鼠在一名研究人员的脑电波控制下,快速走迷宫的神奇现场,这只大鼠 ...
- BFS:走出迷宫并输出最小步数
目录 背景 描述 例子 思路 完整代码 收获总结 背景 描述 给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而"."代表墙壁,S表示起点,T代表重点.移动过程中,如果当前位置 ...
- 6264:走出迷宫(DFS和BFS)
描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入 第一行 ...
- 走出迷宫(信息学奥赛一本通-T1254)
[题目描述] 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. [输 ...
- 6264:走出迷宫——BFS
描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入 第一行 ...
最新文章
- linux进入节点权限,一种基于索引节点的Linux访问权限控制方法与流程
- linux提取第一列且删除第一行(awk函数)
- Java机器学习库ML之八关于模型迭代训练的试验
- 关于for循环里边是否可以用return语句
- 在eclipse中安装与配置maven环境
- bzoj1997 [HNOI2010]平面图判定Plana
- 《统计学习方法》P74勘误
- menuconfig和Kconfig、.config的关系
- python字符串的删除操作_Python 字符串操作(string替换、删除、截取、复制、连接、比较、...
- 百度大脑 EasyDL 专业版最新上线自研超大规模视觉预训练模型
- 自学python买什么教材-学习Python的正确姿势—基础教学,教科书该怎么买?
- 自学python-python自学起来难不难?python学习路线分享
- 软件工程需求分析文档模板
- 《嵌入式-STM32开发指南》第三部分 外设篇 - 第5章 光敏传感器
- 【引用】43种名车标志及来历
- 安全网络身份认证系统的设计与实现
- JavaScript DOM加强(佟刚)
- 甲骨文称:IT安全投得多不如投得巧
- 【摘录】Installing Openproj on Ubuntu
- 看懂了数智化转型的产业链逻辑,也就看懂了用友BIP