Линкор | распечатки мусора из массива char - PullRequest
0 голосов
/ 29 марта 2020

Я работаю над игрой «Морской бой» и пытаюсь создать массив персонажей для игровой доски. Я имею в виду прямоугольный массив angular размером 11x21. Примерно так:

0  1 2 3 4 5 6 7 8 9 10 / 1 2 3 4 5 6 7 8 9 10
1  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
3  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
4  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
5  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
6  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
7  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
8  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
9  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
10 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

Я пытаюсь создать отдельные массивы позже, отразить историю на этой плате и распечатать ее в файле журнала.

Проблема Сейчас я застрял при инициализации этой платы 11x21. По какой-то причине доска инициализируется вплоть до 6-й строки, т.е. первое значение на игровой доске [6] [0] = 6.

Затем, начиная со строки 7, первое значение на игровой доске [7 ] [0] становится буквой.

Something like this:

Я подозреваю, что буквы были перепутаны с данными, после чего печать стала мусором. Но я не уверен, где именно я ошибся.

Вот оригинальный код:

int i = 0, j = 0;
    char gameboard[11][22] = {'\0'};

    for (i = 0; i < 11; ++i)
    {
        gameboard[i][0] = (char)i;
        gameboard[i][11] = (char)i;
        for (j = 1; j < 11; ++j)
        {
            gameboard[i][j] = '~';
            gameboard[i][j + 11] = '~';
        }
    }

    for (i = 0; i < 11; i++)
    {
        for (j = 0; j < 22; j++)
            printf(" %c", gameboard[i][j]);
        printf("\n");
    }

1 Ответ

2 голосов
/ 29 марта 2020

При использовании массива символов не пытайтесь смешивать его с целочисленными значениями. Эти целочисленные значения будут интерпретироваться как их символьные эквиваленты. Здесь - диаграмма, которая отображает целочисленные значения в символы, которые они представляют. Вместо того, чтобы делать это, попробуйте использовать индексы в массиве для определения номеров строк / столбцов.

Этот следующий код создает это в качестве вывода:

0  1 2 3 4 5 6 7 8 9 10 /1 2 3 4 5 6 7 8 9 10
1  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
2  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
3  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
4  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
5  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
6  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
7  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
8  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
9  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
10 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ / ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
int i = 0, j = 0;
char gameboard[10][21];

for (i = 0; i < 10; ++i) {
    for (j = 0; j < 10; ++j) {
        gameboard[i][j] = '~';
        gameboard[i][j + 11] = '~';
    }
}
for (i = 0; i < 10; i++) {
    gameboard[i][10] = '/';
}

printf("0  ");
for (i = 0; i < 21; i++) {
    j = i < 11 ? i+1 : i - 10;
    if (i == 10)
        printf("/");
    else {
        printf("%d ", j);
    }
}
printf("\n");

for (i = 0; i < 10; i++) {
    printf("%d", i + 1);
    if (i + 1 <= 9)
        printf(" ");

    for (j = 0; j < 21; j++)
        printf(" %c", gameboard[i][j]);
    printf("\n");
}
...