HSP3 ゲームのプログラミング | |
カブ・ゲーム制作 |
(8) カード2,3枚目配布
配布された1枚目のカードから選択し賭点を入力した後、2枚目のカードが配布され、その合計によって3枚目を引くかどうかを判断する。
プレーヤの選択したカードは、プレーヤが3枚目を引くかどうかを判定する。その他のカードと親のカードはコンピュータが判定する。すなわち、コンピュータに考えさせる思考プログラムが必要である。思考プログラムと言っても複雑なものではなく、合計が9に近ければ3枚目は引かない、などの判定だけである。さらに、親には1と9の最強役があり、親以外には1と4の役があるので、これも考慮しなければならない。
役(合計点)を記憶する配列yakuを用意し、合計を格納する。ただし、親以外の1と4は合計を10、親の1と9は合計11として格納する。配列yakuの個数は6個(親(1カ所)+親以外(5カ所))で宣言する。
処理の概要を次に示す。
;2,3枚目配布処理
repeat 6
2枚目配布
2枚の合計計算
if 選択したカード{
if 3枚目を引くかどうか選択 {
3枚目配布
3枚の合計計算
}
} else {
if 3枚目を引くかどうか判定 {
3枚目配布
3枚の合計計算
}
}
合計点表示
loop
2枚目の置き場所は@、C、F、I、L、Oである。repeat 6 でシステム変数cntはcnt=0, 1, 2, 3, 4, 5と変わるので、計算式で変数nnがnn=1, 4, 7, 10, 13, 16となるようにする。「2枚目配布」の処理を次に示す。
;2枚目配布
nn = cnt * 3 + 1 ;配布場所計算
gosub *card_move ;配布アニメーション
crd(nn) = card(cnum) ;2枚目
cnum = cnum + 1 ;インデックス加算
gosub *gf_disp ;ゲーム領域描画
「2枚の合計計算」はサブルーチン*get_yaku2として作成する。配布場所の変数nnを元に2枚の合計を計算して、10で割った余りが合計となる。また、親は1と9で合計を11に、親以外は1と4で合計を10にする。合計点は変数yakutenに格納する。「2枚の合計計算」の処理を次に示す。
;2枚の合計計算
gosub *get_yaku2 ;役計算(2枚)→yakuten
yaku(cnt) = yakuten ;役(合計点)格納
サブルーチン*get_yaku2のプログラムを次に示す。
;役計算(2枚) -----
*get_yaku2
yakuten = ((crd(nn - 1) \ 13 + 1) + (crd(nn) \ 13 + 1)) \ 10 ;2枚の合計
if nn >= 15 { ;親
if (crd(nn - 1) \ 13 + 1) = 1 & (crd(nn) \ 13 + 1) = 9 : yakuten = 11 ;1と9の場合
if (crd(nn - 1) \ 13 + 1) = 9 & (crd(nn) \ 13 + 1) = 1 : yakuten = 11
} else { ;親以外
if (crd(nn - 1) \ 13 + 1) = 1 & (crd(nn) \ 13 + 1) = 4 : yakuten = 10 ;1と4の場合
if (crd(nn - 1) \ 13 + 1) = 4 & (crd(nn) \ 13 + 1) = 1 : yakuten = 10
}
return
2枚目を配布した後なので、crd(nn)が2枚目、crd(nn-1)が1枚目となる。配列crdには通番が格納されているので13で割った余りに1を加算してカードの数字に変換している。
親の配布場所はN、O、Pなので、nn≧15が親であると判定できる。
選択したカードは変数selcに0〜4の数値で格納されているので、システム変数cntと比較すればよい。
if selc = cnt { ;選択したカード
選択したカードの場合はプレーヤに「3枚目を引くかどうか選択」させる。ダイアログを表示して選択させることにする。
dialog命令でタイプに2を指定するとメッセージと[はい]、[いいえ]のボタンが表示される。[はい]をクリックすると6、[いいえ]をクリックすると7がシステム変数statに格納される。
3枚目を引く場合、「3枚目配布」の処理は2枚のときとほぼ同じである。「3枚の合計計算」もサブルーチン*get_yaku3として作成する。これらの処理を次に示す。
dialog "もう一枚引きますか。", 2, "かぶ・ゲーム"
if stat = 6 { ;3枚目引く
;3枚目配布
nn = nn + 1 ;配布場所計算
gosub *card_move ;配布アニメーション
crd(nn) = card(cnum) ;3枚目
cnum = cnum + 1 ;インデックス加算
gosub *gf_disp ;ゲーム領域描画
;3枚の合計計算
gosub *get_yaku3 ;役計算(3枚)→yakuten
yaku(cnt) = yakuten ;役(合計点)格納
}
配布場所計算では、変数nnが2枚目の場所の値なので、1を加算して3枚目の場所としている。2枚目と同じようにnn = cnt * 3 + 2で計算してもよい。
サブルーチン*get_yaku3のプログラムを次に示す。
;役計算(3枚) -----
*get_yaku3
yakuten = ((crd(nn - 2) \ 13 + 1) + (crd(nn - 1) \ 13 + 1) + (crd(nn) \ 13 + 1)) \ 10 ;3枚の合計
return
3枚目を配布した後なので、crd(nn)が3枚目、crd(nn-1)が2枚目、crd(nn-2)が1枚目となる。
計算式が1行だけなので、サブルーチンにしなくてもよいが、3枚でできる役、例えば同じ数字3枚などの役を追加するときのためにサブルーチンにしている。
選択したカード以外の場合はコンピュータに「3枚目を引くかどうか判定」させる。判定は、次の条件とする。
(a) 合計が5以下の時、3枚目を引く。 → yaku(cnt) <= 5
(b) 合計が7以下の時、50%の確率で3枚目を引く。 → yaku(cnt) <= 7 & rnd(10) < 5
if yaku(cnt) <= 5 | (yaku(cnt) <= 7 & rnd(10) < 5) { ;3枚目引くか判定
;3枚目配布
… …
;3枚の合計計算
… …
}
3枚目を引く場合の「3枚目配布」と「3枚の合計計算」の処理はすでに示した通りである。
最後に、「合計点表示」の処理である。合計点は配列yakuに格納されている。座標を指定して表示するだけである。処理を次に示す。
;合計点表示
if cnt = 5 { ;親
pos ptx(cnt * 3), pty(cnt * 3) + 60
} else { ;親以外
pos ptx(cnt * 3), pty(cnt * 3) + 140
}
color 0, 0, 0
mes "合計=" + yaku(cnt)
カードの高さは55ドットで、pty(cnt*3)は1枚目のy座標である。親は1枚目のy座標に60を加算してカードの下に座標を設定している。親以外は3枚のカードが重なっており、さらに賭点を表示しているので、1枚目のy座標に140を加算して座標を設定している。
(card67.hsp)
2,3枚目のカード配布の処理を追加する。
カブ・ゲーム制作 | |
2007 © Hiroshi Masuda |