【发布时间】: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