<html> <head> <title>Mine Sweeper v1.5</title> <script type="text/javascript"> var gameflag,first_click,map,flag,table,timerflag,starttime,timeinterval,flagnum,wid=0,hei=0,bom=10; var colors = ['#0000FF','#00FF00','#FF0000','#000080','#800000','#00FFFF','#000000','#808080']; function Position(x,y){ this.x = x; this.y = y; } function PageStart(){ document.write('<table border=\"1\" id=board></table><p>', '<div id=time>残りの爆弾数 : 10 Time : 0:0:0.0</div><br>', '横:<input type=\"number\" id=wform value=\"9\" size=\"5\"> ', '縦:<input type=\"text\" id=hform value=\"9\" size=\"5\"> ', '爆弾:<input type=\"text\" id=bform value=\"10\" size=\"5\"></p>', '<input type=\"button\" value=\"ニューゲーム\" onclick=NewGame()> ', '<input type=\"button\" value=\"リセット\" onclick=BoardReset()> ', '<input type=\"button\" value=\"アンサー\" onclick=Answer()><br>', '<p><br>●操作方法<br>', '  左クリック:マスを開く<br>', '  右クリック:旗を立てる、立っていたら外す<br>', '<br>●ボタン説明<table border=1>', '  <tr><td>ニューゲーム</td><td>新しい爆弾の配置でゲームを始めます。<br>', 'このとき盤面の大きさを「縦」、「横」のフォームで、<br>', '爆弾の多さを「爆弾」のフォームで指定できます。</td></tr>', '  <tr><td>リセット</td><td>前回と同じ配置でもう一度ゲームを始めます。</td></tr>', '  <tr><td>アンサー</td><td>ゲームを終了して今回の爆弾の配置を表示します。</td></tr></table>', '<br>●ルール<br>', '  爆弾のあるマスを1度も開かずに爆弾のないマスをすべて開けばクリアです。<br>', '  開いたマスに書いてある数字をその周囲8マスにある爆弾の数を示します。<br>', '  旗が立っているマスはクリックしても開かれません。<br>', '<br>●注意<br>', '  縦、横の数は正の整数、爆弾の数は盤面の大きさ(縦×横)-9以下の正の整数でなければなりません。<br>', '  「縦」「横」「爆弾」の値は大きすぎると動作が停止する可能性があります。<br>', '  製作者はこのプログラムによって生じた、いかなる損害も責任を負いません。</p>' ); Initalize(9,9,10,false); } function AddCell(m,n,row){ var tdid = row.insertCell(-1); tdid.align = "center"; tdid.onclick = new Function("ButtonClick("+(m)+","+(n)+")"); tdid.oncontextmenu = new Function("RightClick("+(m)+","+(n)+");return false"); tdid.style.backgroundColor = "#E0E0E0"; } function Initalize(w,h,bo,f){ flagnum = 0; timeflag = false; document.getElementById("time").innerHTML = "残りの爆弾数 : "+bo+" Time : 0:0:0.0"; table = document.getElementById( 'board' ); bom = bo; table.width = 27*w+4*(w+1); table.height = 27*h+4*(h+1); table.style.tableLayout = "fixed"; if(f == false){ if(h > hei){ for(var a=hei;a<h;a++){ table.insertRow(-1); table.rows[a].height = 27; } }else{ for(var a=hei;a>h;a--){ table.deleteRow(-1); } } for(a=0;a<h;a++){ var temp = table.rows[a].cells.length; if(w>wid){ for(b=temp;b<w;b++){ AddCell(b,a,table.rows[a]); } }else{ if(temp<w){ for(b=temp;b<w;b++){ AddCell(b,a,table.rows[a]); } }else{ for(b=temp;b>w;b--){ table.rows[a].deleteCell(-1); } } } } first_click = true; map = new Array(w); for(var a=0;a<w;a++){ map[a] = new Array(h); for(var b=0;b<h;b++){ map[a][b] = 0; } } } wid = w; hei = h; gameflag = false; flag = new Array(w); for(var a=0;a<w;a++){ flag[a] = new Array(h); for(var b=0;b<h;b++){ flag[a][b] = 0; table.rows[b].cells[a].innerHTML = ""; table.rows[b].cells[a].style.backgroundColor = "#E0E0E0"; } } } function Timer(flag){ if(gameflag == false && flag == false){ if(timeflag == false){ starttime = new Date(); timeflag = true; timeinterval = setInterval("Timer(false)",1); }else{ var nowtime = new Date(); var T = nowtime.getTime() - starttime.getTime(); document.getElementById("time").innerHTML = "残りの爆弾数 : "+(bom-flagnum) +" Time : "+(Math.floor(T/(60*60*1000))) +":"+(Math.floor(T/(60*1000)) % 60) +":"+(Math.floor(T/1000) % 60)+"."+(T%1000); } }else if(timeflag == true){ clearInterval( timeinterval ); timeflag = false; } } function BombEnter(m,n){ var positions = new Array(0); var aroundnum = 0; for(var c=-1;c<=1;c++){ for(var d=-1;d<=1;d++){ if(m+c>=0&&m+c<wid&&n+d>=0&&n+d<hei){ aroundnum++; } } } for(var a=0;a<wid;a++){ for(var b=0;b<hei;b++){ if(a < m-1 || a > m+1 || b < n-1 || b > n+1){ positions.push(new Position(a,b)); } } } for(var bomb=0;bomb<bom;bomb++){ var p = Math.floor(Math.random() * ((wid * hei)-bomb-aroundnum)); map[positions[p].x][positions[p].y] = 10; positions.splice(p,1); } for(a=0;a<wid;a++){ for(b=0;b<hei;b++){ for(var c=-1;c<=1;c++){ for(var d=-1;d<=1;d++){ if(a+c>=0&&a+c<wid&&b+d>=0&&b+d<hei&&(c!=0||d!=0)){ if(map[a+c][b+d]>=10 && map[a][b] < 10){ map[a][b]++; } } } } } } } function ButtonClick(m,n){ if(first_click == true){ BombEnter(m,n); first_click = false; Timer(false); } if(gameflag == false && flag[m][n] == 0){ table.rows[n].cells[m].style.backgroundColor="#FFFFFF"; flag[m][n] = 1; if(map[m][n] >= 10){ table.rows[n].cells[m].innerHTML="💣"; gameflag = true; alert("GameOver!"); }else if(map[m][n] == 0){ for(var c=-1;c<=1;c++){ for(var d=-1;d<=1;d++){ if(m+c>=0&&m+c<wid&&n+d>=0&&n+d<hei&&(c!=0||d!=0)){ if(flag[m+c][n+d] == 0){ ButtonClick(m+c,n+d); } } } } }else{ table.rows[n].cells[m].innerHTML="<b><font color=\""+(colors[map[m][n]-1])+"\">"+(map[m][n])+"</font></b>"; } } var testflag = false; for(var a=0;a<wid;a++){ for(var b=0;b<hei;b++){ if((flag[a][b] == 0 || flag[a][b] == 2) && map[a][b] < 10){ testflag = true; break; } } } if(testflag == false && gameflag == false){ gameflag = true; tex = "GameClear!\n"+document.getElementById("time").innerHTML.split(" ")[1]+"\nリセット : "; if(timeflag == true){ tex += "なし"; }else{ tex += "あり"; } tex += "\n盤面 : 横"+(wid)+"マス 縦"+(hei)+"マス 爆弾"+(bom)+"個"; alert(tex); } } function RightClick(m,n){ if(flag[m][n] == 0 && first_click == false && gameflag == false){ flagnum++; flag[m][n] = 2; table.rows[n].cells[m].innerHTML="<font color=\"#FF0000\">🚩</font>"; }else if(flag[m][n] == 2){ flagnum--; flag[m][n] = 3; table.rows[n].cells[m].innerHTML="<b>?</b>"; }else if(flag[m][n] == 3){ flag[m][n] = 0; table.rows[n].cells[m].innerHTML=""; } } function NewGame(){ var wtemp = parseInt(document.getElementById('wform').value); if(wtemp < 1 || isNaN(wtemp)){ alert("横幅に正の整数を入力してください。"); }else{ htemp = parseInt(document.getElementById('hform').value); if(htemp < 1 || isNaN(htemp)){ alert("縦幅に正の整数を入力してください。"); }else{ btemp = parseInt(document.getElementById('bform').value); if(btemp < 1 || isNaN(btemp)){ alert("爆弾数に正の整数を入力してください。"); }else if(btemp > wtemp*htemp-9){ alert("爆弾数が盤面の大きさ-9より大きいため、爆弾数を減らすか盤面を大きくしてください。"); }else{ Timer(true); Initalize(wtemp,htemp,btemp,false); } } } } function BoardReset(){ Timer(true); Initalize(wid,hei,bom,true); } function Answer(){ if(first_click == false){ for(var a=0;a<wid;a++){ for(var b=0;b<hei;b++){ table.rows[b].cells[a].style.backgroundColor = "#FFFFFF"; if(map[a][b] >= 10){ table.rows[b].cells[a].innerHTML = "💣"; }else if(map[a][b] > 0){ table.rows[b].cells[a].innerHTML = "<b><font color=\""+(colors[map[a][b]-1])+"\">"+(map[a][b])+"</font></b>"; } } } Timer(true); }else{ alert("まだ配置が決まってません。"); } } </script> </head> <body style="overflow: auto;"> <script type="text/javascript"> PageStart(); </script> <noscript> <p>JavaScriptが無効になっています。<br> 設定でオンにするかブラウザを変更してください。</p> </noscript> </body> </html>