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++实践 走出迷宫相关推荐

  1. 搜索4--noi6264:走出迷宫

    搜索4--noi6264:走出迷宫 一.心得 可以去看看别人的代码,吸收精华 二.题目 6264:走出迷宫 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 当 ...

  2. 信息学奥赛一本通(1254:走出迷宫)

    1254:走出迷宫 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 9105     通过数: 4245 [题目描述] 当你站在一个迷宫里的时候,往往会被错综复杂的 ...

  3. 【NOI】6264:走出迷宫/ 2.5基本算法之搜索

    6264:走出迷宫 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会 ...

  4. 信息学奥赛一本通 1254:走出迷宫 | OpenJudge NOI 2.5 6264:走出迷宫

    [题目链接] ybt 1254:走出迷宫 OpenJudge NOI 2.5 6264:走出迷宫 [题目考点] 1. 广搜 迷宫问题 [解题思路] 广搜,迷宫问题模板题. 当数据量很小时,用深搜的方法 ...

  5. 【浙大脑机接口实验室探秘】人类与AI控制大鼠走出迷宫,C10背负的混合智能未来(视频)...

    (文/杨静 )我对浙江大学的脑机接口研究长久以来抱有朝圣般的浓厚兴趣,主要是受浙江大学计算机学院潘纲教授的影响.他在一次演讲里展示了脑控大鼠在一名研究人员的脑电波控制下,快速走迷宫的神奇现场,这只大鼠 ...

  6. BFS:走出迷宫并输出最小步数

    目录 背景 描述 例子 思路 完整代码 收获总结 背景 描述 给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而"."代表墙壁,S表示起点,T代表重点.移动过程中,如果当前位置 ...

  7. 6264:走出迷宫(DFS和BFS)

    描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入 第一行 ...

  8. 走出迷宫(信息学奥赛一本通-T1254)

    [题目描述] 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. [输 ...

  9. 6264:走出迷宫——BFS

    描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入 第一行 ...

最新文章

  1. linux进入节点权限,一种基于索引节点的Linux访问权限控制方法与流程
  2. linux提取第一列且删除第一行(awk函数)
  3. Java机器学习库ML之八关于模型迭代训练的试验
  4. 关于for循环里边是否可以用return语句
  5. 在eclipse中安装与配置maven环境
  6. bzoj1997 [HNOI2010]平面图判定Plana
  7. 《统计学习方法》P74勘误
  8. menuconfig和Kconfig、.config的关系
  9. python字符串的删除操作_Python 字符串操作(string替换、删除、截取、复制、连接、比较、...
  10. 百度大脑 EasyDL 专业版最新上线自研超大规模视觉预训练模型
  11. 自学python买什么教材-学习Python的正确姿势—基础教学,教科书该怎么买?
  12. 自学python-python自学起来难不难?python学习路线分享
  13. 软件工程需求分析文档模板
  14. 《嵌入式-STM32开发指南》第三部分 外设篇 - 第5章 光敏传感器
  15. 【引用】43种名车标志及来历
  16. 安全网络身份认证系统的设计与实现
  17. JavaScript DOM加强(佟刚)
  18. 甲骨文称:IT安全投得多不如投得巧
  19. 【摘录】Installing Openproj on Ubuntu
  20. 看懂了数智化转型的产业链逻辑,也就看懂了用友BIP

热门文章

  1. Javascript 汉字转首字母的拼音 js文件(支持多音字的选择)
  2. 【iTerm】教程 常用命令
  3. java 定时器(整点报时)
  4. 分享企业融资技巧与方法及常见有效融资途径
  5. 计算机相关设备有哪些,电脑设备有哪些
  6. Navicat Premium数据库开发工具
  7. 文件的打开方式(三种)
  8. buuctf——(SUCTF2019)SignIn
  9. vscode中搭建Golang开发环境(图文并茂)
  10. element 表单只允许输入数字和两位小数,保留两位小数(四舍五入) 小数不足两位补0