【问题标题】:Need some help with a dice rolling algorithm在掷骰子算法方面需要一些帮助
【发布时间】:2011-06-07 20:39:09
【问题描述】:

我将如何对以下方法的算法进行伪编码:

  • 滚动一种模具 - 4 、 6 、 8 、 10 或 12 面

  • 最多可以滚动十个这种类型的骰子

  • 如果超过一半的骰子是 1,则打印一条消息,表示它们已失败并结束程序

  • 如果任何骰子与掷出的骰子类型相同,则从该组中取最高值。以及重新掷出与掷出的骰子类型值相等的骰子。

    ^^^^I.E. - 假设你有 3 个六面骰子,你掷骰子得到 4、2 和 6。你取 6 的值,因为它是最高的。然后你重新掷骰子是六。如果你得到一个六,你把那个六加到前面的六上,然后重新掷骰。如果不是,您只需将那里的最高骰子添加到先前的值。

【问题讨论】:

  • 一个问题,是否应该将所有骰子加在一起,如果不是,如果您掷出 2 个 6,应该返回哪个?
  • 只取最高值进行添加。如果您掷出 2 个六点,则重新掷出两个六点并取最高值,如果您再次掷出与骰子类型相同的骰子,比如说 6 面,那么您继续前进,直到不再有掷骰子类型。
  • 这听起来对我来说足够了。

标签: algorithm dice


【解决方案1】:

我认为您的问题指出了您觉得这很困难的原因。您试图在一个地方解决太多问题,这变得势不可挡。你不想创建一个单一的方法来做到这一点。您将需要创建几个。首先将问题分解为其组成部分。

注意:我不是以面向对象的方式来解决这个问题,以使答案更易于解析。我鼓励您更详细地考虑设计。

要求 1:掷骰子类型 - 4 、 6 、 8 、 10 或 12 面

好的 - 所以我们需要一些类似的方法:

int Roll(int边);

Roll 基本上只返回一个介于 1 和边(含)之间的随机值。

要求 2:最多可以掷出 10 个此类骰子

这可能是一个 for 循环。

要求 3:如果超过一半的骰子是 1,则打印一条消息,表示它们已失败并结束程序

此要求意味着您将每次调用 Roll 的结果存储在一个集合中 - 例如,一个 List 或一个 int[](整数数组)。

接下来它表示您正在迭代该集合并计算“1”的滚动数。如果计数大于滚动总数的一半,则结束程序。计数很容易(for 循环或 foreach 可能是您最好的选择)并且您知道进行了多少次滚动(通过集合中的项目数量以及因为您在进行滚动时在 for 循环中有一个计数器.. . 所以划分和比较。

要求4:如果任何一个骰子与掷出的骰子类型相同,则从该组中取最高值。以及重新掷出与掷出的骰子类型值相等的骰子。

再次 - 您需要遍历结果集并执行操作请求。我不会尝试通过将此规则与之前的规则相结合来“优化”您的解决方案 - 它只会使解决方案复杂化而没有真正的好处。

【讨论】:

  • 我会在滚动部分(第 1 步)中包含第 4 步,它被称为开放式收费角色扮演游戏,它是执行此操作的合乎逻辑的地方,如果最大,则再次滚动并返回最终总和.如果您想与普通 Roll 分开,请调用方法 RollOpenEnded。
【解决方案2】:

您的算法必须:

  1. 掷骰子
  2. 检查结果是否有一半是1s
  3. 检查并可能重新滚动高数字
  4. 跟踪接受的数字和掷骰子的总和

除了实际为您做这件事之外,没有更多的事情要做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2012-10-16
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多