I'm trying to create a simple minesweeper game using css and js.
I managed to create the grid, place bombs, and count the number of bombs in the adjacent cells.
I'm having some issue at hiding the cell content till the player click on of them.
My initial idea was to use a pseudo-element, and after failing i tried to stack a div on top of each cell.
I failed twice, so here I am :)
Please try to give as less help as possible.
What I'm trying to achieve now, is to create a sort of mask on top of each cell.
I'll take care of removing it later.
Thanks!
In the Js, there's a comment where i create a children div and applied a .mask
on it.
In the css you can find the .mask
class
I'd like to make it by using a pseudo class.
function start(n) {
// place bombs
if(n > 30) { n = 30; }
var nodeList = document.getElementsByClassName("game-cell");
gameCells = Array.from(nodeList);
var totalCells = gameCells.length;
while(n > 0 ) {
var index = Math.floor(Math.random() * totalCells);
gameCells[index].classList.add('bomb');
gameCells.splice(index, 1)
totalCells--;
n--;
}
//place numbers
var cellsAbove = [-11, -10, -9];
var cellsBelow = [9, 10, 11];
var cellsOnLeft = [-11, -1, 9];
var cellsOnRight = [-9, 1, 11];
gameCells = Array.from(nodeList);
gameCells.forEach( (cell, idx, arr) => {
if(!cell.classList.contains('bomb')) {
var toIgnore = [];
if (idx<10) { toIgnore = toIgnore.concat(cellsAbove); }
if (idx>=90) { toIgnore = toIgnore.concat(cellsBelow); }
if (idx%10===0) { toIgnore = toIgnore.concat(cellsOnLeft); }
if (idx%10===9) { toIgnore = toIgnore.concat(cellsOnRight);}
var adjacentCells = [-11, -10, -9, -1, 1, 9, 10, 11]
.filter( c => toIgnore.indexOf(c) < 0)
.map( c => c+idx)
.map( c => arr[c]);
var bombNumber = adjacentCells.map( c => c.classList.contains('bomb') ? 1 : 0).reduce( (a,b) => a+b, 0);
if(bombNumber>0) gameCells[idx].innerText = bombNumber
}
});
//mask cells
gameCells.forEach( n => {
var mask = document.createElement("div");
mask.classList.add('mask')
n.appendChild(mask);
})
}
start(10);
html, body {
height: 100%;
margin: 0;
}
.game-container {
display: grid;
grid-template-rows: 15% repeat(10, 1fr);
grid-template-columns: repeat(10, 1fr);
row-gap: 0px;
column-gap: 0px;
width: 100%;
height: 100%;
align-items: center;
justify-items: center;
}
.game-header {
text-align: center;
grid-column: 1 /-1;
}
.game-cell {
background-color: lightgray;
box-shadow: inset 3px 3px 10px #000000;
-moz-box-shadow: inset 3px 3px 10px #000000;
-webkit-box-shadow: inset 3px 3px 10px #000000;
height: 100%;
width: 100%;
border: 1px solid black;
box-sizing: border-box;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
}
.game-cell:hover {
border-color: #4ca4a9;
}
.bomb {
background-color: lightpink;
}
.mask {
/* background-color: gray; */
position: absolute;
left: 0px;
top: 0px;
right: 0px;
bottom: 0px;
z-index: 2;
}
<div class="game-container">
<header class="game-header"> My Game </header>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
<div class="game-cell"></div>
</div>