カード・ゲームの制作 VB6 | |
(5) 2枚目配布 |
カードを選択して賭け点を決めた後、2枚目配布以降の処理をGame2プロシージャとしてプログラムしていく。
まず、点数入力のcmbKaketen_ClickプロシージャでコメントにしていたGame2プロシージャ呼び出しのコメントをとる。
・プログラムリスト(修正)
Private Sub cmbKaketen_Click()
'賭け点の選択
Dim n As Integer, mark As Integer, number As Integer
<< 省 略 >>
If rr = vbYes Then 'OK
cmbKaketen.Enabled = False
'賭け点使用不可
State = 2 '次の状態に設定
Game2 'コメント(')を削除
Else 'NO
For n = 1 To BASYO
picCard(n * 3).BorderStyle
= 0 'カード選択解除
Next n
cmbKaketen.ListIndex = 0
'賭け点初期化
cmbKaketen.Enabled = False
'賭け点使用不可
End If
End If
End Sub
役判定の処理で、配付されていないカードは-1としているので、ゲーム初期化の処理に次の1行を追加する。
Private Sub InitGame()
'ゲームの初期化
Dim n As Integer
Dim used As String
State = 0 '現在の状態
lblMessage.Caption = "" 'メッセージクリア
cmbKaketen.Enabled = False '賭け点使用不可
'オブジェクトの設定
picWork.Visible = False '移動用カードを非表示に設定
For n = 0 To 14
picCard(n).Picture = LoadPicture("")
'画像データの消去
picCard(n).BackColor = &HCC00& 'カード置き場所の色設定
picCard(n).BorderStyle = 0 '枠線なしに設定
If n Mod 3 > 0 Then '最初の置き場所以外は非表示に設定
picCard(n).Visible = False
End If
Tefuda(n) = -1
Next
used = "1111111111000" 'スペード
<<以下省略>>
1. 場(プレーヤー)の2枚目配布以降
点数入力以降の処理は、Game2プロシージャとして作成していく。
まずは、2枚目配布の処理であるが、プローチャート(左図)より、親と場の4枚のカードについて処理する必要がある。順番は場のカードの後に親のカードの処理となる。
場に2枚目を1枚ずつ配付し、選択したカードかどうか判定する。選択した場の番号(3,6,9,12)はグローバル変数SelCardに格納されている。
場の1枚目がオブジェクトpicCardの3,6,9,12であるからFor文で4回繰り返す。おおよその処理は次のようになる。
For n = 3 to BASYO * 3 Step 3 2枚目をpicCard(n+1)に配付する If n = SelCard Then '選択したカード If 3枚目希望する=yes Then rr = 1 else rr = 0 End If Else '選択していないカード rr = 判定 End If if rr = 1 then 3枚目をpicCard(n+2)に配付する Next n |
・プログラムリスト(2,3枚目配付)
Private Sub Game2()
Dim n As Integer, pp As Integer
Dim rr As Integer
'場の処理
For n = 3 To BASYO * 3 Step 3
pp = n + 1
Tefuda(pp) = CARDStock(CARDNext)
'2枚目
GetCardPic picWork, Tefuda(pp)
'カード画像取り出し
CardMove picWork, picCard(pp)
'カード移動
CARDNext = CARDNext + 1 '次に取り出すカード番号
If n = SelCard Then '選択したカード
If MsgBox("もう一枚引きますか?",
vbYesNo, "カブ") = vbYes Then
rr = 1
Else
rr = 0
End If
Else
'選択していないカード
rr = Hantei(n)
End If
If rr = 1 Then
pp = pp + 1
Tefuda(pp) = CARDStock(CARDNext)
'3枚目
GetCardPic picWork, Tefuda(pp)
'カード画像取り出し
CardMove picWork, picCard(pp)
'カード移動
CARDNext = CARDNext + 1
'次に取り出すカード番号
End If
Next n
End Sub
・プログラムリスト(3枚目を引くかどうか判定)
Private Function Hantei(num As Integer) As Integer
Dim yaku As Integer, goukei As Integer
Dim rs As Integer, kekka As Integer
' クッピン(親のみの役)…Aと9 最強 999 ///
' シッピン(子のみの役)…Aと4 3倍返し 998 ///
' 嵐…3枚とも同じ数字(A,3,5,10) 10倍返し 888 800
' 嵐…3枚とも同じ数字(2,4,6,7,8,9) 5倍返し 777 700
' 順子(シュンツ)…同じマークの連番 5倍返し 555 500
' 合計の1の位 2倍返し 9,8,7,6,5,4,3,2,1,0 ///
yaku = Hyouka(num) '役の評価
goukei = yaku - Int(yaku / 10) * 10 '数字合計
rs = ransuu(1, 100) '乱数1〜100
kekka = 0 '0=引かない、1=引く
If yaku = 999 Then '親クッピン
kekka = 0
ElseIf yaku = 998 Then '親以外シッピン
kekka = 0
ElseIf yaku >= 500 Then '順子リーチ以上
If goukei >= 6 Then
If rs <= 20 Then '2割
kekka = 1
Else
kekka = 0
End If
Else
kekka = 1
End If
ElseIf goukei >= 8 Then '以下のif文は役がないとき
kekka = 0
ElseIf goukei = 7 Then
If rs <= 30 Then '3割
kekka = 1
Else
kekka = 0
End If
ElseIf goukei = 6 Then
If rs <= 40 Then '4割
kekka = 1
Else
kekka = 0
End If
ElseIf goukei <= 5 Then
kekka = 1
Else
kekka = 0
End If
Hantei = kekka
End Function
実行して、カードを選択する。かけ点を入力する。場に2枚目と場合によっては3枚目のカードが配布される。今のところ、4つの場にカードが配布されて終了である。
2. 親の2枚目配布以降
基本的に、場の処理と同じである。2枚目を配布した後、3枚目を引くかどうかをHanteiプロシージャで判定する。親の処理はGame2プロシージャの場の処理の後に追加する。
・プログラムリスト
Private Sub Game2()
Dim n As Integer, pp As Integer
Dim rr As Integer
'場の処理
For n = 3 To BASYO * 3 Step 3
<< 省 略 >>
Next n
'親の処理
Tefuda(1) = CARDStock(CARDNext) '2枚目
GetCardPic picWork, Tefuda(1) 'カード画像取り出し
CardMove picWork, picCard(1) 'カード移動
CARDNext = CARDNext + 1
'次に取り出すカード番号
If Hantei(0) = 1 Then
Tefuda(2) = CARDStock(CARDNext) '3枚目
GetCardPic picWork, Tefuda(2) 'カード画像取り出し
CardMove picWork, picCard(2)
'カード移動
CARDNext = CARDNext + 1
'次に取り出すカード番号
End If
End Sub
実行して、カードを選択する。かけ点を入力する。場に2枚目と場合によっては3枚目のカードが配布される。4つの場にカードが配布されたあと、親に配布されて終了である。
(5) 2枚目配布 | |
Copyright © 2005 Hiroshi Masuda |