【问题标题】:A varible in an enum will not set to another value枚举中的变量不会设置为另一个值
【发布时间】:2015-06-20 23:30:47
【问题描述】:

所以我正在制作这个游戏,每当点击“攻击”按钮时,敌人和玩家都会失去生命值。玩家可以治愈,但当他与怪物再次战斗时,怪物的生命值仍然为 0 或 1,而玩家的生命值被治愈。我尝试了一种方法来修复它,但它仍然不起作用。有什么解决办法吗?

(对不起,如果我的代码草率。我认为 Panel 或 Label 类是不必要的。)

主类:

public static void mainScreen(JPanel p)
{
    JButton points = new JButton("stats");
    points.setLayout(null);
    points.setBounds(smallButton);
    points.setLocation(510, 5);
    points.addActionListener(new ActionListener()
    {
          public void actionPerformed(ActionEvent e)
          {
              p.removeAll();
              pointsScreen(p);
              p.repaint();
          }
        });
    JButton battle = new JButton("battle");
    battle.setLayout(null);
    battle.setBounds(smallButton);
    battle.setLocation(510, 30);
    battle.addActionListener(new ActionListener()
    {
          public void actionPerformed(ActionEvent e)
          {
              Battle b = new Battle(strpoints, defpoints, luckpoints, health, currentHealth);
              p.removeAll();
              p.add(battle);
              battleScreen(p,b);
              p.repaint();
          }
        });
    p.add(battle);
    p.add(points);
}

