Mega Code Archive

 
Categories / JavaScript DHTML / Page Components
 

Marbles

<!----------------------------------------------------------------\ |                                                                 | |  Fair License                                                   | |                                                                 | |  JS Games :: Marbles                                            | |  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 :: Marbles !!!</title> <style> body,h1,h2,h3,.msg,td {font-family:Verdana,Comic Sans MS,Arial;} body {margin:0px;} .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;} .menubar {padding:0px; margin:0px; brder-top:1px solid white; brder-bottom:1px solid white; background-color:#606060; background-image:url(images/menu.gif);} .msg {font-size:8pt; font-weight:bold;} .info {font-family:Arial; font-size:8pt; color:#C0FFC0; font-weight:bold;} .score {font-family:Arial; font-size:12pt; color:#ffffff; font-weight:bold;} .button {font-family:Arial; font-size:8pt; background-color:#5581FF; color:#ffffff; font-weight:bold; text-align:center;} .elapsed {font-family:Arial; font-size:12pt; color:#ffFF00; font-weight:bold;} </style> <script> var INVALID=0, MARBLE=1, HOLE=2; var a = new Array( 0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0, 0,0,0,1,1,1,0,0,0, 0,1,1,1,1,1,1,1,0, 0,1,1,1,2,1,1,1,0, 0,1,1,1,1,1,1,1,0, 0,0,0,1,1,1,0,0,0, 0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0 ); var b = new Array(); var marbles_left = 32; var currcell = -1; var gintervalid = -1, gtime = 0; var game_over = true; function tick() {   elapsed.innerHTML = gtime + "&nbsp;sec" + (gtime==1?"":"s");   gtime++; } function copyArray(src,dest) {   for(var ii=0;ii<src.length;ii++) dest[ii]=src[ii]; } function cell(i) {   return eval('c' + i); } function cellxy(x,y) {   return eval('c' + (y * 9 + x) ); } function setHilite(i) {   cell(i).src = "marbles/marble_hilite.gif";   } function setMarble(i) {   cell(i).src = "marbles/marble_hole.gif";   } function setHole(i) {   cell(i).src = "marbles/hole.gif";   } function move(src,middle,dest) {   var msgs = new Array("Hey, that's a lazy game! You need more practice!",                        "WOW! You cleared all the marbles!\nYou must be a Genius!!",                        "That's a great show!\nYou're brilliant!",                        "Good show! You are intelligent.\n" +                        "A little more effort and you'll be at the top!",                        "Hmmm, not bad! But I'm sure you can do better!",                        "You surely can improve! Learn the tricks as you go!");   setHole(src);   setHole(middle);   setMarble(dest);   b[src] = b[middle] = HOLE;   b[dest] = MARBLE;   currcell = -1;   marbles_left--;   score.innerHTML = marbles_left + "/32";   game_over = isGameOver();   if (game_over)   {     clearInterval(gintervalid);     gintervalid = -1;     newbut.value = "S T A R T";     alert("********* !! G A M E   O V E R !! *********\n\n" +           ((marbles_left > 5) ? msgs[0] : msgs[marbles_left]) + "\n\n" +           "No. of marbles left: " + marbles_left + "\n" +           "Time Elapsed: " + gtime + " secs"          );     gtime = 0;   } } function canMove(n) {     if (b[n] != MARBLE) return false;     //does a marble plus hole combination exists left, right, up or down?     return (b[n-2]==HOLE && b[n-1]==MARBLE) ||            (b[n+2]==HOLE && b[n+1]==MARBLE) ||            (b[n-18]==HOLE && b[n-9]==MARBLE) ||            (b[n+18]==HOLE && b[n+9]==MARBLE); } function isGameOver() {   var moveable = false;   for(y=1;y<8;y++)     for(x=1;x<8;x++)       if (canMove(y * 9 + x)) return false;   return true; } function hit(n) {   if (gintervalid == -1) //if game is not running, start it   {     gintervalid = setInterval("tick()",1000);     tick();     newbut.value = "S T O P !";   }   if (b[n] == MARBLE)   {     if (currcell!=-1) setMarble(currcell);     setHilite(n);     currcell = n;   }   if (b[n] == HOLE)   {     if (currcell == -1)     {       alert("Please select a marble to move");       return;     }     if (currcell - n == 2) move(currcell,n+1,n);          else if (n - currcell == 2) move(currcell,n-1,n);     else if (n - currcell == 18) move(currcell,n-9,n);          else if (currcell - n == 18) move(currcell,n+9,n);     else alert("Sorry. Invalid move!\n\n" +                "You can move the selected marble only to\n" +                "a hole that is exactly one marble away.\n\n" +                "Diagonal moves are not allowed.");   } } function dropped() {   var imgid = document.elementFromPoint(event.clientX,event.clientY).id;      var d = imgid.match(/c(\d+)/); //extract value for i from the cell id   if (d != null) hit(parseInt(d[1])); } function newGame() {   if (gintervalid==-1) //game is stopped, so start it.   {     if (game_over || (gtime != 0 && !confirm("Do you wish to continue with the old game?\n\nClick 'Cancel' to start a new game.")))     {       gtime = 0;           boardarea.innerHTML=drawBoard();       game_over = false;     }     gintervalid = setInterval("tick()",1000);     tick();     newbut.value = "S T O P !";   }   else //game running, stop it   {     //stop it!     clearInterval(gintervalid);     gintervalid = -1;     newbut.value = "S T A R T";   } } function drawBoard() {   var i, x, y, s, func;   copyArray(a,b);      marbles_left = 32;   s = "<table border=0  cellspacing=0 cellpadding=0>";   for(y=1;y<8;y++)   {     s += "<tr>";     for(x=1;x<8;x++)     {       i = y * 9 + x;       func = 'onmousedown="hit(' + i + ')"'              + ' ondragend="dropped()"';       if (i==10 || i == 16 || i==55 || i==60)       {         s += "<td width=120 height=120 colspan=2 rowspan=2 valign=bottom align=right>";         if (i == 60)            s += "<table cellpadding=0 cellspacing=0><tr><td class=info align=right>Marbles Left:</td></tr>" +                "<tr><td id=score class=score align=center>32/32</td></tr>" +                 "<tr><td id=elapsed class=elapsed align=center>&nbsp;</td></tr>" +  /*               "<tr><td class=elapsed>&nbsp;</td></tr>" + */                "<tr><td align=center>" +                "<input id=newbut type=button class=button value='S T A R T' onclick='newGame()'>" +                "<td></tr></table>";         s += "</td>";       }       else if (b[i] != INVALID)       {         s += "<td>";         if (b[i]==MARBLE) s += '<img id=c' + i + ' src="marbles/marble_hole.gif" ' + func + '>';         if (b[i]==HOLE) s += '<img id=c' + i + ' src="marbles/hole.gif" ' + func + '>';         s += "</td>";       }     }     s += "</tr>";   }   s += "</table>";   return s; } </script> </head> <body bgcolor="black" text="white" background="images/bkg.gif"       onload="boardarea.innerHTML=drawBoard();"> <center> <h1>JS Games!</h1> <span class=msg>Copyright &copy; 2002-2004 Arun Narayanan</span><br> <a class=notelnk href="http://jsgames.sourceforge.net/">http://jsgames.sourceforge.net/</a> <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 background="images/framebase.gif">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> <td> <a href="http://www.microsoft.com/windows/ie/" target="_blank"><img border="0" src="images/ie.gif" alt="Download Internet Explorer"></a> </td></tr></table> </td></tr></table> <br> <table border=0 background='marbles/bkg4.gif' cellspacing=0 cellpadding=0 height=480 width=480> <tr><td valign=center align=center id=boardarea> </td></tr></table> <p> </center> <br> </body> </html>                     JavaScriptGame.zip( 115 k)