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の場所に配布することになるので、カードを移動するアニメーションを作成する予定である。
○ ゲームの進行
ゲームを開始した後の進行は次の通りとする。
(2) 処理(プログラム)の概要とカード配布
ゲームの進行を参考にして処理の概要を考える。処理の流れはおおよそ次の通りである。
(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 |