【问题标题】:(Java) Changing variables in a instance of a class(Java) 更改类实例中的变量
【发布时间】:2012-01-09 00:23:23
【问题描述】:

我整天都在看这个问题,但我似乎无法理解发生了什么。基本上,我有 2 个课程,一个是 JFrame,另一个只是一个游戏循环。 JFrame 类应该根据用户单击的内容更改一些变量。

但是,当单击按钮时,这些方法不会更改任何变量。我可以更改 JFrame 中的变量的唯一方法是从调用类中调用其中的方法。

这是相关代码的示例。

public class CMBBattle {

public void startCombat (object.PlayerVariables p1Char1, object.PlayerVariables p1Char2, object.PlayerVariables p1Char3){
    boolean status;
    int teamMovesLeft = 0;

    Battle battle = new Battle(p1Char1, p1Char2, p1Char3);

    status = battle.combatStatus();
    teamMovesLeft = battle.getMovesLeft();
    while (status == true){
        teamMovesLeft = battle.getMovesLeft();
        if (teamMovesLeft <= 0){
            battle.createBattleOrder();
            battle.doBattle();
        }
        status = battle.combatStatus();
        if(status == true){
            battle.newRound();
        }
    }
  }

  public class Battle extends JFrame implements MouseListener {
     private String currentCharacter;

   private void characterOrders(String userChoice, String playerHit){
    int playerAttacker = 0;
    int abilityUsed = 0;
    int speedOfHit = 0;
    boolean finished = false;

    //TODO Currently nothing is happening with what you actually used, i think this was in the old code. Re-implement
    //TODO At this point I am going to just say everything is a quick attack.  So, it'll take up 1 per attack.
    //TODO Add logic to see if something is over their move limit or not
    speedOfHit = 1;

    if(currentCharacter.equals(Player1.charName)){
        playerAttacker = 1;
        char1Orders[moveUses][0] = figureDamage(abilityUsed);
        char1Orders[moveUses][1] = playerAttacker;
        char1Orders[moveUses][2] = getCharacterID(playerHit);
        if((currentPlayerMoves - speedOfHit) <= 0){
            player1.ordersFinished = true;
            finished = true;
        }
    }
    else if(currentCharacter.equals(player2.charName)){
        playerAttacker = 2;
        char2Orders[moveUses][0] = figureDamage(abilityUsed);
        char2Orders[moveUses][1] = playerAttacker;
        char2Orders[moveUses][2] = getCharacterID(playerHit);
        if((currentPlayerMoves - speedOfHit) <= 0){
            player2.ordersFinished = true;
            finished = true;
        }
    }
    else if(currentCharacter.equals(player3.charName)){
        playerAttacker = 3;
        char3Orders[moveUses][0] = figureDamage(abilityUsed);
        char3Orders[moveUses][1] = playerAttacker;
        char3Orders[moveUses][2] = getCharacterID(playerHit);
        if((currentPlayerMoves - speedOfHit) <= 0){
            player3.ordersFinished = true;
            finished = true;
        }
    }
    moveUses += 1;

    //The following decides if it's time for the next player or not, if this is the last player,
    //then it's time to set it to zero and let the handler do the rest.
    if(finished == true){
        if(player1.ordersFinished == false){
            currentCharacter = player1.charName;
            currentPlayerMoves = player1.moves;
        }
        else if(player2.ordersFinished == false){
            currentCharacter = player2.charName;
                            //THE PROBLEM IS RIGHT HERE, THE LINE ABOVE SHOULD HAVE
                            //CHANGED CURRENTCHARACTER, BUT IT DID NOT
            currentPlayerMoves = player2.Moves;
        }
        else if(player3.ordersFinished == false){
            currentCharacter = player3.charName;
            currentPlayerMoves = player3.moves;
        }
        else {
            currentCharacter = "";
            currentPlayerMoves = 0;
        }
        moveUses = 0;
    }
    else{
        currentPlayerMoves -= 1;
    }

    /*
    if (actualUses != Character.moves){
        //TODO We should add logic so that an unitilized variable isn't used...
        //If they don't do anything, set the rest of their array to zeroe's so we can later say, if zero exclude them from round or don't worry about the shite
    }
    */
}

