minesweeper/src/components/Game.js
2024-05-05 16:54:22 +03:00

377 lines
11 KiB
JavaScript

/*eslint-disable*/
// const readline = require("readline");
// var fs = require("fs");
// module.exports = {
// resolve: {
// fallback: {
// fs: false,
// },
// },
// };
// const { start } = require("repl");
// const { log } = require("console");
// const rl = readline.createInterface({
// input: process.stdin,
// output: process.stdout,
// });
import minesweeperGrid from "./Board.vue";
class Cell {
constructor() {
this.isMine = false;
this.isRevealed = false;
this.isFlagged = 0;
this.nearbyMines = 0;
this.isHint = false;
}
}
class Board {
constructor(numberOfRows, numberOfCols, numberOfMines) {
this.numberOfRows = numberOfRows;
this.numberOfCols = numberOfCols;
this.numberOfMines = numberOfMines;
this.numberOfFlags = this.numberOfMines;
this.board = Array.from({ length: numberOfRows }, () =>
Array.from({ length: numberOfCols }, () => new Cell())
);
this.numberToWin =
this.numberOfRows * this.numberOfCols - this.numberOfMines;
// console.log(this.numberOfRows, "tt");
// console.log(this.numberOfCols, "tt");
// console.log(this.numberOfMines, "tt");
// console.log(this.numberOfFlags, "tt");
// console.log(this.numberToWin, "tt");
this.putMine(this.numberOfMines);
}
putMine(numberOfMines) {
for (let i = 0; i < numberOfMines; ) {
let row = Math.floor(Math.random() * this.numberOfRows);
let col = Math.floor(Math.random() * this.numberOfCols);
if (!this.board[row][col].isMine) {
this.board[row][col].isMine = true;
i++;
}
}
this.goAroundTheArray(this.numberOfRows, this.numberOfCols);
}
goAroundTheArray(boardSize_row, boardSize_col) {
for (let j = 0; j < boardSize_col; j++) {
for (let i = 0; i < boardSize_row; i++) {
this.makeNumberInBlock(i, j);
}
}
// console.log(this.board);
}
makeNumberInBlock(row, col) {
let theNumberOfMines = 0;
// console.log();
if (this.board[row][col].isMine === false) {
for (let dy = -1; dy <= 1; dy++) {
for (let dx = -1; dx <= 1; dx++) {
const newRow = row + dy;
const newCol = col + dx;
if (
newRow >= 0 &&
newRow < this.numberOfRows &&
newCol >= 0 &&
newCol < this.numberOfCols &&
this.board[newRow][newCol].isMine
) {
theNumberOfMines++;
}
}
}
this.board[row][col].nearbyMines = theNumberOfMines;
} else {
this.board[row][col].nearbyMines = "##";
}
}
}
export class EndGame extends Board {
savingFunction() {
rl.question("enter your name: \n", (answer) => {
let name = answer;
this.writeOnFile(name);
rl.close();
});
}
writeOnFile(name, board, rows, cols) {
console.log("Writing into a file");
let dataForGame = {
playerName: JSON.stringify(name),
item: JSON.stringify(board),
rows: JSON.stringify(rows),
cols: JSON.stringify(cols),
};
fs.readFile("games.json", "utf8", (err, data) => {
if (err) {
console.error(err);
data = '{"games": []}';
}
let allGames = JSON.parse(data);
allGames.games.push(dataForGame);
fs.writeFile(
"newGames.json",
JSON.stringify(allGames, null, 2),
(err) => {
if (err) {
return console.error(err);
}
console.log("Data written to file");
}
);
});
}
finishAndGameOver() {
for (let i = 0; i < this.numberOfRows; i++) {
let row = "";
for (let j = 0; j < this.numberOfCols; j++) {
if (this.board[i][j].isFlagged === 1) {
row += "F";
} else if (this.board[i][j].isMine) {
row += "M";
} else if (this.board[i][j].isRevealed) {
row += this.board[i][j].isMine ? "M" : this.board[i][j].nearbyMines;
} else {
row += "#";
}
row += " ";
}
console.log(row);
}
console.log("Game Over");
end = new Date().getTime();
time = Math.ceil((end - timeForStart) / 1000) + timeInFile;
// console.log("end", end);
// console.log("startTime", startTime);
// console.log("start", timeForStart);
// console.log("timeInFile", timeInFile);
// console.log("time", time);
console.log("the time you spend in this game is : " + time + " second");
}
}
export class Play extends EndGame {
replay() {
rl.question(
'do you want to play again (0 for no 1 for yes) ex"0": \n',
(answer) => {
const [playAgain] = answer.split(" ").map(Number);
if (playAgain === 0) {
rl.close();
} else if (playAgain === 1) {
startGame.makeSizeOfGame();
}
}
);
}
printBoard() {
for (let i = 0; i < this.numberOfRows; i++) {
let row = "";
for (let j = 0; j < this.numberOfCols; j++) {
if (this.board[i][j].isFlagged === 1) {
row += "F";
} else if (this.board[i][j].isRevealed) {
row += this.board[i][j].nearbyMines;
} else {
row += "#";
}
row += " ";
}
console.log(row);
}
// this.game();
}
game() {
rl.question(
'Enter row and col number and a bool flag(1 for true/0 for false) you want to open or write "save" for save this game ex "1 1 0": \n',
(answer) => {
if (answer === "exit") {
rl.close();
} else if (answer === "save") {
this.savingFunction();
} else {
const [row, col, isFlagged] = answer.split(" ").map(Number);
if (isFlagged === 0) {
if (this.board[row - 1][col - 1].isMine === true) {
this.finishAndGameOver();
this.replay();
} else {
// console.log(this.numberToWin);
if (this.numberToWin > 1) {
this.onClick(row - 1, col - 1);
this.printBoard();
this.game();
} else {
this.onClick(row - 1, col - 1);
this.printBoard();
end = new Date().getTime();
time = Math.ceil((end - timeForStart) / 1000) + timeInFile;
console.log(
"the time you spend in this game is : " + time + " second"
);
console.log("you win");
this.replay();
// rl.close();
}
}
} else if (isFlagged === 1) {
this.doFlagged(row - 1, col - 1);
this.printBoard();
this.game();
}
}
}
);
}
doFlagged(row, col) {
if (!this.board[row][col].isRevealed && this.numberOfFlags > 0) {
if (this.board[row][col].isFlagged === 0) {
this.numberOfFlags -= 1;
this.board[row][col].isFlagged = 1;
} else if (this.board[row][col].isFlagged === 1) {
this.numberOfFlags += 1;
this.board[row][col].isFlagged = 0;
}
} else {
console.log("i cannot put the flag");
}
}
onClick(row, col) {
this.board = JSON.parse(localStorage.getItem("minesweeperGrid"));
this.numberToWin = JSON.parse(localStorage.getItem("numberToWin"));
let queue = [[row, col]];
while (queue.length > 0) {
let [row, col] = queue.shift();
if (
row >= 0 &&
col >= 0 &&
row < this.board.board.board.length &&
col < this.board.board.board[0].length &&
this.board.board.board[row][col].isRevealed === false
) {
this.board.board.board[row][col].isRevealed = true;
this.numberToWin = this.numberToWin - 1;
// console.log(this.numberToWin, "this is number to win");
localStorage.setItem("numberToWin", JSON.stringify(this.numberToWin));
// console.log(this.board.board.board[row][col].nearbyMines, "hello");
if (this.board.board.board[row][col].nearbyMines === 0) {
for (let j = col - 1; j <= col + 1; j++) {
for (let i = row - 1; i <= row + 1; i++) {
if (
i >= 0 &&
j >= 0 &&
i < this.board.board.board.length &&
j < this.board.board.board[0].length &&
this.board.board.board[i][j].isRevealed === false
) {
queue.push([i, j]);
}
}
}
}
}
}
localStorage.setItem("minesweeperGrid", JSON.stringify(this.board));
}
}
export class Minesweeper {
constructor(numberOfRows, numberOfCols, numberOfMines) {
this.board = new Board(numberOfRows, numberOfCols, numberOfMines);
this.board.putMine();
this.board.goAroundTheArray(numberOfRows, numberOfCols);
this.play = new Play(numberOfRows, numberOfCols);
this.timeInFile = 0;
}
start() {
startTime = new Date().getTime();
timeForStart = startTime;
this.play.printBoard();
this.play.game();
}
}
// class StartGame {
// startTabel() {
// rl.question("1) start game \n2) load game \n", (answer) => {
// if (answer === "1") {
// this.makeSizeOfGame();
// } else if (answer === "2") {
// this.loadGame();
// } else {
// console.log("enter the correct number");
// startTabel();
// }
// });
// }
// async loadGame() {
// try {
// const answer = await new Promise((resolve) => {
// rl.question("Enter your name to get your game:\n", (input) => {
// resolve(input);
// });
// });
// let oldName = answer;
// this.readFromFile(oldName);
// } catch (error) {
// console.error("Error:", error.message);
// }
// }
// async readFromFile(oldName) {
// try {
// let data = await fs.promises.readFile("games.json", "utf8");
// let parsedData = JSON.parse(data);
// let oldGame = parsedData.games.find(
// (oldGame) => JSON.parse(oldGame.playerName) === oldName
// );
// if (!oldGame) {
// console.error("No game found for player:", oldName);
// rl.close();
// return;
// }
// let name = JSON.parse(oldGame.playerName);
// console.log("hello " + name + " this is your game");
// this.numberOfRows = JSON.parse(oldGame.rows);
// this.numberOfCols = JSON.parse(oldGame.cols);
// const game = new Minesweeper(this.numberOfRows, this.numberOfCols);
// this.board = JSON.parse(oldGame.item);
// timeInFile = JSON.parse(oldGame.timeInGame);
// this.play = new Play(this.numberOfRows, this.numberOfCols);
// startTime = new Date().getTime();
// timeForStart = startTime;
// this.play.printBoard();
// this.play.game();
// } catch (err) {
// console.error(err);
// }
// }
// makeSizeOfGame() {
// rl.question(
// 'Enter row and col and number you want to play ex "1 1 ": ',
// (answer) => {
// const [row, col] = answer.split(" ").map(Number);
// if (row > 1 && col > 1 && row < 15 && col < 15) {
// const game = new Minesweeper(row, col);
// game.start();
// } else {
// console.log("the board is not in the rang from 2 to 15");
// this.makeSizeOfGame();
// }
// }
// );
// }
// }
let time = 0,
timeInFile = 0;
var startTime = 0;
let timeForStart = 0;
let end = 0;
// const startGame = new StartGame();
// startGame.startTabel();