Ваш код будет перебирать новую позицию, но не будет перепроверять ранее протестированные позиции.
Например, когда вы бросаете 5, и он занят, вы будете перебрасывать, но вы выиграли 'Вернитесь назад и повторите проверку с 1 по 4. Если новый бросок равен 1 до 4, ничего не будет сыграно.
Вам необходимо поставить и бросок, и чек (из всехпозиции) в петлю. Фактическая игра может быть оставлена вне цикла после того, как действительная позиция (наконец) выброшена.
Вот пример, который я написал от руки (из-за ограничения по времени):
public static char[][] ComputerPlays( char[][] M ) {
System.out.println("Computer selects grid position...");
int pos, x, y;
do {
pos = (int)(Math.random() * 9); // Roll a new position.
x = ( pos / 3 )*2 + 1;
y = ( pos % 3 )*2 + 1;
} while ( occupied( M[x][y] ) ); // Repeat as long as the position is occupied.
M[x][y] = 'O';
return M;
} //end ComputerPlays
В качестве альтернативы можно было бы сохранить список открытых позиций, удалив их из списка по мере их исчезновения, и перемещать только по списку. Это избавит от необходимости перебрасывать.