在C中打印二维地图

时间:2017-01-24 22:49:23

标签: c loops printf

我有一个用ASCII打印的游戏板,我希望最终看起来像这样

            ___
3       ___/ 1 \___  ___
    ___/ 2 \___/ 2 \/ 3 \
2  / 1 \___/ 3 \___/\___/___
   \___/ 2 \___/        / 2 \
1  / 1 \___/ 1 \___     \___/
   \___/ 2 \___/ 2 \
0      \___/   \___/

     1   2   3   4

地图沿x轴和y轴分布,地图的大小也是固定的。要打印的数字都存储在2d数组中。如上所示,其中一些也可能是空的。 这是我试图做的事情。 map-> sizeX和map-> sizeY给出地图的X轴和y轴的大小。如果该块中的数字为0,则表示该块不存在,我们不打印它。任何帮助将不胜感激。

void printMap(struct Map *map) {
    for (int i = 0; i < map->sizeX; ++i) {
        for (int k = 0; k < map->sizeX && i == 0; ++k)
            printf(" ___ ");
        printf("\n");
        for (int j = 0; j < map->sizeY; ++j) {
            if(i == 0) {
                printf("/ %d \\", giveFloe(map, i, j)->numbOfFish);
            }
            else {
                printf("/ %d \\", giveFloe(map, i, j)->numbOfFish);
            }
        }
        printf("\n");
        for (int l = 0; l < map->sizeX; ++l)
            printf("\\___/");
    }
    printf("\n");
}

这是我得到的输出,因为我无法正确打印第一行,我没有继续。地图不超过15 x 15,所以我确信它可以打印在终端窗口上。

 ___  ___  ___  ___  ___  ___  ___  ___  ___  ___ 
/ 3 \/ 0 \/ 2 \/ 0 \/ 2 \/ 0 \/ 3 \/ 0 \/ 1 \/ 0 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 0 \/ 0 \/ 0 \/ 2 \/ 0 \/ 1 \/ 0 \/ 3 \/ 0 \/ 3 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 2 \/ 0 \/ 3 \/ 0 \/ 3 \/ 0 \/ 3 \/ 0 \/ 1 \/ 0 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 0 \/ 1 \/ 0 \/ 2 \/ 0 \/ 2 \/ 0 \/ 2 \/ 0 \/ 3 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 3 \/ 0 \/ 0 \/ 0 \/ 2 \/ 0 \/ 3 \/ 0 \/ 1 \/ 0 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 0 \/ 3 \/ 0 \/ 2 \/ 0 \/ 1 \/ 0 \/ 3 \/ 0 \/ 1 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 3 \/ 0 \/ 2 \/ 0 \/ 2 \/ 0 \/ 3 \/ 0 \/ 2 \/ 0 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 0 \/ 2 \/ 0 \/ 3 \/ 0 \/ 3 \/ 0 \/ 2 \/ 0 \/ 2 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 3 \/ 0 \/ 2 \/ 0 \/ 3 \/ 0 \/ 3 \/ 0 \/ 2 \/ 0 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
/ 0 \/ 2 \/ 0 \/ 3 \/ 0 \/ 1 \/ 0 \/ 3 \/ 0 \/ 3 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/

这是我能得到的,假设地图不会超过终端窗口。我需要地图看起来像上面绘制的六边形。

struct Map {
    struct Floe *mapPointer;
    int sizeX;
    int sizeY;
    struct Box *changelog;
    int changeCount;
    int maxChanges;
    struct Player *players;
    int playerCount;
};

giveFloe()接收结构图并返回该坐标上的floe

struct Floe {
    int numbOfFish; 
    int whosPenguin; 
};

1 个答案:

答案 0 :(得分:1)

我认为你的第一步可能是重新思考网格是如何布局的。

首先,您应该知道每个六边形应该打印在哪一行上(请注意我的图像如何将每一行视为一行)。

第二,在同一行上有两个六边形是否合法是否合法?请参阅网格右侧的六边形32

            ___
5       ___/ 1 \___  ___
4   ___/ 2 \___/ 2 \/ 3 \
3  / 1 \___/ 3 \___/\___/___
2  \___/ 2 \___/        / 2 \
1  / 1 \___/ 1 \___     \___/
0  \___/ 2 \___/ 2 \
       \___/   \___/

     0---1---2---3----4---5   <-- columns 4 and 5 don't fit normally