自动调整显示类型

时间:2014-06-12 01:13:34

标签: c

我正在研究"2048"游戏项目。

显示矩阵时,有零,如下图所示: enter image description here

我想摆脱表格中的零,只显示非零的整数。 所以我将以下代码添加到我现有的" PrintMat"功能:

void PrintMat(int a[4][4])
{
    int b[4][4];
    int i, j;

    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 4; j++)
        {
            if (a[i][j] == 0)
            {
                b[i][j] = ' ';
            }
            else
            {
                b[i][j] = a[i][j];
            }
        }
    }
        printf("+--------------+--------------+--------------+--------------+\n");
printf("|              |              |              |              |\n");
printf("|   %5d      |   %5d      |   %5d      |   %5d      |\n", b[0][0], b[0][1], b[0][2], b[0][3]);
printf("|              |              |              |              |\n");
printf("+--------------+--------------+--------------+--------------+\n");
printf("|              |              |              |              |\n");
printf("|   %5d      |   %5d      |   %5d      |   %5d      |\n", b[1][0], b[1][1], b[1][2], b[1][3]);
printf("|              |              |              |              |\n");
printf("+--------------+--------------+--------------+--------------+\n");
printf("|              |              |              |              |\n");
printf("|   %5d      |   %5d      |   %5d      |   %5d      |\n", b[2][0], b[2][1], b[2][2], b[2][3]);
printf("|              |              |              |              |\n");
printf("+--------------+--------------+--------------+--------------+\n");
printf("|              |              |              |              |\n");
printf("|   %5d      |   %5d      |   %5d      |   %5d      |\n", b[3][0], b[3][1], b[3][2], b[3][3]);
printf("|              |              |              |              |\n");
printf("+--------------+--------------+--------------+--------------+\n");
}

输出如下图所示: enter image description here

我知道它有什么问题(我使用int类型来显示字符)。问题是:我该如何解决?我怎样才能摆脱零?

感谢您的时间!

2 个答案:

答案 0 :(得分:2)

使用%d说明符无法打印空格。如果数组包含一个带有空格值的整数,则必须使用%c说明符和if语句。

您的printf语句必须拆分为较短的语句。每个数组元素一个,并将它们放入for循环中。

答案 1 :(得分:1)

由于您只需要处理一组有限的可能数字,我会欺骗并使用查找表。

#include <stdio.h>

const char *Fmt(short a)
{
    static const char *powers[] = {
        "     ",
        "  2  ",
        "  4  ",
        "  8  ",
        " 16  ",
        " 32  ",
        " 64  ",
        " 128 ",
        " 256 ",
        " 512 ",
        "1024 ",
        "2048 ",
        "4068 ",
        "8192 ",
        "16384",
        "32768",
    };
    return powers[a];
}

void PrintMat(short a[4][4])
{
    for (int i = 0; i < 4; i++) {
        printf("+--------------+--------------+--------------+--------------+\n");
        printf("|              |              |              |              |\n");
        printf("|    %5s     |    %5s     |    %5s     |    %5s     |\n", Fmt(a[i][0]), Fmt(a[i][1]), Fmt(a[i][2]), Fmt(a[i][3]));
        printf("|              |              |              |              |\n");
    }
    printf(    "+--------------+--------------+--------------+--------------+\n");
}

int main() {
    static short a[][4] = {
        { 0, 1, 2, 3 },
        { 4, 5, 6, 7 },
        { 8, 9,10,11 },
        {12,13,14,15 }
    };
    PrintMat(a);
}