变量在方法中重置

时间:2017-10-20 12:20:35

标签: java swing

我正在尝试创建一个简单的程序,其中包含一个"播放器"和一个怪物"并抽取随机数来降低健康状况。然后我希望它在文本区域中打印。除了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);
        }


}

2 个答案:

答案 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方法,而不是像你一样使用静态变量。