Метод RandomMove Tic Tac Toe не работает - PullRequest
2 голосов
/ 20 января 2012

Я работаю над созданием игры в крестики-нолики, которая позволит пользователю играть против компьютера. Когда пользователь выбирает кнопку на доске, ИИ обнаружит, есть ли три возможных комбо. Если угроза не обнаружена, компьютер случайным образом выберет место на доске для перемещения.

Однако моя проблема в том, что когда я делаю определенный шаг, компьютер иногда перемещает его, а иногда пропускает. Мне было интересно, как это исправить, мой randomMove() метод отображается ниже.

Требуется ли в этой ситуации рекурсивный метод (мой учитель кратко сказал мне, что это может быть необходимо) или нет? Если это рекурсивно, вы можете это объяснить? Спасибо за любую помощь!

public void RandomMove()
{
    Random x = new Random();
    int y = 1 + x.nextInt(9);
    if (buttons[y].getText().equals("O") || buttons[y].getText().equals("X")) {
        RandomMove();
    }
    else {
        buttons[y].setText("O");
        buttons[y].setEnabled(false);
    }
}

Более конкретно, иногда я получаю эту ошибку:

Исключение в потоке "AWT-EventQueue-0" java.lang.StackOverflowError

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Отработка ответа Эндрю Томпсона, попробуйте заменить

Random x = new Random();
int y = 1 + x.nextInt(9);

на

int y = (int)(Math.random() * 9);
2 голосов
/ 20 января 2012
Random x = new Random();

Создавая новый Random каждый раз, когда вызывается метод (в потенциально рекурсивном методе), код будет «захлебываться». Причина в том, что экземпляр Random засеивается с текущим временем в миллисекундах, после чего последовательность чисел, которые он будет производить, будет «установлена ​​в камне». Этот метод будет выполняться много раз в течение одной миллисекунды, создавая множество Random объектов.

Вместо этого (со слабым именем) x должен быть объявлен как атрибут класса и создан только один раз.

...