【问题标题】:"If" statement alternatives“如果”语句替代方案
【发布时间】:2012-03-03 04:06:58
【问题描述】:

我正在做我的功课,并且被一些逻辑所困(我认为我正确使用了这个术语?)。我正在编写一个显示 12 个编号为 1-12 的按钮、2 张骰子图片和一个滚动按钮的应用程序。

玩家掷骰子(2、6 面骰子),无论他得到什么数字,他都可以用来“覆盖”十二个数字中的一些。例如,假设他掷骰子得到 3 和 5。他可以选择是否覆盖 3 和 5,或者两个数字的总和 - 8(我有没有提到我是数学天才? )。

游戏的目标是用最少的掷骰数覆盖所有数字。

我遇到的问题是,我认为是 if 语句:

if (die1 == 3 && die2 == 5) {
  player can cover 3 and 5, or 8, but not both
}

现在,我认为这是可行的,但如果我把所有这些都写出来,那将是 36 个 if 语句(给或取零)。有没有更简单的方法?

【问题讨论】:

  • 贴出代码,我们会尽量简化
  • 查看规范设计模式en.wikipedia.org/wiki/Specification_pattern。我认为它可以帮助您解决问题。
  • 只有8个总和才能覆盖吗?
  • 不用担心他能覆盖什么,只需对照掷骰检查玩家输入(他们尝试覆盖什么)。
  • 是的,“覆盖”只是按下按钮,然后显示“”。谢谢布赖恩,这是个好主意! Corbin,是的,当用户尝试单击一个数字时。汤姆不,只是“滚动”的任何两个数字的总和。每个人都给了我很棒的想法。现在我必须去阅读更多,这样我才能理解它们。学习 Java 的高五!

标签: java if-statement


【解决方案1】:

根据您的描述,我认为玩家可以选择die1die2die1 + die2,所以要查看用户是否选择了有效值,您只需要一个 if。

if (cover == die1 or cover == die2 or cover == ( die1 + die2)) {
    //valid..
}

【讨论】:

    【解决方案2】:

    不需要 if 语句。玩家可以覆盖die1die2die1+die2

    【讨论】:

    • 不理解这里的否决...想法是无需编写任何“幻数”,只需使用变量
    • 这对他的“家庭作业”有何帮助。这只是重复问题。
    • 我同意。我觉得有道理
    • 以某种方式重复问题,让他们明白不需要 if 语句或 switch 语句,只需要变量即可查看允许的值
    • 我对 switch-cases 的建议针对的是“if 语句过多”部分,但重新考虑这一点,我认为您的答案实际上更当场 - 接受我的投票。
    【解决方案3】:

    这是一个使用开关盒的好例子,IMO。 那将是 2 个开关,每个开关有 6 个外壳。

    【讨论】:

    • 你应该提供一个这样的例子。
    【解决方案4】:

    在玩家试图掩盖某些东西之前不要检查。通过仅验证输入,您可以将所有内容简化为一个 if 语句。

    如果您确实需要知道所有可能性(也许是为了向玩家展示可能的动作),那么......您仍然不需要所有这些if 语句。只需突出显示与掷骰子匹配的按钮并仅接受这些按钮作为输入;您将希望通过它们的值(例如“1”)在数组或映射中对它们进行索引,以作为检索它们的一种方式。

    【讨论】:

      【解决方案5】:

      你知道用两个骰子你总是有三个覆盖选项。大概在代码的其他地方,您将把涵盖的选项与数字进行比较。类似的东西

      int[] covered = { die1, die2, die1+die2 };
      // ... other stuff
      if (comparisonValue > 6) {
        // maybe do special stuff since this uses both dice
        if (comparisonValue == covered[2]) {
          // covered/coverable behavior
        } else {
          // not
        }
      } else {
        // maybe do special stuff since this only uses one die
        if (comparisonValue == covered[0] || comparisonValue == covered[1]) {
          // covered/coverable behavior
        } else {
          // not
        }
      }
      

      首先为您提供所涵盖的内容,然后为您提供简单的使用方法。你也可以通过数组foreach 为覆盖的数字做一些事情,ala

      for (int c : covered) {
        // do stuff with c because it's covered
      }
      

      这相当脆弱,但灵活的答案(例如,将结果转储到 Collection)对于 6 面整数面骰子来说方式过大了,真的 > 灵活的答案(例如,容纳可变数量的骰子,将面孔专门组合成结果)就像针对这个特定问题的核末日。

      针对您的特定问题进行编辑,我会做类似的事情

      // start new turn, disable all buttons
      // get rolls
      int[] coverable = { die1, die2, die1+die2 };
      for (int covered : coverable ) {
        // enabled covered button
      }
      

      如果玩家可以根据新结果更改之前的掷骰涵盖的 1-12 中的哪一个,那么您可能会获得一些乐趣,具体取决于您想为他们提供多少帮助。

      【讨论】:

        【解决方案6】:

        我可能会创建 2 个新对象并将它们与查找表一起使用,如下所示:

        class TossResult{
            int firstDie;
            int secondDie;
         }
        
        Class Coverage{
            TossResult tossResult;
        
            int getThirdNumber(){
                return tossResult.firstDie + tossResult.secondDie;
             }
        }
        

        然后在应用程序启动时,填充您的地图:

        HashMap<TossResult, Coverage> lookup = new HashMap<>();
        for (int i = 0, i < SIDES_ON_DIE; i++){
            for (int j = 0, j < SIDES_ON_DIE; j++){
                TossResult tempResult = new TossResult(i,j);
                Coverage tempCoverage = new Coverage(tempResult);
                lookup.put(tempResult, tempCoverage);
            }
        }
        

        用户掷骰子后,创建一个新的 TossResult 并执行 lookup.get(tossResult)

        【讨论】:

          【解决方案7】:

          您还可以创建一个包含 12 个整数或布尔值的数组。初始化所有 12 个元素(比如 0 或 false)。然后对于每个角色,您可以执行以下操作:

          if (false == myArray[die1Value] && false == myArray[die2Value]) {
              myArray[die1Value] = true;
              myArray[die2Value] = true;
          } else if (false == myArray[die1Value + die2Value]) {
              myArray[die1Value + die2Value]
          } else if (false == myArray[die1Value] || false == myArray[die2Value]) {
              if (false == myArray[die1Value]) {
                  myArray[die1Value] = true;
              }
              if (false == myArray[die2Value]) {
                  myArray[die2Value] = true;
              }
          } else {
              // all 12 covered
          }
          

          当然,您还可以对这段代码进行更多重构。 既定目标“游戏的目标是用最少的掷骰数覆盖所有数字。”是不可行的,真的。您可以做的最好的事情是使用概率来知道,例如,您是否应该先覆盖 1 和 2、1 和 2 或 3:-)

          【讨论】:

            猜你喜欢
            • 2011-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-19
            • 2012-10-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多