我正在尝试创建一个简单的程序,其中包含一个"播放器"和一个怪物"并抽取随机数来降低健康状况。然后我希望它在文本区域中打印。除了FightTheMonster方法之外,我的变量怪物和玩家都被重置为0。 (对于草率的代码提前抱歉)。当我在玩家死亡或怪物死亡方法中打印怪物或玩家时,无论如何打印为0,这也会在主方法中出现。
import java.util.Random;
import java.awt.*;
import javax.swing.*;
public class Main extends JPanel {
JTextArea textArea;
static final String NEWLINE = System.getProperty("line.separator");
public static int player;
public static int monster;
private static void CreateAndShowGui() {
JFrame frame = new JFrame("Monster Fight");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new Main();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void FightTheMonster() {
boolean loop = true;
Main.player=10;
Main.monster=10;
while (loop == true) {
Random rand = new Random();
int n = rand.nextInt(3) + 1;
Random monsterroll = new Random();
int m = monsterroll.nextInt(3) + 1;
player = player - n;
monster = monster - m;
System.out.println("player health " + player + " monsterhealth " + monster);
if(player <= 0) {
loop = false;
System.out.println("Player Died");
}
if(monster <= 0) {
loop = false;
System.out.println("Monster Died");
}
}
}
public void monsterDied(int monster) {
Main.monster = Main.monster;
System.out.println("monster health in void" + monster);
if(monster <= 0) {
textArea.append("Monster Died");
System.out.println("Monster Died in void");
}
}
public void playerDied(int player) {
if(player <= 0) {
textArea.append("Player Died");
System.out.println("Player Died in void");
}
}
public Main() {
super(new GridLayout(0,1));
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(200, 75));
add(scrollPane);
}
public static void main(String[] args) {
Main.monster = Main.monster;
System.out.println("Monster Health in Main Method " + monster);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
CreateAndShowGui();
FightTheMonster();
}
});
Main juice = new Main();
juice.playerDied(player);
juice.monsterDied(Main.monster);
}
}
答案 0 :(得分:0)
在定义静态字段怪物和玩家值时:
public static int player=10;
public static int monster=10;
因为战斗方法在信息字符串后运行:System.out.println("Monster Health in Main Method " + monster);
打印默认值为零
答案 1 :(得分:0)
这里发生的主要问题是线程/计时问题。您在新线程上调用CreateAndShowGui和FightTheMonster方法并使用&#34; InvokeLater&#34;运行它们。如果您查看控制台输出,您会注意到在调用juice.playerDied和juice.monsterDied之后会发生这种情况。以下是我在运行代码时看到的输出:
主要方法0中的怪物健康
球员死于空虚
void0中的怪物健康
怪物死于虚空
球员健康8 monsterhealth 7
球员健康7 monsterhealth 5
球员健康6 monsterhealth 3
球员健康4 monsterhealth 2
球员健康1 monsterhealth 0
怪物死了
这将向您显示事情的发生顺序。因此,在将变量设置为10之前,将调用那些playerDied和monsterDied方法。
我不是摇摆专家,也不确定你的程序背后的想法是什么,但你可以尝试使用invokeAndWait而不是invokeLater来解决这个问题。这将导致方法按照您在main方法中列出的顺序发生。
那就是说,作为一个额外的改进,我可能会创建带有玩家和怪物等的新类,在main方法中实例化它们,将它们传递给fightTheMonster方法,而不是像你一样使用静态变量。