Камень Ножницы Бумага Ящерицы Спок

#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. ТЫ СПАСАЕШЬ ЖИЗНЬ!! Это работает именно так, как я хочу! Скорее всего, я научусь делать вещи проще и избегать жесткого кодирования всего. БОЛЬШОЕ ВАМ СПАСИБО!!