public static void battleScreen(JPanel p, Battle b)
{
    Random r = new Random();
    Label enemy = new Label("You've encountered a "+b.e.getName()+"!",200,20, new Dimension(200,30), Color.YELLOW);
    p.add(enemy); // enemy encountered

    Label enemyHp = new Label("Health: "+b.e.getCurrentEnemyHp()+"/"+b.e.getEnemyHp(),500,100, new Dimension(100,25), Color.GREEN);
    p.add(enemyHp); // enemy's hp
    Label enemySt = new Label("Strength: "+b.e.getStr(),500,125, new Dimension(100,25), Color.ORANGE);
    p.add(enemySt); // enemy's str
    Label enemyDf = new Label("Defence: "+b.e.getDef(),500,150, new Dimension(100,25), Color.CYAN);
    p.add(enemyDf); // enemy's def
    Label enemyloot = new Label("Loot: "+(b.e.getLoot()+r.nextInt(luckpoints + 1)),500,175, new Dimension(100,25), Color.YELLOW);
    p.add(enemyloot); // enemy's loot

    Label hp = new Label("Health: "+currentHealth+"/"+health,0,100, new Dimension(100,25), Color.GREEN);
    p.add(hp); // player hp
    Label str = new Label("Strength: "+strpoints,0,125, new Dimension(100,25), Color.ORANGE);
    p.add(str); //player str
    Label def = new Label("Defence: "+defpoints,0,150, new Dimension(100,25), Color.CYAN);
    p.add(def); //player def

    Label activity = new Label("What's your next move?",0,340, new Dimension(620,35), Color.WHITE);

    p.add(activity); // battle activity feed

    Label enemyImg = new Label(null, 390, 100, new Dimension(100,100), null);
    enemyImg.setIcon(b.e.getImage());
    p.add(enemyImg); // picture of the enemy

    Label img = new Label(null, 110, 100, new Dimension(100,100), null);
    img.setIcon(new ImageIcon("src\\player.png"));
    p.add(img); // picture of the player


    JButton done = new JButton("done");
    done.setLayout(null);
    done.setBounds(smallButton);
    done.setLocation(420, 280);
    done.addActionListener(new ActionListener()
    {
          public void actionPerformed(ActionEvent e)
          {
              p.removeAll();
              p.repaint();
              if(currentHealth <= 0)
              {
                  if(activity.getText().contains("been"))
                  {
                    strpoints = 0;
                    defpoints = 0;
                    luckpoints = 0;
                    freepoints = 10;
                    gold = 100;
                    health = 10;
                    currentHealth = 10;
                  }

                    p.removeAll();
                    pointsScreen(p);
                    p.repaint();
                    p.add(activity);
                    p.remove(activity);
              }
              else
                  mainScreen(p);

          }
        });



    JButton attack = new JButton("attack");
    attack.setLayout(null);
    attack.setBounds(smallButton);
    attack.setLocation(100, 280);
    attack.addActionListener(new ActionListener()
    {
          public void actionPerformed(ActionEvent e)
          {
              int dmg2player = b.e.getStr() + r.nextInt(2) - defpoints/2;
              if(dmg2player < 1)
                  dmg2player = 1;
              int dmg2enemy = strpoints + r.nextInt(2) - b.e.getDef()/2;
              if(dmg2enemy < 1)
                  dmg2enemy = 1; // calculates damage dealt by you and enemy


              b.e.updateEnemyHp(dmg2enemy);
              currentHealth = currentHealth - dmg2player; 
              hp.setText("Health: "+currentHealth+"/"+health);
              enemyHp.setText("Health: "+b.e.getCurrentEnemyHp()+"/"+b.e.getEnemyHp()); //updates player and enemy's current hp


              activity.setText("You dealt "+dmg2enemy+" damage to "+b.e.getName()+" and you received "+dmg2player+" damage!"); //updates battle log


              if(currentHealth <= 0)
              {
                  p.removeAll();
                  activity.setText("You have been defeated by a "+b.e.getName()+"!");
                  p.add(done);
                  p.add(activity);
                  p.repaint();
                  b.e.resetHp();
              } // happens whenever the player is ded as fuk
              else if(b.e.getCurrentEnemyHp() <= 0)
              {
                  gold = gold + b.e.getLoot();
                  freepoints = freepoints + (b.e.getLoot()/10);
                  p.removeAll();
                  activity.setText("You have defeated the "+b.e.getName()+" and earned "+b.e.getLoot()+" gold along with "+(b.e.getLoot()/10)+" points!");
                  p.add(done);
                  p.add(activity);
                  p.repaint();



              } // happens when the enemy is ded as fuk

              else
              {
                  p.remove(hp);
                    p.remove(enemyHp);
                    p.remove(activity);
                    p.add(hp);
                    p.add(enemyHp);
                    p.add(activity);
                    p.repaint();
              } // happens when nobody is ded as fuk

          }
        });
    p.add(attack);

    JButton flee = new JButton("flee (" + (b.e.getLoot()/2)+"g)");
    flee.setLayout(null);
    flee.setBounds(new Rectangle(120,20));
    flee.setLocation(420, 280);
    flee.addActionListener(new ActionListener()
    {
          public void actionPerformed(ActionEvent e)
          {

              if(gold > b.e.getLoot()/2)
              {
                  gold = gold - (b.e.getLoot()/2);
                  p.removeAll();
                  mainScreen(p);
              } else 
              {
                  activity.setText("You need "+b.e.getLoot()/2+" gold to escape!");
                  p.remove(activity);
                  p.add(activity);
              } 

              p.repaint();


          }
        });
    p.add(flee);


}

战斗类。

public class Battle
{
    int str;
    int def;
    static int luck;
    int hp;
    int currenthp;
    Enemy e;


    public Battle(int s, int d, int l,int hp, int chp)
    {
        this.hp = hp;
        Random r = new Random();

        currenthp = chp;
        str = s;
        def = d;
        luck = l;

        switch(r.nextInt(5))
        {
        case 0: e = Enemy.rat;
        return;
        case 1: e = Enemy.hunter;
        return;
        case 2: e = Enemy.wolf;
        return;
        case 3: e = Enemy.troll;
        return;
        case 4: e = Enemy.demon;
        return;
        }
    }

}

敌人等级:

