Как мне правильно вызвать созданный мной метод, чтобы я мог использовать его в другом?

#java

#java

Вопрос:

Я создаю камень, ножницы, бумага с методами:

  displayRoundResults()
 displayMatchResults()
 chooseHandShape()
 winningHand()
 //etc
  

winningHand() Метод сравнивает символы и возвращает значение (0,1,2).
В моем displayRoundResults() методе я пытаюсь вызвать winningHand() метод в displayRoundResults() методе, чтобы он мог принимать целое число из winningHand() , а затем добавлять к любому из очков игрока в зависимости от возвращаемого значения.

Я думаю, что у меня есть хорошо написанные методы, я просто застрял на том, как вызывать методы в основном.

 public class RockPaperScissors
{
    private final char _YES = 'Y';
    private final int _HIGH_BESTOF = 5;
    // ***********************************************************************

    // central method that holds the majority of the game's logic
    public void playGame()
    {
        char player1, player2; //used to display the handshape from method
        int playToWins;
        int winningHand;
        int p1Score = 0;
        int p2Score = 0;
        int numberOfRounds; 

        while (true) //add loop so that it keeps going until user decides to end the game

        System.out.println("Welcome to Rock, Paper, Scissors..");
        //call playToWins Method to retrieve how many rounds will be played
        //playToWins(scan);

        //will output different outcomes until winner has won x amount of times (the number retrieved from playToWins)
        for (int i = 1; i <= numberOfRounds; i  )
        {
            player1 = chooseHandShape();
            player2 = chooseHandShape();

            //displays rock,paper, or scissor for each player
            System.out.println("P1: "   player1   " P2: "   player2);

            //winningHand is called to compare the two values and then return an int (0,1,2)
            winningHand = winningHand(player1, player2);

            //displayRoundResult is called to calculate score for each round that is played
            displayRoundResult(p1Score, p2Score);
        }
        //displayMatchResult here
        //
        // majority of code should be here
        //scanner should be here
    }

    // display round results
    private void displayRoundResult(int p1Score, int p2Score)
    {
        int winningHand;
        //properly call winningHand method here

        if (winningHand == 1)
        {
            p1Score  ;
        }
        if (winningHand == 2)
        {
            p2Score  ;
        }
        //if winning equals ... then p1score goes up by 1 or p2score does
    }

    // display match results
    private void displayMatchResult(int round, int p1Score, int p2Score)
    {
        System.out.println("Player 1 has "   p1Score   " points amp; Player 2 has "   p2Score   " points"); 
    }

    // get what will be the round goal score
    private int playToWins(Scanner scan)
    {
        int numberOfRounds;

        System.out.println("Play round to? (Max is 5)");
        numberOfRounds = scan.nextInt();

        while (numberOfRounds > _HIGH_BESTOF)
        {
            System.out.println("Please enter a value between 1 and 5, your last input was incorrect!");
            numberOfRounds = scan.nextInt();
        }

        return numberOfRounds;
    }

    // given two hands choose which one wins
    // possible values for either parameter are 'R','P' or 'S'
    // use the RPS rules to determine the winner
    // return 0 for tie, 1 for player 1 win or 2 for player 2 win
    private int winningHand(char player1, char player2)
    {   
        int winningHand;
        char R,P,S;

        //tie
        if (player1 == (player2))
        {
            winningHand = 0;
        }

        //if player 1 wins
        if (player1 == R amp;amp; player2 == S)
        {
            winningHand =  1;
        }
        if (player1 == S || player2 == P )
        {
            winningHand = 1;
        }
        if (player1 == P || player2 == R)
        {
            winningHand = 1;
        }

        //if player 2 wins
        if (player1 == S || player2 == R)
        {
            winningHand = 2;
        }
        if (player1 == P || player2 == S)
        {
            winningHand = 2;
        }
        if (player1 == R || player2 == P)
        {
            winningHand = 2;
        }

        return winningHand;

    }

