三种功能 - Yahtzee

时间:2014-10-23 10:38:08

标签: c

我回到了我的学校作业,我们被要求为Yahtzee游戏创建一些功能,其中一个是Three of a Kind功能。这是我写的代码,我得到的评论是:“你必须能够检查所有数字,直到nrOfDieValues。”我不太确定如何检查x数字..我尝试使用两个for循环,但这并没有结果太好,因为对数组的保存搞砸了。帮助将不胜感激^ _ ^

int isThreeOfAKind(const int dieValues[], int nrOfDieValues)
{
    int threeOAK, i, x = 0;
    int tOAK[nrOfDievalues];

    for(i = 0; i < nrOfDieValues; i++)
    {
        switch (dieValues[i]
        {
        case 1:
            tOAK[0]++;
            break;
        case 2:
            tOAK[1]++;
            break;
        ....
        ....
        case 6:
            tOAK[5]++;
            break;
        }
    }

    for (i = 0; i < nrOfDieValues; i++)
    {
        if (tOAK[i] >= 3)
        {
           x = i+1;
           threeOAK = 1; 
        }

    }


    if(threeOAK)
    {
        return x;
    }
    else
    {
        return 0;
    }

}

3 个答案:

答案 0 :(得分:1)

删除switch(),它将dieValues[]的值映射到tOAK[]的索引,并且该映射非常基本:

for(i = 0; i < nrOfDieValues; i++)
{
  tOAK[dieValues[i]] += 1;
}

这个工作方式相同,但假设所有索引都是从0开始的。

答案 1 :(得分:1)

我认为你的问题是骰子输入是1-6而阵列是0-5,即使在我的评论之后,你的循环仍然存在同样的问题。

假设骰子上的值被1索引(与Unwind的答案不同),我已经简化了函数中的算法。评论嵌入在代码中:

#define MaxScore 6 //maximum score on one die is 6

int isThreeOfAKind(const int dieValues[], int nrOfDieValues)
{
    int i;
    int tOAK[MaxScore];

    memset(tOAK, 0, MaxScore);         //initialise to 0

    for(i = 0; i < nrOfDieValues; i++) //go through each of the inputs
    {
       tOAK[dieValues[i]-1]++;         //increment the count of the result
       if (tOAK[dieValues[i]-1]==3)
       {                               //if we have now seen 3 results 
            return dieValues[i];       //of that value, return it. we don't
       }                               //need to process the rest.
    }
   return 0;      //if we haven't found a three of a kind, return 0.
}

编辑:啊哈!不敢相信我错过了这个:

int tOAK[nrOfDievalues];

这条线可能是罪魁祸首。您正在创建与输入大小相同的数组。这适用于输入,例如:{1,2,3,4,5,6,1,2,3}但会中断,例如:{6,5,4}
这个数组应该做的是计算每个结果出现的次数,这意味着你需要从一个输入得到相同数量的单元格。所以在你的情况下,6

您的代码所做的是创建一个与输入大小相同的数组,因此,例如,当您调用isThreeOfAKind({6},1)作为输入时,您创建了一个数组tOAK[1]。 试图引用tOAK[6]导致越界访问导致崩溃 我在上面的代码中解决了这个问题。

注意,您可以更改MaxScore以使该功能也适用于其他游戏:例如对于一手牌,将 MaxScore 设置为 13 (低位*)或 14 ( aces high)它也会在那手牌中找到三种类型。

答案 2 :(得分:0)

我可以在你的代码中看到的另一个问题:在我看来,你把骰子值的数量与骰子的数量混淆了 - 我不知道游戏中投掷了多少骰子,所以{{{}的可能值是多少? 1}},但nrOfDieValues为每个骰子值保留计数器,因此应该声明tOAK(对于普通的立方骰子)。

顺便说一句,你还记得在开始计算之前将计数器初始化为零吗?