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

 一人用であるが、カードを5枚だけ表示してゲームを進め、できあがった役によって倍率を変える方法と、コンピュータとの対戦型として、できあがった役を比べて勝敗を決める方法などが考えられる。ここでは、後者のコンピュータとの対戦型として作成していく。

(1) 計画と処理の概要

 カードなどの配置場所および背景色とカード置き場のカラーコード(R, G, B)は、図の通りとする。
 ウィンドウを上下に分割して、上部(y座標0〜249)をゲーム領域として、カードなどを表示する。下部(y座標250〜279)はメッセージなどを表示する領域とする。

 カードの置き場所(座標)は、配列ptxとptyに記憶させる。また、それぞれの場所に配布されているカードの通番を配列crdに記憶させる。例えば、図のBの座標は(ptx(3), pty(3))であり、配布されたカードの通番はcrd(3)にそれぞれ格納する。配布されていない場所のカードの通番は、通番として使用していない -1 とする。
 カードの置き場所(座標)は、次の通りとする。

n= (0) @ A B C D E F G H I
x座標ptx(n) 50 100 150 200 250 50 100 150 200 250 0
y座標pty(n) 150 150 150 150 150 50 50 50 50 50 0
通番crd(n) -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

 カードをIの場所から(0)〜Hの場所に配布することになるので、カードを移動するアニメーションを作成する予定である。


○ ゲームの進行

 ゲームを開始した後の進行は次の通りとする。

  1. プレイヤーと親にそれぞれ5枚のカードを配布する。
  2. プレイヤーが賭点を入力(決定)する。
     図の[+10]または[-10]をクリックして賭点を入力する。最後に[決定]をクリックして賭点を決定する。
  3. プレイヤーが交換するカードを選択(決定)する。
     図のカード(0)〜Cをクリックして交換するカードを選択する。カードの上に「交換」と表示される。もう一度クリックすると選択は解除される。
  4. 選択したカードが交換される。
  5. 親がカードを交換する。
  6. 勝敗が判定され、得点が計算される。 最初に戻る。

(2) 処理(プログラム)の概要とカード配布

 ゲームの進行を参考にして処理の概要を考える。処理の流れはおおよそ次の通りである。

  1. 初期設定をする。
    (配列宣言、乱数、ウィンドウ等設定、カード配置場所設定など)
  2. ゲームの初期設定をする。
    (配布カードの初期化、カードシャッフルなど)
  3. カード5枚ずつ配布する。
  4. 賭点を入力する。
  5. 交換カード入力(選択)する。
  6. カードを交換する。
  7. 親のカード処理をする。
    (交換カードの決定、カード交換)
  8. 勝敗を判定する。
  9. ゲーム再開の確認をする。


サンプル(poker11.hsp)
 初期設定をして、ウィンドウを表示するプログラムを作成する。

;poker11.hsp
;初期設定 -----
    ;配列宣言
    dim card, 53    ;カードの山用
    dim ptx, 11 : dim pty, 11    ;カード置き場所座標
    dim crd, 10     ;配布カードの通番格納用
    ;乱数、ウィンドウ等設定
    randomize
    buffer 1
    picload "card2.bmp"    ;ウィンドウID1番に画像読み込み
    screen 0, 320, 280
    gmode 0, 40, 55    ;コピーモード0。カード1枚のサイズ40×55ドット
    title "ポーカー・ゲーム"
    color 0, 100, 0 : boxf    ;画面消去
    ;カード配置場所設定
    repeat 5
        ptx(cnt) = cnt * 50 + 50        ;プレイヤー 0-4
        pty(cnt) = 150
        ptx(cnt + 5) = cnt * 50 + 50    ;コンピュータ(親) 5-9
        pty(cnt + 5) = 50
    loop
    ;カード山配置場所設定
    cyama = length(ptx)
    ptx(cyama) = 0 : pty(cyama) = 0
    tokuten = 200    ;得点初期化
