【发布时间】: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 控制台是缓冲的,可以加高或滚动,但您可以考虑更简单的单元格,例如
<1><2><3>。 -
如果您告诉我们地图是如何定义的,将会有所帮助。