I'm beginner coder and I would like to request for critique review of my minesweeper implementation. Game was made using bootstrap 3 and game board itself is a simple html DOM table. Game is complete and working but I feel it could be written in more simple and elegant manner. What in my code can be improved/written in different/better way? In game page you can choose size of board, then you have to click "start" to generate board and start the game. Ctrl + click on cell to flag it and prevent accidental click.
Main function responsible for revealing cells:
function reveal(ev){
var x = parseInt(this.getAttribute('x')),
y = parseInt(this.getAttribute('y'));
if(ev.ctrlKey == false){
if(cells[getFieldId(x,y)].markedByPlayer == false){
if(cells[getFieldId(x,y)].hasBomb == true){
document.getElementById(x+'x'+y).innerHTML = '*';
alert('Bomb! You have lost.');
gameState = 'loss';
revealMap();
}else if(cells[getFieldId(x,y)].neighbourNumber > 0 && cells[getFieldId(x,y)].hasBomb != true){
document.getElementById(x + 'x' +y).innerHTML = cells[getFieldId(x,y)].neighbourNumber;
cells[getFieldId(x,y)].hasBeenDiscovered = true;
pointColor(x,y,'midnightblue');
document.getElementById(x+'x'+y).style.color = 'silver';
revealFields(x,y);
}else{
revealFields(x,y);
}
if(checkVictoryCondition() == bombsNumber){
alert('You have won!');
revealMap();
}
}
}else if(ev.ctrlKey == true){
if(cells[getFieldId(x,y)].markedByPlayer == false){
document.getElementById(x+'x'+y).innerHTML = '!';
cells[getFieldId(x,y)].markedByPlayer = true;
document.getElementById(x+'x'+y).style.color = 'red';
}else if(cells[getFieldId(x,y)].markedByPlayer == true){
document.getElementById(x+'x'+y).innerHTML = '';
cells[getFieldId(x,y)].markedByPlayer = false;
}
}
}
function revealFields(x,y){
if(x<0 || y<0 || x>boardHeight - 1 || y>boardWidth - 1){
return;
}
if(cells[getFieldId(x,y)].neighbourNumber > 0){
document.getElementById(x+ 'x' +y).innerHTML = cells[getFieldId(x,y)].neighbourNumber;
cells[getFieldId(x,y)].hasBeenDiscovered = true;
pointColor(x,y,'midnightblue');
document.getElementById(x+ 'x' +y).removeEventListener('click', reveal, true);
}
if(cells[getFieldId(x,y)].hasBeenDiscovered == true){
return;
}
cells[getFieldId(x,y)].hasBeenDiscovered = true;
pointColor(x,y,'midnightblue');
document.getElementById(x+ 'x' +y).removeEventListener('click', reveal, true);
setTimeout(function(){revealFields(x-1,y);}, 200);
setTimeout(function(){revealFields(x+1,y);}, 200);
setTimeout(function(){revealFields(x,y-1);}, 200);
setTimeout(function(){revealFields(x,y+1);}, 200);
setTimeout(function(){revealFields(x-1,y-1);}, 200);
setTimeout(function(){revealFields(x-1,y+1);}, 200);
setTimeout(function(){revealFields(x+1,y-1);}, 200);
setTimeout(function(){revealFields(x+1,y+1);}, 200);
}
JS fiddle link: https://jsfiddle.net/pL1n8zwj/1/