私が以前にGPTと共に作りました enchant.jsのブラックジャックのコードについて記事にしようと思います。
# 関数一覧と役割まとめ(ブラックジャック)
このゲームでは、それぞれの関数に役割が分かれています。
まずは全体をざっくり把握します。
—
## ■ initializeGame
**ゲームを最初の状態に戻して、カードを配る**
## ■ drawCard
**カードを1枚引いて、画面に表示して、手札に追加する**
## ■ calculateHandValue
**手札の合計点数を計算する**
## ■ determineWinner
**プレイヤーとディーラーの勝敗を決める**
## ■ shuffleDeck
**カードをシャッフルする**
## ■ createLabel
**文字(ラベル)を作る**
## ■ createButton
**ボタンを作る**
## ■ disableButtons
**ボタンを押せなくする**
## ■ enableButtons
**ボタンを押せるようにする**
## ■ buttonActions(関数のかたまり)
**ボタンを押したときの動きをまとめている**
* それぞれの関数が「1つの役割」を持っている
* それを組み合わせてゲームが動いている
👉 こういう構造にすると
* 修正しやすい
* 追加しやすい
となっております
今日はinitializeGame を解説していきます
## まずこのゲームは何をしているのか?
このゲームは、やっていることはすごくシンプルです。
👉 3つだけです
* ゲームをはじめる
* カードを引く
* 点数を計算する
今回はその中の
👉「ゲームをはじめる」と「カードを引く」
を見ていきます。
—
# ① ゲームをはじめる(initializeGame)
この関数は
👉 **ゲームを最初の状態に戻すボタン**
みたいなものです。
// 初期化専用関数
function initializeGame(scene) {
console.log(“initializeGame”);
// ゲーム開始時にネクストゲームボタンを非表示にする
nextButton.opacity = 0;//ネクストゲームボタンを見えないようにする
nextButton.ontouchend = null;//タッチしたとき何も起きないようにする
## ① 前のカードを全部消す
// 既存のカードを削除
drawnCards.forEach(card => {//drawnCardsの中身をcardに入れて
scene.removeChild(card); // scene からカードを削除
});//drawnCardsの中身がある限り繰り返す
drawnCards = []; // 引いたカードのリストをリセット
これは何をしているかというと
👉 「前のゲームで出したカードを全部消す」
です。
—
💡イメージ
* テーブルの上にカードがいっぱいある
→ 全部どかす
—
deck(山札)がある場合 山札も削除します
// deck の削除(前回のデッキがシーンに追加されていた場合)
if (deck && deck.parentNode) {
scene.removeChild(deck); // もし deck がシーンに追加されているなら削除
}
## ② 手札を空にする
// プレイヤーとディーラーの手札リセット
playerHand = [];
dealerHand = [];
👉 これは
* プレイヤーの手札を空にする
* ディーラーの手札を空にする
—
💡つまり
* 手に持ってるカードを全部捨てる
—
## ③ 点数をリセット
// プレイヤーとディーラーの合計スコアをリセット
player_total = 0;
dealer_total = 0;
👉 点数を0に戻す
—
💡つまり
* ゲームのスコアをリセット
—
// ラベルのテキストを初期化
player_totalLabel.text = “P: 0”;
dealer_totalLabel.text = “D: 0”;
## ④ 新しいカードの山を作る
// deck(山札) をリセットし、シーンに再追加
deck = enchant.TCard.getDeck(); // 新しいデッキを取得
shuffleDeck(deck); // デッキをシャッフル
👉 これは
* 新しいトランプを用意する
* シャッフルする
—
💡イメージ
* トランプをぐちゃぐちゃに混ぜる
—
// deckArray 山札の配列を再設定
deckArray = Array.from(deck.childNodes); // deck.childNodes を配列化
// デッキをシーンに追加
deckArray.forEach(card => {//山札のを一枚ずつcardの変数にいれて
scene.addChild(card); // 各カードをシーンに追加
});
## ⑤ カードを配る
// ゲーム開始時にカードを配る
drawCard(10, 80, 0, true, dealerHand); // ディーラー1枚目 表
drawCard(50, 80, 0, false, dealerHand); // ディーラー2枚目 裏
👉 ここが大事
* ディーラーに2枚配る
* 1枚は表
* 1枚は裏
—
💡イメージ
* カジノの人がカードを配るあれ
—
dealer_total = calculateHandValue([dealerHand[0]]);
//console.log(“ディーラーの見えている合計:”, dealer_total);
// プレイヤーの手札
drawCard(10, 180, 0, true, playerHand); // プレイヤー1枚目 表
drawCard(50, 180, 0, true, playerHand); // プレイヤー2枚目 表
👉 プレイヤーには2枚とも表
—
💡まとめ
👉 initializeGameは
**「全部リセットして、最初のカードを配る」**
—
// プレイヤーのスコアを更新
player_total = calculateHandValue(playerHand);
player_totalLabel.text = “P: ” + player_total;
dealer_totalLabel.text = “D: ” + dealer_total;
}
👉 initializeGame
= ゲームを最初からやり直す
。