摸牌规则:
A.当某花色牌不足3张,则记录摸到的牌,继续摸下一张牌
B.当某花色的牌超过3张时,若摸到的卡牌点数大于本花色中已有卡牌点数的最小值,则替换本花色中点数最小的卡牌,否则,弃置摸到的牌。继续下一-张摸牌
C.当所有花色的牌均为3张时结束摸牌。然后按花色编号从小到大展示摸到的卡牌
例如:在某次摸牌后的卡牌如下表所示:
花色 |
黑桃 |
红桃 |
梅花 |
方块 |
||||||||
序号 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
点数 |
7 |
5 |
12 |
11 |
3 |
8 |
7 |
5 |
8 |
5 |
3 |
1)当下一次摸到“黑桃4”的牌时,4小于已摸到的[7,5,12],弃置摸到的牌,继续摸牌
2)当摸到“红桃9”的牌时,9大于已摸到的[11,3,8]的最小值3,红桃更新为[11,9,8],继续摸牌
3)当摸到“梅花9”的牌时,梅花点数更新为[7,5,9],达到所有花色的牌均为3张的目标,结束摸牌。
模拟此过程编写VB程序,程序运行界面如下图,单击“展示摸到的卡牌”按钮开始摸牌,满足条件时,在列表框中展示摸到的卡牌。
Const n = 52
Dim hs(1 To n) As Integer'存储每张卡牌的花色
Dim num(1 To n) As Integer'存储每张卡牌的点数
Din class(1 To 4) As Integer '存储每种花色卡牌的存储位置
Dim record(1 To 12) As Integer
Private Sub Form _Load()
'读取打乱的卡牌中每张卡牌的花色、点数数据,存入数组hs, num中,代码略
End Sub
Private Sub Command1_ _Click()
Dim k As Integer, i As Integer, P As Integer
Dim flag As Boolean
flag = True
For i=1 To 4
class(i) = '计算每种花色卡牌存储的起始位置
Next i
i=1
Do while i<=n And flag=True
k = hs(i)
If class(k) > k* 3 Then
p = pos(i)
If p < 0 Then
End If
Else
record(class(k)) = i
class(k) = class(k) + 1
If class() =4 And class(2) =7 And class(3)=10 And clas(4)= 13 Then
flag= False
End If
End If
i=i+1
Loop
List1.AddItem “”&“花色”&“”&“点数”
For i =1 To 12
List1. AddItem“”& hs(record(i)) &“”& num(record(i))
Next i
End Sub
Function pos(t As Integer) As Integer '返回点数最小卡牌位置
Dim min As Integer
m= (hs(t)-1)*3+1
min= m
If num(record(min)) > num(record(m+ 1)) Then min=m+ 1
If num (record(min)) > num(record(m+ 2)) Then min=m+ 2
If Then
pos= 0
Else
pos=min
End If
End Function