我将如何在我的函数中保留一个计数值?

How would I keep a count value in my function?

我需要制作一个模拟掷骰子游戏的程序。但我遇到的问题是计算玩家获胜或失败的次数。我认为这是因为计数不在主要方法中,它会将自己设置回 0 但我不知道如何修复它。这是 运行 程序

的代码
public class Craps {

  public static void main(String args[]) {

    JOptionPane.showMessageDialog(null, "Welcome to my Craps game");
    JOptionPane.showMessageDialog(null, "Press 'OK' to roll the dice");

    //Calls the craps function
    playCraps();
    
    //Asks user if they want to play again
    String playAgain = JOptionPane.showInputDialog("Would you like to play again?\n(enter 'y' for yes)");

    while(playAgain.equals("y")){
      playCraps();
    }

  }


  static void playCraps(){
    Die die1 = new Die(6);
    Die die2 = new Die(6);

    boolean firstTry = false;
    
    //Generates the die
    int roll1 = die1.roll();
    int roll2 = die2.roll();

    int sum = roll1 + roll2;

    //counts the amount of times the player wins or loses
    int winCount = 0;
    int loseCount = 0;

    //Shows the rolls and the sum
    JOptionPane.showMessageDialog(null, "You rolled a " + roll1 + " and a " + roll2 + ".\n\nThe sum is " + sum);

    //If the player doesn't win or lose on their first try,
    //it keeps rolling until they win or lose
    if(sum == 7 || sum == 11){
      JOptionPane.showMessageDialog(null, "You win!!!");
      winCount++;
      firstTry = true;
    }else if(sum == 2 || sum == 3 || sum == 12) {
      JOptionPane.showMessageDialog(null, "You lose.");
      loseCount = loseCount + 1;
      firstTry = true;
    }else{
      JOptionPane.showMessageDialog(null,
      "You must keep rolling. If you roll a " + sum + " again, you win. If you roll a 7 before that, you lose.");
        
      while(firstTry == false){
        int secRoll1 = die1.roll();
        int secRoll2 = die2.roll();
        int secSum = secRoll1 + secRoll2;

        JOptionPane.showMessageDialog(null, "You rolled a " + secRoll1 + " and a " + secRoll2 + ".\n\nThe sum is " + secSum);
        
        if(secSum == sum){
          JOptionPane.showMessageDialog(null, "You matched!!!");
          winCount++;
          break;
        }

        if(secSum == 7){
          JOptionPane.showMessageDialog(null, "I'm sorry, you rolled a 7.");
          loseCount++;
          break;
        }
      }
    }

    //Shows the user how many times they win or lose
    JOptionPane.showMessageDialog(null, "Your current score..." + "\nwins: " + winCount + "\nlosses: " + loseCount);
  }

}
public class Die 
{
    private int sides;
    private int total;
    private int rolls;

    //The following method is called a 'Constructor'
    //it runs when a new 'Die' is created
    
    public Die(int numSides) 
    {
        sides=numSides;
        total=0;
        rolls=0;
    }
    
    
    
    //gets a die roll
    public int roll()
    {
        int result = (int)(Math.random()*sides+1);
            
        total = total+result;
        rolls++;
            
        return result;
    }
    
    // The following methods return information about the die
    
    public int getSides()
    {
        return sides;
    }
    
    public int getTotal()
    {
        return total;
    }
    
    public int getRolls()
    {
        return rolls;
    }
   
}
int winCount = 0;
int loseCount = 0;

您的变量是在 playCraps 方法中声明的,因此每次您 exit/call 方法时它们都是 'lost' 和 're-created'(如您所猜)。要解决此问题,您必须将它们设为全局:

public class Craps{
  public static int winCount=0;
  public static int loseCount=0;

  <your other methods like main and play>
}

这将使它们可以从任何地方访问,因此它们的价值会随着用户不断玩而增加。

你说的很对,每次调用的计数范围都是一样的,所以你直接从头开始计数。

在你的 Craps class 本身,将相同的跟踪器计数定义为私有字段并使用它们,所以你只需要将它们移动到 class 范围;像这样。

public class Craps {
   private static int winCount = 0;
   private static int loseCount = 0;
}

有关简单教程中的更多信息,请尝试阅读此内容 Variables Scope in Java

每次调用 playCraps(); 函数时,您的计数都会重置。

你可以改成

//counts the amount of times the player wins or loses
 static int winCount = 0;
 static int loseCount = 0;

静态将防止每次都重置计数。 但是,如果您打算添加其他播放器,那将不起作用。

在这种情况下,您可以更改您的结构,以便您拥有一个 class 成员,而不是为每个玩家递增。