在C中打印二维地图

Rit*_*tra 5 c printf loops

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

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

     1   2   3   4
Run Code Online (Sandbox Code Playgroud)

地图沿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");
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出,因为我无法正确打印第一行,我没有继续.地图不超过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 \
\___/\___/\___/\___/\___/\___/\___/\___/\___/\___/
Run Code Online (Sandbox Code Playgroud)

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

struct Map {
    struct Floe *mapPointer;
    int sizeX;
    int sizeY;
    struct Box *changelog;
    int changeCount;
    int maxChanges;
    struct Player *players;
    int playerCount;
};
Run Code Online (Sandbox Code Playgroud)

giveFloe()接受结构图并返回该floe坐标.

struct Floe {
    int numbOfFish; 
    int whosPenguin; 
};
Run Code Online (Sandbox Code Playgroud)

小智 1

我认为您的第一步可能是重新考虑网格的布局方式。

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

其次,同一行上相邻的两个六边形是否合法?请参阅网格右侧的3六边形。2

            ___
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
Run Code Online (Sandbox Code Playgroud)