建筑解决方案有时仅打印阵列吗?

时间:2019-12-02 21:19:04

标签: c++ arrays multidimensional-array

我正在尝试以随机生成的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;
    }
}


0 个答案:

没有答案