2

我目前正在研究基于文本的 RPG,并且总体上仍在学习 Java 和编程。我的问题是,我在我的程序中已经到了一个点,用户将选择他们的单位,我不知道如何在没有大型 if 语句的情况下实现这一点,这些语句在扩展或更改游戏玩法方面非常严格。我怎样才能写出可以压缩我的 if 语句并在整体上获得更模块化的批准的东西?

这是用户首先看到的内容:

欢迎来到 RPG 游戏!

请选择3个单位!

输入 1 添加游侠 100 4 10

输入 2 添加重型 100 4 15

输入 3 添加医生 100 4 10

为了回应这一点,我编写了以下内容

if (resp == 1){
      if (rangerCount == 0){
      ArrayList<Item> rangerInv0 = new ArrayList<Item>();    
      Ranger rangerObj0 = new Ranger("Ranger", 100, 4, 10, rangerInv0);

      rangerObj0.pickUp(mh1000);
      rangerObj0.pickUp(s1000);
      rangerObj0.pickUp(t1000);

      rangerObj0.equip(mh1000);
      rangerObj0.equip(s1000);
      rangerObj0.equip(t1000);

      playerUnits.add(rangerObj0);
      playerUnitsCount++;
      rangerCount++;
      }
      else if (rangerCount == 1){
      ArrayList<Item> rangerInv1 = new ArrayList<Item>();    
      Ranger rangerObj1 = new Ranger("Ranger", 100, 4, 10, rangerInv1);

      rangerObj1.pickUp(mh1000);
      rangerObj1.pickUp(s1000);
      rangerObj1.pickUp(t1000);

      rangerObj1.equip(mh1000);
      rangerObj1.equip(s1000);
      rangerObj1.equip(t1000);

      playerUnits.add(rangerObj1);
      playerUnitsCount++;
      rangerCount++;
      }
      else if (rangerCount == 2){
      ArrayList<Item> rangerInv2 = new ArrayList<Item>();    
      Ranger rangerObj2 = new Ranger("Ranger", 100, 4, 10, rangerInv2);

      rangerObj2.pickUp(mh1000);
      rangerObj2.pickUp(s1000);
      rangerObj2.pickUp(t1000);

      rangerObj2.equip(mh1000);
      rangerObj2.equip(s1000);
      rangerObj2.equip(t1000);

      playerUnits.add(rangerObj2);
      playerUnitsCount++;
      rangerCount++;
      }
    } 
    else if (resp == 2) {
      if (heavyCount == 0) {
      ArrayList<Item> heavyInv0 = new ArrayList<Item>();    
      Heavy heavyObj0 = new Heavy("Heavy", 100, 4, 15, heavyInv0);

      heavyObj0.pickUp(mh4000);
      heavyObj0.pickUp(s1000);
      heavyObj0.pickUp(t1000);

      heavyObj0.equip(mh4000);
      heavyObj0.equip(s1000);
      heavyObj0.equip(t1000);

      playerUnits.add(heavyObj0);
      playerUnitsCount++;
      heavyCount++;
      }
      else if (heavyCount == 1){
      ArrayList<Item> heavyInv1 = new ArrayList<Item>();    
      Heavy heavyObj1 = new Heavy("Heavy", 100, 4, 15, heavyInv1);

      heavyObj1.pickUp(mh4000);
      heavyObj1.pickUp(s1000);
      heavyObj1.pickUp(t1000);

      heavyObj1.equip(mh4000);
      heavyObj1.equip(s1000);
      heavyObj1.equip(t1000);

      playerUnits.add(heavyObj1);
      playerUnitsCount++;
      heavyCount++;
      }
      else if (heavyCount == 2){
      ArrayList<Item> heavyInv2 = new ArrayList<Item>();    
      Heavy heavyObj2 = new Heavy("Heavy", 100, 4, 15, heavyInv2);

      heavyObj2.pickUp(mh4000);
      heavyObj2.pickUp(s1000);
      heavyObj2.pickUp(t1000);

      heavyObj2.equip(mh4000);
      heavyObj2.equip(s1000);
      heavyObj2.equip(t1000);

      playerUnits.add(heavyObj2);
      playerUnitsCount++;
      heavyCount++;
      }
    } 
    else if (resp == 3) {
      if (medicCount == 0) {
      ArrayList<Item> medicInv0 = new ArrayList<Item>();    
      Medic medicObj0 = new Medic("Medic", 100, 4, 10, medicInv0);

      medicObj0.pickUp(mh3000);
      medicObj0.pickUp(s1000);
      medicObj0.pickUp(t1000);

      medicObj0.equip(mh3000);
      medicObj0.equip(s1000);
      medicObj0.equip(t1000);

      playerUnits.add(medicObj0);
      playerUnitsCount++;
      medicCount++;
      }
      else if (medicCount == 1) {
      ArrayList<Item> medicInv1 = new ArrayList<Item>();    
      Medic medicObj1 = new Medic("Medic", 100, 4, 10, medicInv1);

      medicObj1.pickUp(mh3000);
      medicObj1.pickUp(s1000);
      medicObj1.pickUp(t1000);

      medicObj1.equip(mh3000);
      medicObj1.equip(s1000);
      medicObj1.equip(t1000);

      playerUnits.add(medicObj1);
      playerUnitsCount++;
      medicCount++;
      }
      else if (medicCount == 2) {
      ArrayList<Item> medicInv2 = new ArrayList<Item>();    
      Medic medicObj2 = new Medic("Medic", 100, 4, 10, medicInv2);

      medicObj2.pickUp(mh3000);
      medicObj2.pickUp(s1000);
      medicObj2.pickUp(t1000);

      medicObj2.equip(mh3000);
      medicObj2.equip(s1000);
      medicObj2.equip(t1000);

      playerUnits.add(medicObj2);
      playerUnitsCount++;
      medicCount++;
      }
    } 
    else {
      System.out.println("Please enter a valid responce!");
    }

您看到在 pickUp() 和equip() 的多个实例中引用的对象如下所示:

static Item mh1000 = new Item ("AR1", "Damage", 2, null, 0, null, 0, false, false);

对我来说,这一切似乎都很麻烦。如果我想让它成为一个有 5 个单元或 10 个单元的游戏,我真的必须在每个条目中添加 2 到 7 行代码来完成这个吗?似乎应该有一个更简单的方法来做到这一点。请指教。

4

1 回答 1

2

随着代码变得越来越长,您意识到您的代码变得越来越难以维护这一事实是一个好兆头,并且是一个很好的迹象,表明是时候重构了。在 Java 中构建代码的基本构建块是类和方法。

类应该代表系统中的一种实体类型,并包含与该类型相关的行为(方法)和状态(属性)。

一个好的开始是将重复的代码部分提取到方法中,然后在需要时调用它们。如果你发现你在重复一些公共代码,这是另一个很好的迹象,表明你需要重构。

关于“多大是太大”或“多大是太小”没有硬性规定,但你会学到一般的直觉。如果方法太大而难以阅读/理解/更改,那么您的直觉可能是正确的,将其拆分为更小、更易于管理的方法。类也是如此。如果您在一个类中有太多方法,以至于难以维护,那么是时候拆分成不同的类了。

于 2019-08-30T17:28:59.757 回答