我开始在VB2008中制作一款Hearts游戏。目前,我一直坚持交易:
For q = 0 To 51
Do
Randomize()
dealrand = Int(Rnd() * 51)
cards(q).Image = pics(dealrand)
Loop Until dealused(dealrand) = False
dealused(dealrand) = True
Next
我要做的是检查卡是否已被使用并生成不同的卡,因此没有人会获得相同的卡。
按下按钮时,程序崩溃。我认为这是一个无限循环,因为当我将cards(q).Image = pics(dealrand)
更改为cards(q).hide
时,它会隐藏一张卡并崩溃。
P.S:
答案 0 :(得分:0)
我认为问题可能是你错过了Rnd
返回0(含)和1(不包含)之间的值,这意味着当转换为整数时,它永远不会返回上限值。因此,您需要将上限扩展为52,以确保索引#51最终“找到”。
您还可以通过在找到下一个空索引后仅分配q
卡来保存一些工作,我相信只需播种一次Randomize
即可:
Dim q As Integer
Dim dealrand As Integer
Dim dealused = Enumerable.Range(0, 52).Select(Function(x) False).ToArray
Randomize()
For q = 0 To 51
Do
dealrand = Int(Rnd() * 52)
Loop Until dealused(dealrand) = False
cards(q).Image = pics(dealrand)
dealused(dealrand) = True
Next
修改
我相信卡片洗牌程序可以在一个循环中完成,没有尝试找到未使用的卡的命中或未命中方法,通过投射所有可用的52张卡(0..51)然后消除它们一次随机牌从牌组中拉出。它利用了List
也有一个索引运算符的事实。
Dim dealrand As Integer
Dim cardsAvailable = Enumerable.Range(0, 52).ToList()
Dim q As Integer = 0
Randomize()
While (cardsAvailable.Any())
dealrand = Int(Rnd() * cardsAvailable.Count)
cards(q).Image = pics(cardsAvailable(dealrand))
cardsAvailable.RemoveAt(dealrand)
q = q + 1
End While