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

ブラックジャック

永谷 弘宣

永谷 弘宣

『ブラックジャック』は、点数が 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 : デッキのカード枚数が不足した場合、新しいデッキを用意

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

PLAY

Programmers played with this program.1 programmers

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