1

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

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

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

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

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

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

4

2 回答 2

6

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

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

要求 1:滚动一种模具 - 4 、 6 、 8 、 10 或 12 面

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

int Roll(int边);

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

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

这可能是一个 for 循环。

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

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

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

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

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

于 2011-01-12T14:12:01.923 回答
0

您的算法必须:

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

没有什么比实际为你做的更多了。

于 2011-01-12T14:09:39.167 回答