UNPKG

minesweeper-for-web

Version:
85 lines 3.95 kB
"use strict"; var _MinesweeperEngine_board; Object.defineProperty(exports, "__esModule", { value: true }); exports.MinesweeperEngine = void 0; const tslib_1 = require("tslib"); const types_1 = require("../types/index.js"); const MinesweeperBoard_1 = require("./MinesweeperBoard.js"); class MinesweeperEngine { constructor(onWinCallback = () => { }, onLoseCallback = () => { }) { _MinesweeperEngine_board.set(this, void 0); this.isGameOver = true; this.onWinCallback = onWinCallback; this.onLoseCallback = onLoseCallback; } get board() { return tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f"); } createBoard(columns = 9, rows = 9, bombs = 10) { this.gameModeConfiguration = { columns, rows, bombs, }; this.restart(); } restart() { tslib_1.__classPrivateFieldSet(this, _MinesweeperEngine_board, new MinesweeperBoard_1.MinesweeperBoard(this.gameModeConfiguration), "f"); this.isGameOver = false; } /** * @returns Delta of the amount of flags */ toggleFlag(selectedRow, selectedColumn) { if (tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").revealedFields[selectedRow][selectedColumn]) { return 0; } if (tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").flags[selectedRow][selectedColumn]) { // removing a flag is always possible tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").removeFlag(selectedRow, selectedColumn); return -1; } if (tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").flagCounter < tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").bombs) { // it should not be possible to place more flags than bombs tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").addFlag(selectedRow, selectedColumn); return 1; } return 0; } /** * @returns {number} Delta of the amount of question marks */ toggleQuestionMark(selectedRow, selectedColumn) { if (tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").revealedFields[selectedRow][selectedColumn]) { return 0; } if (tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").questionMarks[selectedRow][selectedColumn]) { tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").removeQuestionMark(selectedRow, selectedColumn); return -1; } tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").addQuestionMark(selectedRow, selectedColumn); return 1; } selectField(selectedRow, selectedColumn) { const field = tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").revealField(selectedRow, selectedColumn); if (field === types_1.FieldKey.BOMB) { tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").revealBombs(); this.onLoseCallback(); this.isGameOver = true; return field; } // flatten the 2d boolean array and count false values const unrevealedFieldsAmount = tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").revealedFields .flat() .filter((revealedField) => !revealedField).length; if (unrevealedFieldsAmount === tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").bombs) { tslib_1.__classPrivateFieldGet(this, _MinesweeperEngine_board, "f").revealBombs(true); this.onWinCallback(); this.isGameOver = true; } return field; } } exports.MinesweeperEngine = MinesweeperEngine; _MinesweeperEngine_board = new WeakMap(); //# sourceMappingURL=MinesweeperEngine.js.map