【发布时间】:2021-07-14 23:59:39
【问题描述】:
软件:Visual Studio 2017 社区
大家好,
我正在用 C++ 制作一个简单的 2d 控制台游戏(如果你知道的话,可能是非常简化的矮人要塞)。
我希望在控制台中使用 ASCII 显示地图。
类似这样的:
我在头文件(简化版)中声明了一个 WorldMap 类。 我在里面声明了一个二维数组。
#pragma once
#include <iostream>
class WorldMap
{
public:
WorldMap();
virtual ~WorldMap();
private:
int worldWidth;
int worldHeight;
char worldMap; // Declare a variable that will hold all the characters for the map
};
然后在.cpp文件中定义:
#include "WorldMap.h"
#include <algorithm>
WorldMap::WorldMap()
{
worldWidth = 50;
worldHeight = 50;
worldMap[50][50]; // Define the map array
// And then here I will also somehow need to be able to fill the whole map with '.' symbols, and so on
}
这就是我想要实现的基本理念。我之所以不能立即定义数组大小是因为我希望在创建地图时能够选择地图的大小。
我已经试过了:
- 上面的代码。
错误:
error C2109: subscript requires array or pointer type
- 将二维数组声明为
char worldMap[][];,然后将其定义为worldMap[50][50];。
错误:
error C2087: 'worldMap': missing subscript
warning C4200: nonstandard extension used: zero-sized array in struct/union
message : This member will be ignored by a defaulted constructor or copy/move assignment operator
- 将二维数组声明为
char worldMap[worldWidth][worldHeight];,期望在创建对象时先定义宽度和高度变量,然后再定义数组。
错误:
error C2327: 'WorldMap::worldWidth': is not a type name, static, or enumerator
error C2065: 'worldWidth': undeclared identifier
error C2327: 'WorldMap::worldHeight': is not a type name, static, or enumerator
error C2065: 'worldHeight': undeclared identifier
- 使用
char* worldMap;和char** worldMap,但到目前为止我什至无法理解双指针是如何工作的,但char* worldMap实际上可以毫无错误地使用一维数组,直到我开始访问数组中元素的值.
我想一种解决方法是使用字符串或一维字符数组,并且在显示它时只需使用 mapWidth 来结束每 50 个字符的行,例如,这将给出相同的结果。但我觉得这不是实现这一目标的好方法,因为我需要访问这张地图的 x 和 y 坐标等等。
我想我要问的是:
- 为类声明二维数组然后在对象中定义它的最佳方式是什么?
- 为这样的主机游戏存储地图的最佳方式是什么? (不一定使用数组)
感谢您的阅读。我将非常感谢任何帮助,即使只是想法和提示也可能将我推向正确的方向:)
【问题讨论】:
-
对于在编译时大小未知的数组,您使用动态内存分配。在 C++ 中,您实际上不需要做太多事情,因为标准库为您提供了
std::vector,它已经为您完成了所有复杂的事情。了解此功能后,您可能会认为std::vector<std::vector<char>>可能是您正在搜索的内容。这可行,但在性能方面并不理想。为了获得最佳性能,人们通常使用词法索引(例如idx = y * width + x),这几乎就是您自己提出的。然后可以将其包装到类或函数中。 -
@TedLyngmo 抱歉,我已经删除了该评论,因为该部分可能被解释为具有构造函数的参数,该参数可能仍然是静态的。但我想这有点牵强......
-
Here's an example of a wrapper class 就是 PaulG 所说的。
-
This 深入探讨了我提到的性能注意事项。
-
最后,您的尝试无效的原因: 1.
WorldMap是char不是字符数组。这永远行不通。 2. 如果num_elements在编译时已知,char array[num_elements]声明仅适用于标准 C/C++。有一些编译器(gcc)允许您以不同的方式使用它(甚至可能像您尝试过的那样,我不知道),这意味着“非标准扩展”。 3. 从指针开始是向动态内存方向迈出的一步,但你仍然需要分配内存让它工作。但是使用像这样的“原始”指针是 C 的做事方式。
标签: c++ arrays oop visual-c++