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

 

 

inserted by FC2 system