簡體   English   中英

三種功能-Yahtzee

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM