2013-03-30 62 views
2

我意識到我今天早上從我的結構組陣列中挑選卡片的編碼存在缺陷,這是我轉換爲計算機的桌面卡片遊戲。 目前代碼設置爲隨機挑選特定卡片的陣列,但如果組中的卡片數量爲< 1,則跳過該組。對於我的套牌,這並不是真正的隨機,因爲每張牌都有自己的數量。某些卡片有10張卡片,其他卡片6張,最多4張。我怎樣才能將它編碼到所有這些數量數字的整體中,並從這些數字中挑選一張隨機卡片。真隨機抽取卡,而不是隨機組? visual basic 2010

If GameSize >= 3 Then 
    For StartHands = 10 To 14 
     Number = (DeckGroup(Rnd.Next(0, DeckGroup.Count)).ID) 
     'Cardslots Player3 
     If CardTypeArray(StartHands) = "" Then 
      If DeckGroup(Number).QuantityInteger > 0 Then 
       DeckGroup(Number).QuantityInteger -= 1 
       Player1HandGroup(Number).QuantityInteger3 += 1 
       CardTypeArray(StartHands) = Player1HandGroup(Number).CardType 
       Me.NumberArray(StartHands) = Number 
      Else 
       'Recall Procedure if Generated Random Number is not allowed 
       'due to QuantityInteger <= 0 
       Call StartButton_Click(sender, e) 
      End If 
     End If 
    Next StartHands 
End If 

當玩牌和畫一張新牌時,我使用這種編碼方案,以防止計算器堆疊,但是是虛擬的。

Dim temp As IEnumerable(Of LunchMoneyGame.LunchMoneyMainForm.Group) = From r In DeckGroup Where r.QuantityInteger > 0 Select r 

If temp IsNot Nothing AndAlso temp.count > 0 Then 
    Number = (temp(Rnd.Next(0, temp.Count)).ID) 

    DeckGroup(Number).QuantityInteger -= 1 
    'Select the Player depending value of T 
    Select Case T 
     Case 0 
      Player1HandGroup(Number).QuantityInteger += 1 
     Case 1 
      Player1HandGroup(Number).QuantityInteger2 += 1 
     Case 2 
      Player1HandGroup(Number).QuantityInteger3 += 1 
     Case 3 
      Player1HandGroup(Number).QuantityInteger4 += 1 
     Case 4 
      Player1HandGroup(Number).QuantityInteger5 += 1 
    End Select 

編輯: 改進的問題: 如何我大概畫卡重量的基礎上如何一個特定的卡中有多少人留在每張卡的甲板數量的整數?

+0

甲板大小有限,足以允許用單張卡片填充列表。然後它是微不足道的,只需使用[Fisher-Yates shuffle](http://stackoverflow.com/a/8108702/17034)。 –

+0

我的套牌有106張牌,大多數牌都有一張牌的數量。 –

回答

0

我的解決方案的想法是在所有卡組羣中可用卡的總數上生成一個隨機數。最後,我們發現這個號碼組的目標號碼在一個循環中:

Dim totalNumerOfCards As Integer = DeckGroup.Sum(Function(d) d.QuantityInteger) 
Dim Number As Integer = Rnd.Next(totalNumerOfCards) 
Dim numCards As Integer = 0 
Dim groupIndex As Integer = 0 
Dim cardIndex As Integer = 0 
Dim i As Integer = 0 
While i < DeckGroup.Length AndAlso numCards <= Number 
    groupIndex = i 
    cardIndex = Number - numCards 
    numCards += DeckGroup(i).QuantityInteger 
    i += 1 
End While 
Console.WriteLine("Your card is in DeckGroup({0}), card index {1}", 
        groupIndex, cardIndex); 
+0

在我的程序中選擇一張牌放在玩家手中我的號碼變量現在每次變爲106而不是所需的隨機數,並使我的索引超出範圍錯誤。 –

+0

確保您在遊戲開始時只初始化Random對象一次,而不是每次使用它時,否則每次調用時可能會得到相同的隨機數。也只能指定一個種子值用於調試目的。這將產生一個可重現的序列。在「真實」遊戲中,爲了每次都獲得不同的遊戲,不要指定一個遊戲。調試器是你最好的朋友。用它來追蹤異常! –