Visual Basic 2008 - 做......直到无限循环时洗牌52卡牌

时间:2015-05-26 18:42:44

标签: vb.net visual-studio-2008 boolean infinite-loop do-while

我开始在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:

  • 所有"处理过的"创建时,变量设置为False。
  • "图片"是一个图像阵列(如在图像文件中),但我不认为这是原因。

1 个答案:

答案 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