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);
}
}
請改善您的問題:縮小問題範圍,確切地告訴我們無盡循環發生的位置(使用調試器!)。正確格式化並縮進代碼,並按照Java命名約定(方法名稱從不以大寫字母開頭)。附加提示:不要在事件派發線程中執行長操作。 – RealSkeptic
你需要改善你的問題,讓人們能夠幫助你。問題不在於「幫助我建立一個基於回合的戰鬥系統」,而是「幫助我找到這個無限循環」;問更具體的問題,你會得到更好的答案,你會更快地得到它們。 (我現在正在改變這個問題的標題。) –