Я учусь в классе CS и пытаюсь создать программу крестиков-ноликов. Я впервые использую функции, и мне нужна помощь в проверке 2-мерного массива, чтобы узнать, заполнен ли он символами «x» или «o». Я инициализировал, чтобы начать со всех элементов, равных '_', и мне нужно, чтобы возвращаемое значение было истиной или ложью, поэтому я использую #include <stdbool.h>. Вот функция:
bool check_table_full(char board[SIZE][SIZE]){
if (board[0][0] == '_'){
return false;
}else if (board[1][0] == '_'){
return false;
}else if (board[2][0] == '_'){
return false;
}else if (board[0][1] == '_'){
return false;
}else if (board[1][1] == '_'){
return false;
}else if (board[2][1] == '_'){
return false;
}else if (board[0][2] == '_'){
return false;
}else if (board[1][2] == '_'){
return false;
}else if (board[2][2] == '_'){
return false;
}else{
return true;
}
Я знаю, что есть лучшая оптимизация, чем использование оператора if else, но это просто в моей голове. Я использую printf("%s", check_table_full?"true":"false");, чтобы проверить, возвращает ли он false, как и должно, поскольку все элементы в массиве - это '_'. Независимо от того, что я делаю, он печатает true, и если я изменяю «true» в операторе printf, он печатает все, что находится внутри первой кавычки.
Все остальное работает так, как будто SIZE определен, массив определен, я просто не могу заставить эту функцию возвращать false.
Извините, если это слишком долго, я впервые задаю здесь вопрос.
Да, я распечатал весь массив, и все они являются подчеркиваниями, а РАЗМЕР определяется как 3, чтобы иметь доску 3 x 3
Кстати, тело функции может быть return !std::memchr(&board, '_', 9);





Ваш метод обхода матрицы не масштабируется, вы легко можете вносить ошибки и не слишком сложен. Мой «метод проверки» - это 2 строки кода для любого размера матрицы.
Вот как ты катишься ->
#include <stdio.h>
#include <stdbool.h>
#define MXSIZE 3
bool is_full(char *block) {
for (int l=0;l<MXSIZE*MXSIZE;l++)if (*(block+l)=='_')return false;
return true;
}
int main() {
char my2DArray[MXSIZE][MXSIZE] = {{'O','O','O'},{'O','O','O'},{'O','O','_'}};
printf("%s",is_full(&my2DArray[0][0])?"The array is full\n":"The array is not full\n");
return 0;
}
(LOL .. голосование против.)
/ А
Если вы делаете printf("%s", check_table_full?"true":"false");, вы нет вызываете функцию.
check_table_full - это адрес функции. Вы хотите check_table_full()
Я просто набирал тот же ответ. Ты подтолкнул меня на это. :)
Должен быть приведен аргумент, например check_table_full(board)
Вы можете использовать вложенные циклы for. Я изучил синтаксис C++, а не синтаксис C, поэтому синтаксис может быть немного неправильным. Пример кода ...
#include <stdio.h>
int main() {
char board[2][2];
int outer_count, inner_count;
//It will use nested for loops
for (outer_count = 0; outer_count <= 2; count++) {
for (inner_count = 0; inner_count <= 2; count ++) {
if (board[outer_count][inner_count] == '_'){
return false;
}
}
}
return True
}
Он помечен как c [не c++], поэтому string недоступен. Кроме того, ваша функция отваливается с конца без return, поэтому последняя строка должна быть return true;
Спасибо, Крейг. Я понятия не имел, что строка недоступна в C. Я отредактирую свой код, чтобы отразить это, поэтому, надеюсь, спрашивающий поймет, что я говорю.
Вы уверены, что инициализируете плату для всех
'_'? Вы распечатали всю доску для проверки? Что такоеSIZE?