2017-10-20 43 views
0

我想创建一个简单的程序,它有一个“玩家”和一个“怪物”并绘制随机数字以降低健康。然后我希望它在文本区域打印。除了FightTheMonster方法,我的变量怪物和玩家正​​在被重置为0。 (对于草率代码,提前抱歉)。当我使用playerDied或monsterDied方法打印怪物或玩家时,无论如何它们都打印为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

给你的静态字段的怪物和玩家的值,当你将它们定义:

public static int player=10; 
    public static int monster=10; 

而且由于战斗方法信息字符串后运行:System.out.println("Monster Health in Main Method " + monster);默认值为零印

+0

哎呀,没有注意到我错过了,谢谢! – MangoesRAwesome

0

主要的事情发生这是一个线程/时间问题。你正在一个新的线程上调用CreateAndShowGui和FightTheMonster方法,并使用“InvokeLater”来运行它们。如果您查看控制台输出,您会注意到这是在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的。这将导致方法按您在主方法中列出的顺序进行。这就是说,作为一个额外的改进,我可能会用玩家和怪物或其他东西创建新的类,在主要方法中实例化它们,将它们传递给fightTheMonster方法,而不是像你在做的那样使用静态变量。

+0

非常感谢你,我甚至没有注意到,从它被分配或试图实际做某件事情的意义上说,没有一个真正的“目的”,我只是想学习java,而我_thought_我已经学会了足够的东西来做一些更令人兴奋的事情,因为仅仅遵循这些教程真的很无聊,但显然我需要更多的练习。 – MangoesRAwesome