[英]Beginner writing C code to program a round of yahtzee, function to hold dice values?
[英]Three of a kind function - Yahtzee
我回到學校的作業中,被要求為Yahtzee游戲創建一些功能,其中之一是“三種功能”。 這是我編寫的代碼,得到的注釋是:“您必須能夠檢查直到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;
}
}
除去switch()
它的所有它的值映射dieValues[]
的索引成tOAK[]
和該映射是非常基本的:
for(i = 0; i < nrOfDieValues; i++)
{
tOAK[dieValues[i]] += 1;
}
這是相同的,但是假定所有索引都基於0。
我認為您的問題是骰子輸入為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
(王牌高),它也會在那只手中找到三類。
我在您的代碼中看到的另一個問題:在我看來,您將骰子值的數量與骰子的數量相混淆-我不知道游戲中會擲多少骰子,因此nrOfDieValues
可能值是nrOfDieValues
,但tOAK
保持tOAK
每個骰子值都會計數,因此應將其聲明為tOAK[6]
(對於普通立方骰子)。
順便說一句,您還記得在開始計數之前將計數器初始化為零嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.