import javax.swing.ImageIcon;


    public class Enemy {

        public static final Enemy rat = new Enemy("Rat", 2, 2, 10, 10, new ImageIcon("src\\rat.png"));
        public static final Enemy hunter = new Enemy("Hunter", 4, 4, 20, 25, new ImageIcon("src\\hunter.png"));
        public static final Enemy wolf = new Enemy("Wolf", 5, 3, 15, 40, new ImageIcon("src\\wolf.png"));
        public static final Enemy troll = new Enemy("Troll", 4, 7, 30, 75, new ImageIcon("src\\troll.png"));
        public static final Enemy demon = new Enemy("Demon", 6, 6, 25, 100, new ImageIcon("src\\demon.png"));

        private String name;
        private int estr;
        private int edef;
        private int ehp;
        private int gold;
        private int ecHp;
        private ImageIcon img;

        Enemy(String n, int s, int d, int h, int g, ImageIcon i)
        {
            name = n;
            estr = s;
            edef = d;
            ehp = h;
            gold = g;
            ecHp = h;
            img = i;
        }

        public void updateEnemyHp(int dmg)
        {
            ecHp = ecHp - dmg;
        }

        public int getCurrentEnemyHp()
        {
            return ecHp;
        }

        public int getEnemyHp()
        {
            return ehp;
        }


    public int getStr()
    {
        return estr;
    }

    public int getDef()
    {
        return edef;
    }


public ImageIcon getImage()
{
    return img;
}

public int getLoot()
{
    return gold;
    }

        public String getName() {
            return name;
        }


    public void resetHp() {
        ecHp=ehp;

    }
    }

【问题讨论】:

  • Java enums 最好是不可变的编译时常量和stateless,所以你可以在这里重新考虑你的设计。
  • 是的,你的想法是对的,但不幸的是枚举并不是最好的选择。只做常规课程!

标签: java enums


【解决方案1】:

更改 enum Enemy 的第一部分:

public class Enemy {

    public static final Enemy rat = new Enemy("Rat", 2, 2, 10, 10, new ImageIcon("src\\rat.png"));
    public static final Enemy hunter = new Enemy("Hunter", 4, 4, 20, 25, new ImageIcon("src\\hunter.png"));
    public static final Enemy wolf = new Enemy("Wolf", 5, 3, 15, 40, new ImageIcon("src\\wolf.png"));
    public static final Enemy troll = new Enemy("Troll", 4, 7, 30, 75, new ImageIcon("src\\troll.png"));
    public static final Enemy demon = new Enemy("Demon", 6, 6, 25, 100, new ImageIcon("src\\demon.png"));
    // same as before
}

【讨论】:

  • 所以我创建了一个新类并删除了枚举,但它仍然无法正常工作。战斗仍然可以正常开始,但之后敌人的生命值没有重置
  • 我完全被难住了。有什么想法吗?
  • @KylerRiesenbeck 您的问题是枚举中的变量不会设置为另一个值。如有必要,您应该发布另一个问题。请勿在此问题中更改您的代码。
【解决方案2】:

我找到了解决方案!这是我的一个愚蠢的错误,但我在 Enemy 中做了一个方法来重置敌人的 hp

    public void resetHp() {
    ecHp=ehp;

}

但我实际上并没有在赢得战斗后调用该方法......它只是在我被击败时才调用

              if(currentHealth <= 0)
          {
              p.removeAll();
              activity.setText("You have been defeated by a "+b.e.getName()+"!");
              p.add(done);
              p.add(activity);
              p.repaint();
              b.e.resetHp();
          } // happens whenever the player is ded as fuk
          else if(b.e.getCurrentEnemyHp() <= 0)
          {
              gold = gold + b.e.getLoot();
              freepoints = freepoints + (b.e.getLoot()/10);
              p.removeAll();
              activity.setText("You have defeated the "+b.e.getName()+" and earned "+b.e.getLoot()+" gold along with "+(b.e.getLoot()/10)+" points!");
              p.add(done);
              p.add(activity);
              p.repaint();



          } // happens when the enemy is ded as fuk

感谢大家的回复!

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 2023-03-31
    • 2016-06-27
    • 2011-11-14
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    相关资源
    最近更新 更多