#java
#java
Вопрос:
Мне нужно напечатать количество выигрышей, проигрышей и ничьих пользователей в программе. Мне потребовалась вечность, чтобы решить проблему с циклом, но я, наконец, понял это. Я новичок в Java, но раньше кодировал на HTML и других языках сценариев.
import java.io.InputStream;
import java.util.Random;
import java.util.Scanner;
public class RPSLS {
//AUTHOR: JOSEPH CLAY
//TODO make program continue until user chooses to stop.
//TODO then print # of user wins, losses, and ties.
public static void main(String[] args) {
//declare objects
String user;
String comp= "";
Random comprand;
String answer=null;
do
{
//scanner and random setup and imported
Scanner scan=new Scanner(System.in);
//Random gen=new Random();
//prompt to play game/instructions
System.out.println("Yo, let's play a game of Rock, Paper, Scissors, Lizard, Spock");
System.out.println("Please enter R for rock, P for paper, S for scissors, L for lizard, or V for Spock");
//User selection input
System.out.println("Pick your poison: ");
user=scan.next();
//Randomly generated # of 5
System.out.println();
comprand=new Random();
int x=comprand.nextInt(5) 1;
//translate random # to string
if(x==1)
comp="R";
else if(x==2)
comp="P";
else if(x==3)
comp="S";
else if(x==4)
comp="L";
else if(x==5)
comp="V";
//capitalize user selection
user=user.toUpperCase();
//print computer choice
System.out.println("Your adversary chose: " comp);
//conditions of possible outcomes
//tie
if (user.equals(comp))
System.out.println("Tie!");
//if user enters r
else if (user.equalsIgnoreCase("R"))
if (comp.equals("S"))
System.out.println("Rock crushes scissors. You win!");
else if (comp.equals("P"))
System.out.println("Paper envelopes rock. You lose.");
else if (comp.equals("L"))
System.out.println("Rock destroys lizard. You win!");
else if (comp.equals("V"))
System.out.println("Spock crushes rock. You lose.");
//if user enters p
if (user.equalsIgnoreCase("P"))
if (comp.equals("R"))
System.out.println("Paper envelopes rock. You win!");
else if (comp.equals("S"))
System.out.println("Scissors cuts paper. You lose");
else if (comp.equals("L"))
System.out.println("Lizard eats paper. You lose.");
else if (comp.equals("V"))
System.out.println("Paper disproves Spock. You win!");
//if user enters s
if (user.equalsIgnoreCase("S"))
if (comp.equals("R"))
System.out.println("Rock crushes scissors. You lose.");
else if (comp.equals("P"))
System.out.println("Scissors cuts paper. You win!");
else if (comp.equals("L"))
System.out.println("Scissors eviscerates lizard. You win!");
else if (comp.equals("V"))
System.out.println("Spock vaporizes scissors. You lose.");
//if user enters l
if (user.equalsIgnoreCase("L"))
if (comp.equals("R"))
System.out.println("Rock crushes lizard. You lose.");
else if (comp.equals("P"))
System.out.println("Lizard eats paper. You win!");
else if (comp.equals("S"))
System.out.println("Scissors eviscerate lizard. You lose.");
else if (comp.equals("V"))
System.out.println("Lizard poisons Spock. You win!");
//if user enters v
if (user.equalsIgnoreCase("V"))
if (comp.equals("R"))
System.out.println("Spock crushes rock. You win!");
else if (comp.equals("P"))
System.out.println("Paper disproves Spock. You lose!");
else if (comp.equals("S"))
System.out.println("Spock vaporizes scissors. You win!");
else if (comp.equals("L"))
System.out.println("Lizard poisons Spock. You lose.");
System.out.println("Would you like to continue? (yes or no)");
answer = scan.next();
}
while(answer.equals("y"));
while (answer.equalsIgnoreCase("n"))
break;
}
}
Комментарии:
1. Вы должны отредактировать вопрос, чтобы указать, что происходит не так, в идеале показывая трассировку стека.
2. Ну, в настоящее время все работает хорошо, и нет никаких сообщений об ошибках. Я просто не уверен, как реализовать функцию для чтения и печати суммы выигрышей, проигрышей или ничьих пользователя.
Ответ №1:
Согласно вашим комментариям к вашему вопросу, вот как вы могли бы реализовать отслеживание количества побед, поражений и связей у пользователя.
Вы объявляете переменные для отслеживания каждой из них перед запуском do
цикла. Поскольку вы хотите их посчитать, я бы предложил простую целочисленную переменную для каждого:
int wins = 0;
int losses = 0;
int ties = 0;
Затем внутри вашего цикла вы увеличиваете каждый счетчик, когда возникает такая ситуация. Например:
if (comp.equals("R")){
System.out.println("Spock crushes rock. You win!");
wins ;
}
else if (comp.equals("P")){
System.out.println("Paper disproves Spock. You lose!");
losses ;
}
После того, как ваш цикл закончится, то есть после while
того, как вы напечатаете эти цифры.
while(answer.equals("y"));
System.out.println("You won " wins " times");
System.out.println("You lost " losses " times");
System.out.println("You tied " ties " times");
Наконец, некоторые элементы обзора кода для вас. Обычно вы никогда не захотите писать такой код:
while(answer.equals("y"));
Причина в том, что если answer
значение равно null, это вызовет a NullPointerException
во время выполнения. Безопаснее писать:
while("y".equals(answer));
В приведенном выше коде «y» никогда не может быть нулевым, поэтому у вас никогда не будет исключения NullPointerException, вызванного этим кодом.
Во-вторых, жесткое кодирование всех возможных сценариев — не самый эффективный и удобный способ написания вашей программы. Вместо этого, если вы думаете в терминах объектов (и вы должны, поскольку Java является объектно-ориентированным языком), вы можете создать объект для представления каждого возможного выбора, и каждый объект может содержать другие в своем роде, представляющие, какие варианты его победят. Тогда вы можете просто сделать что-то вроде этого:
if(userChoice.defeats(computerChoice)){
//handle user win here
}else if(computerChoice.defeats(userChoice){
//handle computer win here
}else{
//handle tie here
}
Надеюсь, это поможет вам!
Комментарии:
1. ТЫ СПАСАЕШЬ ЖИЗНЬ!! Это работает именно так, как я хочу! Скорее всего, я научусь делать вещи проще и избегать жесткого кодирования всего. БОЛЬШОЕ ВАМ СПАСИБО!!