【问题标题】:Printing a 2 dimensional map in C在 C 中打印二维地图
【发布时间】:2017-06-09 23:18:35
【问题描述】:

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

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

     1   2   3   4

地图沿 x 和 y 轴分布,地图的大小也是固定的。要打印的数字都存储在二维数组中。其中一些也可以为空,如上所示。 这是我尝试做的事情。 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; 
};

【问题讨论】:

  • 你的代码会产生什么输出?
  • 只是对未来的建议,不要直接打印到屏幕上。使用足够的缓冲区来处理您的地图,并使用滑动窗口打印您想向用户展示的部分。它将允许您拥有比终端窗口大小更大的地图。当然,您可以使用一些自定义缓冲区并将其基本上转换为可打印区域。
  • 你的代码有两个相同的顺序条件if(i == 0) {。它们当然必须合并。
  • 你说 “地图不超过 15 x 15,所以我确信它可以打印在终端窗口上。” 每个单元格需要 3 行,所以15 个单元板需要 45+1 行,通常比终端窗口大。确实,Windows 控制台是缓冲的,可以加高或滚动,但您可以考虑更简单的单元格,例如 &lt;1&gt;&lt;2&gt;&lt;3&gt;
  • 如果您告诉我们地图是如何定义的,将会有所帮助。

标签: c loops printf


【解决方案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

【讨论】:

    猜你喜欢
    • 2016-03-10
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2011-07-07
    • 2014-12-21
    • 2015-12-13
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多