2014-11-30 2 views
0

Мне было поручено создать простую программу, которая будет играть с Rock-Paper-Scissors с пользователем. К сожалению, когда я пытаюсь запустить программу, мое возвращение (предложение + результат) возвращает null. Я новичок в использовании методов, поэтому, пожалуйста, объясните, что я делаю неправильно здесь ... Спасибо!Java String Метод возвращает Null?

package rockpaperscissors; 

/** 
* 
* @author Owner 
*/ 
import java.util.Scanner; 
import java.io.IOException; 

public class RockPaperScissors { 

    static int weaponChoice; 
    static int computerChoice; 
    static int tie = 0; 
    static int lose = 0; 
    static int win = 0; 
    static String outcome; 
    static String sentence; 

    /** 
    * @param args the command line arguments 
    * @throws java.io.IOException 
    */ 
    public static void main(String[] args) throws IOException { 
     Scanner userInput = new Scanner(System.in); 
     System.out.println(" ========================="); 
     System.out.println("====ROCK=PAPER=SCISSORS===="); 
     System.out.println(" ========================="); 
     int playAgain = 1; //sets a play again function 
     do { 
      System.out.println("Please select your weapon."); 
      System.out.println("1 - Rock"); 
      System.out.println("2 - Paper"); 
      System.out.println("3 - Scissors"); 
      System.out.println("Choose wisely:"); 
      String choice = userInput.nextLine(); 
      weaponChoice = Integer.parseInt(choice); 
      do { 
       if (weaponChoice != 1 && weaponChoice != 2 && weaponChoice != 3) { 
        System.out.println("Please choose again, grasshopper. There are only" 
          + " three choices."); 
        System.out.println("1 - Rock"); 
        System.out.println("2 - Paper"); 
        System.out.println("3 - Scissors"); 
        choice = userInput.nextLine(); 
        weaponChoice = Integer.parseInt(choice); 
       } 
      } while (weaponChoice != 1 && weaponChoice != 2 && weaponChoice != 3); 

      if (weaponChoice == 1) { 
       System.out.println("You have selected Rock as your weapon."); 
      } else if (weaponChoice == 2) { 
       System.out.println("You have selected Paper as your weapon."); 
      } else { 
       System.out.println("You have selected Scissors as your weapon."); 
      } 
      //Computer's Choice 
      computerChoice = 1 + (int) (Math.random() * ((3 - 1) + 1)); 
      if (computerChoice == 1) { 
       System.out.println("The computer has chosen Rock."); 
      } else if (computerChoice == 2) { 
       System.out.println("The computer has chosen Paper."); 
      } else { 
       System.out.println("The computer has chosen Scissors."); 
      } 
determineOutcome(outcome, sentence); 
      System.out.println(sentence+outcome); 
      System.out.println("==SCORES=="); 
      System.out.println("WINS: " + win); 
      System.out.println("TIES: " + tie); 
      System.out.println("LOSSES: " + lose); 
      System.out.println("Press 1 to play again, or any other number to exit."); 
      String play = userInput.nextLine(); 
      playAgain = Integer.parseInt(play); 
     } while (playAgain == 1); 
    } 

    public static String determineOutcome(String outcome, String sentence) { 
sentence = "Your result is: "; 
     do { 
      if (weaponChoice == 1 && computerChoice == 1 || weaponChoice == 2 && computerChoice == 2 || weaponChoice == 3 && computerChoice == 3) { 
       tie++; 
       outcome = "TIE"; 
      } else if (weaponChoice == 1 && computerChoice == 3 || weaponChoice == 2 && computerChoice == 1 || weaponChoice == 3 && computerChoice == 2) { 
       win++; 
       outcome = "You WON!"; 
      } else { 
       lose++; 
       outcome = "You LOSE. Better luck next time?"; 
      } 
     } while (lose <0 || win < 0 || tie < 0); 
     return(sentence+outcome); 
    } 
} 
+0

Где указано 'weaponChoice' и' computerChoice'? – mdnghtblue

+0

Отредактировано для включения всего кода. @DavidWallace Не могли бы вы объяснить немного больше? –

+0

@ AardenHartle Какая часть моего ответа вызывает у вас трудности? –

ответ

2

Чтобы сделать эту работу, вам нужно заменить

determineOutcome(outcome, sentence); 
System.out.println(sentence+outcome); 

с

String valueReturned = determineOutcome(outcome, sentence); 
System.out.println(valueReturned); 

потому, что Java является передача по значению, не проходит по ссылке. Это означает, что метод determineOutcome будет работать со своими собственными копиями outcome и sentence и не изменять версии, принадлежащие вызываемому ему методу.

Но также метод фактически не использует два аргумента, которые вы передаете в него. Было бы гораздо менее запутанным, если бы вы просто полностью опустили параметры и изменили их на public static String determineOutcome() ... и объявили String sentence; и String outcome; внутри метода.

+0

Благодарим вас за помощь. Мне просто нужна помощь. Еще раз спасибо! –

+0

Не похоже, чтобы входные переменные назначались до вызова метода, поэтому на самом деле вам, вероятно, лучше не использовать какие-либо параметры вообще. – mdnghtblue

+0

О, я вижу, он отредактировал вопрос, так как написал свой ответ. Мне нужно взглянуть на новый код. –

1

При вызове функции, возвращающей результат, вы должны либо вызвать функцию в System.out.println(), либо присвоить результат переменной, которую вы затем распечатываете.

Вариант 1:

String result = determineOutcome(outcome, sentence); 
System.out.println(result); 

или вариант 2:

System.out.println(determineOutcome(outcome, sentence)); 
0

В дополнение к точкам других людей, сделанных в своих ответах, это выглядит как ваш цикл в то время как никогда не выполняется. Переменные tie, win и lose не меньше 0, поэтому условие цикла while никогда не будет истинным. Вы можете попытаться изменить его:

while (lose <= 0 || win <= 0 || tie <= 0); 

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

+0

Учитывая то, что мы ожидаем от него, он почти наверняка не хочет петли вообще. –

Смежные вопросы