Arrange Game : Game « Page Components « JavaScript DHTML






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>


           
       








Related examples in the same category

1.Chess: Draughts
2.Mine game
3.Word search game
4.Ranisima english
5.Yasminuroban (by Joan Alba Maldonado)
6.Level editor for Yasminuroban by Joan Alba Maldonado
7.js mine sweeper
8.Another tictactoe
9.Marbles
10.Jigsaw
11.Game sudoku
12.Game PunkPong
13.Tetris in Javascript
14.Guess Number
15.Tic tac toe
16.Count Game
17. A JavaScript Hangman Game
18.Game library
19.Type Tutor
20.Game: Place It (IE only)
21.HylZee