Крестики-нолики против компьютера - PullRequest
0 голосов
/ 09 ноября 2019

Для задания меня попросили создать матрицу [7] x [7] и игру в крестики-нолики против компьютера. Игрок - это Х, а Компьютер - О. [1] [1] - это выбор 1, [1] [3] - это выбор 2, [1] [5] - это выбор 3, [3] [1] - это выбор 4 и т. Д. И т. Д. до выбора 9. Я сделал все, кроме создания двух логических методов для прохождения через методы player и computer, чтобы проверить, занято ли уже пространство.

Кажется, я не могу создать цикл while и оператор if, который логически сообщает компьютеру, как только он генерирует случайное число от 1 до 9, что, если это число уже занято, генерирует другое случайное число доэтот номер НЕ был взят.

public static char[][] ComputerPlays(char[][] M)
{
    System.out.println("Computer selects grid position...");
    //  *** computer play code ***

    int x = (int)((Math.random() * 9)+1);
    if (x ==1)
    {
        while (occupied(M[1][1]) == true)
        {
            x = (int)((Math.random() *9)+1);      
        }
        if (occupied(M[1][1])== false)
        {
            M[1][1] = 'O';        
        } 
    }
    if (x ==2)
    {
        if (occupied(M[1][3])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[1][3])== false)
        {
            M[1][3] = 'O';
        }
    }
    while (x ==3)
    {
        if (occupied(M[1][5])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[1][5])== false)
        {
            M[1][5] = 'O';        
        }

    }
    while (x ==4)
    {
        if (occupied(M[3][1])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[3][1])== false)
        {
            M[3][1] = 'O';
        }
    }
    while (x ==5)
    {
        if (occupied(M[3][3])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[3][3])== false)
        {
            M[3][3] = 'O';
        }
    }
    while(x ==6)
    {
        if (occupied(M[3][5])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[3][5])== false)
        {
            M[3][5] = 'O';
        }
    }
    while(x ==7)
    {
        if (occupied(M[5][1])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[5][1])== false)
        {
            M[5][1] = 'O';
        }
    }
    while (x ==8)
    {
        if (occupied(M[5][3])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[5][3])== false)
        {
            M[5][3] = 'O';
        }
    }
    while (x ==9)
    {
        if (occupied(M[5][5])== true)
        {
            x = (int)((Math.random() *9) +1);
        }
        if (occupied(M[5][5])== false)
        {
            M[5][5] = 'O';
        }
    }
    return M;
}//end Computer Play

1 Ответ

1 голос
/ 09 ноября 2019

Ваш код будет перебирать новую позицию, но не будет перепроверять ранее протестированные позиции.

Например, когда вы бросаете 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

В качестве альтернативы можно было бы сохранить список открытых позиций, удалив их из списка по мере их исчезновения, и перемещать только по списку. Это избавит от необходимости перебрасывать.

...