实现老鼠走迷宫(学校作业)-思考题更新中

题目

题目描述与设计要求

设计思路与其他要求

初步设计思路

准备采用堆栈的方法实现。
创建了3个抽象类,分别完成目的。 这里放上类图
抽象类的关系
Maze类: 用于初始化迷宫(目前是完成题目前半段,之间用固定数组)
Mouse类: 老鼠类实现方法
Stack: 普通的堆栈

实现代码

因为有注释就不写实现思路了。

// Maze.h
#pragma once
#include<iostream>
using namespace std;

class Maze
{
public:
	Maze(int (*ms)[9]);		//定义的动态将数值改为变量即可以自定义迷宫
	void display();			//地图打印
	~Maze();
	int** MazeSpace;		//数组第一维为列,第二维为行
};

//Stack.h
class Stack
{
	public:
		Stack(int size = 10) ;				//堆栈初始化
		~Stack();
		void push(int p);					//push数据		
		int pop();							//pop数据
		int top()const;						//得到最外面的数据
		bool full()const { return this->mtop == this->msize - 1; }
		bool empty()const { return this->mtop == -1; }

	private:
		int* mpStack;	// 存放栈的元素
		int mtop;		// 栈顶指针
		int msize;		// 栈的总长度

		void resize()   //stack的动态扩容函数要私有化
		{
			int* ptemp = new int[msize * 2];
			for (int i = mtop; i >= 0; i--)
			{
				ptemp[i] = mpStack[i];
			}
			delete[]mpStack;
			mpStack = ptemp;
			msize *= 2;
		}
	};


//Mouse.h
#pragma once
#include"Maze.h"
#include"Stack.h"

class Mouse
{
public:
	Mouse(int(*ms)[9]);
	void findMazePath();			//找路
	void display();					//显示地图
	void showPath();				//显示老鼠走过的路径

private:
	const int RIGHT = 0;
	const int DOWN = 1;
	const int LEFT = 2;
	const int UP = 3;
	Maze maze;
	Stack s;
};

//Maze.cpp
#include "Maze.h"

//采用了动态数组,在此题之后如果需要可以更改迷宫的格式
Maze::Maze(int (*ms)[9]) {
	MazeSpace = new int * [9];		//开辟一维数组
	for (int i = 0; i < 9; ++i)
	{
		MazeSpace[i] = new int[9];	//在一维的基础上再开辟二维
	}

	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			MazeSpace[i][j] = ms[i][j];
		}
	}
}

//改成自定义迷宫时只需将数值改为传入数组的大小即可
void Maze::display()
{
	cout << "迷宫的图形为" << endl;
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			if (MazeSpace[i][j] == 1) {
				cout << "█";
			}
			else
			{
				cout << "  ";
			}
		}
		cout << endl;
	}
}

Maze::~Maze() {
	for (int i = 0; i < 9; i++)
	{
		delete[] MazeSpace[i];
	}
	delete[] MazeSpace;
}

//Stack.cpp
#include "Stack.h"


//堆栈初始化
Stack::Stack(int size) :mtop(-1), msize(size)
{
	mpStack = new int[msize];
}

Stack::~Stack()
{
	delete[]mpStack;
	mpStack = nullptr;
}

//push数据	
void Stack::push(int p)
{
	if (this->full())
		this->resize();
	mpStack[++mtop] = p;
}

//pop数据
int Stack::pop()
{
	if (this->empty())
		return -1;
	int move = mpStack[mtop];
	this->mtop--;
	return move;
}

//得到最外面的数据
int Stack::top() const
{
	if (empty())
		throw"";
	return this->mpStack[this->mtop];
}

//Mouse.cpp
#include "Mouse.h"
#include"Mouse.h"

Mouse::Mouse(int(*ms)[9]) :maze(ms) { ; }


//可以通过更改i与j开始的取值改变迷宫入口
//可以通过更改i与j最后的取值改变迷宫出口
//将走过的路线设定为3,如有需要可以单独打印走错的路线,或者其他需求
void Mouse::findMazePath()		
{
	int i = 0;				//i为行
	int j = 3;				//j为列
	for (; i != 7 || j != 8;) {
		if (i != 8) {
			if (maze.MazeSpace[i + 1][j] == 0) {		//down
				maze.MazeSpace[i + 1][j] = 3;			//将其设定为已经走过
				s.push(DOWN);							//记录路线
				i++;
				continue;
			}
		}
		if (j != 8) {
			if (maze.MazeSpace[i][j + 1] == 0) {		//right
				maze.MazeSpace[i][j + 1] = 3;
				s.push(RIGHT);							//记录路线
				j++;
				continue;
			}
		}
		if (j != 0) {
			if (maze.MazeSpace[i][j - 1] == 0) {		//left
				maze.MazeSpace[i][j - 1] = 3;
				s.push(LEFT);							//记录路线
				j--;
				continue;
			}
			if (i != 0) {
				if (maze.MazeSpace[i - 1][j] == 0) {	//left
					maze.MazeSpace[i - 1][j] = 3;
					s.push(UP);							//记录路线
					i--;
					continue;
				}
			}
		}
		switch (s.pop())								//回退
		{
		case 0:
			j--;
			break;
		case 1:
			i--;
			break;
		case 2:
			j++;
			break;
		case 3:
			i++;
			break;
		}
	}
}

void Mouse::display() {
	maze.display();
}


//依旧和之前一样如果是自定义迷宫只需将里面的数值改为变量即可

//老鼠路径
void Mouse::showPath()
{
	if (s.empty())//判断路径栈是否空
	{
		cout << "该迷宫不存在可通行的路径" << endl;
		return;
	}


	int i = 7;
	int j = 8;
	maze.MazeSpace[0][3] = 2;
	for (; i != 0 || j != 3;) {
		switch (s.pop())
		{
		case 0:
			maze.MazeSpace[i][j--] = 2;
			break;
		case 1:
			maze.MazeSpace[i--][j] = 2;
			break;
		case 2:
			maze.MazeSpace[i][j++] = 2;
			break;
		case 3:
			maze.MazeSpace[i--][j] = 2;
		}
	}

	cout << "老鼠的路径为" << endl;
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			if (maze.MazeSpace[i][j] == 1) {
				cout << "█";
			}
			//此处因为失败设定为3,如有需要可以单独打印走错的路线
			else if (maze.MazeSpace[i][j] == 0 || maze.MazeSpace[i][j] == 3)
			{
				cout << "  ";
			}
			else {
				cout << " *";
			}
		}
		cout << endl;
	}
}

思考题

更新中

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值