minesweeper-for-web
Version:
Minesweeper as a WebComponent.
85 lines • 3.95 kB
JavaScript
"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