This post was originally published on
Coding Glamour .
Vrijdagmiddag om half vier is een uitstekend moment om de laatste 90 minuten
pre-borrel gewoonweg te verspillen. Dat kan met filmpjes kijken of door spelletjes te spelen. Blijkbaar had systeembeheer dit
ook door, want op mijn verse geïnstalleerde machine staat mooi geen
mijnenveger. Mooi moment om eens te gaan spelen met <canvas />. Beware
voor awesome code, met fantastische variabelenamen: Minesweeper in Javascript
en Canvas (bouwtijd: minder dan 60 minuten vanaf scratch)!
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns = "http://www.w3.org/1999/xhtml" >
< head >
< script src = "jquery-1.4.1.js" type = "text/javascript" >< /script >
< script src = "jquery.rightClick.js" type = "text/javascript" >< /script >
< title >< /title >
< /head >
< body >
< div style = "border: solid 1px black; width: 500px; height: 500px;" >
< canvas id = 'canvas' width = "500" height = "500" >< /canvas >
< /div >
< script >
var cnvs = document . getElementById ( 'canvas' ). getContext ( '2d' );
var vals = [];
$ ( document ). ready ( function () {
// horizontal index (1 - 10)
for ( var hix = 0 ; hix < 10 ; hix ++ ) {
// vertical index
for ( var vix = 0 ; vix < 10 ; vix ++ ) {
// breedte van dat ding is 500, dus we doen
// 10 spacing en dan 40 breed
var width = 48 ;
cnvs . fillStyle = "rgb(50,50,50)" ;
cnvs . fillRect ( 10 + ( width * hix ), 10 + ( width * vix ), width , width );
cnvs . strokeRect ( 10 + ( width * hix ), 10 + ( width * vix ), width , width );
}
}
// calculate 10 random numbers
var rndNrs = new Array ();
for ( var ix = 0 ; ix < 10 ; ix ++ ) {
// tussen 0 en 99
while ( contains ( rndNrs , r = Math . floor ( Math . random () * 100 ))) { }
rndNrs . push ( r );
}
var cntr = 0 ;
for ( var hix = 1 ; hix <= 10 ; hix ++ ) {
vals [ hix - 1 ] = [];
for ( var vix = 1 ; vix <= 10 ; vix ++ ) {
cntr ++ ;
vals [ hix - 1 ][ vix - 1 ] = { discovered : false , val : contains ( rndNrs , cntr ) === true ? - 1 : 0 };
}
}
// gaan we nog een keer jonge
for ( var h = 0 ; h < 10 ; h ++ ) {
for ( var v = 0 ; v < 10 ; v ++ ) {
if ( vals [ h ][ v ]. val !== - 1 ) {
// anders gaan we kijken
// alles eromheen mag
var dezeV = 0 ;
for ( nh = h - 1 ; nh <= h + 1 ; nh ++ ) {
for ( nv = v - 1 ; nv <= v + 1 ; nv ++ ) {
if ( nh === h && nv === v ) continue ;
if ( nh >= 0 && nh <= 9 && nv >= 0 && nv <= 9 ) {
dezeV += ( vals [ nh ][ nv ]. val === - 1 ? 1 : 0 );
}
}
}
vals [ h ][ v ]. val = dezeV ;
}
}
}
// okee nu is alles getekend maar nu moeten we dus nog wel wat doen
$ ( "#canvas" ). click ( function ( e ) {
var x = Math . floor (( e . pageX - $ ( "#canvas" ). offset (). left ));
var y = Math . floor (( e . pageY - $ ( "#canvas" ). offset (). top ));
var h = Math . floor ((( x / 480 ) * 10 ));
var v = Math . floor (( y / 480 ) * 10 );
handleChecked ( h , v );
});
$ ( '#canvas' ). rightClick ( function ( e ) {
var x = Math . floor (( e . pageX - $ ( "#canvas" ). offset (). left ));
var y = Math . floor (( e . pageY - $ ( "#canvas" ). offset (). top ));
var h = Math . floor ((( x / 480 ) * 10 ));
var v = Math . floor (( y / 480 ) * 10 );
handleRechtermuisknop ( h , v );
});
});
handleRechtermuisknop = function ( h , v ) {
vals [ h ][ v ]. discovered = true ;
cnvs . fillStyle = "rgb(200,0,0)" ;
cnvs . fillRect ( 10 + ( 48 * h ) + 1 , 10 + ( 48 * v ) + 1 , 46 , 46 );
return false ;
}
handleChecked = function ( h , v ) {
vals [ h ][ v ]. discovered = true ;
var whut = vals [ h ][ v ]. val ;
switch ( whut ) {
case - 1 : whut = "*" ; break ;
case 0 : whut = "" ; break ;
}
if ( whut === "" ) {
checkSurroundingVoorLeeg ( h , v );
}
if ( whut === "*" ) {
alert ( 'boem' );
}
cnvs . fillStyle = whut !== "*" ? "rgb(255,255,255)" : "rgb(0, 200, 200)" ;
cnvs . fillRect ( 10 + ( 48 * h ) + 1 , 10 + ( 48 * v ) + 1 , 46 , 46 );
cnvs . fillStyle = "rgb(0,0,0)" ;
cnvs . fillText ( whut , 10 + ( h * 48 ) + 24 , 10 + ( v * 48 ) + 24 );
};
function contains ( arr , el ) {
for ( var ix = 0 ; ix < arr . length ; ix ++ ) {
if ( arr [ ix ] === el ) return true ;
}
return false ;
}
function checkSurroundingVoorLeeg ( h , v ) {
for ( var x = h - 1 ; x <= h + 1 ; x ++ ) {
for ( var y = v - 1 ; y <= v + 1 ; y ++ ) {
// boundaries checken
if ( x >= 0 && x <= 9 && y >= 0 && y <= 9 ) {
// eens kijken
var el = vals [ x ][ y ];
if ( ! el . discovered && el . val >= 0 ) {
handleChecked ( x , y ); // deze doet zelf wel recursie hieromheen
}
}
}
}
}
< /script >
< /body >
< /html>
Ik vermoed dat deze code me nog een keer tijdens een sollicitatiegesprek gaat achtervolgen