【问题标题】:Space invaders game太空侵略者游戏
【发布时间】:2010-09-15 07:26:24
【问题描述】:

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

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

公开列出太空船;

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

公共列表闪烁;

hitsMap 将引用一张地图,谁的键将是被眨眼击中的 Spaceship 实例,其值将列出对应的“成功”眨眼实例

??????

unscathed 将引用所有未被任何眨眼“击中”的 SpaceShip 实例的列表

???

misses,它将引用所有没有“击中”任何宇宙飞船的 Blink 实例的列表

???

然后我必须在构造函数中添加行以将 HashMap 的新实例分配给 hits map 并将 ArrayList 分配给其他变量,到目前为止我有

spaceShips = new ArrayList(); 眨眼 = 新的 ArrayList();

任何帮助都会很棒

干杯

【问题讨论】:

  • 你告诉我们你必须做什么,但问题是什么?
  • 我认为您不需要保留对镜头的引用。使它们基于事件,并让垃圾收集器在它们命中或未命中时处理它们。

标签: java collections


【解决方案1】:

在 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。这样,相关信息将在受影响的对象实例中,您可以使用spaceShipsblinks 列表上的简单过滤器来获取其他三个列表/映射。

请注意您的命名。 “Blink”不应该是“Missile”还是“Shot”?

【讨论】:

  • 它闻起来像家庭作业,所以我猜他在 API 或数据结构方面别无选择。
  • 也许很高兴提到 Map> 只有在 SpaceShip 类中覆盖 hashCode 和 equals 时才能“正常工作”
【解决方案2】:

本作业的一些一般要点(至少,我认为是这样 - 如果不是这种情况,请随时澄清)。

  1. 尽可能在数据结构中使用泛型。例如。 List&lt;SpaceShip&gt; spaceShips
  2. 默认情况下不要声明变量public(虽然我已经说过,但我还没有看到你们其他人的代码,所以你这样做也许有充分的理由)

你说过你的hitsMap 变量应该是Map 的一个实例,但后来你说它必须是HashMap。因此没有太多选择,只能声明Map&lt;SpaceShip, List&lt;Blink&gt;&gt; hitsMap = new HashMap&lt;SpaceShip, List&lt;Blink&gt;&gt;();

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

您的misses 列表应该只是一个List&lt;Blink&gt;,只要您确定有问题的Blink 是否未命中或命中(在这种情况下,您必须编辑hitsMap),就会将Blink 对象添加到其中。

【讨论】:

    【解决方案3】:

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

    在设计面向对象的游戏时,您应始终牢记,有些图形表示会移动,有些则不会,有些会破坏其他表示,有些会穿过其他表示,有些则不会。 (可能有不同的优先级)。

    另外,我以吃豆人游戏为例(还有什么 :p)你必须记住一些游戏实体可以有状态(比如吃豆人上帝模式,或吃豆人脆弱,与幽灵相反)。因此,使 Ghosts 和 Pacman(与移动/状态相关)成为公共抽象类的子代的想法。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多