enchant.js マインスイーパ コード解説②

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をあとで入れる用 ブログランキング・にほんブログ村へにほんブログ村

開発ログ一覧

エロゲーム一覧