地图包含水,土地,山。 此地图表示为名为CMap的类,其具有以下属性:
高度和宽度为64的2D阵列瓷砖,每个瓷砖均为整数,其中值0是水,1是土地,2是山,3是镇,4是 洞穴和5是一座城堡。
世界上非水瓷砖的数量。
世界上填充的瓷砖(即城镇或城堡)的数量
答案 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()
,width
和height
是类成员变量
tiles