Mega Code Archive

 
Categories / JavaScript DHTML / Page Components
 

Arrange Game

<!----------------------------------------------------------------\ |                                                                 | |  Fair License                                                   | |                                                                 | |  JS Games :: Arrange                                            | |  Copyright (C) 2002-2004 Arun Narayanan                         | |                                                                 | |  For latest release information and downloads visit:            | |  http://jsgames.sourceforge.net/                                | |                                                                 | |  Usage of the works is permitted provided that this             | |  instrument is retained with the works, so that any entity      | |  that uses the works is notified of this instrument.            | |                                                                 | |  DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY.                    | |                                                                 | |  [2004, Fair License: rhid.com/fair]                            | |                                                                 | \-----------------------------------------------------------------> <html> <head> <title>!!! JS Games :: Arrange !!!</title> <style> .bigcell {   background-color:#cccccc;   border:4px solid #999999;   text-align:center; } .cell {   width:36px;   height:40px;   font-family:Verdana, Arial;   font-size:10pt;   font-weight:bold;   background-color:#606060;   color:#ffffff;   border-top:3px solid #cccccc;   border-left:3px solid #cccccc;   border-right:3px solid #000000;   border-bottom:3px solid #000000;   text-align:center; } .hole {   width:36px;   height:40px;   background-color:#999999;   text-align:center; } body,h1,h2,h3,.msg,capt1,capt2,td {font-family:Verdana,Comic Sans MS,Arial;} body {margin:0px;} h1 {font-size:28pt; font-weight:bold; margin-bottom:0px;} h2,.h2 {font-size:22pt; margin:0px; font-weight:bold; padding:0px;} h3 {font-size:8pt; margin:0px; font-weight:bold;} .msg {font-size:8pt; font-weight:bold;} .tab {cursor:hand;} .capt1 {font-size:10pt; font-weight:bold;} .capt2 {font-size:9pt; font-weight:bold;} .capt3 {font-size:14pt; font-weight:bold; color:yellow;} .capt4 {font-size:10pt; font-weight:bold; color:yellow;} .but {font-size:8pt; font-weight:bold; height:24px; background-color:#606060; background-image:url(images/butbase.gif);       border:0px solid #cccccc; border-left:none; border-right:none; color:white;} .bnote {font-size:8pt; font-weight:normal;color:white;} a.notelnk,a.notelnk:visited,a.notelnk:active {font-size:8pt; font-weight:normal; color:#66ffcc;} .bnotehead {font-size:10pt; font-weight:bold;color:#66ffcc;} .email {font-size:8pt; font-weight:bold; color:white;} .fra {border:2px solid #999999; background-color:#606060;} .clsThisGame, .clsBar {font-size:8pt; font-weight:bold; color:#cccccc;} .clsBar {margin:0px; font-size:8pt; font-weight:bold; color:#ffffff;} .clsOtherGame {margin:0px; font-size:8pt; font-weight:bold; color:#ffffff; text-decoration:none;} .help {font-size:8pt; margin:0px; font-weight:bold;} .menubar {padding:0px; margin:0px; brder-top:1px solid white; brder-bottom:1px solid white; background-color:#606060;           background-image:url(images/menu.gif);} </style> <script> var gsize, ghrow, ghcol, gtime, gmoves, gintervalid=-1, gshuffling; function toggleHelp() {   if (butHelp.value == "Hide Help")   {     help.style.display = "none";     butHelp.value = "Show Help";   }   else   {     help.style.display = "";     butHelp.value = "Hide Help";   }   } //random number between low and hi function r(low,hi) {   return Math.floor((hi-low)*Math.random()+low);  } //random number between 1 and hi function r1(hi) {   return Math.floor((hi-1)*Math.random()+1);  } //random number between 0 and hi function r0(hi) {   return Math.floor((hi)*Math.random());  } function startGame() {   shuffle();   gtime = 0;   gmoves = 0;   clearInterval(gintervalid);   tickTime();   gintervalid = setInterval("tickTime()",1000); } function stopGame() {   if (gintervalid==-1) return;   clearInterval(gintervalid);   fldStatus.innerHTML = "";   gintervalid=-1; } function tickTime() {   showStatus();   gtime++; } function checkWin() {   var i, j, s;      if (gintervalid==-1) return; //game not started!      if (!isHole(gsize-1,gsize-1)) return;      for (i=0;i<gsize;i++)     for (j=0;j<gsize;j++)     {       if (!(i==gsize-1 && j==gsize-1)) //ignore last block (ideally a hole)       {        if (getValue(i,j)!=(i*gsize+j+1).toString()) return;       }     }   stopGame();   s = "<table cellpadding=4>";   s += "<tr><td align=center class=capt3>!! CONGRATS !!</td></tr>";   s += "<tr class=capt4><td align=center>You have done it in " + gtime + " secs ";   s += "with " + gmoves + " moves!</td></tr>";   s += "<tr><td align=center class=capt4>Your speed is " + Math.round(1000*gmoves/gtime)/1000 + " moves/sec</td></tr>";   s += "</table>";   fldStatus.innerHTML = s; //  shuffle(); } function showStatus() {   fldStatus.innerHTML = "Time:&nbsp;" + gtime + " secs&nbsp;&nbsp;&nbsp;Moves:&nbsp;" + gmoves } function showTable() {   var i, j, s;      stopGame();   s = "<table border=3 cellpadding=0 cellspacing=0 bgcolor='#666655'><tr><td class=bigcell>";   s = s + "<table border=0 cellpadding=0 cellspacing=0>";   for (i=0; i<gsize; i++)   {     s = s + "<tr>";         for (j=0; j<gsize; j++)     {       s = s + "<td id=a_" + i + "_" + j + " onclick='move(this)' class=cell>" + (i*gsize+j+1) + "</td>";     }     s = s + "</tr>";           }   s = s + "</table>";   s = s + "</td></tr></table>";         return s; } function getCell(row, col) {   return eval("a_" + row + "_" + col); } function setValue(row,col,val) {   var v = getCell(row, col);   v.innerHTML = val;   v.className = "cell"; } function getValue(row,col) { //  alert(row + "," + col);   var v = getCell(row, col);   return v.innerHTML; } function setHole(row,col) {    var v = getCell(row, col);   v.innerHTML = "";   v.className = "hole";   ghrow = row;   ghcol = col; } function getRow(obj) {   var a = obj.id.split("_");   return a[1]; } function getCol(obj) {   var a = obj.id.split("_");   return a[2]; } function isHole(row, col) {   return (row==ghrow && col==ghcol) ? true : false; } function getHoleInRow(row) {   var i;      return (row==ghrow) ? ghcol : -1; } function getHoleInCol(col) {   var i;   return (col==ghcol) ? ghrow : -1; } function shiftHoleRow(src,dest,row) {   var i;   //conversion to integer needed in some cases!   src = parseInt(src);   dest = parseInt(dest);   if (src < dest)   {     for (i=src;i<dest;i++)     {       setValue(row,i,getValue(row,i+1));       setHole(row,i+1);     }   }   if (dest < src)   {     for (i=src;i>dest;i--)     {       setValue(row,i,getValue(row,i-1));       setHole(row,i-1);     }   } } function shiftHoleCol(src,dest,col) {   var i;      //conversion to integer needed in some cases!   src = parseInt(src);   dest = parseInt(dest);        if (src < dest)   {//alert("src=" + src +" dest=" + dest + " col=" + col);     for (i=src;i<dest;i++)     {//alert(parseInt(i)+1);       setValue(i,col,getValue(i+1,col));       setHole(i+1,col);     }   }   if (dest < src)   {     for (i=src;i>dest;i--)     {       setValue(i,col,getValue(i-1,col));       setHole(i-1,col);     }   } } function move(obj) {   var r, c, hr, hc;   if (gintervalid==-1 && !gshuffling)    {     alert('Please press the "Start Game" button to start.')     return;   }   r = getRow(obj);   c = getCol(obj);   if (isHole(r,c)) return;      hc = getHoleInRow(r);   if (hc != -1)   {     shiftHoleRow(hc,c,r);     gmoves++;     checkWin();     return;   }      hr = getHoleInCol(c);   if (hr != -1)   {     shiftHoleCol(hr,r,c);     gmoves++;     checkWin();     return;   } } function shuffle() {   var t,i,j,s,frac;   gshuffling =  true;   frac = 100.0/(gsize*(gsize+10));   s = "% ";   for (i=0;i<gsize;i++)   {     s += "|";     for (j=0;j<gsize+10;j++)     {         window.status = "Loading " + Math.round((i*(gsize+10) + j)*frac) + s         if (j%2==0)       {         t = r0(gsize);         while (t == ghrow) t = r0(gsize); //skip holes         getCell(t,ghcol).click();       }        else       {         t = r0(gsize);         while (t == ghcol) t = r0(gsize); //skip holes         getCell(ghrow,t).click();       }     }   }   window.status = "";   gshuffling = false; } function loadBoard(size) {   gsize = size;      board.innerHTML = showTable(gsize);   setHole(gsize-1,gsize-1);   //shuffle(); } </script> </head> <body bgcolor="black" text="white" onload="toggleHelp();loadBoard(4);" background="images/bkg.gif"> <center> <h1>JS Games!</h1> <span class=msg>Copyright &copy; 2002-2004 Arun Narayanan</span><br> <br>&nbsp; <table width="450" class=fra cellpadding=0 cellspacing=0 border=0><tr><td> <table width=100% cellpadding=2 cellspacing=0> <tr><td colspan=2 class=bnotehead height=31>Important Note:</td></tr> <tr><td class=bnote valign=top>This game is written entirely using JavaScript. It requires Internet Explorer Version 4 or above for proper functioning. </td> </tr></table> </td></tr></table> <br> <table width=620 height=47 border=0 cellpadding=0 cellspacing=0> <tr><td colspan=3 height=16></td></tr> <tr> <td width=8>&nbsp;</td><td class=h2 align=center width=98%>Arrange</td> <td align=right valign=bottom><input type=button id=butHelp value="Hide Help" class="but" onclick="toggleHelp()"></td> <td width=8>&nbsp;</td> </tr> </table> <table id=help width=620 border=0 cellpadding=0 cellspacing=0> <tr><td height="10"></td></tr> <tr><td class=help> <ol> <li>Choose a Level (3 to 10).</li> <li>The game board has blocks with numbers in it. Also there is a single "hole" that can be used for moving the blocks.</li> <li>The objective of the game is to order the numbers using the "hole" for temporary movement.</li> <li>Press the "Start Game" button. The timer would be started.</li> <li>Move blocks in a row by clicking on them. A block can be moved only if it is in the same row or column as the "hole".</li> <li>You can move multiple blocks (in the same row or column as the "hole") by clicking the farthest block that you need to be moved.</li> </ol> </td></tr> </table> <table width=620 border=0 cellpadding=0 cellspacing=0> <tr><td height=29><td valign=middle align=center><h3>Order all the numbers in the shortest time possible with a minimum number of moves... </h3></td></tr> </table> <p> <div id=test></div> <table cellpadding=4> <tr><td align=center> <b>Choose Level: </b> <select id=level onchange="loadBoard(parseInt(level.value))"> <option value='3'>3</option> <option value='4' selected>4</option> <script> for (var i=5;i<=10;i++) {   document.write("<option value='" + i + "'>" + i + "</option>"); } </script> </select> </td></tr> <tr><td align=center> <input type=button class=but value="Start Game" onclick="startGame();"> <tr><td align=center id=fldStatus class=capt2> </td></tr> </table> <div id=board></div> </CENTER> <br> </body> </html>