制作记忆配对游戏时卡牌赋值遇无限循环问题求解决
问题分析与解决方案
原代码的核心问题
你的代码出现无限循环,根源是随机数生成范围错误: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
相关产品推荐
相关产品推荐

