Мне было интересно, как я буду это делать. Я хочу сказать, что каждый раз, когда пользователь вводит "бумагу", он добавляет счетчик, а когда счетчик равен 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;
}
Спасибо :)
В вашей программе много повторного кода. Когда у вас будет много повторений, вы должны искать способы избежать повторения.
Например, вы проверяете, равен ли 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
.
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)
выбрасывает все после десятичной точки.