Камень-ножницы Java

1

Я знаю, что это задание java было задано здесь снова и снова, но вместо копирования других методов (поскольку, кажется, существует множество способов написания такого кода), я бы скорее хотел помочь на шахтах, чтобы я мог больше - легко понять понятия. Кроме того, профессор, вероятно, мог бы легко проверить, изменен ли я, ха-ха.

Ошибок с этим кодом нет, однако он не работает, как предполагается. Выходы просто... случайные.

Я чувствую, что мне не хватает целой части кода, но я читал свой учебник снова и снова и, похоже, не обнаружил происхождение ошибки. : | Пожалуйста помоги!

edit: Я обновил свой пост много с фиксированными изменениями.

import java.util.Scanner;

public class RockPaperScissors
{
   public static void main(String[] args)
     {  
      String playerTwo = "";\\to be honest I'm not sure what this is even for

      Scanner keyboard = new Scanner(System.in);
      System.out.println("Lets play rock-paper-scissors! Please enter your move:");

      int Choice = (int) (Math.random()*2);
         if (Choice == 0)
            playerTwo = "ROCK";\\rock = 0
         else if (Choice == 1)
            playerTwo = "PAPER";\\paper = 1
         else if (Choice == 2)
            playerTwo = "SCISSORS";\\scissors = 2

  String playerOne = keyboard.nextLine();     
     playerOne = playerOne.toUpperCase();
        if (playerOne.equals(playerTwo)){
              System.out.println("It a tie, so nobody wins!");
              }

        if (playerOne.equals("ROCK")){
              if (playerTwo.equals("PAPER")){
                 System.out.println("Your rock got covered by my paper. You lose!");
                 }
              if (playerTwo.equals("SCISSORS")){
                 System.out.println("Your rock smashes my scissors. You win!");
                 }
              }

        if (playerOne.equals("PAPER")){
              if (playerTwo.equals("ROCK")){
                 System.out.println("Your paper covers my rock. You win!");
                 }
              if (playerTwo.equals("SCISSORS")){
                 System.out.println("Your paper got cut by my scissors. You lose!");
                 }
              }

        else if (playerOne.equals("SCISSORS")){
              if (playerTwo.equals("ROCK")){
                 System.out.println("Your scissors got smashed by my rock. You lose!");
                 }
              if (playerTwo.equals("PAPER")){
                 System.out.println("Your scissors cut my paper. You win!");
                 }
              }

            else
                  System.out.println("Error. Please restart and enter either: \"rock\", \"paper\", or \"scissors\".");
   }
}
Теги:
random

3 ответа

1
Лучший ответ

Прежде чем я выясню, что не так с вашим кодом, вот несколько советов:

Math.round() не требуется. Если вы производите тип int он автоматически округляется до ближайшего целого.

Вы должны объявить Enum с тремя типами результатов. Затем вы можете ссылаться на них по имени вместо цифр или строк:

public enum Outcome { ROCK, PAPER, SCISSOR };

Теперь вы можете назначать переменные, а также использовать операторы switch:

Outcome player1 = Outcome.ROCK;
// switch statement example
switch (player1) {
    case ROCK:
        // do something
    case PAPER:
        // do something
    case SCISSOR:
        // do something

Кроме того, комментарии выполняются с двумя косой чертой FORWARD, а не BACK slashes

Теперь для момента WTF в вашем коде. Что, черт возьми это:

if (playerOne.equals("ROCK")){}
              else if (playerTwo.equals("PAPER")){
                 System.out.println("Your rock got covered by my paper. You lose!");
                 }
              else if (playerTwo.equals("SCISSORS")){
                 System.out.println("Your scissors got smashed by my rock. You win!");
                 }

В принципе, вы просто сказали компьютеру, что если игрок One выбрал рок, ничего не делайте. Синтаксис оператора if выглядит так:

if (condition) {
     // do something 
}

Если вы хотите иметь несколько операторов if внутри оператора if, выполните следующие действия:

if (condition) {
    if (condition) { // do something }
    else if (condition) { // do something else if first did not work }
    else { // do something if nothing worked }
}

В вашем коде вы набрали это:

if (condition) {} // this does nothing if condition is true
else if (condition) {...} // if the first if statement is true, this will not be reached
else if (condition) {...} // neither will this!

Поэтому, чтобы исправить вашу проблему, ваш фрагмент кода должен выглядеть так:

if (playerOne.equals("ROCK")) {
              if (playerTwo.equals("PAPER")) {
                 System.out.println("Your rock got covered by my paper. You lose!");
              }
              else if (playerTwo.equals("SCISSORS")) {
                 System.out.println("Your scissors got smashed by my rock. You win!");
              }
} // terminates outer if

Если у вас есть еще вопросы, прокомментируйте этот ответ!

  • 0
    Я спросил кого-то еще об этом, но я также прокомментирую ваш совет.
  • 0
    Спасибо за пост! Я определенно рассмотрю вопрос об объявлении Enum, если получу такое назначение снова. И не волнуйся! Косые черты отсутствуют в коде, я просто поспешил и вставил это при создании своего поста. Прямо сейчас у меня просто проблемы с моим последним утверждением ... "еще ... Ошибка. Перезапустите" одно. Я также обновил свой код в первом сообщении.
Показать ещё 1 комментарий
0
if (playerOne.equals("ROCK")){}
              else if (playerTwo.equals("PAPER")){
                 System.out.println("Your rock got covered by my paper. You lose!");
                 }
              else if (playerTwo.equals("SCISSORS")){
                 System.out.println("Your scissors got smashed by my rock. You win!");
                 }

Ваши условные блоки написаны неправильно. Если какое-либо условие истинно, будет выполнен следующий {} блок. В вашем коде вы проверяете, что входит в состав playerOne, но вы ничего не делаете, когда вход соответствует "ROCK". Блок просто пуст.

Условие else, если условие будет проверено далее (при условии, что playerTwo.equals("ROCK")) System.out.println("Ваша скала..."); будет выполняться только на основании того, что вход playerOne не равен "ROCK".

Вы можете захотеть просмотреть свои заметки, чтобы понять, как и когда работает инструкция else if.

Вместо этого вы должны проверить, что playerOne.equals("ROCK"), а затем проверить, что playerTwo.equals("PAPER") и что-то сделать.

Это относится ко всем случаям, когда вы проверяете вход игрока.

0

Я не собираюсь писать вашу программу для вас, вместо этого я собираюсь указать на недостатки в вашей логике.

if (playerOne.equals("ROCK"))**{}** //notice you aren't actually executing any logic here?
     **else** if (playerTwo.equals("PAPER")){ //this line is being called if playerOne does **not** equal rock.
     System.out.println("Your rock got covered by my paper. You lose!");
}

Эта же логика применяется и к вашим другим блокам кода.

Вместо этого он должен быть чем-то вроде

   if (playerOne.equals("ROCK")){
       if (playerTwo.equals("PAPER")){ 
         System.out.println("Your rock got covered by my paper. You lose!");
       }
    }        
  • 0
    Спасибо вам большое! Я исправил это довольно хорошо, и теперь это работает. Я не уверен, что делать с концом кода (который предназначен для входных данных, которые не являются камнем, бумагой или ножницами). Когда я пытаюсь сыграть в скомпилированную игру, она появляется случайно. Я также поместил мой обновленный код в исходное сообщение.
  • 0
    @ Тони, в вашем обновленном коде вы пропускаете «else» до того, как if (playerOne.equals("PAPER") {} . Кроме того, вы пропускаете закрывающее } перед финальным остальным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню