<!---------------------------------------------------------------- | | | Fair License | | | | JS Games :: Place It | | 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 :: Place It !!!</title> <style> body,h1,h2,h3,.msg,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,.h3 {font-size:8pt; margin:0px; font-weight:bold;} .capt1 {font-size:9pt; margin:0px; font-weight:bold;} .capt2 {font-size:8pt; margin:0px; font-weight:normal; color:white;} .msg {font-size:8pt; font-weight:bold;} .tab {cursor:hand;} .board {font-size:9pt; font-weight:bold;} .status {font-size:9pt; font-weight:bold; color:#99ff99;} .progress {font-size:8pt; font-weight:bold;} .success {font-size:14pt; font-weight:bold; color:#33ccff;} .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 LANGUAGE=javascript> <!-- var glevel = 12; var gdt = 24; var gboardwidth = 400; var gcolor = new Array(); var gtop = 200; //168; var gleft = 20; var gdrag = false; var gcellid = ""; var a; var gblocks; var gzmax=0;
function toggleHelp() { if (butHelp.value == "Hide Help") { help.style.display = "none"; butHelp.value = "Show Help"; } else { help.style.display = ""; butHelp.value = "Hide Help"; } }
Array.prototype.add = ArrayAdd; function ArrayAdd(val) { this[this.length] = val; }
function storeBlocks() { var i; gblocks = new Array(glevel); for(i=0;i<glevel;i++) gblocks[i] = new Array(); for(i=0;i<glevel*glevel;i++) gblocks[a[i]].add(i); }
function BLOCK(index) { c = eval("a" + index); this.index = index; this.block = a[index]; this.left = -1; this.bottom = -1; this.right = -1; this.top = -1; this.obj = c; this.add = BLOCK_Add; }
function clsBlock(num) { var i, k=0, c; this.left = 10000; //some big number! this.top = 10000; //some big number! this.bottom = 0; this.right = 0; for(i=0;i<glevel*glevel;i++) { if (a[i] == num) { this.block = num; this.cells[k] = new clsCell(num,i); c = this.cells[k]; if (c.left < this.left) this.left = c.left; //leftmost element if (c.top < this.top) this.top = c.top; //topmost element if (c.right > this.right) this.right = c.right; //rightmost element if (c.bottom > this.bottom) this.bottom = c.bottom; //bottommost element k++; } } this.width = this.right - this.left; this.height = this.bottom - this.top; // this.move = BlockMoveFunc; }
function clsCell(num,index) { var c; this.id = "a" + index; c = eval(this.id); this.block = num; this.object = c; this.id = c.id; this.left = c.style.pixelLeft; this.top = c.style.pixelTop; this.right = c.style.pixelRight; this.bottom = c.style.pixelBottom; this.x = c.style.pixelLeft; this.y = c.style.pixelTop; this.z = c.style.zIndex; }
function populateColor() { var r,g,b,l,n; var arr = new Array("FF","33","99"); l = arr.length; //gcolor[0] = "#000000" n = 0; for (r=0;r<l;r++) for (g=0;g<l;g++) for (b=0;b<l;b++) { gcolor[n] = "#" + arr[r] + arr[g] + arr[b]; if (gcolor[n] != "#333333") n++; //omit the blackish color } }
function isWin() { for (i=0;i<gblocks.length;i++) //check each block { n = gblocks[i][0]; //first cell oldx = (n % glevel) * gdt; oldy = (parseInt(n / glevel)) * gdt;
c = eval("a" + gblocks[i][0]); if (c.style.pixelLeft != oldx || c.style.pixelTop != oldy) return false; } return true; }
//inclusive of low, excludes hi function rand(low,hi) { return Math.floor((hi-low)*Math.random()+low); }
function getLeft() { }
function moveBlock(cell,x,y) { var i, max, b, c, n, xoff, yoff; max = glevel * glevel; n = parseInt(cell.id.substr(1)); xoff = x - cell.style.pixelLeft - gleft - parseInt(gdt/2) + document.body.scrollLeft; yoff = y - cell.style.pixelTop - gtop - parseInt(gdt/2) + document.body.scrollTop; b = gblocks[a[n]]; for (i=0;i < b.length;i++) { c = eval("a" + b[i]); c.style.pixelLeft += xoff; c.style.pixelTop += yoff; } }
function fnMouseDown(obj) { var b, c, n; if (event.button == 1) { gdrag = true; gcellid = obj.id; max = glevel * glevel; n = parseInt(obj.id.substr(1)); b = gblocks[a[n]]; gzmax++; for (i=0;i < b.length;i++) { c = eval("a" + b[i]); c.style.zIndex = gzmax; } } }
function fnMouseMove() { if (gdrag) moveBlock(document.getElementById(gcellid),event.clientX,event.clientY); }
function fnMouseUp() { var c, n, oldx, oldy, newx, newy;
if (!gdrag) return;
c = eval(gcellid); n = parseInt(gcellid.substr(1)); oldx = (n % glevel) * gdt; oldy = (parseInt(n / glevel)) * gdt; newx = c.style.pixelLeft; newy = c.style.pixelTop; if (Math.abs(oldx - newx) < gdt/2 && Math.abs(oldy - newy) < gdt/2) { moveBlock(c,oldx + gdt/2 + gleft - document.body.scrollLeft, oldy + gdt/2 + gtop - + document.body.scrollTop); if (chkAnim.checked) setTimeout("animate(" + n + ",0)",80); else { if (isWin()) { if (confirm("!! C O N G R A T S !!nYou have done it!nnPress OK to play again.")) createBlocks(); else quitGame(); } } } gdrag = false; gcellid = ""; }
function animate(num,count) { var b; count++;
b = gblocks[a[num]]; if (count < 5) { for (i=0;i < b.length;i++) { c = eval("a" + b[i]); c.style.backgroundColor = gcolor[count]; } setTimeout("animate(" + num + "," + count + ")",200); } else { for (i=0;i < b.length;i++) { c = eval("a" + b[i]); c.style.backgroundColor = gcolor[a[num]]; } if (isWin()) { if (confirm("!! C O N G R A T S !!nYou have done it!nnPress OK to play again.")) createBlocks(); else quitGame(); } } }
function isOk(cellnum) { var i, x, y, max, xx, yy; if (a[cellnum] != -1) return false; x = cellnum % glevel; y = parseInt(cellnum / glevel);
if (x == 0 || x == glevel-1) return false; if (y == 0 || y == glevel-1) return false; //look for all cells around the selected cell to see if any are not empty // for(xx=x-1;xx<=x+1;xx++) // for(yy=y-1;yy<=y+1;yy++) // if (a[yy*glevel + xx] != -1) return false; if (a[(y+1)*glevel + x] != -1 || a[(y-1)*glevel + x] != -1 || a[y*glevel + x + 1] != -1 || a[y*glevel + x - 1] != -1) return false; return true; }
function setBorder() { var i, x, y, max, bstyle="1px solid black", c; max = glevel * glevel; for (i=0;i<max;i++) { x = i % glevel; y = parseInt(i / glevel); c = eval("a" + i); if ((y == 0) || (y != 0 && a[(y-1)*glevel+x]!=a[i])) c.style.borderTop = bstyle; if ((y == glevel-1) || (y != glevel-1 && a[(y+1)*glevel+x]!=a[i])) c.style.borderBottom = bstyle; if ((x == 0) || (x != 0 && a[y*glevel+x-1]!=a[i])) c.style.borderLeft = bstyle; if ((x == glevel-1) || (x != glevel-1 && a[y*glevel+x+1]!=a[i])) c.style.borderRight = bstyle; } }
function createBlocks() { var i, max, x, y, rr, done, j, tries; divMain.style.display = "none"; glevel = parseInt(selLevel.value); gdt = parseInt(gboardwidth / glevel); board.style.pixelLeft = gleft; board.style.pixelTop = gtop; max = glevel * glevel; a = new Array(max); for (i=0;i<max;i++) a[i] = -1; for (i=0;i<glevel;i++) { tries = 0; do { rr = rand(0,max); tries++; } while(!isOk(rr) && tries < glevel*glevel && a[rr]!=-1); a[rr] = i; } do { //draw(); //if (!confirm("Continue?")) break; done = true; for (i=0;i<max;i++) { if (a[i] == -1) //found an empty cell { done = false; } else { growCell(i); } } } while (!done); draw(); setBorder(); storeBlocks(); shuffle(); divSub.style.display = "block"; }
function unit() { //return (rand(0,2) == 0) ? -1 : 1; return rand(-1,2); }
function growCell(cellnum) { var x, y, cn, nx, ny, n; cn = cellnum; x = cn % glevel; y = parseInt(cn / glevel); nx = unit(); if (nx != 0) { if (x + nx < 0) nx = 0; else if (x + nx > glevel - 1) nx = glevel - 1;
n = y * glevel + x + nx; if (a[n] == -1) a[n] = a[cn]; } ny = unit();
if (ny != 0) { if (y + ny < 0) ny = 0; else if (y + ny > glevel - 1) ny = glevel - 1; n = (y + ny) * glevel + x; if (a[n] == -1) a[n] = a[cn]; } }
function shuffle() { for (i=0;i<glevel;i++) { moveBlock(eval("a" + gblocks[i][0]),rand(gboardwidth + gleft,1.5*gboardwidth + gleft),rand(gtop,gboardwidth/2 + gtop)); } }
function draw() { var i, x, y, max, s; max = glevel * glevel; s = ""; for (i=0;i<max;i++) { x = i % glevel; y = parseInt(i / glevel); s = s + '<div id=a' + i + ' style="position:absolute;width:' + gdt + 'px;height:' + gdt + 'px;left:' + (x*gdt) + 'px;top:' + (y*gdt) + 'px;background-color:' + gcolor[a[i]] + ';z-index:' + a[i] + '" onmousedown="fnMouseDown(this);"></div>'; } gzmax = glevel; board.style.width = glevel * gdt; board.style.height = glevel * gdt; // s += '<div class=capt2 style="position:relative;top=-20px">Drag the pieces onto the square using the mouse...</div>'; board.innerHTML = s; }
function quitGame() { divSub.style.display = "none"; divMain.style.display = "block"; }
function init() { populateColor(); //createBlocks(); document.onmousemove = "fnMouseMove()"; document.onmouseup = "fnMouseUp()"; toggleHelp(); } //--> </SCRIPT> </head> <body bgcolor="black" text="white" onload="init()" onmousemove="fnMouseMove()" onmouseup="fnMouseUp()" background="images/bkg.gif"> <body bgcolor="black" text="white" onload="toggleHelp();stopGame()" background="images/bkg.gif"> <center> <h1>JS Games!</h1> <span class=msg>Copyright © 2002-2004 Arun Narayanan</span><br>
<br> <div id=divMain>
<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 5.0 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> </td><td class=h2 align=center width=98%>Place It</td> <td align=right valign=bottom><input type=button id=butHelp value="Hide Help" class="but" onclick="toggleHelp()"></td> <td width=8> </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 the number of pieces for the puzzle from the drop down.</li> <li>Press the "Start Game" button.</li> <li>Drag the coloured pieces onto the black square.</li> <li>An option is provided to blink the pieces when placed correctly.</li> <li>Use the 'Quit Game' button during the game to end game or to play a new game.</li> </ol> </td></tr> </table>
<table width=620 border=0 cellpadding=0 cellspacing=0> <tr><td height=29><td valign=middle align=center> <h3>Recreate the square from the crazy pieces...</h3> </td></tr> </table> <p> <span class=capt1>Choose No. of Pieces:</npan> <select id=selLevel> <script>for (i=8;i<=20;i++) document.write("<option value='" + i + "'>" + i);</script> </select> <input class=but type=button value="Start Game" onclick="createBlocks();"> <p> <p> <p> </center>
<br> </div>
</center> <div id=divSub style="display:none;"> <input type=button class=but value="Quit Game" onclick="quitGame()"> <input type=checkbox checked id=chkAnim> <label for=chkAnim class=h3>Blink pieces when correctly placed.</label> <div class=capt2> Drag the pieces onto the square using the mouse...</div> <div id=board style="border:1px solid white;background-color:black;position:absolute"></div> <p> </div> <!--<textarea rows=8 cols=70 cols id=txta></textarea>--> </body> </html>
|