太空入侵者游戏

时间:2010-09-15 07:26:24

标签: java collections

我正在编写一个太空入侵者游戏我需要编写5个公共实例变量,这些变量包含记录有关游戏运行的所有信息的集合:

spaceShips将按照它们出现在屏幕上的顺序引用SpaceShip列表

  

public List spaceShips;

闪烁是将按照发生的顺序引用所有Blink实例列表的镜头

  

公开列表闪烁;

hitsMap将引用一张地图,其中的键将是Spaceship的实例,其中闪烁命中,其值将是相应的“成功”闪烁实例的列表

  

????

unscathed,它将引用未被任何闪烁“击中”的所有SpaceShip实例的列表

  

???

未命中,这将引用一个没有“击中”任何宇宙飞船的所有Blink实例的列表

  

???

然后我必须在构造函数中添加一行来分配一个新的HashMap实例来命中map和ArrayList到其他变量,到目前为止我还有

  

spaceShips = new ArrayList();   blinks = new ArrayList();

任何帮助都会很棒

欢呼声

3 个答案:

答案 0 :(得分:2)

在Java 5及更高版本中,您可以使用泛型使您的生活略微更简单。使用这些定义:

public List<SpaceShip> spaceShips = new ArrayList<SpaceShip>();
public List<Blink> blinks ...;
public Map<SpaceShip, List<Blink>> hitsMap = new HashMap<SpaceShip, List<Blink>>();
public List<SpaceShip> unscathed ...;
public List<Blink> misses ...;

要添加匹配,请使用以下代码:

public void addHit(SpaceShip ship, Blink blink) {
    List<Blink> hits = hitsMap.get(spaceShip);
    if(null == hits) {
        hits = new ArrayList<Blank>();
        hitsMap.put(spaceShip, hits);
    }
    hits.add(blink);
}

那就是说,我建议稍微不同的API:向SpaceShip添加一个“命中”列表,并向hit添加一个布尔字段Blink(或者可能是对它所命中的太空船的引用) {1}}。这样,相关信息将位于受影响的对象实例中,您可以使用spaceShipsblinks列表上的简单过滤器来获取其他三个列表/地图。

记住你的命名。不应该“闪烁”是“导弹”还是“射击”?

答案 1 :(得分:0)

一些一般性观点,因为这个作业(至少,我认为如此 - 随意澄清是否不是这样)。

  1. 尽可能在数据结构中使用泛型。例如。 List<SpaceShip> spaceShips
  2. 默认情况下不要声明变量public(尽管如此,我还没有看到你们其余的代码,所以也许有充分的理由说明你已经这样做了)
  3. 您已经说过,hitsMap变量应该是Map的一个实例,但稍后您说它必须是HashMap。因此,除了宣布Map<SpaceShip, List<Blink>> hitsMap = new HashMap<SpaceShip, List<Blink>>();

    之外别无选择

    对于您的misses列表,首先要复制所有太空飞船的列表(可能是通过Collections.copy?)。当每个SpaceShip被点击时,请将其从misses列表中删除。

    您的misses列表应该只是一个List<Blink>,只要您确定有问题的Blink是否错过或点击,就会添加Blink个对象(在这种情况下,您)必须编辑hitsMap

答案 2 :(得分:0)

您还应该记住,您可以使用继承,并以这种方式定义具有相同行为的类组或与其他对象的交互。

在设计面向对象的游戏时,你应该始终记住,某些图形表示会移动,有些则不会,有些会破坏其他,有些会经过其他,有些则不会。 (可能有不同的优先事项)。

另外,我举了一个PacMan游戏的例子(还有什么:p)你必须记住一些游戏实体可以拥有状态(如Pacman godmode,或Pacman易受攻击,对Ghosts相反)。因此,制作一个共同的抽象类的Ghosts和Pacman(它们是移动/状态相关的)孩子的想法。

希望这有帮助!