<html>
<head><title>Minesweeper</title>
<style type="text/css">
.st{font-family:Arial,Helvetica,sans-serif;font-size:12px}
</style>
</head>
<body link=#000000 vlink=#000000 alink=#000000>
<form name=f>
<p align=center>
<table border=1 cellspacing=0 bordercolor=#000000 bordercolorlight=#000000 bordercolordark=#C0C0C0><tr><td align=center class=st bgcolor=#000000>
<font size=3 color=#FFFFFF><b>Black & White Minesweeper</b></font>
</td></tr><tr><td align=center>
<select name=s size=1 onChange="javascript:F9()"><option selected value=0810>Beginner (8x8, 10 mines)</option><option value=1640>Intermediate (16x16, 40 mines)</option><option value=2499>Advanced (24x24, 99 mines)</option></select><br>
<table>
<tr>
<script language="JavaScript">
var a,b,c,d,g,o,s,t,u,i,j;
b=new Array();
u=new Array();
t='Are you sure you wish to ';
//t is ugly
g=(navigator.userAgent.indexOf('MSIE')>0);
//FD returns an image link
function FD(z){
return('<IMG WIDTH='+z+' HEIGHT='+z+' BORDER=0 SRC="javascript:F0(');
}
//F0 uncompresses, caches and draws the requested image
function F0(z){
if(!u[z]){
a='';
c='NB0TMMMMM0fTf0CAf1bf1DJDJD412a4fc7VYA1047e04X4AV9faT25595OO56b5OO5J5acea5J5a8Of8VN07L0cL14LWL7c0WGGGGU0N7NZBZVIfKKKK183eZ1fXfS7FPYPFFPQC8423eI79Zf9ZV83Vf7VeVfIVZVZNI7842CQ1EEEEZfQ7HS0eQ7HHS1S1e3Ze7ZBZ7FHQ3Q';
d='807f1P1aRRS3UUX3814d3c02ZTfeaaX1Z0YYcZ99ZWff248ZZZ00';
for(i=0;i<26;i++){
c=c.replace(new RegExp(String.fromCharCode(i+65),'g'),d.substr(i*2,2));
}
for(i=0;i<32;i++){
a+=(a==''?'':',')+'0x'+c.substr(z*64+i*2,2);
}
u[z]="#define x_width 16\n#define x_height 16\nstatic char x_bits[] = {"+a+"};\n";
}
return(u[z]);
}
//F1 updates the statusbar
function F1(z){
window.status=!z?'':z;
return(true);
}
//F2 draws a hyperlinked XBM graphic or textlink of a toolbar button
function F2(x,y,z){
c='javascript:';
if (x==9||g){
document.write('<TD CLASS=st ALIGN=CENTER><A HREF="'+c+y+'()" onMouseOut="return(F1())" onMouseOver="return(F1(\''+z+' game\'))">'+(x==9?z+' game':FD(32)+x+')" ALT="'+z+' game">')+'</A></TD>');
}
}
F2(2,'F9','New');
F2(1,'FB','Load');
F2(0,'FA','Save');
document.write('</TR><TR>');
F2(9,'F9','New');
F2(9,'FB','Load');
F2(9,'FA','Save');
</script>
</tr>
</table>
</td></tr><tr><td align=center class=st>
<input type=checkbox name=q> Question mark (or rightclick)<br><br>
<div align=center id=m></div><br>
</td></tr><tr><td class=st align=center><i>Created by <a href="mailto:ward@ward.nu">Ward van Wanrooij</a></i></td></tr></table>
</p>
</form>
<script language="JavaScript">
//b[x][y]=
//-1 covered, bomb
//0 covered, no bomb
//1 uncovered
//2 question, bomb
//3 question, no bomb
//F3 calculates the number to be displayed at b[x][y]
function F3(x,y){
return(F4(x-1,y)+F4(x+1,y)+F4(x,y-1)+F4(x,y+1)+F4(x-1,y-1)+F4(x+1,y-1)+F4(x-1,y+1)+F4(x+1,y+1));
}
//F4 determines whether b[x][y] is a bomb
function F4(x,y){
if(F7(x,y)){
return(0);
}else{
return((b[x][y]==-1||b[x][y]==2)?1:0);
}
}
//F7 determines whether b[x][y] is a valid grid reference
function F7(x,y){
return(x<0||y<0||x>=s||y>=s);
}
//F5 draws the playing field
function F5(){
c='BORDERCOLOR';
a='<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=0 '+c+'=#000000 '+c+'LIGHT=#000000 '+c+'DARK=#C0C0C0>';
c='<FONT FACE=Arial SIZE=1';
for(i=0;i<s;i++){
a+='<TR HEIGHT=20>';
for(j=0;j<s;j++){
a+='<TD WIDTH=20 HEIGHT=20 ALIGN=CENTER VALIGN=CENTER BGCOLOR='+(b[i][j]==1?'#C0C0C0>'+c+'>'+(F3(i,j)==0?' ':F3(i,j))+'</FONT>':'#808080>'+(o<1?'<A onMouseOver="return(F1(\'Uncover '+(i+1)+','+(j+1)+'\'))" onMouseOut="return(F1())" HREF="javascript:F6('+i+','+j+',0)" onContextMenu="javascript:F6('+i+','+j+',-1);return(false)">':'')+((o<1&&b[i][j]>1)||(o>0&&(b[i][j]==-1||b[i][j]==2))?(g?FD(16)+(o<1?3:4)+')">':c+' COLOR='+(o>0?'#FF0000><B>X</B>':'#000000>??')+'</FONT>'):(g?FD(16)+'5)">':c+' COLOR=#808080>__</FONT>'))+(o<1?'</A>':''))+'</TD>';
}
a+='</TR>';
}
a+='</TABLE>';
a+='<BR>'+(o>0?(g?FD(16)+(o<2?4:6)+')">':'')+c+'> '+(o<2?'Game over!':'Congratulations!'):c+'>Game in progress...')+'</FONT>';
if(document.all&&!document.getElementById){
m.innerHTML=a;
}else{
document.getElementById('m').innerHTML=a;
}
}
//F6 recursively handles user input, clicking at b[x][y]
//z is zero when called by user, 1 when called recursively, 2 when right clicked
function F6(x,y,z){
if(o<1&&!F7(x,y)){
if(z<1&&b[x][y]>1){
b[x][y]-=3;
}else if(z<0||document.f.q.checked){
b[x][y]+=3;
}else if(z<1&&b[x][y]==-1){
o=1;
F5();
alert('Game over!');
}else{
if(b[x][y]==0){
b[x][y]=1;
if(F3(x,y)==0){
F6(x-1,y,1);
F6(x+1,y,1);
F6(x,y-1,1);
F6(x,y+1,1);
F6(x-1,y-1,1);
F6(x+1,y-1,1);
F6(x-1,y+1,1);
F6(x+1,y+1,1);
}
}
}
if(z<1){
a=0;
for(i=0;i<s;i++){
for(j=0;j<s;j++){
a+=((b[i][j]==-1||b[i][j]==1||b[i][j]==2)?1:0);
}
}
if(a==s*s){
o=2;
F5();
alert('Congratulations!');
}
F5();
}
}
}
//F8 generates a new, random playing field
function F8(){
o=0;
d=document.f;
s=d.s.value.substr(0,2);
for(i=0;i<s;i++){
b[i]=new Array(s);
for(j=0;j<s;j++){
b[i][j]=0;
}
}
for(i=0;i<document.f.s.value.substr(2,2);i++){
while(true){
x=Math.floor(Math.random()*s);
y=Math.floor(Math.random()*s);
if(b[x][y]==0){
b[x][y]=-1;
break;
}
}
}
d.q.checked=false;
F5();
}
//F9 starts a new game
function F9(){
if(o>0||confirm(t+'start a new game?')){F8();}else{FC();}
}
//FA saves a game
function FA(){
if(o>0){
alert('Unable to save a finished game.');
return;
}
a='MXS='+s+'|';
for(i=0;i<s;i++){
a+=b[i].join(',')+'|';
}
document.cookie=a+'; expires='+new Date(2006,5,6).toGMTString()+';';
alert('Game saved.');
}
//FB loads a game
function FB(){
d=document.cookie;
c=d.indexOf('MXS=');
if(c<0){
alert('No saved game available.');
return;
}
if(o>0||confirm(t+'load a game, breaking off the current game?')){
o=0;
a=d.substring(c+4);
c=a.indexOf('|');
s=a.substr(0,c);
for(i=0;i<s;i++){
c=a.indexOf('|',c+1);
b[i]=a.substring(a.lastIndexOf('|',c-1)+1,c).split(',');
for(j=0;j<s;j++){
b[i][j]=parseInt(b[i][j]);
}
}
FC();
document.f.q.checked=false;
F5();
}
}
//FC sets dropdownbox to the current game style
function FC(){
c=document.f.s.options;
//next line is ugly, should be i<c.length-1
for(i=0;i<3;i++){
if(c[i].value.substr(0,2)==s){
c[i].selected=true;
}
}
}
F8();
</script>
</body>
</html>