*restart
;ゲーム初期設定 -----
    foreach crd
        crd(cnt) = -1    ;配布カード初期化
    loop
    gosub *shuffle       ;カードシャッフル
    gosub *gf_disp       ;画面表示
    cnum = 0        ;取り出すカード番号(インデックス)
;カード5枚ずつ配布 -----
;賭点入力 -----
;交換カード入力 -----
;親のカード処理 -----
;勝敗判定 -----
;ゲーム再開確認 -----
    stop
;------------------------
;----- サブルーチン -----
;ゲーム領域表示 -----
*gf_disp
    redraw 0
    ;ゲーム領域消去・準備
    color 0, 100, 0 : boxf , , , 249
    color 0, 150, 0
    ;配置場所描画
    foreach ptx
        boxf ptx(cnt), pty(cnt), ptx(cnt) + 40, pty(cnt) + 55
    loop
    ;カード山描画
    pos ptx(cyama), pty(cyama)
    gcopy 1, 80, 220    ;40 * 2, 55 * 4
    ;親カード(裏)描画
    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
    ;プレイヤーのカード描画
    repeat 5
        if crd(cnt) ! -1 {
            pos ptx(cnt), pty(cnt)
            gcopy 1, crd(cnt) \ 13 * 40, crd(cnt) / 13 * 55
        }
    loop
    ;得点、賭点表示
    font "MS ゴシック", 20, 1
    pos 10, 210
    color 0, 0, 0 : mes strf("得点:%08d", tokuten)
    pos 190, 210
    color 0, 0, 0 : mes strf("賭点:%d", kake)
    redraw 1
    return
;カード移動アニメーション -----
*card_move
    ;cyama = length(ptx)
    kaisu = 10    ;分割数
    dx = abs(ptx(nn) - ptx(cyama)) / kaisu    ;移動量計算
    dy = abs(pty(nn) - pty(cyama)) / kaisu
    repeat kaisu, 1
        gosub *gf_disp      ;ゲーム領域描画
        pos ptx(cyama) + dx * cnt, pty(cyama) + dy * cnt    ;座標設定
        gcopy 1, 80, 220    ;画像コピー
        wait 5    ;時間待ち
    loop
    return
;カードシャッフル -----
*shuffle
    ;配列初期化
    foreach card
        card(cnt) = cnt
    loop
    ;シャッフル
    repeat 200        ;200回
        r1 = rnd(53)
        r2 = rnd(53)
        wk = card(r1)
        card(r1) = card(r2)
        card(r2) = wk
    loop
    return

 「カード移動のアニメーション」と「カードシャッフル」のサブルーチンはカブ・ゲームの制作のところで説明しているものとほぼ同じである。
 「カード移動のアニメーション」のサブルーチンでは、カード配置場所の最後、すなわち配列ptx(pty)の最後がカード山の配置場所としているので、配置場所の数が変わっても配列の個数をきっちりと宣言しておけばこのサブルーチンを変更しなくてよいように変数cyamaを使って変更している。
 「カードシャッフル」のサブルーチンでは、今回、すべてのカードとジョーカーを使用するので、配列初期化部分が変更されている。

 ポーカーの役判定でカードが強い順に並んでいる必要があるので、カブ・ゲームで使用した画像とは並びが違う"card2.bmp"を使用している。


 
画像データ card2.bmp (140kB) (右クリックでダウンロード)



課題(poker61.hsp)
 プレイヤーと親にカード5枚ずつ配布する処理を追加する。

ヒント
 シャッフルされたカードは配列cardに格納されている。変数cnumの値を配列の添字としてシャッフルしたカードを順に参照していく。参照後は変数cnumを1加算しておく。
 配布されたカードは配列crdに格納していく。
    repeat 10    ;プレイヤー(0-4)と親(5-9)に配布
        nn = cnt           ;カード移動アニメーション用
        gosub *card_move   ;カード移動アニメーション
        crd(cnt) = card(cnum)    ;配布
        cnum++             ;インデックス加算
        gosub *gf_disp     ;ゲーム領域表示
    loop

実行


(リスト)


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

 

 

inserted by FC2 system