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番〜)を付ける。
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 | クラブ | 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 | |
2 | ハート | 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 | |
3 | ダイヤ | 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 |