VBA扑克手
我正在尝试编写代码,将生成4个随机扑克手VBA扑克手,vba,excel,Vba,Excel,我正在尝试编写代码,将生成4个随机扑克手 (来源:) 显然,这些值应该是唯一的。这是我已经尝试过的代码,但是我无法让它工作 Sub poker_is_hard() Dim r As Range Dim c As Variant Dim s As Variant Dim cs As Variant Set r = Workbooks("Poker game.xls").Worksheets("Cards").Range("B2:E6") cs = c & "" & s Fo
(来源:) 显然,这些值应该是唯一的。这是我已经尝试过的代码,但是我无法让它工作
Sub poker_is_hard()
Dim r As Range
Dim c As Variant
Dim s As Variant
Dim cs As Variant
Set r = Workbooks("Poker game.xls").Worksheets("Cards").Range("B2:E6")
cs = c & "" & s
For Each cs In r
c = Int(Math.Rnd * 13) + 1
'Card's value
If c = 11 Then
c = "J"
ElseIf c = 12 Then
c = "Q"
ElseIf c = 13 Then
c = "K"
ElseIf c = 1 Then
c = "A"
Else
End If
'Card's symbol
s = Int(Math.Rnd * 4) + 1
If s = 1 Then
s = ThisWorkbook.Worksheets("Symbols").Range("B1").Value
ElseIf s = 2 Then
s = ThisWorkbook.Worksheets("Symbols").Range("B2").Value
ElseIf s = 3 Then
s = ThisWorkbook.Worksheets("Symbols").Range("B3").Value
Else
s = ThisWorkbook.Worksheets("Symbols").Range("B4").Value
End If
Next cs
End Sub
cs
更改为键入Range
而不是Variant
,以迭代单元格而不是单元格值
Dim cs As Range
cs = c & "" & s
将其放置在下一个cs之前Const SUITS As String = "CDHS"
Const RANKS As String = "A23456789TJQK"
Dim s As String, r As String
s = Mid$(SUITS, Int(Math.Rnd * 4) + 1, 1)
r = Mid$(RANKS, Int(Math.Rnd * 13) + 1, 1)
或者,利用Unicode:
Dim SUITS As String
SUITS = ChrW$(9824) & ChrW$(9827) & ChrW$(9829) & ChrW$(9830) ' ♠♣♥♦
这比OP要求的要多,但这里还有一些要看。结果与OP提供的图像类似,手被处理到工作表上从[B2]开始的范围 我在用电话 只需运行
Deal()
例程:
Public Sub Deal()
Const PLAYERS = 6, CARDS = 5
Dim i&, j&, k&, deck
CreateAndShuffle deck
ReDim hands(1 To CARDS, 1 To PLAYERS)
For i = 1 To CARDS
For j = 1 To PLAYERS
k = k + 1
hands(i, j) = deck(k)
Next
Next
[b2].Resize(CARDS, PLAYERS) = hands
End Sub
Private Sub CreateAndShuffle(a)
Dim i&, j&, k&, p&, suit
ReDim a(1 To 52)
suit = Array(ChrW$(9829), ChrW$(9830), ChrW$(9827), ChrW$(9824))
Randomize
For i = 1 To 13
For j = 0 To 3
k = k + 1
p = Int((k - 1 + 1) * Rnd + 1)
If j <> k Then a(k) = a(p)
a(p) = Mid$("A234567890JQK", i, 1): If i = 10 Then a(p) = 10
a(p) = a(p) & " " & suit(j)
Next
Next
End Sub
公开子交易()
常量玩家=6张,卡片=5张
尺寸i&,j&,k&,甲板
CreateAndShuffle牌组
重拨牌(1对牌,1对玩家)
对于i=1到卡
对于j=1的玩家
k=k+1
手(i,j)=甲板(k)
下一个
下一个
[b2]。调整大小(牌、玩家)=手
端接头
私有子创建和随机播放(a)
尺寸i&,j&,k&,p&,套装
重拨a(1至52)
套装=阵列(ChrW$(9829)、ChrW$(9830)、ChrW$(9827)、ChrW$(9824))
随机化
对于i=1到13
对于j=0到3
k=k+1
p=Int((k-1+1)*Rnd+1)
如果j k那么a(k)=a(p)
a(p)=Mid$(“A234567890JQK”,i,1):如果i=10,则a(p)=10
a(p)=a(p)&“和”与诉讼(j)
下一个
下一个
端接头
在Mid
中,$
做什么?@BruceWayne-将值视为字符串而不是变量。这不是必需的,但会阻止转换为变量
并再次转换回字符串
。@BruceWayne$
是Mid()函数的字符串版本。如果未指定,则使用变体版本。字符串版本更快。@BruceWayne-是,因为没有使用Mid$()
进行类型转换。但是,使用Mid()
,所有字符串参数的类型都转换为Variant
,返回值的类型从Variant
转换为string
@BruceWayne-几乎每个VBA字符串函数都有一个$
版本。有关示例,请参见。这不是官方文档(也是针对VB6的),但应该足够了。