我正在使用一个名为libtcod的C ++引擎在类似流氓的游戏中打印出ASCII字符。
在游戏中,我想将“地图”表示为地图类型的二维数组,其中包含瓷砖的“layer1”,例如Grass,Sand,Water,以及第二层,用于表示layer2顶部的对象,例如树木和巨石。
我创建了Map类,它包含两个属性;一个是Tile类型,另一个是Object类型。
但是我似乎在创建2D数组本身时遇到了困难。
我收到错误:“数组可能没有此类型的元素”
#include "libtcod.hpp"
#include <ctime>
#include <stdio.h>
#include <ciso646>
#include <cstring>
static const TCODColor colour_darkWall(128, 128, 128);
static const TCODColor colour_grass(0, 255, 0);
static const TCODColor colour_black(0, 0, 0);
static const TCODColor colour_white(255, 255, 255);
static const TCODColor colour_blue(0, 0, 255);
static const TCODColor colour_brown(139, 69, 19);
static const TCODColor colour_red(255, 0, 0);
int i, j;
class object {
public:
char name[20];
TCODColor colour;
char symbol;
bool passable;
object(int layer_id) {
if (layer_id == 0) { //EMPTY
strcpy(name, "NA");
symbol = ' ';
passable = true;
colour = colour_white;
}
else if (layer_id == 1) { //TREE
strcpy(name, "Tree");
symbol = '^';
passable = false;
colour = colour_grass;
}
else if (layer_id == 2) { //ROCK
strcpy(name, "Rock");
symbol = 'R';
passable = false;
colour = colour_black;
}
}
};
class tile {
public:
char name[20];
TCODColor colour;
bool passable;
tile(int layer_id) {
if (layer_id == 0) { //WATER
strcpy(name, "Water");
colour = colour_blue;
passable = false;
}
else if (layer_id == 1) { //GRASS
strcpy(name, "Grass");
colour = colour_grass;
passable = true;
}
else if (layer_id == 2) { //SAND
strcpy(name, "Sand");
colour = colour_brown;
passable = true;
}
}
};
class Map {
public:
tile layer1;
object layer2;
Map(int layer1_id, int layer2_id) {
layer1 = tile(layer1_id);
layer2 = object(layer2_id);
}
};
int main() {
const int window_x = 150;
const int window_y = 50;
Map[][] map = new Map[5][5];
TCODConsole::initRoot(window_x, window_y, "CivSim v0.1", false);
while (!TCODConsole::isWindowClosed()) {
TCODConsole::root->clear();
TCODConsole::root->putChar(0, 0, map.layer2.symbol);
TCODConsole::flush();
}
return 0;
}
不确定如何创建有问题的2D阵列。
提前感谢您的帮助!
答案 0 :(得分:0)
Map[][] map = new Map[5][5];
不合法。只能省略第一个维度。您需要Map[][5] map = new Map[5][5];
或更好Map (*map)[5] = new Map[5][5];
。
原因是在类型中使用[]
的这些符号只是描述指针类型的另一种(并且令人困惑)方式。所以int[] x
只是一种不同的写作方式int* x
而Map[][5] m
只是写Map (*m)[5]
的另一种方式(也就是指向五个数组的数组的指针)。
我认为你应该总是使用这些符号的指针版本,它更准确地描述了你真正在做的事情。从长远来看编写看起来像你有一个数组的代码,当你实际拥有的只是一个指针令人困惑。
那么为什么不是Map[][]
另一种写作方式Map**
?这是因为C和C ++中数组和指针之间的相似性仅适用于一个级别。二维数组是指向指针数组的指针的根本不同的结构。因此int[5][5]
与int**
不兼容,因此没有理由让int[][]
与int**
相同。