我正在尝试以随机生成的2d char数组的形式制作2d地图。事实是,它有时仅打印,我不知道为什么。我猜在某些情况下它无法按计划进行并且根本无法打印?如果另一双眼睛可以指出任何事情,我将不胜感激。我这堂课有4张不同的地图,但是没有一张能一致打印。
如果需要,这是.h文件
#ifndef MAP_H
#define MAP_H
#include <iostream>
#pragma once
class Map
{
public:
Map(); // generate map
~Map();
void setTerrainAt(int, int, char);
char getTerrainAt(int, int);
void setPositionAt(int, int, float);
float getPositionAt(int, int);
void setVisualAt(int, int, char);
char getVisualAt(int, int);
void setPlayerMapAt(int, int, char);
char getPlayerMapAt(int, int);
void printVisualMap();
void printTerrainMap();
void printPositionMap();
void generateMap();
void printPlayerMap();
private:
char terrainMap[40][40];
float positionMap[40][40];
char visualMap[40][40];
char playerMap[40][40];
};
#endif
.cpp文件
Map::Map()
{
terrainMap[40][40];
positionMap[40][40];
visualMap[40][40];
playerMap[40][40];
generateMap();
}
Map::~Map()
{
}
void Map::generateMap() {
srand(time(0));
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
switch (1 + rand() % 17) { // randomly fills in 2d array according to the character it generates
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
setTerrainAt(j, i, '#'); // grass
break;
case 11:
case 12:
setTerrainAt(j, i, '~'); // deep water
break;
case 13:
case 14:
setTerrainAt(j, i, '_'); // ice
break;
case 15:
case 16:
setTerrainAt(j, i, ';'); // sand
break;
case 17:
setTerrainAt(j, i, '|');// wall, full cover, can only fire if there is open space on either side of the wall
break;
case 18:
setTerrainAt(j, i, '='); // half cover facing down (-y direction)
break;
}
}
}
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
char posType = getTerrainAt(j, i);
switch (posType) {
case '#':
setPositionAt(j, i, 0);
break;
case '~':
setPositionAt(j, i, -1);
break;
case '_':
setPositionAt(j, i, 0.25);
break;
case ';':
setPositionAt(j, i, 0.5);
break;
case '|':
setPositionAt(j, i, -1);
break;
case '=':
setPositionAt(j, i, 0.75);
break;
}
}
}
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
setVisualAt(j, i, getTerrainAt(j, i));
}
}
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
setPlayerMapAt(j, i, getTerrainAt(j, i));
}
}
}
void Map::setPlayerMapAt(int x, int y, char tile) {
playerMap[y][x] = tile;
}
char Map::getPlayerMapAt(int x, int y) {
return playerMap[y][x];
}
void Map::setVisualAt(int x, int y, char tile) {
visualMap[y][x] = tile;
}
char Map::getVisualAt(int x, int y) {
return visualMap[y][x];
}
void Map::setPositionAt(int x, int y, float position) {
positionMap[y][x] = position;
}
float Map::getPositionAt(int x, int y) {
return positionMap[y][x];
}
void Map::setTerrainAt(int x, int y, char tile) {
terrainMap[y][x] = tile;
}
char Map::getTerrainAt(int x, int y) {
return terrainMap[y][x];
}
void Map::printPositionMap() {
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
std::cout << positionMap[i][j] << ",";
}
std::cout << std::endl;
}
}
void Map::printTerrainMap() {
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
std::cout << terrainMap[i][j] << " ";
}
std::cout << std::endl;
}
}
// visualMap is supposed to have color to help differentiate characters from terrain
void Map::printVisualMap() { // map of everything, including enemy and player positions
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
switch (visualMap[i][j]) { // ~ # _ n ^ | < > = switch these characters out for below
case '#':
SetConsoleTextAttribute(h, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case '~':
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case '_':
SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case ';':
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
case '=':
SetConsoleTextAttribute(h, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case '|':
SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
break;
default:
SetConsoleTextAttribute(h, COMMON_LVB_REVERSE_VIDEO);
break;
}
std::cout << visualMap[i][j];
SetConsoleTextAttribute(h, COMMON_LVB_REVERSE_VIDEO);
std::cout << " ";
}
std::cout << std::endl;
}
}
void Map::printPlayerMap() { // map of just what the player sees
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 40; j++) {
std::cout << playerMap[i][j] << " ";
}
std::cout << std::endl;
}
}