#c #arrays #recursion #char #tic-tac-toe
#c #массивы #рекурсия #символ #крестики-нолики
Вопрос:
Я пишу крестики-нолики на C, и у меня проблема с функцией, которая помещает знак на игровое поле. Вот код:
int aiPutSign(int difficultyLevel, char board[])
{
if(difficultyLevel == 1)
{
srand(time(NULL));
int field = rand() % 9;
return board[field] == ' ' ? field : aiPutSign(difficultyLevel, board);
} else if(difficultyLevel == 2)
{
//to do
return 2;
} else if(difficultyLevel == 3)
{
//to do
return 3;
}
}
К сожалению, я получаю ошибку ошибки сегментации. Все, что я знаю, что существует проблема с рекурсией, и это вызывает ошибку, но я понятия не имею, как это происходит и как это исправить.
Короче говоря: доска — это массив из 9 символов, содержащий девять пробелов, и я ставлю в нем знаки X и O после каждого хода каждого игрока. Если игрок (здесь компьютерный искусственный интеллект) пытается поставить знак на поле, которое уже заполнено, происходит рекурсия, и rand() генерирует другой номер поля.
Комментарии:
1. Если рекурсивная функция вызывает ошибку сегментации, это подсказка, что она не завершается (в вашем случае:
board[field] == ' '
всегда равно 0).
Ответ №1:
Не вводите srand(time(NULL));
в свою aiPutSign
функцию, вы получите одно и то же случайное число при каждом вызове. Вызовите srand
один раз, например, в начале вашей программы.
Комментарии:
1. Вы правы, спасибо! Когда функция пыталась поставить знак на уже заполненное поле, это вызывало бесконечный цикл генерации одного и того же числа, что в конечном итоге вызывало ошибку сегментации.