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

 トランプを使ったカードゲームとして、「カブ」を制作する。

使用カード:  スペード、クラブ、ハート、ダイヤ、それぞれA(1)から10までの40枚。
ゲームの目的:  カードの合計点数を9点に近づける。
 カードの合計点数は10の位を除いたものになる。例えば、合計が15であれば合計点数は5点となる。
ゲームの流れ:  場に5枚、親に1枚を表向きに配る。プレーヤーは場の4枚から賭けるカードを一つ選択し、賭け点を決める。場のカードに1枚ずつ追加配布する。このとき、さらに1枚要求できる(最大3枚)。親にも同じように追加配布する。合計点と役によって勝敗を判定する。
役: ・シッピン  Aと4 (プレーヤーのみの役)
   ・クッピン  Aと9 (ディーラーのみの役)   無条件で勝ち、プレーヤーの役も無効にする


(1) カードの準備

○ カード画像の準備
 同じサイズのカードを1枚の画像ファイルとして作成する。今回利用するのは、次の図で、カード1枚分のサイズは、40×55ドットである。


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

○ カードの記憶方法
 カードを記憶するとき、カードのデータをS1, S2, ・・・(Sはスペード)とすることが考えられるが、コンピュータでは連続した数値で扱う方が便利である。ここでは、スペードの1から順に通し番号(0番〜)を付ける。

スペード 1 2 3 4 5 6 7 8 9 10 J Q K
通番 0 1 2 3 4 5 6 7 8 9 10 11 12
クラブ 1 2 3 4 5 6 7 8 9 10 J Q K
通番 13 14 15 16 17 18 19 20 21 22 23 24 25
ハート 1 2 3 4 5 6 7 8 9 10 J Q K
通番 26 27 28 29 30 31 32 33 34 35 36 37 38
ダイヤ 1 2 3 4 5 6 7 8 9 10 J Q K
通番 39 40 41 42 43 44 45 46 47 48 49 50 51

 カードと通番の変換は次の式でできる。

カード種類 = 通番÷13の商   (0=スペード、1=クラブ、2=ハート、3=ダイヤ)
カード数字 = 通番÷13の余り + 1
 
通番 = カード種類 × 13 + カード数字 − 1

 HSPの変数は基本的に整数型であるから、普通にわり算すると小数以下は切り捨てられ、商が求められる。余りは演算子(\)を使えば求められる。
 カードの通番を一次元配列に格納しておけば、配列の添字を順に変えるだけで取り出すことができる。

 カードの通番をカード種類とカード数字に変換すれば、次の式で、画像の座標にも変換できる。カード1枚の画像サイズ、40×55ドットである。

x座標 = (カード数字 − 1) × 40 = 通番÷13の余り × 40
y座標 = カード種類 × 55       = 通番÷13の商 × 55



(2) カードのシャッフル

 でたらめに取り出したカードの通番を配列の0番から順に格納していけばよい。でたらめに取り出す方法は乱数を使う。
 次にプログラムを示す。

    dim c, 52
    randomize
    ;配列初期化
    repeat 52
        c(cnt) = -1
    loop
    ;シャッフル
    repeat 52
        repeat
            rr = rnd(52)
            if c(rr) = -1 : break
        loop
        c(rr) = cnt
    loop
【シャッフル方法1】
 配列の初期化では、すべての配列に-1を格納している。

 シャッフルでは、カードが52枚なので52回繰り返している。内側の無限ループでは乱数で0〜51の整数を発生し、その乱数を添字とする配列が空いていれば(-1であれば)通番(cntの値)を格納している。すなわち、内側の無限ループでは、空いている配列をランダムに探している。
 乱数の発生回数は平均で260回程度である。
    dim c, 52
    randomize
    ;配列初期化
    repeat 52
        c(cnt) = cnt
    loop
    ;シャッフル
    repeat 200    ;200回
        r1 = rnd(52)
        r2 = rnd(52)
        wk = c(r1)
        c(r1) = c(r2)
        c(r2) = wk
    loop
【シャッフル方法2】
 配列の初期化では、配列に通番を格納している。配列の添字と格納されている値は同じになる。

 シャッフルでは、2つの乱数r1, r2を発生させ配列のr1番とr2番の値を入れ替えている。この処理を200回繰り返している。理論的には、カードの枚数の半分繰り返せばシャッフルできるはずであるが、念のため200回としている。

 この方法では、使用するカードの通番を配列に格納しておき、それらを入れ替えることでシャッフルしているので、特定のカードだけを使用する場合にも対応できる。

 シャッフルの結果は、次のプログラムを追加すれば通番が13個ずつ表示される。

    ;結果表示
    repeat 52
        pos (cnt \ 13) * 24, cnt / 13 * 16
        mes c(cnt)
    loop
    stop


サンプル(card11.hsp)
 カブ・ゲーム用のシャッフルを作成する。

 カブ・ゲーム用に、シャッフルをするサブルーチンshuffleを作成する。使用するカードは数字のカードだけ40枚である。カードの通番で表すと次のようになる。

 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
 39, 40, 41, 42, 43, 44, 45, 46, 47, 48

 【シャッフル方法2】を使う場合、配列に使うカードの通番を格納して初期化する。HSPでは、次のように書くことができる。

dim card, 40    ;カード40枚分
card = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, …, 46, 47, 48
;card11.hsp
    dim card, 40    ;カード用
    randomize
    gosub *shuffle  ;カードシャッフル
    ;結果表示
    repeat 40
        pos (cnt \ 10) * 24, cnt / 10 * 16
        mes card(cnt)
    loop
    stop
;カードシャッフル -----
*shuffle
    ;配列初期化
    card(0)  =  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22
    card(20) = 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48
    ;シャッフル
    repeat 200              ;200回
        r1 = rnd(40)
        r2 = rnd(40)
        wk = card(r1)
        card(r1) = card(r2)
        card(r2) = wk
    loop
    return



課題(card61.hsp)
 シャッフルの結果を画像で表示する。


(リスト)


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

 

 

inserted by FC2 system