我回到了我的学校作业,我们被要求为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;
}
}
答案 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
(对于普通的立方骰子)。
顺便说一句,你还记得在开始计算之前将计数器初始化为零吗?