写在前面

今天主要完成了基本地图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);
        }
    }
}

Point类是用来存放存放二维坐标的,实现较为简单:


class Point
{
    public:
        Point();
        Point(int x1, int y1);

        int x;
        int y;

};

Point::Point()
{
    x = 0;
    y = 0;
}

Point::Point(int x1, int y1)
{
    x = x1;
    y = y1;
}

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

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的内存,否则很容易造成内存泄漏。