0

メインクラス、バトルクラス、モンスタークラス、プレイヤークラスなどのJavaゲームを作成しています。メインクラスのフレームに統計情報が表示されています。ボタンを押すと、新しいバトルフレームが作成され、統計も表示されます。戦闘後、ステータスは異なります(たとえば、プレイヤーの体力ポイントは、モンスターに攻撃される前よりも低くなります)。バトルフレームが消えた後、これらの統計の変更をメインフレームに反映させる必要があります。

メインクラスに戦闘が終了したことを伝え、統計を更新するための最良の方法は何ですか?コードは以下のとおりです。これは明らかに進行中の作業であり、他にもいくつかの無関係なクラスがあります。

バトルを開始する(つまり、JFrameである新しいバトルオブジェクトを作成する)メインクラスの部分:

public class DarkWorld extends JFrame implements ActionListener
{
    ...
    public DarkWorld()
    {
        ...
    public void createInfoLabel()
    {
        infoLabel.setText("<html>Player: " + DarkWorld.user.getPlayerName()
            + "<br>Health: " + DarkWorld.user.getHealth()
            + "<br>Attack Damage: " + DarkWorld.user.getAttackDamage()
            + "<br>Level: " + DarkWorld.user.getLevel()
            + "<br>Experience: " + DarkWorld.user.getExperience());
    }
    ...
        if(source == monsterButton)
        {

            BattleFrame battle = new BattleFrame();
            final int WIDTH = 700;
            final int HEIGHT = 500;
            battle.setSize(WIDTH, HEIGHT);
            battle.setVisible(true);
        }
        ...
}

バトル級の一部:

...


public class BattleFrame extends JFrame implements ActionListener
{
    Monster newMonster = new Monster();
    ...
    public BattleFrame()
    ...
    public void displayStats()
    {
        monsterLabel.setText("<html>Type: " + newMonster.getMonsterName()
                + "<br>Health: " + newMonster.getHealth()
                + "<br>Attack: " + newMonster.getAttackName()
                + "<br>Attack Damage: " + newMonster.getAttackDamage());
        playerLabel.setText("<html>Player: " + DarkWorld.user.getPlayerName()
                + "<br>Health: " + DarkWorld.user.getHealth()
                + "<br>Attack Damage: " + DarkWorld.user.getAttackDamage()
                + "<br>Level: " + DarkWorld.user.getLevel()
                + "<br>Experience: " + DarkWorld.user.getExperience());
    }
    ...
            if(newMonster.getHealth() <= 0)
            {
                ...
                JOptionPane.showMessageDialog(null, "You killed the monster! You found a " + newItem.getItemName()
                        + ". It has been added to your inventory.");
                dispose();
            }
            if(DarkWorld.user.getHealth() <= 0)
            {
                //if player dies (health reaches zero), the game is over - need to make game end
                displayStats();
                JOptionPane.showMessageDialog(null, "The monster killed you!");
                dispose();
            }
        }
        ...
}

編集:私が何を求めているのかがより明確になるように、ここでコードを単純化しようとしました。

4

2 に答える 2

0

メインクラスにメソッドを作成してみませんか。

public void updateStats() { /*update the stats*/ }

次に、バトルクラスで、バトルが終了したら、そのメソッドを呼び出すだけです。また、バトルクラスは常に1つしかないように思われるので、プロジェクトにシングルトンパターンを実装すると便利だと思います。

また、すべてのバトルロジックをクラスに入れたい場合もあります。私が今までに得た最高のプログラミングアドバイスは、GUIからロジックを分離することでした。

または、私は13歳で、JavaではなくC#でプログラムしているので、私が言ったことをすべて無視したいと思うかもしれません。

于 2012-12-04T01:12:40.813 に答える
0

この方法ではなく、統計表示画面でメインプレーヤーオブジェクトをリッスンすることをお勧めします。メインプレーヤーオブジェクトの統計の1つが変更されると、統計画面が自動的に更新されます。

...
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
...

public class User {

    private List<PropertyChangeListener> propertyListeners;

    ... add, and remove listener methods ...        


    public void setHitPoints(int newValue){
       PropertyChangeEvent event = new PropertyChangeEvent(this, "hitPoints", myHitpoints, newValue);
       myHitpoints = newValue;
       for (PropertyChangeListener listener : propertyListeners){
          listener.propertyChange(event);
       }
    }
于 2012-12-04T01:35:54.360 に答える