2013-12-03 3 views
3

A while Я выполнил задание, создающее программу tictactoe через затмение. Он работает достаточно хорошо, при этом я нажимаю пустые поля для размещения O, а программа вводит X после. Тем не менее, я использую довольно простой код для размещения Икса:Рандомизировать tictactoe

public int putX(){ 
for(int i=0; i<3;i++) 
    for(int j = 0;j<3;j++) { 
    if(position[i][j]==' ') { 
     position[i][j]='X'; 
     return 0; 
    } 
    } 
    return -1; //some error occurred. This is odd. No cells were free. 
} 

Из-за этого, иксы просто помещается в строке каждого столбца, не спускаясь до следующего столбца. Может ли кто-нибудь показать мне простой способ рандомизировать эту программу?

+0

Почему вы «возвращаете 0» при замене позиции? – Maroun

+0

@MarounMaroun Примечание: Я предполагаю, что это то, что означает OP: было бы лучше, если бы он вернул «истину» и «ложь». Когда X помещен, он хочет, чтобы метод сообщил ему. – Justin

ответ

1

Что мы хотим сделать, это сгенерировать массив всех возможных точек и выбрать одну из этих точек в случайном порядке. Мы используем цикл for для итерации по всем точкам массива 3x3 и добавляем действительные в наш временный массив, а затем выбираем случайный индекс и размещаем там X.

String[] list = new String[9]; // maximum 9 points 
int size = 0; 

for(int i = 0; i < 3; i++) { 
    for(int j = 0; j < 3; j++) { 
     if(position[i][j] == ' ') { 
      list[size] = "" + i + j; 
      size++; 
     } 
    } 
} 

int index = (int) (Math.random() * (size+1)); 
position[Integer.parseInt(list[index].charAt(0))][Integer.parseInt(list[index].charAt(1))] = 'X'; 

В качестве альтернативы, вместо того чтобы хранить х, у координаты точки в String мы могли бы хранить их в java.awt.Point так:

Point[] list = new Point[9]; // maximum 9 points 
int size = 0; 

for(int i = 0; i < 3; i++) { 
    for(int j = 0; j < 3; j++) { 
     if(position[i][j] == ' ') { 
      list[size] = new Point(i, j); 
      size++; 
     } 
    } 
} 

int index = (int) (Math.random() * (size+1)); 
position[list[index].getX()][list[index].getY()] = 'X'; 

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

Вы также должны проверить, чтобы остались какие-то элементы, проверяя, равен ли размер 0 после цикла for. Если это так, вы должны, вероятно, вернуть -1 (что делает ваш существующий код). В противном случае в конце всего кода возвращается 0.