HSP3 ゲームのプログラミング
 ポーカー・ゲーム制作 前へ 目次へ 

(8) 親のカード処理

 親のカードから、どのカードを交換するか判定する。この判定はサブルーチンoya_hanteiとして作成し、交換するカードは配列chg(5)〜(9)に1を格納する。
 交換のルールは次の通りとする。

役名 交換 役点数
ファイブカード 交換なし 1000
ロイヤルストレートフラッシュ 交換なし 900
ストレートフラッシュ 交換なし 800
フォーカード 1 枚必ず交換 700
フルハウス 交換なし 600
フラッシュ 交換なし 500
ストレート 交換なし 400
スリーカード 0 〜 2 枚交換 300
ツーペア 1 枚必ず交換 200
ワンペア 0 〜 3 枚交換 100
ノーペア 0 〜 5 枚交換 0

 まず、役判定をするため、サブルーチンpoker_yakuを呼び出してから交換なしの役から判定する。交換なしの場合は、return命令で戻るだけである。

 次に、プログラムリストを示す。

;親の交換カード判定 -----
*oya_hantei
    oya = 1 : gosub *poker_hantei    ;役判定処理
    ;1000ファイブカード : 交換なし
    ;900ロイヤルストレートフラッシュ : 交換なし
    ;800ストレートフラッシュ : 交換なし
    ;600フルハウス : 交換なし
    ;500フラッシュ : 交換なし
    ;400ストレート : 交換なし
    if yaku >= 800 | (yaku >= 400 & yaku <= 699) : return

 残り、フォーカード、スリーカード、ツーペア、ワンペア、ノーペアは別々に処理していく。まず、カード1枚を必ず交換するフォーカードとツーペアの処理からである。これらの役では、役を構成するカード以外のカードは1枚で、配列hcntには1が格納されている。このカードを探して交換する。

 次に、プログラムリストを示す。前の処理の後に追加する。

;700フォーカード : 1 枚必ず交換
;200ツーペア : 1 枚必ず交換
    if yaku / 100 = 7 | yaku / 100 = 2{
        repeat 13, 2
            if hcnt(cnt) = 1 : chn = cnt : break
        loop
        if chn = 14 : chn = 1 ;Aの変換
        repeat 5, 5
            if crd(cnt) \ 13 + 1 = chn : chg(cnt) = 1
        loop
        return
    }
 役の数字の計算は、変数yakuが整数型であることを利用して、役点数を除いた数字を取り出している。ただし、Aは14としてyakuに格納されているので、if文で1に戻している。
 例えば、yaku=112のとき、yaku/100=1となり、(yaku/100)*100=100となる。したがって、chn=yaku-(yaku/100)*100は12となり、数字の12(Q)が役を構成していることがわかる。

 スリーカードとワンペアは、役を構成するカード以外が2枚または3枚ある。このカードを探して交換するかどうかを乱数で決定する。決定は「rnd(100) \ 2 = 1」で、0〜99の乱数を2で割った余りが1のときだけ(50%の確率)交換する。

 次に、プログラムリストを示す。前の処理の後に追加する。

;300スリーカード : 0 or 1 or 2 枚交換
;100ワンペア : 0 or 1 or 2 or 3 枚交換
;0ノーペア : 0 〜 5 枚交換
    repeat 13, 2
        if hcnt(cnt) = 1 {
            chn = cnt
            if chn = 14 : chn = 1    ;Aの変換
            repeat 5, 5
                if crd(cnt) \ 13 + 1 = chn & rnd(100) \ 2 = 1 : chg(cnt) = 1
            loop
        }
    loop
    return



○ 交換処理

 交換の判定をした後、配列chgの値を元にして実際に交換の処理をする。リストを参照のこと。

 次に、プログラムリストを示す。処理はメインの中に追加する。

;親のカード処理 -----
    gosub *oya_hantei    ;親の交換カード判定
    ;カード交換
    repeat 5, 5
        if chg(cnt) = 1 {
            crd(cnt) = -1     ;交換カードを消去
            gosub *gf_disp    ;ゲーム領域表示
            nn = cnt          ;移動先設定
            gosub *card_move  ;カード移動アニメーション
            crd(cnt) = card(cnum)    ;交換カードを配布
            cnum++            ;インデックス加算
            gosub *gf_disp    ;ゲーム領域表示
        }
    loop



