Крестики-нолики в C

Для задания мне нужно закодировать игру Tic Tac Toe на C в Putty. Не могу найти что не так с программой. Независимо от того, что я ввел в качестве входных данных, программа возвращает «Игрок X выиграл!»

Может ли кто-нибудь обнаружить проблему?

Вот код функций

#include <stdio.h>
#include "tictac.h"
#define BOARD_SIZE 3 // size of the board
void print_theboard(char board[BOARD_SIZE][BOARD_SIZE]) {
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            printf(" %c ", board[i][j]);
            if (j < BOARD_SIZE - 1) {
                printf("|");
            }
        }
        printf("\n");
        if (i < BOARD_SIZE - 1) {
            printf("---+---+---\n");
        }

    }
}


int check_whowon(char board[BOARD_SIZE][BOARD_SIZE]) {
    //Gewinn in den Reihen
    for (int i = 0; i < BOARD_SIZE; i++) {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
            return 1;
    }

    //Gewinn in den Spalten
    for (int j = 0; j < BOARD_SIZE; j++) {
        if (board[0][j] == board[1][j] && board[1][j] == board[2][j])
            return 1;
    }

  //Gewinn in den Diagonalen
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
        return 0;
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0])
        return 1;

    return 0;
}
~

Вот код для файла .h

void print_theboard();
int check_whowon();
int check_draw();


Вот код основного

#include <stdio.h>
#include "tictac.h"

#define BOARD_SIZE 3 // size of the boad

int main() {
    char board[BOARD_SIZE][BOARD_SIZE];
    int row, col, game_over = 0;
    char player = 'X';

    // initialize the board with empty spaces
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            board[i][j] = ' ';
        }
    }

    while (!game_over) {
        // display the current status of the board
        print_theboard(board);

        printf("Player %c, enter the row and column (e.g. 0 2): ", player);
        scanf("%d %d", &row, &col);

        // validate the input
        if (row >= 0 && row < BOARD_SIZE && col >= 0 && col < BOARD_SIZE) {
            board[row][col] = player;


            // check if the game is won or drawn
            if (check_whowon(board)) {
                printf("Player %c wins!\n", player);
                game_over = 1;
            }
            else {
            printf("Invalid input. Please try again.\n");
        } if (player='X')
            player='O';
                else
                player='X';


    }

    return 0;
}
}

Независимо от того, что я ввел в качестве входных данных, программа возвращает «Игрок X выиграл!»

Скорее всего, виноват scanf, так как он оставляет после себя символы «\n», которые мешают последующим сканированиям. Используйте fget, чтобы использовать всю строку, а затем обработайте буфер, чтобы определить, что игрок хочет воспроизвести. Кроме того, всегда проверяйте, работает ли fscan должным образом, проверяя его вывод.

picchiolu 10.01.2023 23:52

Когда доска пуста, board[0][0], board[0][1] и board[0][2] будут равны, поэтому check_whowon вернет 1.

user3386109 10.01.2023 23:57

Это «использование PuTTY», а не «в PuTTY», поскольку это просто терминал, а не компилятор или даже язык программирования.

tadman 11.01.2023 00:12

Пробовали ли вы запускать свой код построчно в отладчике, отслеживая поток управления и значения всех переменных, чтобы определить, в какой строке ваша программа перестает вести себя так, как предполагалось? Если вы не пробовали это, то можете прочитать это: Что такое отладчик и как он может помочь мне в диагностике проблем? Вы также можете прочитать это: Как отлаживать небольшие программы?

Andreas Wenzel 11.01.2023 00:33

Обратите внимание, что обычно ожидается, что вы сами предпримете попытку отладки, прежде чем обращаться за помощью по переполнению стека. Вопросы, которые не демонстрируют никаких попыток отладки и не указывают, что вы узнали при попытке отладки, обычно плохо воспринимаются.

Andreas Wenzel 11.01.2023 00:33
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
2
5
117
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

board[i][0] == board[i][1] && board[i][1] == board[i][2]

Будет оценивать

' ' == ' ' && ' ' == ' '

Что является правдой. Вы должны дополнительно проверить, действительно ли в строке/столбце/диагонали есть токен.

Доска инициализируется пробелами:

 // initialize the board with empty spaces
    for (int i = 0; i < BOARD_SIZE; i++) {
        for (int j = 0; j < BOARD_SIZE; j++) {
            board[i][j] = ' ';
        }
    }

Переменная player инициализируется с помощью «X», потому что X играет первым:

char player = 'X';

Но когда функция check_whowon(board) вызывается в первый раз, она проверяет, имеют ли горизонтальные, вертикальные или диагональные линии один и тот же символ (не имеют ли они конкретно «X» или «O»). Поэтому он всегда возвращает true из-за инициализированных символов пробела.

Чтобы исправить это, отредактируйте функцию checkwhowon(), чтобы она игнорировала пробел или специально проверяла «X» и «O».

Другие вопросы по теме