Скальные бумажные ножницы в Java

Я пишу игру для ножниц из каменной бумаги в java, но есть некоторые вещи, которые я не могу понять. Прежде всего, я хочу сделать так, чтобы пользователь мог набирать "Rock" или "paper" вместо 1, 2 и 3, но я не могу понять это. Во-вторых, я должен использовать вложенные инструкции if else, но я не знаю, как это сделать либо с тем, что я делал. Мой код ниже

import java.util.Scanner; публичный класс RockGame {

private final static int ROCK=1;
 private final static int PAPER =2;
 private final static int SCISSOR =3;

 private static Scanner key;




public static void main(String args[]){
 int playerOneScore = 0;
 int computerScore = 0;

 int userPlay, computerPlay;


 String val = key.nextLine().toLowerCase();

 key = new Scanner(System.in);
 while(playerOneScore <2 && computerScore <2){


 System.out.println("Choose 1 for rock, 2 for paper, and 3 for sciscors!");
 userPlay = key.nextInt();
 computerPlay = (int)(Math.random()*3) +1;
 if(val.equals("rock"))
 userPlay = ROCK;

 else if (val.equals("paper"))
 userPlay =PAPER;

 else if (val.equals("scissors"))
 userPlay=SCISSOR;


 if (val.equals("rock"))
 computerPlay = ROCK;
 else if (val.equals("paper"))
 computerPlay =PAPER;
 else if (val.equals("scissors"))
 computerPlay=SCISSOR;

 if (computerPlay ==ROCK && userPlay==SCISSOR ){
 System.out.println("The computer chose rock, you chose scissors.\n You lose!");
 computerScore++;
 }
 if (computerPlay ==ROCK && userPlay==PAPER ){
 System.out.println("You computer chose rock, you chose paper.\n You win!");
 playerOneScore++;
 }
 if (computerPlay ==PAPER && userPlay==SCISSOR ){
 System.out.println("The computer chose scissors, you chose paper.\n You win!");
 playerOneScore++;
 }
 if (computerPlay ==PAPER && userPlay==ROCK ){
 System.out.println("The computer chose paper and you chose rock. \n You lose!");
 computerScore++;
 }
 if (computerPlay ==SCISSOR && userPlay==ROCK ){
 System.out.println("The computer chose scissors and you chose rock. \n You win!");
 playerOneScore++;
 }
 if (computerPlay ==SCISSOR && userPlay==PAPER ){
 System.out.println("The computer chose scissors and you chose paper. \n You lose!");
 computerScore++;
 }
 if (computerPlay == userPlay ){
 System.out.println("The computer chose the same thing you did! \n Tie!");

 }


 }
 if(computerScore > playerOneScore)
 System.out.println("Computer win score is: - "+ computerScore + " -" + playerOneScore );
 else
 System.out.println("Your score is: " + playerOneScore + "-" + computerScore );


 }


}
8 ответов

Я хочу сделать так, чтобы пользователь мог набирать "Rock" или "paper" вместо 1, 2 и 3

Используйте key.nextLine().toLower(), затем проверьте, равно ли это значение "rock" и т.д.

Я должен использовать вложенные выражения if else

Обратите внимание на свой код:

if (computerPlay ==SCISSOR && userPlay==ROCK ){
 // etc.
}
if (computerPlay ==SCISSOR && userPlay==PAPER ){
 // etc.
}

Вы проверяете, будет ли computerPlay == SCISSOR дважды. В то время как с вложенным выражением вы можете сделать что-то большее:

if (computerPlay == SCISSOR) {
 if (userPlay == ROCK) {
 // etc.
 else if (userPlay == PAPER) {
 // etc.
 }
}


Использование:

string val = sc.nextLine().toLower();

А потом:

if(val.equals("rock") {
 userPlay = ROCK;
}
else if(...) {
 //..
}

Вы можете использовать вложенные циклы if:

if(userPlay == ROCK) {
 if(computerPlay == ROCK) {
 System.out.println("The computer chose the same thing you did! \n Tie!");
 }
 else if(computerPlay == PAPER) {
 System.out.println("The computer chose paper and you chose rock. \n You lose!");
 computerScore++;
 }
 else {
 System.out.println("The computer chose scissors and you chose rock. \n You win!");
 playerOneScore++;
 }
}
else if(userPlay == PAPER) {
 if(computerPlay == ROCK) {
 System.out.println("You computer chose rock, you chose paper.\n You win!");
 playerOneScore++;
 }
 else if(computerPlay == PAPER) {
 System.out.println("The computer chose the same thing you did! \n Tie!");
 }
 else {
 System.out.println("The computer chose scissors and you chose paper. \n You lose!");
 computerScore++;
 }
}
//I think you get the idea...


Подумав, это то, что вы могли бы сделать,

Создание перечисления с элементами

enum Elements{ROCK ,PAPER ,SCISSORS};

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

enum ElementCombinations implements RockPaperScissorssLogic
{
 ROCK_PAPER
 {
 int decideWinner()
 {
 //For second player
 return 2;
 }
 }, 
 PAPER_SCISSORS
 {
 int decideWinner()
 {
 //For second player
 return 2;
 }
 }, 
 ..... ;

 // For obtaining decide the type of combination object to be used.
 public static ElementCombinations getCombination(Element player1, Element player2)
 {
 // Some logic...
 }
};

Наконец, в вашем коде вы можете просто вызвать метод решения победителя объекта ElementCombinations, чтобы получить выигрывающего игрока.


Во-первых, вам нужно создать перечисление, а затем проанализировать ввод пользователя в это перечисление:

Просмотр переименования по строковому значению

Что касается вложенных операторов if-else, технически

if(something){
 // do something
}else if(somethingElse){
 // do something else
}else{
 // do another things
}

является вложенным оператором if-else. По крайней мере, как это выглядит для компилятора.

Я подозреваю, что ваш учитель хочет увидеть структуру вроде:

if(computerPlay == ROCK){
 if(userPlay == PAPER){
 }
 else if(userPlay == ROCK){
 }
 else if(userPlay == SCISSOR){
 }
}
else if(computerPlay == PAPER){
 // same as above
}
else if(computerPlay == SCISSOR){
 // same as above
}


Во-первых, вам не нужны эти строки:

if (computerPlay==1)
 computerPlay = ROCK;
if (computerPlay==2)
 computerPlay =PAPER;
if (computerPlay==3)
 computerPlay=SCISSOR;

Во-вторых, вы говорите, что вы должны использовать вложенные операторы if/else - возможно, это то, чему учит ваш учитель:

if (computerPlay == ROCK)
{
 if (userPlay==ROCK)
 {
 ...
 }
 else if (userPlay == PAPER)
 {
 ...
 }
 else if (userPlay == SCISSORS)
 {
 ...
 }
 else
 {
 // Cheating!
 }
}
else if (computerPlay == PAPER)
{
 if (userPlay==ROCK)
 {
 ...
 }
 // And so on...

Это очень длинный способ делать вещи (я лично делал бы двумерный поиск в массиве), и ваш исходный код выглядит приемлемым, но я думаю, что это упражнение для обучения, которое вы использовали для вложенности if/elses,


import java.util.Scanner;

public class RockPaperScissors {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
System.out.println("Hey let play Rock, Paper, Scissors!");
System.out.println("You must choose 1 for Rock, 2 for Paper and 3 for Scissors");
System.out.print("Rock, Paper or Scissors? ");
int play = console.nextInt();
String user = intToName(play,console);
int person = play;
int computer = generateRandomNumber(1,3);

}
 public static String intToName(int play,Scanner console){
 String choose = "";
 if (play == -1){
 System.out.print("Game Over!");
 }
 while (play != -1){
 if (play == 1){
 System.out.println("Your play is: Rock");
 if (generateRandomNumber(1,3) == 1){
 System.out.println("Computer player is: Rock"); 
 System.out.println("It a tie!");
 }
 else if (generateRandomNumber(1,3) == 2){
 System.out.println("Computer player is: Paper"); 
 System.out.println("Paper eats Rock. You lose!");
 }
 else if (generateRandomNumber(1,3) == 3){
 System.out.println("Computer player is: Scissors"); 
 System.out.println("Rock eats Scissors. You win!");
 }
 }
 else if (play == 2){
 System.out.println("Your play is: Paper");
 if (generateRandomNumber(1,3) == 1){
 System.out.println("Computer player is: Rock"); 
 System.out.println("Paper eats Rock. You win!");
 }
 else if (generateRandomNumber(1,3) == 2){
 System.out.println("Computer player is: Paper"); 
 System.out.println("It a tie!");
 }
 else if (generateRandomNumber(1,3) == 3){
 System.out.println("Computer player is: Scissors"); 
 System.out.println("Scissors eats Paper. You lose!");
 }
 }
 else if (play == 3){
 System.out.println("Your play is: Scissors");
 if (generateRandomNumber(1,3) == 1){
 System.out.println("Computer player is: Rock"); 
 System.out.println("Rock eats Scissors. You lose!");
 }
 else if (generateRandomNumber(1,3) == 2){
 System.out.println("Computer player is: Paper"); 
 System.out.println("Scissors eats Paper. You win!");
 }
 else if (generateRandomNumber(1,3) == 3){
 System.out.println("Computer player is: Scissors"); 
 System.out.println("It a tie!");
 }
 }
 System.out.println();
 System.out.print("Rock, Paper or Scissors? ");
 play = console.nextInt();
 }
 return choose;
 }
 public static int generateRandomNumber(int a, int b){
 return a+(int)(Math.random()*b-a+1);
 }
 public static int winner(int person, int computer){
 int win =0;
 int lose =0;
 int tie=0;
 if (person == 1 && computer == 1){
 tie++;
 }
 if (person == 2 && computer == 2){
 tie++;
 }
 if (person == 3 && computer == 3){
 tie++;
 }
 if (person == 1 && computer == 2){
 lose++;
 }
 if (person == 1 && computer == 3){
 win++;
 }
 if (person == 2 && computer == 1){
 win++;
 }
 if (person == 2 && computer == 3){
 lose++;
 }
 if (person == 3 && computer == 1){
 lose++;
 }
 if (person == 3 && computer == 2){
 win++;
 }
 return win;
 }
}


По моему личному варианту все ответы на вопросы слишком усложняют ситуацию.

Вот очень простой пример, сохранив простой 2-мерный array.

public class Main{

 public final static int SCISSORS = 0;
 public final static int PAPER = 1;
 public final static int STONE = 2;

 public static void rockPaperScissors(int player1, int player2){
 if(player1 == player2){ System.out.println("Tie"); return;}

 boolean key[][] = {
 {false, true, false},
 {false, false, true},
 {true, false, false} 
 };

 boolean player1Wins = key[player1][player2];

 if(player1Wins){ System.out.println("Player one wins"); }
 else{ System.out.println("Player two wins"); } 

 }

 public static void main(String[] arrgs){

 rockPaperScissors(SCISSORS, STONE);
 }

}

Массив сохраняет все возможные результаты.


Вы можете использовать .equalsIgnoreCase(); для проверки "Rock", "Paper", "etc" или даже будет соответствовать, если пользователь вводит "rock", "PaPER" и т.д. Кроме того, добавление вложенных операторов if сделает вашу функцию намного более эффективной. Чтобы сделать вложенный оператор if, все, что вам нужно сделать, это разместить один оператор if в другом, как показано ниже.

if(userPlay.equalsIgnoreCase("Rock")) {

 if (computerPlay.equalsIgnoreCase("Scissors"){
 System.out.println("The computer chose scissors, you chose rock.\n You win!");
 playerOneScore++;
 }
 else if (computerPlay.equalsIgnoreCase("Paper")){
 System.out.println("You computer chose paper, you chose rock.\n You lose!");
 computerScore--;
 }
 }

С помощью этих вложенных операторов if вам нужно будет только проверять выбор пользователей один раз за параметр вместо нескольких раз, как в вашем примере кода.

Вам также нужно будет перейти от key.nextInt() к key.next() чтобы вы принимали строки в качестве входных данных и userPlay их в userPlay вместо целых чисел

userPlay = key.next();

Надеюсь, что это вам полезно!

licensed under cc by-sa 3.0 with attribution.