【问题标题】:Visual basic 2008 - Do...While until infinite loop when shuffling 52 card deckVisual basic 2008 - 做...直到洗牌 52 张牌时的无限循环
【发布时间】:2015-05-26 18:42:44
【问题描述】:

我开始在 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 时,它隐藏了一张卡并崩溃了。

PS:

  • 所有“dealused”变量在创建时都设置为 False。
  • "pics" 是一个图像数组(在图像文件中),但我认为这不是原因。

【问题讨论】:

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


    【解决方案1】:

    我相信问题可能在于您错过了 Rnd 返回的值介于 0(包括)和 1(不包括)之间,这意味着当转换为整数时,它永远不会返回上限值。因此,您需要将上限扩展到 52,以确保最终“找到”索引 #51。

    您还可以通过在找到下一个空索引后仅分配qth 卡来节省一些工作,我相信只播种一次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
    

    【讨论】:

    • 成功了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2017-05-16
    相关资源
    最近更新 更多