#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
}
В этом случае не забудьте сбросить значения в начале новой игры.
Удачи