カード・ゲームの制作 VB6 | |
(2) 1枚目のカード配布 |
1. 全体の処理の流れ
カードゲーム(カブ)の全体の処理はフローチャート(右図)のようになる。
初期化(準備)の"オブジェクトの設定"は、「不要なオブジェクトを非表示にする」などの設定である。
入力や選択はイベントの発生によって処理される。例えば、「カード選択」は場に配布された4枚のカードから1枚をクリックして選択したときに次の処理を実行するような形にする。
2-1 オブジェクトの設定
フォームには配布されたカードを表示するpicCardオブジェクトが15個と移動用のpicWorkオブジェクトが配置されている。ここでは、親と場の1枚目以外を「非表示」にプログラムで設定する。これは、ゲーム継続によって2回目以降のゲームを開始するときにも「非表示」にする必要があるためである。
親と場の1枚目以外は、次図のようにコントロール配列の添字を3で割ったときの余りが0以外のカード(オブジェクト)である。
・プログラムリスト
実行すると、ウィンドウに4枚のカード(緑色)だけが表示される。
2-2 カードシャッフル と 1枚目配布(全員)
ここでは、カードをシャッフルして、1枚ずつ配布する処理をプログラムする。
まずは、カードをシャッフルする処理である。使用するカードはルールでも説明したように各マークそれぞれ1から10までの計40枚である。カードをシャッフルする処理は既に作成済みであり、追加した標準モジュールCardGame.basに用意されているので、使用するカードを設定してプロシージャCARDShuffleを呼び出すだけである。次のプログラムはInitGameプロシージャの最後に追加する。
used = "1111111111000"
'スペード
used = used & "1111111111000" 'クラブ
used = used & "1111111111000" 'ハート
used = used & "1111111111000" 'ダイヤ
used = used & "0"
'ジョーカー
CARDShuffle used 'カードシャッフル
string型の変数usedに使用するカードのデータを設定して、サブプロシージャCARDShuffleを呼び出す。シャッフルされたカードは配列CARDstockに格納される。
次に、配布する処理である。配布したカード(番号)は配列Tefuda(Integer型)に記憶させることにする。配列Tefudaは、-1で初期化する。また、シャッフルしたカードを取り出すカードの番号を変数CARDNext(Integer型)で管理する。
この配列と変数は(General), (Declarations)で宣言して、グローバル変数とする。
親の手札 Tefuda(0), Tefuda(1), Tefuda(2) 場1の手札
場2の手札
場3の手札
場4の手札Tefuda(3), Tefuda(4), Tefuda(5)
Tefuda(6), Tefuda(7), Tefuda(8)
Tefuda(9), Tefuda(10), Tefuda(11)
Tefuda(12), Tefuda(13), Tefuda(14)
1枚目は親のpicCard(0)と、場のpicCard(3)、picCard(6)、picCard(9)、picCard(12)の5カ所である。picWorkに画像を設定して目的の場所まで移動させる。
CARDNext = 1 '取り出すカード番号の初期化
'カード1枚目配布
For n = 0 To BASYO
Tefuda(n * 3) = CARDstock(CARDNext)
'カード取り出し
GetCardPic picWork, Tefuda(n * 3) '※1 カード画像取り出し
CardMove picWork, picCard(n * 3)
'カード移動
CARDNext = CARDNext + 1 '次に取り出すカード番号
Next n
※1 カードの画像imgCardAllから必要な部分の画像を取り出すサブプロシージャを次のように作成する。
Private Sub GetCardPic(pic As Object, num As Integer)
Dim xx As Integer, yy As Integer
xx = 40 * ((num - 1) Mod 13)
yy = 55 * Int((num - 1) / 13)
pic.PaintPicture imgCardAll.Picture, 0, 0, , , xx, yy, 40,
55
End Sub
ここまでの全体のプログラムリストを次に示す。
・プログラムリスト
Option Explicit '変数宣言の強制
Const BASYO = 4 '場に配布するカード数
Dim CARDNext As Integer '取り出すカード番号
Dim Tefuda(14) As Integer '配布されたカード
Private Sub Form_Load()
Randomize '乱数の初期化
frmKabu.Show 'フォームの表示
InitGame 'ゲームの初期化
End Sub
Private Sub InitGame()
'ゲームの初期化
Dim n As Integer
Dim used As String
'オブジェクトの設定
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"
'スペード
used = used & "1111111111000" 'クラブ
used = used & "1111111111000" 'ハート
used = used & "1111111111000" 'ダイヤ
used = used & "0"
'ジョーカー
CARDShuffle used 'カードシャッフル
CARDNext = 1 '取り出すカード番号の初期化
'カード1枚目配布
For n = 0 To BASYO
Tefuda(n * 3) = CARDstock(CARDNext)
'カード取り出し
GetCardPic picWork, Tefuda(n * 3)
'カード画像取り出し
CardMove picWork, picCard(n * 3)
'カード移動
CARDNext = CARDNext + 1 '次に取り出すカード番号
Next n
End Sub
Private Sub GetCardPic(pic As Object, num As Integer)
'カード画像の取得
' pic:画像データを格納するオブジェクト(PictureまたはImage), num:取り出すカード番号
Dim xx As Integer, yy As Integer
xx = 40 * ((num - 1) Mod 13)
yy = 55 * Int((num - 1) / 13)
pic.PaintPicture imgCardAll.Picture, 0, 0, , , xx, yy, 40,
55
End Sub
実行すると、右図のように5枚のカードが配布される。この状態で処理は終了なので「閉じる」のボタンで終了する。(右図は実行例である。カードは実行するごとに変わる。)
配布のアニメーションの最後で、下図のように移動しているカードが移動先のカードの後ろに隠れてしまったとき、picWorkが最前面にくるようにオブジェクトの上下関係を変更する。上下関係の変更は、変更するオブジェクトを選択して右クリックし、メニューから[最前面へ移動(B)]を選択する。
移動先のカードに隠れてしまうときは右図のように右クリックして、メニューから[最前面へ移動(B)]を選択する。 |
(2) 1枚目のカード配布 | |
Copyright © 2004 Hiroshi Masuda |