Запись ввода пользователя, чтобы повлиять, если оператор Java

1

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

 double PC = Math.random();

 String User = UI.askString("Enter choice: ");
 int paper = 0;
 paper ++;
 int finalCount = 0;

 UI.clearGraphics();

 if(PC < 0.3333 || paper > 3){ 
    UI.drawImage("scissors-left.jpg", 100, 100);
    UI.drawString("PC chose scissors", 100, 90);

    if(User.equalsIgnoreCase("rock")){
         UI.drawImage("rock-right.jpg", 300, 100);
         UI.drawString("you win", 300, 90);
         finalCount = finalCount + 1;


        }

    if(User.equalsIgnoreCase("scissors")){
         UI.drawImage("scissors-right.jpg", 300, 100);
         UI.drawString("tie", 300, 90);
         finalCount = finalCount + 0;


        }   

    if(User.equalsIgnoreCase("paper")){
         UI.drawImage("paper-right.jpg", 300, 100);
         UI.drawString("you lose", 300, 90);
         finalCount = finalCount - 1;
         paper ++;

    }

}

else if(PC > 0.667){ 
     UI.drawImage("rock-left.jpg", 100, 100);
     UI.drawString("PC chose rock", 100, 90);
    if(User.equalsIgnoreCase("rock")){
         UI.drawImage("rock-right.jpg", 300, 100);
         UI.drawString("tie", 300, 90);
         finalCount = finalCount + 0;


        }

    if(User.equalsIgnoreCase("scissors")){
         UI.drawImage("scissors-right.jpg", 300, 100);
         UI.drawString("you lose", 300, 90);
         finalCount = finalCount - 1;


        }   

    if(User.equalsIgnoreCase("paper")){
         UI.drawImage("paper-right.jpg", 300, 100);
         UI.drawString("you win", 300, 90);
         finalCount = finalCount + 1;
         paper++;

    }

}
else{ 
     UI.drawImage("paper-left.jpg", 100, 100);
     UI.drawString("PC chose paper", 100, 90);
    if(User.equalsIgnoreCase("rock")){
         UI.drawImage("rock-right.jpg", 300, 100);
         UI.drawString("you lose", 300, 90);
         finalCount = finalCount - 1;


        }

    if(User.equalsIgnoreCase("scissors")){
         UI.drawImage("scissors-right.jpg", 300, 100);
         UI.drawString("you win", 300, 90);
         finalCount = finalCount + 1;



        }   

    if(User.equalsIgnoreCase("paper")){
         UI.drawImage("paper-right.jpg", 300, 100);
         UI.drawString("tie", 300, 90);
         finalCount = finalCount + 0;
         paper ++;

    }

}

return finalCount;
}

Спасибо :)

  • 0
    Вы можете объяснить с помощью переменной PC в вашем коде?
  • 0
    Какой смысл использовать счетчик итогов и почему в случае sciccors вы делаете finalCount + 0, имеет ли это какое-то значение? Кроме того, почему вы включаете бумагу только после инициализации ее 0?
Показать ещё 1 комментарий
Теги:
loops
if-statement
user-input

1 ответ

0
Лучший ответ

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

Например, вы проверяете, равен ли User "rock", и если это правда, вы рисуете "rock-right.jpg". Но этот тест и код для рисования изображения одинаковы независимо от того, какой PC. Таким образом, вы можете перенести это из PC, if этот тестовый PC, и сделайте это один раз, прежде чем вы скажете, if (PC < 0.3333 || paper > 3):

if(User.equalsIgnoreCase("rock")){
     UI.drawImage("rock-right.jpg", 300, 100);
}
else if (User.equalsIgnoreCase("scissors")) {
     UI.drawImage("scissors-right.jpg", 300, 100);
}
else if (User.equalsIgnoreCase("paper")) {
     UI.drawImage("paper-right.jpg", 300, 100);
}

Тогда вы можете понять, что вам даже не нужны инструкции if, поскольку вы каждый раз повторяете drawImage с почти drawImage же параметрами:

UI.drawImage(User.toLowerCase() + "-right.jpg", 300, 100);

Таким образом, 9 вызовов drawImage были уменьшены до 1.

Еще одна вещь, которую вы можете сделать, - не использовать так много, if проверять каждую комбинацию скалы, бумаги, ножниц. Предположим, что мы перевели каждую строку в число, с rock = 0, paper = 1, scissors = 2. Вот таблица, показывающая, кто будет победителем для каждой комбинации:

PC     \ User |  rock=0  |  paper=1  | scissors=2
rock=0        |   Tie    |   User    |   PC
paper=1       |   PC     |   Tie     |   User
scissors=2    |   User   |   PC      |   Tie

Обратите внимание, что строки следуют шаблону: когда вы переходите к следующей строке, значения "победителя" поворачиваются на одно место вправо (с одним справа перемещается влево), и этот шаблон продолжается до конца (ОК, еще одна строка). Но в любое время, когда вы видите такой шаблон, вы должны подумать об использовании оператора % (modulo), чтобы найти ответ. В этом случае он будет работать следующим образом:

if (PC == User)
    it a tie
else if ((PC + 1) % 3 == User)
    the user wins
else
    the PC wins

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

  • 0
    Привет, спасибо за ваш ответ, но как мне преобразовать строку в int, а затем использовать ее в коде, как вы предложили. Извините, я новичок, и я первый год занимаюсь программированием. @ajb
  • 0
    Самый простой способ - использовать операторы if или операторы switch , например if (User.equalsIgnoreCase("rock")) { userValue = 0; } else if (User.equalsIgnoreCase("paper")) { userValue = 1; } ... then use userValue` в своих вычислениях. Map - это тоже хороший способ, но, поскольку вы новичок, я не буду бросать вам слишком много сразу. Значение ПК может быть сгенерировано из вашего случайного числа: PCValue = (int) (PC * 3); , Умножение на 3 приводит к случайному числу от 0 до 2.9999999 ..., и (int) выбрасывает все после десятичной точки.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню