Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*  Vous pouvez utiliser la page [[Utilisateur:Delhovlyn/Démineur]], ou bien créer votre [[Utilisateur:Vous-même/Démineur]], auquel cas vous y mettrez le code « <div id="emplacementDemineur"></div> ». Enjoy! */


if(mw.config.get('wgPageName') == 'Utilisateur:Delhovlyn/Démineur' || mw.config.get('wgPageName') == 'Utilisateur:' + mw.config.get('wgUserName') + '/Démineur'){
  addOnloadHook(function()
  {
  importStylesheet('Utilisateur:Delhovlyn/démineur.css');
  if (document.getElementById('emplacementDemineur'))
    document.getElementById('emplacementDemineur').innerHTML = '<ul id="menu"><li><a href="javascript:;" onclick="largeur = 9; hauteur = 9; nbMines = 10; afficherGrille();">Débutant</a></li>&ndash;<li><a href="javascript:;" onclick="largeur = 16; hauteur = 16; nbMines = 40; afficherGrille();">Intermédiaire</a></li>&ndash;<li><a href="javascript:;" onclick="largeur = 30; hauteur = 16; nbMines = 99; afficherGrille();">Expert</a></li>&ndash;<li><a href="javascript:;" onclick="input();">Personnalisé</a></li>&#x2022;&#x2022;&#x2022;<li><a href="javascript:;" onclick="afficherGrille();" title="Recommencer la partie" accesskey="r">Recommencer</a></li></ul><div id="conteneur"><div id="empGrille" align="center"></div><div id="compteurs">Mines restantes : <span id="compteurMines"></span><br />Temps : <span id="chronomètre"></span></div></div>';
  else
    return;

  /////////// Démarrage ////////////
  largeur = 9; hauteur = 9; nbMines = 10; afficherGrille();
  document.getElementById('empGrille').oncontextmenu = function() { return false; };
  });
  }



var x,y,i;
var tableau = new Array();
var largeur = 0;
var hauteur = 0;
var nbMines = 0;

var grilleCreee = false;
var fini = false;

var tChrono;
var temps = -1;
var minesRest = 0;

var nbNonDecouverts = 0;

function input() {
	largeur = parseInt(window.prompt('Largeur ?',(largeur ? largeur : 10)));
	if(!largeur) return;
	hauteur = parseInt(window.prompt('Hauteur ?',(hauteur ? hauteur : largeur)));
	if(!hauteur) return;
	nbMines = parseInt(window.prompt('Nombre de mines ?',(nbMines ? nbMines : 15)));
	if(!nbMines) return;
	afficherGrille(largeur, hauteur);
}

function afficherGrille() {
	// Réinitialisation
	if (grilleCreee) {
		document.getElementById('empGrille').innerHTML = "";
		tableau = [];

		grilleCreee = false;
		fini = false;

		clearTimeout(tChrono);
		temps = -1;
		minesRest = 0;

		nbNonDecouverts = 0;
		document.getElementById('chronomètre').innerHTML = "";
		document.getElementById('compteurMines').innerHTML = "";
	}
	
	var txtLigne = "";
	var txtGrille = "";
	for (y=0; y<hauteur; y++) {
		txtLigne = "";
		for (x=0; x<largeur; x++) {
			txtLigne += ('<td onmouseup="gererClic(' + y + ',' + x + ',event);"><span style="visibility: hidden;">&nbsp;</span>');
		}
		txtGrille += "<tr>" + txtLigne + "</tr>";
	}
	txtGrille = '<table style="border-spacing:0px; table-layout:fixed;" id="Grille">' + txtGrille + '</table>';
	document.getElementById('empGrille').innerHTML = txtGrille;
}

function creerGrille2(clicX, clicY) {
	for (y=0; y<hauteur; y++) {
		tableau[y] = new Array();
		for (x=0; x<largeur; x++) {
			tableau[y].push({mine:false, drapeau:false, decouvert:false, valeur:0});
		}
	}
	///////////////////////
	var posX;
	var posY;
	for (i=1; i<=nbMines; i++) {
		do {
			posX = Math.floor(Math.random()*largeur);
			posY = Math.floor(Math.random()*hauteur);
			var goodPlace;

			if(tableau[posY][posX].mine == false && (Math.abs(clicX-posX)>1 || Math.abs(clicY-posY)>1))
				{
				goodPlace = true;
				} else {
				goodPlace = false;
				}
			} while (!goodPlace)
		tableau[posY][posX].mine = true;
		
		// On incrémente toutes les cases autour (ou presque) :
		if(posY>=1 && posX>=1)
			tableau[posY-1][posX-1].valeur ++;
		if(posY>=1)
			tableau[posY-1][posX].valeur ++;
		if(posY>=1 && posX<=largeur-2)
			tableau[posY-1][posX+1].valeur ++;

		if(posX>=1)
			tableau[posY][posX-1].valeur ++;
		if(posX<=largeur-2)
			tableau[posY][posX+1].valeur ++;

		if(posY<= hauteur-2 && posX>=1)
			tableau[posY+1][posX-1].valeur ++;
		if(posY<= hauteur-2)
			tableau[posY+1][posX].valeur ++;
		if(posY<= hauteur-2 && posX<=largeur-2)
			tableau[posY+1][posX+1].valeur ++;

	}
	grilleCreee = true;
	minesRest = nbMines;
	document.getElementById('compteurMines').innerHTML = minesRest;
	nbNonDecouverts = largeur*hauteur;
	chrono();
}

function clicCase(clicY, clicX) {
	var case_ = document.getElementById('Grille').firstChild.childNodes[clicY].childNodes[clicX];
	
	if (!tableau[clicY][clicX].decouvert) {
		tableau[clicY][clicX].decouvert = true;
		if(tableau[clicY][clicX].mine)
			{
			case_.className = 'mines';
			case_.id = 'mine';

			// Montrer les autres mines :
			for (y=0; y<hauteur; y++) {
				for (x=0; x<largeur; x++) {
					if (tableau[y][x].mine && !tableau[y][x].drapeau) {
						case_ = document.getElementById('Grille').firstChild.childNodes[y].childNodes[x];
						case_.className = 'mines';
					}
					if (!tableau[y][x].mine && tableau[y][x].drapeau) {
						document.getElementById('Grille').firstChild.childNodes[y].childNodes[x].innerHTML = '<span class="v3">X</span>';
					}
				}
			}
			
			finir(false);
			}
		else
			{
			nbNonDecouverts--;
			case_.className = 'decouvert';
			if(tableau[clicY][clicX].valeur != 0) {
				case_.innerHTML = tableau[clicY][clicX].valeur;
				case_.className += ' v' + tableau[clicY][clicX].valeur;
			} else {
				if(clicY>=1 && clicX>=1)
					clicCase(clicY-1,clicX-1);
				if(clicY>=1)
					clicCase(clicY-1,clicX);
				if(clicY>=1 && clicX<=largeur-2)
					clicCase(clicY-1,clicX+1);

				if(clicX>=1)
					clicCase(clicY,clicX-1);
				if(clicX<=largeur-2)
					clicCase(clicY,clicX+1);

				if(clicY<= hauteur-2 && clicX>=1)
					clicCase(clicY+1,clicX-1);
				if(clicY<= hauteur-2)
					clicCase(clicY+1,clicX);
				if(clicY<= hauteur-2 && clicX<=largeur-2)
					clicCase(clicY+1,clicX+1);
			}
		}
	}
	verifVictoire();
}

function gererClic(cY,cX,e) {
	if (!e) var e = window.event;
	
	if (!grilleCreee && e.button != 0) {
		return;
	} else if (!grilleCreee && e.button == 0) {
		creerGrille2(cX, cY);
		clicCase(cY, cX);
		return;
	}
	
	if (fini) {
		return;
	}

	if(!tableau[cY][cX].decouvert) {
		if (e.button == 0 && !tableau[cY][cX].drapeau) { // clic gauche, normal
			clicCase(cY, cX);
		} else if (e.button == 2) { // clic droit : drapeau
			document.getElementById('Grille').firstChild.childNodes[cY].childNodes[cX].className = tableau[cY][cX].drapeau ? '' : 'drapeau';
			tableau[cY][cX].drapeau = !tableau[cY][cX].drapeau;
			if (tableau[cY][cX].drapeau)
				minesRest--;
			else
				minesRest++;
			document.getElementById('compteurMines').innerHTML = minesRest;
		}
	} else if (e.button == 0) { // clic gauche, équivalent gauche + droit sur démineur Windows
			// On crée d'abord un tableau des cases autour
			var casesAutour = new Array();
			if(cY>=1 && cX>=1)
				casesAutour.push([cY-1,cX-1]);
			if(cY>=1)
				casesAutour.push([cY-1,cX]);
			if(cY>=1 && cX<=largeur-2)
				casesAutour.push([cY-1,cX+1]);

			if(cX>=1)
				casesAutour.push([cY,cX-1]);
			if(cX<=largeur-2)
				casesAutour.push([cY,cX+1]);

			if(cY<= hauteur-2 && cX>=1)
				casesAutour.push([cY+1,cX-1]);
			if(cY<= hauteur-2)
				casesAutour.push([cY+1,cX]);
			if(cY<= hauteur-2 && cX<=largeur-2)
				casesAutour.push([cY+1,cX+1]);
			
			// Puis on compte les drapeaux et les mines
			var drapeauxAutour = 0;
			var minesAutour = 0;
			for (i=0; i<casesAutour.length; i++) {
				if (tableau[casesAutour[i][0]][casesAutour[i][1]].drapeau)
					drapeauxAutour ++;
				if (tableau[casesAutour[i][0]][casesAutour[i][1]].mine)
					minesAutour ++;
			}
			
			if (drapeauxAutour == minesAutour) {
				for (i=0; i<casesAutour.length; i++) {
					if (!tableau[casesAutour[i][0]][casesAutour[i][1]].drapeau)
						clicCase(casesAutour[i][0], casesAutour[i][1]);
				}
			}
			///////////////////////////////////
	}
}

function verifVictoire() {
	if (fini)
		return;
	if (nbNonDecouverts != nbMines) {
		return;
	} else {
		var posMines = new Array();
		for (y=0; y<hauteur; y++) {
			for (x=0; x<largeur; x++) {
				if (tableau[y][x].mine)
					posMines.push([y, x]);
			}
		}
	}
	/*
	var posNonDecouverts = new Array();
	var posMines = new Array();

	// Listage des cases non découvertes et des mines
	for (y=0; y<hauteur; y++) {
		for (x=0; x<largeur; x++) {
			if (!tableau[y][x].decouvert && !tableau[y][x].mine)
				return;
			if (!tableau[y][x].decouvert)
				posNonDecouverts.push([y, x]);
			if (tableau[y][x].mine)
				posMines.push([y, x]);
		}
	}*/
	
	//if (posNonDecouverts.toSource() == posMines.toSource()) {
	// Mettre des drapeaux là où il faut :
	/*for (i=0; i<posMines.length; i++) {
		if (!tableau[posMines[i][0]][posMines[i][1]].drapeau) {
			document.getElementById('Grille').firstChild.childNodes[posMines[i][0]].childNodes[posMines[i][1]].className = 'drapeau';
			tableau[posMines[i][0]][posMines[i][1]].drapeau = true;
		}
	}*/
	// Mettre des drapeaux là où il faut :
	for (i=0; i<posMines.length; i++) {
		if (!tableau[posMines[i][0]][posMines[i][1]].drapeau) {
			document.getElementById('Grille').firstChild.childNodes[posMines[i][0]].childNodes[posMines[i][1]].className = 'drapeau';
			tableau[posMines[i][0]][posMines[i][1]].drapeau = true;
		}
	}
	minesRest = 0;
	document.getElementById('compteurMines').innerHTML = minesRest;
	finir(true);
}

function chrono() {
	tChrono = setTimeout('chrono()',1000);
	if(tChrono) {
		temps++;
		document.getElementById('chronomètre').innerHTML = temps;
	}
}

function finir(gagne) {
	clearTimeout(tChrono);
	fini = true;
	for (y=0; y<hauteur; y++) {
		for (x=0; x<largeur; x++) {
			if (!tableau[y][x].decouvert)
				document.getElementById('Grille').firstChild.childNodes[y].childNodes[x].className += ' fini';
		}
	}
	alert(gagne ? 'Gagné !' : 'Perdu.');
}