function createMineSweeperScene(core, resumeScenario) {
const scene = new Scene();//新しい空の画面を用意してる
scene.backgroundColor = “black”;
const GRID_SIZE = 26;
const ROWS = 10;
const COLS = 10;
const BOMBS = 10;
const BOARD_OFFSET_Y = 60;
const cells = [];
let isGameEnd = false;
let isFirstOpen = true; // 初回クリック用フラグ
let openedCount = 0; // 開いたセルのカウント
// 操作説明
const instruction = new Label(“左クリック: パネルオープン
左長押し: 旗を置く/解除”);
instruction.font = “14px monospace”;
instruction.color = “yellow”;
instruction.x = 10;
instruction.y = 10;
scene.addChild(instruction);
// 爆弾カウンター
const bombCountLabel = new Label(“残り爆弾数: ” + BOMBS);
bombCountLabel.font = “16px monospace”;
bombCountLabel.color = “white”;
bombCountLabel.x = 200;
bombCountLabel.y = 35;
scene.addChild(bombCountLabel);
// sellにグリッドをいれていく
//26×26のグリッドを10×10つくりたい
for (let y = 0; y < ROWS; y++) {//行 上下 const ROWS = 10; 0~9までまわす
cells[y] = [];//二次元配列生成
for (let x = 0; x < COLS; x++) {//列 左右 const COLS = 10; 0~9までまわす
const cell = new Sprite(GRID_SIZE, GRID_SIZE);//一個のグリッドの大きさ26×26
cell.backgroundColor = "#cccccc";//灰色
//位置を決める
//左右に30ずつの余白を作りたい
cell.x = x * GRID_SIZE + (core.width - GRID_SIZE * COLS) / 2;
//x * GRID_SIZE 0 26 52 78・・0から26ずつ増えていく
//(core.width - GRID_SIZE * COLS) / 2;
//ゲーム画面サイズから 左右にグリッドを並べたときの長さを引く(余白)の半分
//(320 - 26 * 10) / 2; //答えは30
//余白の半分を足すことによって左右に30ずつ余白ができる→中央揃え
cell.y = y * GRID_SIZE + BOARD_OFFSET_Y;
//const BOARD_OFFSET_Y = 60;
//上に60の余白を持たせる
//初期的にまずこれで
cell.hasBomb = false; // 爆弾があるか、爆弾は初回クリック後に配置
cell.isOpened = false;// 開いたか
cell.isFlagged = false;// 旗が立ってるか
cell.flagLabel = null;// 表示用
cell.bombCount = 0;// 周囲の地雷数
//とりあえず灰色をペタペタ貼る
scene.addChild(cell);//セルを貼る
cells[y][x] = cell;//リファレンス渡してる
}
}
----------------------------------------------------------------------------------------
const scene = new Scene();//新しい空の画面を用意してる
再代入できない変数を作る
const を使う理由はだいたいこれ👇
間違って上書きしないため
コードが安全になる
scene = new Scene();別のシーンはいれられないが
scene.backgroundColor = "black";中身はいくらでも変えることはできる
なお const は{}の中で作れば{}ないのローカル変数になる
① 二重forで盤面を作ってる部分
cells[y][x] は「10段ある棚の、上からy番目、左からx番目の引き出し」
for (let y = 0; y < ROWS; y++) {
cells[y] = [];
for (let x = 0; x < COLS; x++) {
2次元配列で中にグリッドをいれていく
ROWS 行(上下)
COLS 列(左右)
cells[y][x] で座標を管理してる構造。
「2次元配列 = 画面のマスそのもの」になってる
② 座標計算(ここかなり重要)
cell.x = x * GRID_SIZE + (core.width - GRID_SIZE * COLS) / 2;
cell.y = y * GRID_SIZE + BOARD_OFFSET_Y;
横
x * GRID_SIZE
→ マスを横に並べる
(core.width - GRID_SIZE * COLS) / 2
→ 中央寄せ
👉 つまり全体として
「左から並べる + 全体を中央にずらす」
って構造になってる
③ セルに情報を持たせてる部分
cell.hasBomb
cell.isOpened
cell.isFlagged
cell.bombCount
「見た目(Sprite)にゲームデータを直接持たせてる」
メリット
管理がシンプル
別配列いらない
デメリット(将来的に)
ロジックと表示が混ざる
でも今の段階ならむしろこの方が分かりやすい
④ 気になるポイント(軽い指摘)
cell.flagLabel = null;
👉 旗を表示するLabelをあとで入れる用
にほんブログ村
。