0

我正在创建一个游戏,其中玩家(玩家对象)必须与许多僵尸(僵尸对象)战斗。战斗是模拟的,但用户可以在战斗期间设置防御。

我想要一种有效的方法来处理所有的僵尸。每个 Zombie 对象都具有诸如生命值和攻击力等属性,它们分别对 Player 对象的攻击力和生命值产生影响。当玩家用武器攻击特定的僵尸时,我希望能够执行specificZombie.health -= 20;

我的问题是我不知道如何处理数十个甚至数百个 Zombie 对象,每个对象都具有各自的属性和单独的方法,例如 attack() 或 move()。我也不知道如何有效地初始化所有的僵尸,同时仍然能够调用特定的僵尸。我知道我可以使用循环,但是如何命名所有僵尸以便可以单独调用它们?

4

5 回答 5

0

您可以使用策略模式Zombie使您的课程如下所示:

class Zombie {

   private AttackAction atackAction;
   private MoveAction moveAction;
   //other attributes of the zombie;

}

您的AttackActionMoveAction界面如下所示:

interface AttackAction {
      public void attack();
}

interface MoveAction {
      public void move();
}

每个接口可以有两个实现。就像在的情况下AttackAction,一个是RealAttackAction,另一个是DummyAttackAction

class RealAttackAction implements AttackAction {

     public void action(){
         //do some real action
     }
}

class DummyAttackAction implements AttackAction {

     public void action(){
         //do some dummy action
     }
}

然后如果僵尸可以攻击,传递RealAttackAction' 引用它,如果它不能攻击,传递DummyAttackAction' 引用。类似的事情可以用MoveAction接口来完成。

您可以为僵尸维护一个list(或者map,如果每个僵尸都有唯一的标识)来有效地处理它们!

于 2013-05-23T16:22:28.230 回答
0

我的问题是我不知道如何处理数十个甚至数百个 Zombie 对象,每个对象都具有各自的属性和单独的方法,例如 attack() 或 move()。我也不知道如何有效地初始化所有的僵尸,同时仍然能够调用特定的僵尸。

=> 你需要声明一个interface,但至少是一个abstract classZombie。与实现相比,您将拥有一个 RapidAttackZombie 和一个 SlowRunningZombie,它会扩展您的父类。强烈建议阅读页面。

因为它们有一个通用类,所以你可以放入任何存储集合:Array、ArrayList、Hashtable,无论你需要什么。

在实现时,您将实现/覆盖attack() 和move(),它们应该在抽象类中声明为抽象,或者可以具有默认实现。

僵尸的初始化取决于您的关卡编辑器引擎输出结果,也就是您必须声明:位置 XI 想要 ZombieType1,位置 y,z 我想要 ZombieType2,依此类推。

如何开发一个完整的游戏不是10分钟,希望对您有所帮助!

于 2013-05-23T16:08:43.037 回答
0

最好有一个像这样的数据结构

Map<String,List<zombieClass>>

在字符串部分,您可以存储您的僵尸名称或可能类型。在你的地图内部使用一个列表(ArrayList)来保存各种僵尸。在数组中,您将具有调整大小的约束,而在 ArrayList 中它将是动态的并且可以在运行时进行修改。在列表中,您实际上可以拥有您的 ZombieClass。

public class ZombieClass{
   private float health;
   private float damageCapability;
   //getters ans setters
}
于 2013-05-23T16:09:58.470 回答
0

您创建一个包含 Zombies 的 Zombie 对象数组或列表

Class Zombie {

     private int health ;
     private int attack;

     public boolean died(){
       if(health < 0) return true;  
     }        
}



class Game {

    public static void main(String [] arg){
      List<Zombie> zombies = new ArrayList<Zombie>();
      for(int i  =0 ;i<10; i++)  
      zombies.add(new Zombie());
    } 

    // main game loop
    public void render(){
        for(int i =0; i<10; i++){
              // get each zombie and do whatever you want
        }     
    }

   }
于 2013-05-23T16:10:58.273 回答
0

将它们放在列表或数组中,然后遍历列表/数组。每个僵尸都可以通过列表或数组的索引来识别。

大批:

Zombie[] zombieArray = new Zombie[10];
for(int x=0; x<10; x++){
    Zombie z = new Zombie(--whatever your parameters are);
    zombieArray[x] = z;
}

列表:

List<Zombie> zombieList = new ArrayList<>();
    for(int x=0; x<10; x++){
        Zombie z = new Zombie(--whatever your paremeters are);
        zombieList.add(z);
    }
于 2013-05-23T16:02:45.027 回答