为了账号安全,请及时绑定邮箱和手机立即绑定

关于走出迷宫案例的疑问

老师你好,这个案例我最终是做出你演示的效果了,但是实现的方法不太好,其中遇到了一些问题。


1、我最终的程序没有在MyMazer类里面写start()函数,原因是我发现这里面我需要调用到另一个类中的检查边界函数,我不明白这要怎么实现;

2、我在  源.c 这个文件里面除了写了main()函数,还写了检查边界函数,之所以没有把这个函数放在迷宫类里面,是因为我在这个函数中需要使用到MyMazer类中的成员(具体我用到的是人的位置和方向,我是不停的检测当前所处位置的边界情况)

因为这两点,程序比较乱,感觉完全没有发挥出c++中类的优势。。我自己总结了一下,造成这两点的主要原因在于:我在写一个类的成员函数的时候,经常遇到需要调用另一个类的成员参数的情况,我百度了一下,没有发现什么好的方法,仔细想想,这样的做法确实不太合理。希望老师或者其他同学可以指导一下,谢谢!


PS:老师能不能给出你的程序,我想看看您的start() 和检查边界函数是怎么实现的。

正在回答

1 回答

#include <iostream>
#include <stdio.h>
#include "MyMazer.h"
#include "MyMazeMap.h"
#include <Windows.h>
using namespace std;
int checkEdge(MyMazer *p, MyMazeMap *q, char dir, int x, int y);//迷宫边界检查函数

int main()
{
	int WALL = 1;
	int ROAD = 0;
	int map[8][9] = {
		{ WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL},
		{ WALL, WALL, ROAD, WALL, ROAD, ROAD, WALL, ROAD, WALL}, 
		{ WALL, WALL, ROAD, ROAD, ROAD, WALL, ROAD, ROAD, WALL},
		{ WALL, WALL, ROAD, WALL, ROAD, WALL, ROAD, WALL, WALL},
		{ WALL, WALL, ROAD, WALL, ROAD, ROAD, ROAD, WALL, WALL},
		{ WALL, WALL, ROAD, WALL, ROAD, WALL, ROAD, ROAD, WALL},
		{ WALL, ROAD, ROAD, WALL, ROAD, WALL, WALL, ROAD, WALL},
		{ WALL, ROAD, WALL, WALL, WALL, WALL, WALL, ROAD, WALL}
	};
	MyMazeMap maze;
	maze.setMazeMap(&map[0][0], 8, 9);
	maze.setMazeWall("*");
	maze.drawMap();
	MyMazer mazer;
	mazer.setPersonPosition(7, 1);
	mazer.setPersonChar('T');

	mazer.gotoxy(mazer.getX(), mazer.getY());
	mazer.printPer();
	Sleep(1000);
	do
	{
		Sleep(200);
		if (checkEdge(&mazer, &maze, 'L', mazer.getX(), mazer.getY()) == 0)
		{
			mazer.changeDirection(0);//左边是0,左转
			mazer.gotoxy(mazer.getX(), mazer.getY());
			cout << " ";
			mazer.goOneStep();
			mazer.gotoxy(mazer.getX(), mazer.getY());
			mazer.printPer();
			continue;
		}
		else
		{
			if (checkEdge(&mazer, &maze, 'A', mazer.getX(), mazer.getY()) == 0)
			{
				mazer.gotoxy(mazer.getX(), mazer.getY());
				cout << " ";
				mazer.goOneStep();
				mazer.gotoxy(mazer.getX(), mazer.getY());
				mazer.printPer();
				continue;
			}
			else
			{
				mazer.changeDirection(1);
				continue;
			}
		}
	} while (mazer.getX() != 0 && mazer.getY() != 0 && mazer.getX() != 7 && mazer.getY() != 8);

	mazer.gotoxy(15, 0);
	cout << "O(∩_∩)O" << endl;
	cout << endl << endl << endl << endl << endl;


	system("pause");
	return 0;
}

int checkEdge(MyMazer *p, MyMazeMap *q, char dir, int x, int y)
{
	int temp;
	if (dir == 'L')
	{
		if (p->getDir() == 1)
		{
			temp = *(q->getm_pMazeMap() + x * 9 + y - 1);
			return temp;
		}
		else
		{
			if (p->getDir() == 2)
			{
				return *(q->getm_pMazeMap() + (x - 1) * 9 + y);
			}
			else
			{
				if (p->getDir() == 3)
				{
					return *(q->getm_pMazeMap() + x * 9 + y + 1);
				}
				else
				{
					return *(q->getm_pMazeMap() + (x + 1) * 9 + y);
				}
			}
		}
	}
	else
	{
		if (p->getDir() == 1)
		{
			return *(q->getm_pMazeMap() + (x - 1) * 9 + y);
		}
		else
		{
			if (p->getDir() == 2)
			{
				return *(q->getm_pMazeMap() + x * 9 + y + 1);
			}
			else
			{
				if (p->getDir() == 3)
				{
					return *(q->getm_pMazeMap() + (x + 1) * 9 + y);
				}
				else
				{
					return *(q->getm_pMazeMap() + x * 9 + y - 1);
				}
			}
		}
	}
}


3 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C++远征之封装篇(下)
  • 参与学习       70898    人
  • 解答问题       534    个

封装--面向对象三大特征之一,通过案例让C++所学知识融会贯通

进入课程

关于走出迷宫案例的疑问

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号