[A*算法02]Graph类构建

Posted AIplusX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[A*算法02]Graph类构建相关的知识,希望对你有一定的参考价值。

写在前面

今天主要完成了基本地图Graph类的设计以及实现,我设置的控制台的大小是960X480,每个格子的大小是32,水平往右是x轴正方向,竖直向下是y轴正方向,因此x轴总共有30个格子,y轴总共有15个格子。

知识点

1:特定范围随机数生成方法:

#define RANDOM(a) (rand()%a) 
#define RANDOM_RANGE(a,b) (rand()%(b-a+1)+a)  //[i, j]

2:C语言字符串换行:

利用“ \\ ”符号进行同一个语句换行。

Graph类构建

首先是我设计了一个UserPara的结构体,用来存储用户数据,源码如下图所示:

typedef struct _UserPara
{

	public:
		int win_width = 960;
		int win_height = 480;
		int block_size = 32;
		int obstacle_num = 88;
		int map[30][15] = { 0 };// 960/32 = 30, 480/32 = 15 
		int map_x = win_width / block_size;
		int map_y = win_height / block_size;

}UserPara;

我的设计思路是将所有可调参数都整理到这个struct里面,然后将这个struct再做为参数传递给Graph类,这样集中参数方便二次开发。

今天主要是做的是Graph类的地图绘制构建,效果图如下:

青色的方块是可走的路径,黑色的方块是障碍物,后期还会加入起点和终点,今天最主要是将基本框架搭建完毕,地图展现的源码如下所示:


void Graph::show_map()
{
	srand((unsigned)time(NULL));
	initgraph(graph_user_para.win_width, graph_user_para.win_height);
	settextstyle(16, 8, _T("Courier"));	
	setbkcolor(WHITE);
	cleardevice();

	for (int i = 0; i < graph_user_para.obstacle_num; i++) {
		graph_user_para.map[obstacle[i].x][obstacle[i].y] = OBSTACLE;
	}

	for (int i = 0; i < graph_user_para.map_x; i++) {
		for (int j = 0; j < graph_user_para.map_y; j++) {

			switch (graph_user_para.map[i][j])
			{
			case PATH:
				setfillcolor(LIGHTCYAN);
				break;
			case OBSTACLE:
				setfillcolor(BLACK);
				break;
			default:
				break;
			}
			fillrectangle(i * graph_user_para.block_size, j * graph_user_para.block_size, \\
				(i + 1) * graph_user_para.block_size, (j + 1) * graph_user_para.block_size);
		}
	}
}

为了增加代码的简洁性,我尽量减少在程序中使用绝对位置,而是使用相对位置进行图像绘制。

Graph类的构造函数和析构函数如下所示:

Graph::Graph(UserPara graph_user_para)
{
	graph_user_para = graph_user_para;
	obstacle = new Point[graph_user_para.obstacle_num];

	for (int i = 0; i < graph_user_para.obstacle_num; i++) {
		obstacle[i].x = int(RANDOM_RANGE(0, graph_user_para.map_x));
		obstacle[i].y = int(RANDOM_RANGE(0, graph_user_para.map_y));
		//graph_user_para.map[obstacle[i].x][obstacle[i].y] = OBSTACLE;
	}


}

Graph::~Graph()
{
	delete[] obstacle;
}

记住,在C++类进行析构的时候一定要释放new的内存,否则很容易造成内存泄漏。

以上是关于[A*算法02]Graph类构建的主要内容,如果未能解决你的问题,请参考以下文章

论文笔记:Weighted Graph Cuts without Eigenvectors:A Multilevel Approach

我可以在片段中构建操作栏吗?

狄克斯特拉算法

实验四

为不同的文件扩展名调用不同的函数

迪克斯特拉算法python实现