    // method that randomly chooses a hand shape
    // returns 'R' for rock, 'P' for paper and 'S' for scissors
    private char chooseHandShape()
    {

        Random cChoice = new Random();
        Random pChoice = new Random();

        //0 = Scissors, 1 = Rock, 2 = Paper

        int cChoiceInt =  cChoice.nextInt(2);
        int pChoiceInt = pChoice.nextInt(2);

        //player 1 randomized
        char pChoice1;
        switch (pChoiceInt)
        {
        case 0:
            pChoice1 = 'S';
            break; 
        case 1:
            pChoice1 = 'R';
            break;
        case 2:
            pChoice1 = 'P';
            break;
        }

        //player 2 randomized
        char cChoice1;
        switch (cChoiceInt)
        {
        case 0:
            cChoice1 = 'S';
            break; 
        case 1:
            cChoice1 = 'R';
            break;
        case 2:
            cChoice1 = 'P';
            break;
        }

        return cChoice1;
        return pChoice1;
    }

    // Yes/No response
    // Returns true if the user enters a 'y' or 'Y'
    //
    private boolean yesResponse(Scanner scan)
    {
        System.out.println("Would you like to play again? Yes(Y) or No(N)?");
        //scan.nextChar();
        return scan.nextLine().toUpperCase().charAt(0) == _YES;
    }
}
  

Комментарии:

1. Является ли это частью объявления класса? Можете ли вы добавить полный код? Все ваши методы являются частными, поэтому недоступны извне класса. Вы должны сделать хотя бы один общедоступным, и вы сможете получить к нему доступ

2. @Mihai извините, я добавил полный код. Я не уверен, что они квалифицируются как объявления классов?

3. Этот код даже не компилируется. Прежде чем пытаться вызывать методы на нем, он должен, по крайней мере, скомпилироваться. Также добавьте метод main, и вы сможете создать там экземпляр своего класса и вызвать свой общедоступный метод для этого объекта

Ответ №1:

Итак, вы определенно новичок в программировании. Зная это, я мог бы порекомендовать прочитать / посмотреть как можно больше руководств по основам программирования.

В любом случае, как вы можете прочитать здесь, вам нужно в первую очередь написать имя функции (вы правильно поняли эту часть). Но функции в Java и многих языках также определяются круглыми скобками () , которые используются для передачи параметров, если таковые имеются (но они все равно требуются даже при отсутствии параметров). Кроме того, в случае функции, возвращающей значение, подобное вашему, вам нужно присвоить его результат переменной, если вы хотите использовать его впоследствии (как в вашем случае). Это был бы правильный способ сделать это :

int thisRoundWinningHand = winningHand(player1Hand, player2Hand)

НО обратите внимание, что это неверно в вашей текущей реализации, поскольку в настоящее время вы принимаете значения типа char в своей winningHand() функции, но ваша displayRoundResults() получает только оценку? обоих игроков в качестве значений типа int . Кроме того, имя переменной отличается, поскольку вы хотите легко дифференцировать свою функцию и переменную (но это не обязательно в Java).

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

Надеюсь, это поможет

Ответ №2:

Помимо полезных материалов, упомянутых Оливером Самсоном, я замечаю проблему с displayRoundResult. Аргументы имеют примитивные типы int, поэтому при вызове этого метода значения передаются по значению, а не по ссылке. Оператор p1Score ; не будет иметь ожидаемого результата, поскольку он обновит только значение параметра, но не исходный p1score. Что вы можете сделать, так это определить p1score и p2score как переменные класса:

 public class RockPaperScissors
{
    private final char _YES = 'Y';
    private final int _HIGH_BESTOF = 5;
    // ***********************************************************************
    int p1Score = 0;
    int p2Score = 0;

    // central method that holds the majority of the game's logic
    public void playGame()
    {
        char player1, player2; //used to display the handshape from method
        int playToWins;
        int winningHand;
        int numberOfRounds; 
        ...
        displayRoundResult(winningHand);
      ...
    }
    // display round results
    private void displayRoundResult(int pWinningHand)
    {   
        if (pWinningHand== 1)
        {
            p1Score  ;
        }
        if (pWinningHand== 2)
        {
            p2Score  ;
        }
        //if winning equals ... then p1score goes up by 1 or p2score does
    }
  

В этом случае не забудьте сбросить значения в начале новой игры.

Удачи