看了大致三天的C++基础的教程,视频最后让用一个走迷宫的程序来综合总结一下,于是便开始敲,设计算法到编程实现及测试共花费大致四个小时时间,
整体框架
整体设计一共创建两个类: Maze(迷宫类)、Person(人),采用OOP,编写人走的方法在迷宫里探索。
核心点
1.由于还是在控制台,没有任何的图形库支持,所以迷宫的墙就以*代替,路就是空格。人物呢我则按照教程展示中的使用T。
2.绘制人物移动的动画的效果,通过使用windos.h头文件下的控制光标的函数实现。
void Person::gotoxy(int x, int y)
{
COORD cd;
cd.X = x;
cd.Y = y;
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle, cd);
}
具体的效果就是控制你的光标到(x,y)位置使你在此进行输出,所以实现逻辑就是控制光标移动之后直接cout人物的标志即可。
3.逻辑算法:整体实现上呢,遵循左手规则
按照这个流程进行逻辑判断,在设计过程中呢有一些思考点和注意点。
gotoxy这个函数是根据计算机的坐标系来定位的,与使用数组不同,也就是说计算机的左上角为(0,0),右方向为x正方向,下方向为y正方向
其次,我们始终遵循左手规则,但是每次转身之后你所判断的左方的位置便随之改变。
根据流程图设计出判断逻辑:
string Person::judge(Maze map)
{
if (((m_iX + m_iLRDirection) < 0) || ((m_iY + m_iFBDirection) < 0))return "succ";
if (map.getMap()[m_iY][m_iX + m_iLRDirection] != '*') //左右走
{
m_iX += m_iLRDirection;
m_iFBDirection *= -1;
}
else if (map.getMap()[m_iY + m_iFBDirection][m_iX] != '*') //前后走
{
m_iY += m_iFBDirection;
m_iLRDirection *= -1;
}
else
{
m_iLRDirection *= -1;
m_iFBDirection *= -1;
}
return "fail";
}
这里方向我只设计了两个参数,由于之前使用过游戏引擎,所以在思考时有一点启发,只定义了两个参数进行方向的对应,就是fbdirection 和 lrdirection,两个参数的初始值为-1,因为我设定人物初始方向为正北,所以对应数组判断时应该是两个-1才能判断到左和前两个方向。两个参数的正负用于表示不同方向情况下判断当前方向所对应的左和前。
PS:由于gotoxy函数的坐标特殊性,我们设定人物的坐标与计算机坐标系相同对应,所以在使用人物坐标对数组进行访问时应该注意对应关系不要搞混了。