Для задания мне нужно закодировать игру 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 выиграл!»
Когда доска пуста, board[0][0], board[0][1] и board[0][2] будут равны, поэтому check_whowon вернет 1.
Это «использование PuTTY», а не «в PuTTY», поскольку это просто терминал, а не компилятор или даже язык программирования.
Пробовали ли вы запускать свой код построчно в отладчике, отслеживая поток управления и значения всех переменных, чтобы определить, в какой строке ваша программа перестает вести себя так, как предполагалось? Если вы не пробовали это, то можете прочитать это: Что такое отладчик и как он может помочь мне в диагностике проблем? Вы также можете прочитать это: Как отлаживать небольшие программы?
Обратите внимание, что обычно ожидается, что вы сами предпримете попытку отладки, прежде чем обращаться за помощью по переполнению стека. Вопросы, которые не демонстрируют никаких попыток отладки и не указывают, что вы узнали при попытке отладки, обычно плохо воспринимаются.
Я думаю, что чек странный. Независимо от того, куда вы поместите свой жетон в самом первом раунде, у вас все равно будут две строки, которые останутся пустыми. Поскольку вы инициализируете свою доску пробелами, ваша проверка строк
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».
Скорее всего, виноват scanf, так как он оставляет после себя символы «\n», которые мешают последующим сканированиям. Используйте fget, чтобы использовать всю строку, а затем обработайте буфер, чтобы определить, что игрок хочет воспроизвести. Кроме того, всегда проверяйте, работает ли fscan должным образом, проверяя его вывод.