(9) 勝敗判定

 ここまでで、プレイヤー、親ともにカードの交換が終了したので、後はそれぞれの役を判定して勝敗を決める。プレイヤーが勝てば賭点を得点に加算する。負ければ賭点を得点から減算する。

;勝敗判定 -----
    kmm = ""
    oya = 0 : gosub *poker_hantei    ;役判定処理(プレイヤー)
    yaku1 = yaku
    kmm += strf("プレイヤー : %4d\n", yaku1)    ;ダイアログ表示用メッセージ
    oya = 1 : gosub *poker_hantei    ;役判定処理(親)
    kmm += strf("親     : %4d\n", yaku)     ;ダイアログ表示用メッセージ
    if yaku1 > yaku {
        tokuten += kake
        dialog kmm + "\nプレイヤーの勝ちです。"
    } else {
        tokuten -= kake
        dialog kmm + "\n親の勝ちです。"
    }
    kake = 0        ;賭点クリア
 ダイアログにプレイヤーと親の役の点数を表示するようにメッセージを変数kmmに格納している。

 最後に、ゲームオー場のときの処理である。得点があるときは、無条件にゲームを再開する。ゲームオーバー(得点が0
)のときだけ確認のダイアログを表示するようにしている。

;ゲーム再開確認 -----
    if tokuten = 0 {
        dialog "ゲーム・オーバーです。もう一度しますか。", 2, "ポーカー・ゲーム"
        if stat = 6 :tokuten = 200 : goto *restart
        if stat = 7 : end
    }
    goto *restart
    end



○ 親のカード

 カードを配布したとき、親のカードも役判定の確認等のために表面を表示していた。ゲームとしては、相手(親)のカードを見て賭点を決めるのは適当ではない。
 カード配布時は親のカードの裏面を表示し、カード交換が終了して勝敗判定のダイアログが表示されるときに表面を表示するように処理を変更・追加する。表示の処理はサブルーチンgf_dispにある。

 親カードの裏面表示のための変更点を次に示す。

;ゲーム領域表示 -----
*gf_disp
    redraw 0
    ;ゲーム領域消去・準備
<< 省略 >>
    ;配置場所描画
<< 省略 >>
    ;カード山描画
<< 省略 >>
    ;親カード(裏)描画
    repeat 5, 5
        if crd(cnt) ! -1 {
            pos ptx(cnt), pty(cnt)
            gcopy 1, 80, 220    ;←裏面表示
            gcopy 1, crd(cnt) \ 13 * 40, crd(cnt) / 13 * 55    ;←表面表示 削除
        }
    loop
    ;プレイヤーのカード描画
<< 省略 >>
    ;交換マーク表示
<< 省略 >>
    ;得点、賭点表示
<< 省略 >>
    return

 親カードの表面表示のための追加処理を次に示す。

;勝敗判定 -----
   ;親カード(表)描画
    repeat 5, 5
        if crd(cnt) ! -1 {
            pos ptx(cnt), pty(cnt)
            gcopy 1, 80, 220    ;←裏面表示 削除
            gcopy 1, crd(cnt) \ 13 * 40, crd(cnt) / 13 * 55    ;←表面表示
        }
    loop
    kmm = ""
    oya = 0 : gosub *poker_hantei    ;役判定処理(プレイヤー)
    yaku1 = yaku
    kmm += strf("プレイヤー : %4d\n", yaku1)    ;ダイアログ表示用メッセージ
    oya = 1 : gosub *poker_hantei    ;役判定処理(親)
    kmm += strf("親     : %4d\n", yaku)     ;ダイアログ表示用メッセージ
    if yaku1 > yaku {
        tokuten += kake
        dialog kmm + "\nプレイヤーの勝ちです。"
    } else {
        tokuten -= kake
        dialog kmm + "\n親の勝ちです。"
    }
    kake = 0        ;賭点クリア



課題(poker65.hsp)
 親のカード処理、勝敗判定等の処理を追加して、ゲームを完成する。


(リスト)



課題(poker66.hsp)

 親のカード処理でのカード交換は、役が成立しているときだけしか考慮していない。特に、ノーペア(スリーカードもワンペアもであるが)のとき、単純に乱数で交換する/しないを決定している。
 また、賭点が10点単位の増減しかできない。100点、200点掛けようとするとクリックする回数が大変である。

 そこで、次の点について実現できるよう処理を追加せよ。



(リスト)


 ポーカー・ゲーム制作 前へ 目次へ 
2007 © Hiroshi Masuda 

 

 

inserted by FC2 system