这个循环在哪里出错了?

时间:2015-07-19 18:09:26

标签: java awt java-threads

我目前正在研究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);
    }
}

1 个答案:

答案 0 :(得分:0)

我建议你专注于战斗功能的循环。

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

如果这是无限循环,则看起来好像p.getHP()的终止条件小于或等于0永远不会被满足。