2015-07-19 59 views
0

我目前正在研究基於文本的Java RPG。每次玩家走過一定數量的步時,都會發生隨機戰鬥。每次運行戰鬥系統時,程序都會進入永久循環,屏幕會凍結。這個循環在哪裏出錯?

我該如何解決這個問題?這是所有這些處理的主類的代碼。

import javax.swing.*; 
import java.awt.event.*; 
public class Runner extends JFrame{ 

    String mat[][] = {{".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}, 
         {".",".",".",".",".",".",".",".",".","."}}; 

    boolean Burn; 
    JPanel j = new JPanel(); 
    Player p = new Player(1,20,20,0,2,6,0,7); 
    Enemy en = new goblin(1,8,8,0,1,3); 
    private int steps = 0, randomBattle = (int)(Math.random()*(7-4))+4; 

    public Runner() 
    { 
     System.out.println(""+p.getHp()); 
     JPanel j = new JPanel(); 
     JLabel gridDisplay = new JLabel(); 
     JButton north = new JButton("N"); 
     JButton south = new JButton("S"); 
     JButton east = new JButton("E"); 
     JButton west = new JButton("W"); 
     Grid grins = new Grid(mat,1,1,mat.length,mat[0].length); 
     gridDisplay.setBounds(200,10,200,200); 
     gridDisplay.setText(grins.toString()); 
     j.setLayout(null); 
     north.setBounds(100,50,50,50); 
     south.setBounds(100,105,50,50); 
     east.setBounds(45,77,50,50); 
     west.setBounds(155,77,50,50); 
     j.add(north); 
     j.add(south); 
     j.add(east); 
     j.add(west); 
     j.add(gridDisplay); 
     j.setVisible(true); 
     j.setSize(800,600); 
     add(j); 

     north.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (randomBattle == steps) 
       { 
        j.setVisible(false); 
        System.out.println("HP: "+p.getHp()); 
        Battle(p, en); 
       } 
       grins.changeX(-1); 
       gridDisplay.setText(grins.toString()); 
       steps++; 
      } 
     }); 

     south.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (randomBattle == steps) 
       { 
        j.setVisible(false); 
        System.out.println("HP: "+p.getHp()); 
        Battle(p, en); 
       } 
       grins.changeX(1); 
       gridDisplay.setText(grins.toString()); 
       steps++; 
      } 
     }); 

     east.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (randomBattle == steps) 
       { 
        j.setVisible(false); 
        System.out.println("HP: "+p.getHp()); 
        Battle(p, en); 
       } 
       grins.changeY(-1); 
       gridDisplay.setText(grins.toString()); 
       steps++; 
      } 
     }); 

     west.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (randomBattle == steps) 
       { 
        j.setVisible(false); 
        System.out.println("HP: "+p.getHp()); 
        Battle(p, en); 
       } 
       grins.changeY(1); 
       gridDisplay.setText(grins.toString()); 
       steps++; 
      } 
     }); 
    } 

    public void Battle(Player p, Enemy e) 
    { 
     JButton attack = new JButton("Attack"); 
     JLabel playerHp = new JLabel(); 
     JLabel enemyHp = new JLabel(); 
     JLabel battleStatus = new JLabel(); 
     boolean battle = true; 

     setFocusable(true); 
     setLayout(null); 

     playerHp.setBounds(400,200,300,20); 
     enemyHp.setBounds(400,20,300,20); 
     attack.setBounds(350,300,100,20); 

     playerHp.setText("HP :"+p.getHp()); 
     enemyHp.setText("HP :"+e.getHp()); 
     add(playerHp); 
     add(enemyHp); 
     add(attack); 
     add(battleStatus); 
     attack.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       p.attack((Fighter)en); 
       Burn = false; 
      } 
     }); 
     while(battle == true){ 
      if(Burn == false) 
      { 
       en.attack((Fighter)p); 
       Burn = true; 
      } 
      if(p.getHp() <= 0) 
      { 
       battle = false; 
      } 
     } 
    } 

    public static void main(String args[]) 
    { 
     Runner r = new Runner(); 
     r.setVisible(true); 
    } 
} 
+3

請改善您的問題:縮小問題範圍,確切地告訴我們無盡循環發生的位置(使用調試器!)。正確格式化並縮進代碼,並按照Java命名約定(方法名稱從不以大寫字母開頭)。附加提示:不要在事件派發線程中執行長操作。 – RealSkeptic

+1

你需要改善你的問題,讓人們能夠幫助你。問題不在於「幫助我建立一個基於回合的戰鬥系統」,而是「幫助我找到這個無限循環」;問更具體的問題,你會得到更好的答案,你會更快地得到它們。 (我現在正在改變這個問題的標題。) –

回答

0

我會建議把重點放在你的戰鬥功能循環上。

while(battle == true){ 
     if(Burn == false) 
     { 
      en.attack((Fighter)p); 
      Burn = true; 
     } 
     if(p.getHp() <= 0) 
     { 
      battle = false; 
     } 
    } 

如果是這樣的無限循環,它看起來好像p.getHP()的終止條件是小於或等於0永不滿足。