1

我已经坚持了几天了。此方法检查是否掷出 5 个骰子 == 小顺子。它适用于某些数字。如果我滚动一个

1、2、4、3、6

它会起作用的。但是,如果我滚动

1、2、4、3、3

不起作用。我认为这是因为那里有重复的 3。我需要以某种方式将它移到最后。

小顺子是指有四个连续的骰子面值,例如 1、2、3、4 或 3、4、5、6。它可以是任意顺序,例如 2、3、1、4

      int counter = 0;
      int score = 0;
      boolean found = false;
      Arrays.sort(die);

      for (int i = 0; i < die.length - 1; i++)
      {
          if (counter == 3)
              found = true;

          if (die[i + 1] == die[i] + 1)
          {
              counter++;
          }
          else if (die[i + 1] == die[i])
          {
              continue;
          }
          else
          {
              counter = 0;
          }
      }

      if (found)
      {
         score = 30; 
      }
      else
      {
          score = 0;
      }
      return score;
    }
4

3 回答 3

2

重复的 3 不是抛弃算法的原因。问题是您在迭代过程中检查直线发生后。因此,如果最后一个骰子是顺子的一部分,它将不会被识别。

要解决此问题,请移动

if (counter == 3) found = true;

到循环的结尾。应该管用。

编辑:所以它看起来像这样。

for (/*...*/) {
  /* Everything else */

  if (counter == 3) {
      found = true;
      break;
  }
}
于 2013-03-27T23:51:40.943 回答
1

编辑:首先,如果一个小顺子是连续三个,那么你想看看计数器是否达到 2,而不是 3。3 将要求连续四个。

编辑 for 循环的开头,如下所示:

  for (int i = 0; i < die.length ; i++)
  {
      if (counter == 2)
          found = true;
      if (i == die.length - 1) break;
      //method continues here

推理:我想当你开始编写这个方法时,IndexOutOfBoundsException当它到达数组中的最后一个骰子时,它正在抛出 s,试图将它与不存在的第六个骰子进行比较并死亡。因此,您使循环停止了一小段时间。但是,如果它在最后一个骰子上停了一小段,并且小顺子在最后一个骰子上完成,那么你就再也不会进入循环来确认计数器是 3 并且已经发生了小顺子。通过以这种方式编辑循环的开头,它一直到最后一个元素,检查然后中断。

或者,在循环结束后进行最后一次检查:

  for (int i = 0; i < die.length - 1; i++)
  {
      if (counter == 2)
          found = true;
      if (die[i + 1] == die[i] + 1)
      {
          counter++;
      }
      else if (die[i + 1] == die[i])
      {
          continue;
      }
      else
      {
          counter = 0;
      }
  }

  found = (counter == 2); // or counter >= 2 if you want larger straights to be found too

  //continue method here
于 2013-03-27T23:51:29.530 回答
0

这应该计算最长的序列:

int longestSequence(int[] a) {
  Arrays.sort(a);
  int longest = 0;
  int sequence = 0;
  for (int i = 1; i < a.length; i++) {
    int d = a[i] - a[i - 1];
    switch (d) {
      case 0:
           // Ignore duplicates.
           break;
      case 1:
           sequence += 1;
           break;
      default:
           if (sequence > longest) {
             longest = sequence;
           }
           break;
    }
  }
  return Math.max(longest, sequence);
}
于 2013-03-28T00:10:55.407 回答