如何使用2D数组创建游戏地图?

时间:2019-07-28 23:02:30

标签: c++

地图包含水,土地,山。 此地图表示为名为CMap的类,其具有以下属性:

高度和宽度为64的2D阵列瓷砖,每个瓷砖均为整数,其中值0是水,1是土地,2是山,3是镇,4是 洞穴和5是一座城堡。

世界上非水瓷砖的数量。

世界上填充的瓷砖(即城镇或城堡)的数量

1 个答案:

答案 0 :(得分:0)

没有指定确切答案(因为这听起来像是作业/作业)...

听起来您的瓷砖类型需要enumerated type

也许是这样的:

enum CMapTile
{
    WATER    = 0,
    LAND     = 1,
    MOUNTAIN = 3,
    TOWN     = 4,
    CASTLE   = 5
};

这意味着您可以为数字使用符号(更易读)的字符串名称。例如,指定LAND而不是1。不必在定义中指定数字,但是当这些列表变长时,当类型为17时,您可能会遇到问题,并且添加数字(甚至作为注释)也很容易查找它们。

根据对工作的期望,可以简单地静态分配2D对象块。静态选项仅为您提供固定大小的地图,例如:

CTileMap tiles[64][64];  // Fixed-size 2D array.  (super-boring)

否则,可以动态分配地图的空间。 2D地图的动态分配在运行时仅获取足够的内存。它允许您保留地图所需的确切空间量,因此更加灵活。但是,它比较复杂,需要两个步骤。当某人试图将地图制作得比机器的内存更大时,您还需要处理这种情况。

因此,首先分配一个数组以容纳所有行。分配是行指针的分配。这是因为您的地图数组是行指针数组,并且每个行指针都指向CMapTile数组-有点像argv的{​​{1}}变量(除非是char *数组) ,而不是CMapTile *)。

main()

然后为每个行指针,为宽度分配另一个数组:

// allocate an array of row-pointers length <map_height>
CMapTile** tiles = new CMapTile*[map_height];  

这为您提供了可以访问的地图:

for ( int i=0; i<map_height; i++ )
    tiles[i] = new CMapTile[map_width];  // allocate row[i], length <map_width>

确保处理内存分配失败-这将是if ( tiles[y][x] == TOWN ) populated_lands += 1 返回NULL的时候。

因此,地图分配函数可能看起来像这样:
new()widthheight是类成员变量

tiles