HSP3 ゲームのプログラミング | |
プログラミング例 (ポーカー・ゲーム) |
リンクをクリックするとリストが表示される。
課題 (poker61.hsp)
プレイヤーと親にカード5枚ずつ配布する処理を追加する。
;poker61.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枚ずつ配布 ----- repeat 10 ;プレイヤー(0-4)と親(5-9)に配布 nn = cnt ;カード移動アニメーション用 gosub *card_move ;カード移動アニメーション crd(cnt) = card(cnum) ;配布 cnum++ ;インデックス加算 gosub *gf_disp ;ゲーム領域表示 loop ;賭点入力 ----- ;交換カード入力 ----- ;親のカード処理 ----- ;勝敗判定 ----- ;ゲーム再開確認 ----- 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
課題 (poker62.hsp)
賭点の入力と決定の処理を追加する。
;poker62.hsp ;初期設定 ----- << 省略 >> *restart ;ゲーム初期設定 ----- << 省略 >> ;カード5枚ずつ配布 ----- << 省略 >> ;賭点入力 ----- color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 font "MS Pゴシック", 16 : color 255, 255, 255 pos 5, 255 : mes "賭点を入力して下さい。" ;メッセージ表示 color 128, 128, 128 boxf 180, 255, 215, 274 ;クリックする場所に四角形描画 boxf 220, 255, 255, 274 boxf 260, 255, 305, 274 font "MS Pゴシック", 16, 1 : color 0, 0, 0 pos 185, 257 : mes "+10" ;得点表示 pos 225, 257 : mes "-10" pos 265, 257 : mes "決定" ;賭点決定待ち repeat stick kk if kk = 256 & mousey >= 255 & mousey <= 274 { ;左クリック if mousex >= 180 & mousex <= 215 : kake += 10 ;賭点加算 if mousex >= 220 & mousex <= 255 : kake -= 10 ;賭点減算 if mousex >= 260 & mousex <= 305 & kake ! 0 : break ;賭点決定 kake = limit(kake, 0, tokuten) ;賭点の制限 gosub *gf_disp ;ゲーム領域表示 } await 100 loop ;交換カード入力 ----- ;親のカード処理 ----- ;勝敗判定 ----- ;ゲーム再開確認 ----- stop ;------------------------ ;----- サブルーチン ----- ;ゲーム領域表示 ----- *gf_disp << 省略 >> ;カード移動アニメーション ----- *card_move << 省略 >> ;カードシャッフル ----- *shuffle << 省略 >>
課題 (poker63.hsp)
交換するカード選択とカード交換の処理を追加する。
;poker63.hsp ;初期設定 ----- ;配列宣言 dim card, 53 ;カードの山用 dim ptx, 11 : dim pty, 11 ;カード置き場所座標 dim crd, 10 ;配布カードの通番格納用 dim chg, 10 ;交換用フラグ ;乱数、ウィンドウ等設定 << 省略 >> *restart ;ゲーム初期設定 ----- << 省略 >> ;カード5枚ずつ配布 ----- << 省略 >> ;賭点入力 ----- << 省略 >> ;交換カード入力 ----- color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 font "MS Pゴシック", 16 : color 255, 255, 255 pos 5, 255 : mes "交換するカードをクリックして下さい。" color 128, 128, 128 boxf 260, 255, 305, 274 font "MS Pゴシック", 16, 1 : color 0, 0, 0 pos 265, 257 : mes "決定" ;交換カード決定待ち repeat stick kk if kk = 256 & mousey >= pty(0) & mousey <= pty(0) + 55 { ;カードクリック repeat 5 if mousex >= ptx(cnt) & mousex <= ptx(cnt) + 40 { chg(cnt) = -chg(cnt) gosub *gf_disp ;ゲーム領域表示 } loop } if kk = 256 & mousex >= 260 & mousex <= 305 & mousey >= 255 & mousey <= 274 : break ;[決定] await 100 loop ;カード交換 color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 repeat 5 ;cnt=0,1,2,3,4 if chg(cnt) = 1 { crd(cnt) = -1 ;交換カードを消去 gosub *gf_disp ;ゲーム領域表示 nn = cnt ;移動先設定 gosub *card_move ;カード移動アニメーション crd(cnt) = card(cnum) ;交換カードを配布 cnum++ ;インデックス加算 gosub *gf_disp ;ゲーム領域表示 } loop ;親のカード処理 ----- ;勝敗判定 ----- ;ゲーム再開確認 ----- stop ;------------------------ ;----- サブルーチン ----- ;ゲーム領域表示 ----- *gf_disp << 省略 >> ;カード移動アニメーション ----- *card_move << 省略 >> ;カードシャッフル ----- *shuffle << 省略 >>
課題 (poker64.hsp)
役判定のサブルーチンpoker_hanteiを完成する。
;poker64.hsp #module #defcfunc pow int dd, int kk ; ;pow(整数値, 乗数) ; 返却値=int べき乗の値 ; ans = 1 repeat kk ans = ans * dd loop return ans #global ;初期設定 ----- ;配列宣言 dim card, 53 ;カードの山用 dim ptx, 11 : dim pty, 11 ;カード置き場所座標 dim crd, 10 ;配布カードの通番格納用 dim chg, 10 ;交換用フラグ dim hnum, 5 : dim hcnt, 15 ;役判定用(数字と種類) sdim hsn, 5 : dim hnn, 5 ;役判定用(数字(2進数)と種類別枚数) ;乱数、ウィンドウ等設定 << 省略 >> *restart ;ゲーム初期設定 ----- << 省略 >> ;カード5枚ずつ配布 ----- << 省略 >> ;賭点入力 ----- << 省略 >> ;交換カード入力 ----- << 省略 >> ;確認用プログラム oya = 1 : gosub *poker_hantei : test1 = yaku oya = 0 : gosub *poker_hantei : test2 = yaku dialog "親=" + test1 + "\nプ=" + test2 goto *restart ;親のカード処理 ----- ;勝敗判定 ----- ;ゲーム再開確認 ----- stop ;------------------------ ;----- サブルーチン ----- ;役判定処理 ----- *poker_hantei ;役判定用配列初期化 repeat 5 hnum(cnt) = 0 hsn(cnt) = "" hnn(cnt) = 0 loop repeat 15 hcnt(cnt) = 0 loop ;カード解析、プレイヤーcrd(0)-(4)/親crd(5)-(9) repeat 5, oya * 5 syu = crd(cnt) / 13 suu = crd(cnt) \ 13 + 1 if syu = 4 { ;joker hnum(4) = 1 } else { if suu = 1 : suu = 14 ;10,J,Q,K,Aの並びのため hcnt(suu)++ ;数字別カウント hnum(syu) += pow(2, suu) ;種類別数字 } loop ;カード解析2、数字2進数文字列変換、種類別枚数等 hnumw = 0 repeat 4 hnumw |= hnum(cnt) ;種類別数字のまとめ bindata = hnum(cnt) gosub *bin2str ;2進数文字列変換 hsn(cnt) = binstr ;種類別数字→"0101010101010" 2進数文字列 hnn(cnt) = binnum ;種類別枚数 loop bindata = hnumw gosub *bin2str ;2進数文字列変換 hsn(4) = binstr ;種類別数字まとめ→"0101010101010" 2進数文字列 ;役判定 ;1000ファイブカード:同じ数のカード4枚とジョーカー ;700フォーカード:同じ数のカードが4枚、残りの1枚は何でも良い ;600フルハウス:同じ数のカードが3枚と別のカードで同じ数のカード2枚 ;300スリーカード:同じ数のカードが3枚、ほかの2枚は何でも良い ;200ツーペア:同じ数が2枚の組が2組、残りの1枚は何でも良い ;100ワンペア:同じ数が2枚の組が1組、残りの3枚は何でも良い yaku = 0 ;役の返却値 repeat 15 if yaku / 100 = 3 & hcnt(cnt) = 2 : yaku += 300 : break ;フルハウス(スリー+ワン) if yaku / 100 = 1 & hcnt(cnt) = 3 : yaku = 600 + cnt : break ;フルハウス(ワン+スリー) if yaku / 100 = 1 & hcnt(cnt) = 2 : yaku = 200 + cnt ;ツーペア(ワン+ワン) if yaku = 0 & hcnt(cnt) = 2 : yaku = 100 + cnt ;ワンペア if yaku = 0 & hcnt(cnt) = 3 : yaku = 300 + cnt ;スリーカード if yaku = 0 & hcnt(cnt) = 4 : yaku = 700 + cnt ;フォーカード loop if yaku / 100 = 7 & hnum(4) = 1 : yaku += 300 ;ファイブカード(フォー+Joker) if yaku / 100 = 3 & hnum(4) = 1 : yaku += 400 ;フォーカード(スリー+Joker) if yaku / 100 = 2 & hnum(4) = 1 : yaku += 400 ;フルハウス(ツー+Joker) if yaku / 100 = 1 & hnum(4) = 1 : yaku += 200 ;スリーカード(ワン+Joker) if yaku ! 0 : return ;900ロイヤルストレートフラッシュ:5枚とも同じ種類で、10, J, Q, K, Aの連番"0111110000000000" ;800ストレートフラッシュ:5枚とも同じ種類で、5枚連番 ;500フラッシュ:5枚とも同じ種類 repeat 4 ;4種類 ;ロイヤルストレートフラッシュ if hnum(cnt) = 31744 { ;31744 = "0111110000000000" yaku = 900 + 4 - cnt break } ;joker & KQJ10 | AQJ10 | AKJ10 | AKQ10 | AKQJ if hnum(4) = 1 & (hnum(cnt) = 15360 | hnum(cnt) = 23552 | hnum(cnt) = 27648 | hnum(cnt) = 29696 | hnum(cnt) = 30720) { yaku = 900 + 4 - cnt break } ;ストレートフラッシュ if instr(hsn(cnt), 0, "11111") ! -1 { yaku = 800 + 4 - cnt break } ;joker & ストレートフラッシュ if hnum(4) = 1 & (instr(hsn(cnt), 0, "1111") ! -1 | instr(hsn(cnt), 0, "10111") ! -1 | instr(hsn(cnt), 0, "11011") ! -1 | instr(hsn(cnt), 0, "11101") ! -1) { yaku = 800 + 4 - cnt break } ;フラッシュ if hnn(cnt) = 5 | (hnum(4) = 1 & hnn(cnt) = 4) { yaku = 500 + 4 - cnt break } loop if yaku ! 0 : return ;400ストレート:種類はバラバラで、5枚連番 if instr(hsn(4), 0, "11111") ! -1 { yaku = 400 + 15 - instr(hsn(4), 0, "1") } ;joker & ストレート if hnum(4) = 1 & (instr(hsn(4), 0, "1111") ! -1 | instr(hsn(4), 0, "10111") ! -1 | instr(hsn(4), 0, "11011") ! -1 | instr(hsn(4), 0, "11101") ! -1) { yaku = 400 + 15 - instr(hsn(4), 0, "1") } if yaku ! 0 : return ;0ノーペア:役なし ;100ワンペア:+Joker repeat 4 pr = instr(hsn(cnt), 0, "1") if pr ! -1 : yaku = cnt * 20 + pr : break loop yaku = 80 - yaku ;joker & ノーペア if hnum(4) = 1 : yaku = 100 + 15 - instr(hsn(4), 0, "1") ;ワンペア return ;10進数データを16桁の2進数文字列に変換及び1のビット数カウント ----- ; bindata : 元データ(10進数) ; binstr : 変換データ(2進数) ; binnum : 1のビット数 *bin2str binstr = "" ;2進数文字列に変換 repeat br = bindata \ 2 bindata = bindata / 2 if br = 1 : binstr = "1" + binstr : else : binstr = "0" + binstr if bindata = 0 : break loop ;16けたの2進数に変換 binstr = "0000000000000000" + binstr binstr = strmid(binstr, -1, 16) ;文字1の個数カウント binnum = 0 repeat 16 if strmid(binstr, cnt, 1) = "1" : binnum++ loop return ;ゲーム領域表示 ----- *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 ゴシック", 10 foreach chg pos ptx(cnt) + 10, pty(cnt) - 15 if chg(cnt) = 1 : color 0, 0, 0 : else : color 100, 100, 100 mes "交換" 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 << 省略 >> ;カードシャッフル ----- *shuffle << 省略 >>
課題 (poker65.hsp)
親のカード処理、勝敗判定の処理を追加して、ゲームを完成する。
;poker65.hsp #module #defcfunc pow int dd, int kk ; ;pow(整数値, 乗数) ; 返却値=int べき乗の値 ; ans = 1 repeat kk ans = ans * dd loop return ans #global ;初期設定 ----- ;配列宣言 dim card, 53 ;カードの山用 dim ptx, 11 : dim pty, 11 ;カード置き場所座標 dim crd, 10 ;配布カードの通番格納用 dim chg, 10 ;交換用フラグ dim hnum, 5 : dim hcnt, 15 ;役判定用(数字と種類) sdim hsn, 5 : dim hnn, 5 ;役判定用(数字(2進数)と種類別枚数) ;乱数、ウィンドウ等設定 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 ;配布カード初期化 chg(cnt) = -1 ;交換用フラグ初期化 loop gosub *shuffle ;カードシャッフル gosub *gf_disp ;画面表示 cnum = 0 ;取り出すカード番号(インデックス) ;カード5枚ずつ配布 ----- repeat 10 ;プレイヤー(0-4)と親(5-9)に配布 nn = cnt ;カード移動アニメーション用 gosub *card_move ;カード移動アニメーション crd(cnt) = card(cnum) ;配布 cnum++ ;インデックス加算 gosub *gf_disp ;ゲーム領域表示 loop ;賭点入力 ----- color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 font "MS Pゴシック", 16 : color 255, 255, 255 pos 5, 255 : mes "賭点を入力して下さい。" ;メッセージ表示 color 128, 128, 128 boxf 180, 255, 215, 274 ;クリックする場所に四角形描画 boxf 220, 255, 255, 274 boxf 260, 255, 305, 274 font "MS Pゴシック", 16, 1 : color 0, 0, 0 pos 185, 257 : mes "+10" ;得点表示 pos 225, 257 : mes "-10" pos 265, 257 : mes "決定" ;賭点決定待ち repeat stick kk if kk = 256 & mousey >= 255 & mousey <= 274 { ;左クリック if mousex >= 180 & mousex <= 215 : kake += 10 ;賭点加算 if mousex >= 220 & mousex <= 255 : kake -= 10 ;賭点減算 if mousex >= 260 & mousex <= 305 & kake ! 0 : break ;賭点決定 kake = limit(kake, 0, tokuten) ;賭点の制限 gosub *gf_disp ;ゲーム領域表示 } await 100 loop ;交換カード入力 ----- color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 font "MS Pゴシック", 16 : color 255, 255, 255 pos 5, 255 : mes "交換するカードをクリックして下さい。" color 128, 128, 128 boxf 260, 255, 305, 274 font "MS Pゴシック", 16, 1 : color 0, 0, 0 pos 265, 257 : mes "決定" ;交換カード決定待ち repeat stick kk if kk = 256 & mousey >= pty(0) & mousey <= pty(0) + 55 { ;カードクリック repeat 5 if mousex >= ptx(cnt) & mousex <= ptx(cnt) + 40 { chg(cnt) = -chg(cnt) gosub *gf_disp ;ゲーム領域表示 } loop } if kk = 256 & mousex >= 260 & mousex <= 305 & mousey >= 255 & mousey <= 274 : break ;[決定] await 100 loop ;カード交換 color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 repeat 5 ;cnt=0,1,2,3,4 if chg(cnt) = 1 { crd(cnt) = -1 ;交換カードを消去 gosub *gf_disp ;ゲーム領域表示 nn = cnt ;移動先設定 gosub *card_move ;カード移動アニメーション crd(cnt) = card(cnum) ;交換カードを配布 cnum++ ;インデックス加算 gosub *gf_disp ;ゲーム領域表示 } loop ;親のカード処理 ----- 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 ;勝敗判定 ----- ;親カード(裏)描画 repeat 5, 5 if crd(cnt) ! -1 { pos ptx(cnt), pty(cnt) 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 ;賭点クリア ;ゲーム再開確認 ----- if tokuten = 0 { dialog "ゲーム・オーバーです。もう一度しますか。", 2, "ポーカー・ゲーム" if stat = 6 :tokuten = 200 : goto *restart if stat = 7 : end } goto *restart end ;------------------------ ;----- サブルーチン ----- ;親の交換カード判定 ----- *oya_hantei oya = 1 : gosub *poker_hantei ;役判定処理 ;1000ファイブカード : 交換なし ;900ロイヤルストレートフラッシュ : 交換なし ;800ストレートフラッシュ : 交換なし ;600フルハウス : 交換なし ;500フラッシュ : 交換なし ;400ストレート : 交換なし if yaku >= 800 | (yaku >= 400 & yaku <= 699) : return ;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 } ;300スリーカード : 0 〜 2 枚交換 ;100ワンペア : 0 〜 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 ;役判定処理 ----- *poker_hantei ;役判定用配列初期化 repeat 5 hnum(cnt) = 0 hsn(cnt) = "" hnn(cnt) = 0 loop repeat 15 hcnt(cnt) = 0 loop ;カード解析、プレイヤーcrd(0)-(4)/親crd(5)-(9) repeat 5, oya * 5 syu = crd(cnt) / 13 suu = crd(cnt) \ 13 + 1 if syu = 4 { ;joker hnum(4) = 1 } else { if suu = 1 : suu = 14 ;10,J,Q,K,Aの並びのため hcnt(suu)++ ;数字別カウント hnum(syu) += pow(2, suu) ;種類別数字 } loop ;カード解析2、数字2進数文字列変換、種類別枚数等 hnumw = 0 repeat 4 hnumw |= hnum(cnt) ;種類別数字のまとめ bindata = hnum(cnt) gosub *bin2str ;2進数文字列変換 hsn(cnt) = binstr ;種類別数字→"0101010101010" 2進数文字列 hnn(cnt) = binnum ;種類別枚数 loop bindata = hnumw gosub *bin2str ;2進数文字列変換 hsn(4) = binstr ;種類別数字まとめ→"0101010101010" 2進数文字列 ;役判定 ;1000ファイブカード:同じ数のカード4枚とジョーカー ;700フォーカード:同じ数のカードが4枚、残りの1枚は何でも良い ;600フルハウス:同じ数のカードが3枚と別のカードで同じ数のカード2枚 ;300スリーカード:同じ数のカードが3枚、ほかの2枚は何でも良い ;200ツーペア:同じ数が2枚の組が2組、残りの1枚は何でも良い ;100ワンペア:同じ数が2枚の組が1組、残りの3枚は何でも良い yaku = 0 ;役の返却値 repeat 15 if yaku / 100 = 3 & hcnt(cnt) = 2 : yaku += 300 : break ;フルハウス(スリー+ワン) if yaku / 100 = 1 & hcnt(cnt) = 3 : yaku = 600 + cnt : break ;フルハウス(ワン+スリー) if yaku / 100 = 1 & hcnt(cnt) = 2 : yaku = 200 + cnt ;ツーペア(ワン+ワン) if yaku = 0 & hcnt(cnt) = 2 : yaku = 100 + cnt ;ワンペア if yaku = 0 & hcnt(cnt) = 3 : yaku = 300 + cnt ;スリーカード if yaku = 0 & hcnt(cnt) = 4 : yaku = 700 + cnt ;フォーカード loop if yaku / 100 = 7 & hnum(4) = 1 : yaku += 300 ;ファイブカード(フォー+Joker) if yaku / 100 = 3 & hnum(4) = 1 : yaku += 400 ;フォーカード(スリー+Joker) if yaku / 100 = 2 & hnum(4) = 1 : yaku += 400 ;フルハウス(ツー+Joker) if yaku / 100 = 1 & hnum(4) = 1 : yaku += 200 ;スリーカード(ワン+Joker) if yaku ! 0 : return ;900ロイヤルストレートフラッシュ:5枚とも同じ種類で、10, J, Q, K, Aの連番"0111110000000000" ;800ストレートフラッシュ:5枚とも同じ種類で、5枚連番 ;500フラッシュ:5枚とも同じ種類 repeat 4 ;4種類 ;ロイヤルストレートフラッシュ if hnum(cnt) = 31744 { ;31744 = "0111110000000000" yaku = 900 + 4 - cnt break } ;joker & KQJ10 | AQJ10 | AKJ10 | AKQ10 | AKQJ if hnum(4) = 1 & (hnum(cnt) = 15360 | hnum(cnt) = 23552 | hnum(cnt) = 27648 | hnum(cnt) = 29696 | hnum(cnt) = 30720) { yaku = 900 + 4 - cnt break } ;ストレートフラッシュ if instr(hsn(cnt), 0, "11111") ! -1 { yaku = 800 + 4 - cnt break } ;joker & ストレートフラッシュ if hnum(4) = 1 & (instr(hsn(cnt), 0, "1111") ! -1 | instr(hsn(cnt), 0, "10111") ! -1 | instr(hsn(cnt), 0, "11011") ! -1 | instr(hsn(cnt), 0, "11101") ! -1) { yaku = 800 + 4 - cnt break } ;フラッシュ if hnn(cnt) = 5 | (hnum(4) = 1 & hnn(cnt) = 4) { yaku = 500 + 4 - cnt break } loop if yaku ! 0 : return ;400ストレート:種類はバラバラで、5枚連番 if instr(hsn(4), 0, "11111") ! -1 { yaku = 400 + 15 - instr(hsn(4), 0, "1") } ;joker & ストレート if hnum(4) = 1 & (instr(hsn(4), 0, "1111") ! -1 | instr(hsn(4), 0, "10111") ! -1 | instr(hsn(4), 0, "11011") ! -1 | instr(hsn(4), 0, "11101") ! -1) { yaku = 400 + 15 - instr(hsn(4), 0, "1") } if yaku ! 0 : return ;0ノーペア:役なし ;100ワンペア:+Joker repeat 4 pr = instr(hsn(cnt), 0, "1") if pr ! -1 : yaku = cnt * 20 + pr : break loop yaku = 80 - yaku ;joker & ノーペア if hnum(4) = 1 : yaku = 100 + 15 - instr(hsn(4), 0, "1") ;ワンペア return ;10進数データを16桁の2進数文字列に変換及び1のビット数カウント ----- ; bindata : 元データ(10進数) ; binstr : 変換データ(2進数) ; binnum : 1のビット数 *bin2str binstr = "" ;2進数文字列に変換 repeat br = bindata \ 2 bindata = bindata / 2 if br = 1 : binstr = "1" + binstr : else : binstr = "0" + binstr if bindata = 0 : break loop ;16けたの2進数に変換 binstr = "0000000000000000" + binstr binstr = strmid(binstr, -1, 16) ;文字1の個数カウント binnum = 0 repeat 16 if strmid(binstr, cnt, 1) = "1" : binnum++ loop return ;ゲーム領域表示 ----- *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 } 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 ゴシック", 10 foreach chg pos ptx(cnt) + 10, pty(cnt) - 15 if chg(cnt) = 1 : color 0, 0, 0 : else : color 100, 100, 100 mes "交換" 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
課題 (poker66.hsp)
親の交換するカードを考える。また、賭点入力を右クリックで100点単位にする。
;poker66.hsp #module #defcfunc pow int dd, int kk ; ;pow(整数値, 乗数) ; 返却値=int べき乗の値 ; ans = 1 repeat kk ans = ans * dd loop return ans #global ;初期設定 ----- ;配列宣言 dim card, 53 ;カードの山用 dim ptx, 11 : dim pty, 11 ;カード置き場所座標 dim crd, 10 ;配布カードの通番格納用 dim chg, 10 ;交換用フラグ dim hnum, 5 : dim hcnt, 15 ;役判定用(数字と種類) sdim hsn, 5 : dim hnn, 5 ;役判定用(数字(2進数)と種類別枚数 ;乱数、ウィンドウ等設定 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 ;配布カード初期化 chg(cnt) = -1 ;交換用フラグ初期化 loop gosub *shuffle ;カードシャッフル gosub *gf_disp ;画面表示 cnum = 0 ;取り出すカード番号(インデックス);カード5枚ずつ配布 ----- repeat 10 ;プレイヤー(0-4)と親(5-9)に配布 nn = cnt ;カード移動アニメーション用 gosub *card_move ;カード移動アニメーション crd(cnt) = card(cnum) ;配布 cnum++ ;インデックス加算 gosub *gf_disp ;ゲーム領域表示 loop ;賭点入力 ----- color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 font "MS Pゴシック", 16 : color 255, 255, 255 pos 5, 255 : mes "賭点を入力して下さい。" ;メッセージ表示 color 128, 128, 128 boxf 180, 255, 215, 274 ;クリックする場所に四角形描画 boxf 220, 255, 255, 274 boxf 260, 255, 305, 274 font "MS Pゴシック", 16, 1 : color 0, 0, 0 pos 185, 257 : mes "+10" ;得点表示 pos 225, 257 : mes "-10" pos 265, 257 : mes "決定" ;賭点決定待ち repeat stick kk if kk = 256 & mousey >= 255 & mousey <= 274 { ;左クリック if mousex >= 180 & mousex <= 215 : kake += 10 ;賭点加算 if mousex >= 220 & mousex <= 255 : kake -= 10 ;賭点減算 if mousex >= 260 & mousex <= 305 & kake ! 0 : break ;賭点決定 kake = limit(kake, 0, tokuten) ;賭点の制限 gosub *gf_disp ;ゲーム領域表示 } if kk = 512 & mousey >= 255 & mousey <= 274 { ;右クリック if mousex >= 180 & mousex <= 215 : kake += 100 if mousex >= 220 & mousex <= 255 : kake -= 100 kake = limit(kake, 0, tokuten) gosub *gf_disp ;ゲーム領域表示 } await 100 loop ;交換カード入力 ----- color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 font "MS Pゴシック", 16 : color 255, 255, 255 pos 5, 255 : mes "交換するカードをクリックして下さい。" color 128, 128, 128 boxf 260, 255, 305, 274 font "MS Pゴシック", 16, 1 : color 0, 0, 0 pos 265, 257 : mes "決定" ;交換カード決定待ち repeat stick kk if kk = 256 & mousey >= pty(0) & mousey <= pty(0) + 55 { ;カードクリック repeat 5 if mousex >= ptx(cnt) & mousex <= ptx(cnt) + 40 { chg(cnt) = -chg(cnt) gosub *gf_disp ;ゲーム領域表示 } loop } if kk = 256 & mousex >= 260 & mousex <= 305 & mousey >= 255 & mousey <= 274 : break ;[決定] await 100 loop ;カード交換 color 0, 100, 0 : boxf 0, 250 ;メッセージ領域消去 repeat 5 ;cnt=0,1,2,3,4 if chg(cnt) = 1 { crd(cnt) = -1 ;交換カードを消去 gosub *gf_disp ;ゲーム領域表示 nn = cnt ;移動先設定 gosub *card_move ;カード移動アニメーション crd(cnt) = card(cnum) ;交換カードを配布 cnum++ ;インデックス加算 gosub *gf_disp ;ゲーム領域表示 } loop ;親のカード処理 ----- 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 ;勝敗判定 ----- ;親カード(表)描画 repeat 5, 5 if crd(cnt) ! -1 { pos ptx(cnt), pty(cnt) gcopy 1, crd(cnt) \ 13 * 40, crd(cnt) / 13 * 55 } loop kmm = "" oya = 0 : gosub *poker_hantei ;役判定処理(プレイヤー) yaku1 = yaku gosub *yaku_mes kmm += "プレイヤー:" + yakumes ;ダイアログ表示用メッセージ oya = 1 : gosub *poker_hantei ;役判定処理(親) gosub *yaku_mes kmm += "親 :" + yakumes + "\n" ;ダイアログ表示用メッセージ if yaku1 > yaku { tokuten += kake dialog kmm + "プレイヤーの勝ちです。" } else { tokuten -= kake dialog kmm + "親の勝ちです。" } kake = 0 ;賭点クリア;ゲーム再開確認 ----- if tokuten = 0 { dialog "ゲーム・オーバーです。もう一度しますか。", 2, "ポーカー・ゲーム" if stat = 6 :tokuten = 200 : goto *restart if stat = 7 : end } goto *restart end ;------------------------ ;----- サブルーチン ----- ;役メッセージ ----- *yaku_mes yt = yaku / 100 ;役点数 ys = yaku - yt * 100 ;構成数字 yss = "" + ys if ys = 14 : yss = "A" if ys = 13 : yss = "K" if ys = 12 : yss = "Q" if ys = 11 : yss = "J" if yt = 10 : yakumes = yss + " の" + "ファイブカード" if yt = 7 : yakumes = yss + " の" + "フォーカード" if yt = 6 : yakumes = yss + " の" + "フルハウス" if yt = 4 : yakumes = yss + " の" + "ストレート" if yt = 3 : yakumes = yss + " の" + "スリーカード" if yt = 2 : yakumes = yss + " の" + "ツーペア" if yt = 1 : yakumes = yss + " の" + "ワンペア" if ys = 0 : yss = "スペード" if ys = 1 : yss = "ハート" if ys = 2 : yss = "ダイヤ" if ys = 3 : yss = "クローバー" if yt = 9 : yakumes = yss + " の" + "ロイヤルストレートフラッシュ" if yt = 8 : yakumes = yss + " の" + "ストレートフラッシュ" if yt = 5 : yakumes = yss + " の" + "フラッシュ" if yt = 0 : yakumes = "ノーペア " + yaku yakumes += "\n" return ;親の交換カード判定 ----- *oya_hantei oya = 1 : gosub *poker_hantei ;役判定処理 ;1000ファイブカード : 交換なし ;900ロイヤルストレートフラッシュ : 交換なし ;800ストレートフラッシュ : 交換なし ;600フルハウス : 交換なし ;500フラッシュ : 交換なし ;400ストレート : 交換なし if yaku >= 800 | (yaku >= 400 & yaku <= 699) : return ;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 } ;300スリーカード : 0 〜 2 枚交換 ;100ワンペア : 0 〜 3 枚交換 if yaku / 100 = 3 | yaku / 100 = 1 { 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 } ;0ノーペア : 0 〜 5 枚交換 ;-- フラッシュねらい chn = -1 repeat 4 if hnn(cnt) >= 3 { ;同種3枚 or 4枚 chn = cnt repeat 5, 5 if crd(cnt) / 13 = chn : chg(cnt) = 1 loop break } loop if chn ! -1 : return ;-- ストレートねらい ; 連番4枚 if instr(hsn(4), 0, "1111") ! -1 | instr(hsn(4), 0, "10111") ! -1 | instr(hsn(4), 0, "11011") ! -1 | instr(hsn(4), 0, "11101") ! -1 { chn = 15 - instr(hsn(4), 0, "1") ;連番の先頭数字 if chn = 14 { repeat 5, 5 if crd(cnt) \ 13 + 1 < 10 & crd(cnt) \ 13 + 1 > 1 : chg(cnt) = 1 loop } else { repeat 5, 5 if crd(cnt) \ 13 + 1 > chn | crd(cnt) \ 13 + 1 < chn - 4 : chg(cnt) = 1 loop } return } ; 連番3枚 if instr(hsn(4), 0, "111") ! -1 | instr(hsn(4), 0, "1011") ! -1 | instr(hsn(4), 0, "1101") ! -1 { chn = 15 - instr(hsn(4), 0, "1") ;連番の先頭数字 if chn = 14 { repeat 5, 5 if crd(cnt) \ 13 + 1 < 11 & crd(cnt) \ 13 + 1 > 1 : chg(cnt) = 1 loop } else { repeat 5, 5 if crd(cnt) \ 13 + 1 > chn | crd(cnt) \ 13 + 1 < chn - 3 : chg(cnt) = 1 loop } return } ;-- 一番強いカードを1枚残す ;スペードとハート repeat 2 chn = 15 - instr(hsn(0), 0, "1") ;連番の先頭数字 if chn ! -1 { if chn = 14 : chn = 1 ;Aの変換 repeat 5, 5 if crd(cnt) \ 13 + 1 ! chn & crd(cnt) / 13 ! cnt & rnd(100) \ 2 = 1 : chg(cnt) = 1 loop break } loop if chn ! -1 : return ;その他 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 ;役判定処理 ----- *poker_hantei ;役判定用配列初期化 repeat 5 hnum(cnt) = 0 hsn(cnt) = "" hnn(cnt) = 0 loop repeat 15 hcnt(cnt) = 0 loop ;カード解析、プレイヤーcrd(0)-(4)/親crd(5)-(9) repeat 5, oya * 5 syu = crd(cnt) / 13 suu = crd(cnt) \ 13 + 1 if syu = 4 { ;joker hnum(4) = 1 } else { if suu = 1 : suu = 14 ;10,J,Q,K,Aの並びのため hcnt(suu)++ ;数字別カウント hnum(syu) += pow(2, suu) ;種類別数字 } loop ;カード解析2、数字2進数文字列変換、種類別枚数等 hnumw = 0 repeat 4 hnumw |= hnum(cnt) ;種類別数字のまとめ bindata = hnum(cnt) gosub *bin2str ;2進数文字列変換 hsn(cnt) = binstr ;種類別数字→"0101010101010" 2進数文字列 hnn(cnt) = binnum ;種類別枚数 loop bindata = hnumw gosub *bin2str ;2進数文字列変換 hsn(4) = binstr ;種類別数字まとめ→"0101010101010" 2進数文字列;役判定 ;1000ファイブカード:同じ数のカード4枚とジョーカー ;700フォーカード:同じ数のカードが4枚、残りの1枚は何でも良い ;600フルハウス:同じ数のカードが3枚と別のカードで同じ数のカード2枚 ;300スリーカード:同じ数のカードが3枚、ほかの2枚は何でも良い ;200ツーペア:同じ数が2枚の組が2組、残りの1枚は何でも良い ;100ワンペア:同じ数が2枚の組が1組、残りの3枚は何でも良い yaku = 0 ;役の返却値 repeat 15 if yaku / 100 = 3 & hcnt(cnt) = 2 : yaku += 300 : break ;フルハウス(スリー+ワン) if yaku / 100 = 1 & hcnt(cnt) = 3 : yaku = 600 + cnt : break ;フルハウス(ワン+スリー) if yaku / 100 = 1 & hcnt(cnt) = 2 : yaku = 200 + cnt ;ツーペア(ワン+ワン) if yaku = 0 & hcnt(cnt) = 2 : yaku = 100 + cnt ;ワンペア if yaku = 0 & hcnt(cnt) = 3 : yaku = 300 + cnt ;スリーカード if yaku = 0 & hcnt(cnt) = 4 : yaku = 700 + cnt ;フォーカード loop if yaku / 100 = 7 & hnum(4) = 1 : yaku += 300 ;ファイブカード(フォー+Joker) if yaku / 100 = 3 & hnum(4) = 1 : yaku += 400 ;フォーカード(スリー+Joker) if yaku / 100 = 2 & hnum(4) = 1 : yaku += 400 ;フルハウス(ツー+Joker) if yaku / 100 = 1 & hnum(4) = 1 : yaku += 200 ;スリーカード(ワン+Joker) if yaku ! 0 : return ;900ロイヤルストレートフラッシュ:5枚とも同じ種類で、10, J, Q, K, Aの連番"0111110000000000" ;800ストレートフラッシュ:5枚とも同じ種類で、5枚連番 ;500フラッシュ:5枚とも同じ種類 repeat 4 ;4種類;ロイヤルストレートフラッシュ if hnum(cnt) = 31744 { ;31744 = "0111110000000000" yaku = 900 + 4 - cnt break } ;joker & KQJ10 | AQJ10 | AKJ10 | AKQ10 | AKQJ if hnum(4) = 1 & (hnum(cnt) = 15360 | hnum(cnt) = 23552 | hnum(cnt) = 27648 | hnum(cnt) = 29696 | hnum(cnt) = 30720) { yaku = 900 + 4 - cnt break } ;ストレートフラッシュ if instr(hsn(cnt), 0, "11111") ! -1 { yaku = 800 + 4 - cnt break } ;joker & ストレートフラッシュ if hnum(4) = 1 & (instr(hsn(cnt), 0, "1111") ! -1 | instr(hsn(cnt), 0, "10111") ! -1 | instr(hsn(cnt), 0, "11011") ! -1 | instr(hsn(cnt), 0, "11101") ! -1) { yaku = 800 + 4 - cnt break } ;フラッシュ if hnn(cnt) = 5 | (hnum(4) = 1 & hnn(cnt) = 4) { yaku = 500 + 4 - cnt break } loop if yaku ! 0 : return ;400ストレート:種類はバラバラで、5枚連番 if instr(hsn(4), 0, "11111") ! -1 { yaku = 400 + 15 - instr(hsn(4), 0, "1") } ;joker & ストレート if hnum(4) = 1 & (instr(hsn(4), 0, "1111") ! -1 | instr(hsn(4), 0, "10111") ! -1 | instr(hsn(4), 0, "11011") ! -1 | instr(hsn(4), 0, "11101") ! -1) { yaku = 400 + 15 - instr(hsn(4), 0, "1") } if yaku ! 0 : return ;0ノーペア:役なし ;100ワンペア:+Joker repeat 4 pr = instr(hsn(cnt), 0, "1") if pr ! -1 : yaku = cnt * 20 + pr : break loop yaku = 80 - yaku ;joker & ノーペア if hnum(4) = 1 : yaku = 100 + 15 - instr(hsn(4), 0, "1") ;ワンペア return ;10進数データを16桁の2進数文字列に変換及び1のビット数カウント ----- ; bindata : 元データ(10進数) ; binstr : 変換データ(2進数) ; binnum : 1のビット数 *bin2str binstr = "" ;2進数文字列に変換 repeat br = bindata \ 2 bindata = bindata / 2 if br = 1 : binstr = "1" + binstr : else : binstr = "0" + binstr if bindata = 0 : break loop ;16けたの2進数に変換 binstr = "0000000000000000" + binstr binstr = strmid(binstr, -1, 16) ;文字1の個数カウント binnum = 0 repeat 16 if strmid(binstr, cnt, 1) = "1" : binnum++ loop return ;ゲーム領域表示 ----- *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 ゴシック", 10 foreach chg pos ptx(cnt) + 10, pty(cnt) - 15 if chg(cnt) = 1 : color 0, 0, 0 : else : color 100, 100, 100 mes "交換" 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
プログラミング例 | |
2007 © Hiroshi Masuda |