2D массив не обновляется даже после перезаписи элементов сразу после - PullRequest
0 голосов
/ 07 октября 2018

КОНТЕКСТ:

Здравствуйте, я пытаюсь напечатать доску Connect 4x6, где каждая секция |___| с тремя подчеркиваниями.Я пытаюсь создать в каждом центре подчеркивание элемента 2D-массива, чтобы потом можно было обновить его для ходов игрока.В настоящее время я пытаюсь проверить обновление центрального подчеркивания или элемента массива.

CONFLICT:

При успешном тестировании выбранный раздел будет выводиться как |_X_|.Я попытался проверить обновление элемента внутри PrintBoard() с помощью arr[1][1] = 'X';, однако он остался как _, а раздел также остался как |___|.Затем я повторил это в main(), но с board[1][1] = 'X'; безрезультатно.Я не получаю ни ошибок, ни предупреждений.

КОД:

#include <stdio.h>

void PrintBoard(char arr[6][7]);

int main()
{

    // Declaration of 7x6 2D board array: board[row][col]
    char board[6][7];

    // Sets all board array elements to '_'
    PrintBoard(board);

    /* board[1][1] =  'X'; // NOT WORKING, ELEMENTS REMAIN AS `_` */

    return 0;
}

void PrintBoard(char arr[6][7])
{
    int vertCnt = 0; // Counts vertical lines (8 per row, separates sections)
    int undCnt = 0; // Counts underscores (3 per section)
    int rowCnt = 0; // Counts rows (6 total)
    int colCnt = 0; // Count columns (7 total)

    // Print game title
    printf("      ~~ CONNECT FOUR ~~\n\n");

    for (int rowCnt = 0; rowCnt <= 6; rowCnt++)
        {
            // If current row is not the first, start it on a new line
            if (rowCnt > 0)
            {
                printf("\n");
            }

            // Creation of row: |___|___|___|___|___|___|___|
            for (int vertCnt = 0; vertCnt < 8; vertCnt++)
            {
                printf("|");

                // Only print `_` three times as long as there have been 7 total or less vertical lines printed
                for (int undCnt = 0; undCnt < 3 && vertCnt <= 6; undCnt++)
                {

                    // Print left and right sections as `_`
                    if(undCnt != 1)
                    {
                        printf("_");
                    }

                    // Assign middle section to board array and prints it as `_`
                    else if(undCnt == 1)
                    {
                        // If printing left underscore, increment column count
                        if(colCnt < 7){colCnt++;}

                        // Assign middle section to 2D board array
                        arr[rowCnt][colCnt] = '_';
                        printf("%c", arr[rowCnt][colCnt]);

                        // Test to rewrite random array element
                        arr[1][1] = 'X'; // NOT WORKING. ELEMENTS REMAIN AS `_`

                        // After last (7th) column reached, reset to 0
                        if(colCnt == 7){colCnt = 0;}
                    }

                }
            }
        }

    // Print column numbers
    printf("\n  1   2   3   4   5   6   7\n\n");

    /* HOW A CLEAN BOARD SHOULD LOOK:

         ~~ CONNECT FOUR ~~             <--- GAME TITLE

    |___|___|___|___|___|___|___|
    |___|___|___|___|___|___|___|
    |___|___|___|___|___|___|___|       <--- BOARD
    |___|___|___|___|___|___|___|
    |___|___|___|___|___|___|___|
    |___|___|___|___|___|___|___|
      1   2   3   4   5   6   7         <--- COLUMN NUMBERS

    */

}

1 Ответ

0 голосов
/ 07 октября 2018

Допустимые индексы массива для диапазона char[7] от 0 до <= 6.

Доступ к массиву char arr[6][7] за пределами:

for (int rowCnt = 0; rowCnt <= 6; rowCnt++)

считается до 6, где он должен считаться только до 5, а конструкция

if (colCnt < 7) { colCnt++; }

arr[rowCnt][colCnt] = '_';  // eventually arr[6][something] gets
printf("%c", arr[rowCnt][colCnt]);  // written to --> corupted stack.

if (colCnt == 7) { colCnt = 0; }

фактически составляет colCnt с 1 до 7 вместо 0 до 6.


И вы слишком усложняете вещи ...

#include <stddef.h>
#include <stdio.h>

enum { board_width = 7, board_height = 6 };

void board_print(char arr[board_height][board_width]);

int main(void)
{
    char board[board_height][board_width] = { 0 };

    board_print(board);
    board[1][1] = 'X';
    board_print(board);
}

void board_print(char arr[board_height][board_width])
{
    puts("      ~~ CONNECT FOUR ~~\n");

    for (size_t row = 0; row < board_height; ++row) {
        for (size_t col = 0; col < board_width; ++col) {
            printf("|_%c_", arr[row][col] ? arr[row][col] : '_');
        }
        puts("|");
    }

    puts("  1   2   3   4   5   6   7\n");
}

Вывод:

      ~~ CONNECT FOUR ~~

|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
  1   2   3   4   5   6   7

      ~~ CONNECT FOUR ~~

|___|___|___|___|___|___|___|
|___|_X_|___|___|___|___|___|
|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
|___|___|___|___|___|___|___|
  1   2   3   4   5   6   7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...