Скальные бумажные ножницы в 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.