   public String setCurrent(){
   currentCharacter = "NewPerson";
    }

    @Override
public void mouseClicked(MouseEvent e) {
    if(!currentCharacter.equals("")){
        String playerHit = JOptionPane.showInputDialog(null, "Who should "                          + currentCharacter + " attack?");
        if(e.getSource() == attackButton){
            characterOrders("Attack", playerHit);
        }
    }
}

}

现在,如果我从 startCombat 方法中调用 setCurrent,则变量会发生变化。但是,单击不会更改变量。它会很好地运行代码,但是当它到达它改变它的部分时,它不会改变它。我确定我只是遗漏了一些东西,但我无法弄清楚我看过的规则......

--更新-- 我更新了 CharacterOrders 以反映我现在的实际代码 请注意currentCharacter是当前正在下单的Character

【问题讨论】:

  • 怎么知道CharacterOrders中的赋值已经执行了?你怎么知道 CharacterOrders 已经被执行了?
  • setCurrent 如何工作?它没有括号,编译器不应该允许这样做。另外,当前角色是否应该是作为目标的其他团队的角色?
  • 那是我的错,我在这里写的,但这不是直接复制和粘贴。我会用实际的复制和粘贴来更新信息
  • 请提交编译的代码,并以小写字母开头方法和变量名称,使用大写字母会导致您的代码难以理解。我们习惯于阅读遵循标准约定的代码。

标签: java class variables jframe


【解决方案1】:

好的,由于代码不完整,而且我发现它有点难以理解,我可能完全走错了方向。

但是...playerHit 在你的监听器中是从哪里来的 mouseClicked?它在哪里设置?我不确定,但也许playerHit 不对应任何玩家的名字,因此,它没有进入你的第一组三个if-else 语句,所以finished 永远不是@ 987654325@?

如果您可以发布更多信息,或者让代码提供更多信息,我们或许能够更深入地了解您的问题所在。抱歉,如果这不是解决方案。

不是解决方案的一部分,但它可能会使代码更简洁:在characterOrders 中的第一组if-else 语句中,也许您可​​以将一些变量设置为@987654328 @、char2Orderschar3Orders 而不必分别调用每一个?然后改为对变量进行操作?

有点像

if(currentCharacter.equals(Player1.charName)) {
    myVariable = char1Orders;
}
else if(/*...a condition...*/) {
   //...more code
}
//...
myVariable[0] = /*...*/;
//...etc.

【讨论】:

  • 我之前在代码中,由于一些复杂性不得不将其更改为这个。然而,问题确实不是任何实际流程。它按照我想要的方式流动,我可以告诉这一点,因为我正在 Eclipse 中调试它。但是,当它到达我试图更改 currentCharacter 变量的部分时,代码实际上并没有改变它,但是它确实运行了那行代码。
  • 啊,代码居然在运行?好的。嗯......好吧,如果这些值都是不同的,并且它们都是不同的对象,那么这有点难以弄清楚。目前我唯一能想到的是它们可能不是不同的值。除此之外,嗯...我什么都没有...对不起...=\
  • 哈哈没关系。我认为问题要么是 A。我需要重新阅读有关静态和非静态方法/变量的信息,要么是 B。由于主类在循环中运行,也许这会阻止我的 jframe 运行。
【解决方案2】:

问题是我对线程缺乏了解(我现在已经纠正)。因为我正在创建我的 JFrame,然后希望它与代码同时运行,所以它永远不允许执行它的代码,因为从技术上讲它仍在创建中。所以,注意线程就是答案。

【讨论】:

    【解决方案3】:

    不应该

    private void CharacterOrders(String userChoice, String PlayerHit)
    {
        currentCharacter = PlayerHit;
    }
    

    【讨论】:

    • 是的,它在实际代码中。但是,我试图给出代码在做什么的一般概念。我这边的代码正在运行我猜问题是我无法更改 CharacterOrders 中的 currentCharacter。
    • 那你为什么发帖说是currentCharacter = userChoice;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 2013-11-09
    相关资源
    最近更新 更多