enchant.js ブラックジャックの作り方:initializeGame関数の役割を徹底解説

私が以前に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
= ゲームを最初からやり直す

ブログランキング・にほんブログ村へにほんブログ村

開発ログ一覧

エロゲーム一覧