You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

制作记忆配对游戏时卡牌赋值遇无限循环问题求解决

问题分析与解决方案

原代码的核心问题

你的代码出现无限循环,根源是随机数生成范围错误:
random.Next(1, 10)只会生成1到9的整数,漏掉了数值10。而你需要10个不同数值(1-10)各出现2次来凑够20张卡牌,当1-9都被用满2次后,循环永远找不到符合checks(a) < 2的数值,直接陷入死循环。
改成checks(a) < 3虽然终止了循环,但会让部分数值重复3次,破坏了“每个数值恰好2次”的配对需求。


解决方法一:修正随机数范围

只需要调整随机数的上限,让它能生成1到10的整数(Random.Next(min, max)的max是开区间,所以要写11才能包含10),这样checks数组的10个索引(1-10)都会被用到,刚好凑够20个配对数值,循环不会再卡住。

修正后的CardProperties函数:

Public Function CardProperties(x As PictureBox) As PictureBox
    Do
        Dim a As Short = random.Next(1, 11) ' 修正为11,生成1-10的随机数
        If checks(a) < 2 Then
            x.Tag = a
            checks(a) += 1
            Exit Do
        End If
    Loop
    Return x
End Function

解决方法二:先创建配对数组再打乱(更高效推荐)

这种方法彻底避免了循环重试的问题,逻辑更清晰:先构造一个包含1-10各两次的有序数组,再打乱顺序,最后直接给卡牌赋值。

修改后的完整代码:

Dim random As New Random

Private Sub Game_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim cards() As PictureBox = {C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20}
    
    ' 1. 生成包含1-10各两次的列表
    Dim cardValues As New List(Of Short)()
    For i As Short = 1 To 10
        cardValues.Add(i)
        cardValues.Add(i)
    Next
    
    ' 2. 打乱列表顺序
    Dim shuffledValues = cardValues.OrderBy(Function() random.Next()).ToList()
    
    ' 3. 给每张卡牌分配数值
    For i As Integer = 0 To cards.Length - 1
        cards(i).Tag = shuffledValues(i)
    Next
End Sub

这种写法不需要维护checks计数数组,代码更简洁,也不会出现循环卡死的情况。

内容的提问来源于stack exchange,提问作者user21574373

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:53:19