Enjoy programming more!
Kidspod is a post site which supports young programmers.
First step to join us.
Register as a member
For members

2018/05/18 16:22:46

MixJuice GET URL : kidspod.club/mj/486

ブラックジャック

『ブラックジャック』は、点数が 21 を超えないようにしつつ、
ディーラーより高い点数を目指すトランプゲームです。

【ルール】
それぞれのトランプカードは、以下の点数を持ちます。

2 ~ 10 : 数値通りの点数
J, Q, K : 10 点
A : 1 または 11 のうち、どちらか都合の良い点数

点数の合計が 21 になることを「ブラックジャック(Blackjack)」と呼びます。
点数の合計が 21 を超えることを「バスト(Bust)」と呼びます。

----

最初に、プレイヤーとディーラーにデッキから二枚のカードが配られます。
ディーラーに配られた最初の一枚カードは表向きで見ることができます。
しかしもう一枚のカードは裏向きで見ることはできません。

----

次に、プレイヤーは「ヒット(Hit)」または「スタンド(Stand)」を行います。

ヒットは、デッキからカードをもう一枚引く動作です。
もしヒットしてバストした場合、その時点でプレイヤーが負けます。
バストしない限り、何回でもヒットできます。

スタンドは、現在の点数でディーラーと勝負する動作です。

----

プレイヤーのスタンドが行われた後、
ディーラーの裏向きのカードが表向きにされ公開されます。
続いて、ディーラーは点数が 17 点以上になるまでヒットします。

ディーラーがバストとなれば、プレイヤーの勝ちとなります。
そうでなければ、点数の高いほうが勝ちとなります。
同点の場合は引き分けとなります。

----

ゲーム開始時のプレイヤーの所持金は $200 です。

プレイヤーは、各ゲームの最初に賭け金 $10 支払います。
プレイヤーが勝てば $25 獲得します。
引き分けの場合は賭け金 $10 が戻されます。

プレイヤーの所持金が無くなるとゲームオーバーです。

----

ゲームではシングルデッキ(普通の 52 枚のトランプカードの 1 組)を使用します。
つまり、ゲーム中に出たカードは新しいデッキが用意されるまで再度出ることはありません。
そのため、出たカードの情報を利用することで、より有利にゲームを進めることができます。
ゲームができなくなるまでデッキのカードが少なくなると、新しいデッキが用意されます。

【操作】
ENTER : スタンド
上記以外 : ヒット

【更新履歴】
2018/05/18 初版公開
2018/05/18 プレイヤーがバストした際の点数表示が正しくない問題を修正
2018/05/19 コード最適化

【ソースコード解説】
《変数》
K : Key, キー入力値
M : Money, プレイヤーの所持金
T : Target, カードを配る対象(0 : プレイヤー、 1 : ディーラー)
F : Face, 配られるカードの表裏(0 : 表、 1 : 裏)
D : Dealt, デッキから配られたカードの枚数
E : デッキから配られたカードの得点の合計
N : デッキの枚数から引かれる見せかけ上のカードの枚数( 0 または 1 )
B : Bust, プレイヤーがバストしたかどうか(0 : した、1 : していない)
X : カード描画の X 座標
Y : カード描画の Y 座標
V : Value, カードの点数
G : Game, プレイヤーとディーラーの得点の差( [68] - [69] )
W : Wait, ウェイト値
I, J, L : Iterator, ループ変数
U, Z : ヒット処理のための一時変数
H : 所持金計算のための一時変数
A, B, C : デッキをシャッフルするための一時変数
O, P, Q, R, S : 得点を計算するための一時変数

《配列》
[1] ~ [13] : カードの番号を表すキャラクタ
[14] 〜 [65] : デッキのカード(上位 14 bit : 数字、下位 2 bit : スート)
[66] : プレイヤーに配られたカードの状態(上位 13 bit : A 以外の得点の合計、下位 3 bit : A の枚数)
[67] : ディーラーに配られたカードの状態(上記と同様)
[68] : プレイヤーの得点
[69] : ディーラーの得点

《PCGパターン》
#758 〜 カード上端を表す文字列
#75D 〜 カード下端を表す文字列
#762 〜 カード両端を表す文字列

《コード》
1 : タイトル
2 : 初期化
3 : デッキのシャッフル
4 - 5 : ヒット処理
6 : ヒットしたカードの点数の加算
9 : ゲーム開始とゲームオーバー判定
10 : 最初のカードの配布
20 : プレイヤーのヒット/スタンド入力受付
30 : ディーラーのヒット
40 : 勝敗による所持金の変更
50 : デッキのカード枚数が不足した場合、新しいデッキを用意

【その他】
容量の都合で「ナチュラルブラックジャック」(最初にカードが配られた時点でブラックジャックになっていること)は処理されません。

  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

SOURCE CODE

1 'Blackjack
2 CLS:CLV:CLP:M=200:W=45:FORI=2TO9:[I]=48+I:NEXT:[1]=65:LET[10],#EA,74,81,75:GSB3:POKE#758,#98,#91,#91,#99,0,#9A,#91,#91,#9B,0,#92,32,32,#92,0:GOTO9
3 D=0:E=0:FORI=0TO3:FORJ=1TO13:[13+I*13+J]=J<<2+I:NEXT:NEXT:FORI=0TO300:A=14+RND(52):B=14+RND(52):C=[A]:[A]=[B]:[B]=C:NEXT:RTN
4 U=T-!T:Z=[D+14]:Y=11-9*U:LCX,Y:?STR$(#758+5*T):FORJ=0TO1:LCX,21*!T+J:?STR$(#762):NEXT:LCX+1,Y-U:IFFLC9,0:?CHR$(2,2,31,28,28,2,2)ELSE?CHR$([Z>>2]):LCX+1,Y-2*U:?CHR$(#E4+Z&3):GSB6
5 LC24,0:?"Deck:";52-D-N;" ":WAITW:RTN
6 V=[D+14]>>2:V=V*(V<10)+10*(V>9):O=T+66:[O]=[O]+V<<(3*(V!=1)):Q=[O]:R=Q&7:P=Q>>3:S=P<11&&R:[O+2]=P+S*11+R-S:D=D+1:E=E+V:IFBLC2,21*!T+1:?[68+T]:RTNELSERTN
9 CLS:LET[66],0,0:B=1:M=M-10:IFM<0ENDELSELC0,20:?"$";M
10 FORI=0TO3:T=I&1:F=I=3:N=F:X=I>>1*2+6:GSB4:NEXT:T=0:F=0:CLK
20 K=INKEY():IF!KGOTO20ELSEIFK=10:T=1:N=0:X=8ELSEX=X+2:GSB4:IF[68]>21B=0:GSB6:GOTO50ELSEGOTO20
30 GSB4:H=[69]:IFH>21M=M+25:GOTO50ELSEIFH<17:X=X+2:GOTO30
40 G=[68]-H:M=M+25*(G>0)+10*(G=0)
50 IFE>293GSB3:GOTO9ELSEWAITW*4:GOTO9

COMMENT

Kidspod運営チーム
Kidspod運営チーム2018/05/22 09:40:15

きちんとDeckがあったり、トランプのグラフィックを用意したり、まさに気分はカジノですね。もう1回もう1回と何度も遊んでいる内にお金と時間が……。