<!----------------------------------------------------------------\
| |
| Fair License |
| |
| JS Games :: Tic-Tac-Toe |
| 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 :: Tic-Tac-Toe !!!</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 {font-size:8pt; margin:0px; font-weight:bold;}
.cell {width:54px; height:60px; border:3px solid #999999; font-size:32pt; font-weight:bold;
background-color:#606060; color:#ffffff;}
.tab {border:3px solid #999999; background-color:#999999;}
.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;}
.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;}
.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;}
.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 gtarget, ghi, gtries, gtime, gintervalid=-1;
function toggleHelp()
{
if (butHelp.value == "Hide Help")
{
help.style.display = "none";
butHelp.value = "Show Help";
}
else
{
help.style.display = "";
butHelp.value = "Hide Help";
}
}
/*
0 1 2
0|-----|
1| |
2|_____|
*/
var gcoords = new Array(
"000102",
"101112",
"202122",
"001020",
"011121",
"021222",
"001122",
"021120"
);
//random number between low and hi
function r(low,hi)
{
return Math.floor((hi-low)*Math.random()+low);
}
//random number between 0 and hi
function r0(hi)
{
return Math.floor((hi)*Math.random());
}
//random number between 1 and hi
function r1(hi)
{
return Math.floor((hi-1)*Math.random()+1);
}
function showMessage(msgstr,classname)
{
if (classname != null)
fldStatus.innerHTML = "<span class=" + classname + ">" + msgstr + "</span>";
else
fldStatus.innerHTML = msgstr;
}
function stopGame()
{
clearInterval(gintervalid);
gintervalid=-1;
}
function isMarked(obj)
{
if (obj.innerHTML == "")
return false;
else
return true;
}
function markCell(obj,symbol)
{
obj.innerHTML = symbol;
}
function getCell(row,col)
{
return eval("a_" + row + "_" + col);
}
function getMark(obj)
{
return obj.innerHTML;
}
function getMark(row,col)
{
return getCell(row,col).innerHTML;
}
function getMarkSpace(row,col)
{
var r = getCell(row,col).innerHTML;
if (r=="") r = " ";
return r;
}
function drawBoard()
{
var s, i, j;
s = "<table class=tab cellpadding=0 cellspacing=0>\n";
for (i=0;i<3;i++)
{
s += "<tr>\n";
for (j=0;j<3;j++)
s += "<td class=cell align=center id=a_" + i + "_" + j + " onclick=draw(this)></td>\n";
s += "</tr>\n";
}
s += "</table>";
board.innerHTML = s;
}
function toArray(coords)
{
var arr = new Array();
for (var i=0;i<6;i++)
{
arr[i] = parseInt(coords.substr(i,1));
}
return arr;
}
//Returns the blank cell in the first line where two cells are
//already filled with 'X' or 'O'. Returns null if match not found
function getTwoInLineCell(symbol)
{
var s, arr;
for (var i=0;i<gcoords.length;i++)
{
s = getLine(gcoords[i]);
arr = toArray(gcoords[i]);
if ( (symbol=="X" && s=="XX ") || (symbol=="O" && s=="OO ") )
return getCell(arr[4],arr[5]);
if ( (symbol=="X" && s=="X X") || (symbol=="O" && s=="O O") )
return getCell(arr[2],arr[3]);
if ( (symbol=="X" && s==" XX") || (symbol=="O" && s==" OO") )
return getCell(arr[0],arr[1]);
}
return null;
}
//Returns a blank cell (random) in the first line where one cell
//is already filled with 'X' or 'O' and the other two are blank.
//Returns null if no such match is found
function getOneInLineCell(symbol)
{
var s, arr;
for (var i=0;i<gcoords.length;i++)
{
s = getLine(gcoords[i]);
arr = toArray(gcoords[i]);
if ( (symbol=="X" && s=="X ") || (symbol=="O" && s=="O ") )
return (r0(2)==0) ? getCell(arr[2],arr[3]) : getCell(arr[4],arr[5]);
if ( (symbol=="X" && s==" X") || (symbol=="O" && s==" O") )
return (r0(2)==0) ? getCell(arr[2],arr[3]) : getCell(arr[0],arr[1]);
if ( (symbol=="X" && s==" X ") || (symbol=="O" && s==" O ") )
return (r0(2)==0) ? getCell(arr[0],arr[1]) : getCell(arr[4],arr[5]);
}
return null;
}
function getRandomFreeCell()
{
var i,j,row=new Array(),col=new Array(),c=-1,n;
if (getMark(1,1)=="") return getCell(1,1);
for (i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
if (getMark(i,j)=="")
{
c++;
row[c] = i;
col[c] = j;
}
}
}
if (c == -1) return null;
n = r0(c+1);
return getCell(row[n],col[n]);
}
function getLine(coords)
{
var a = toArray(coords);
return getMarkSpace(a[0],a[1]) + getMarkSpace(a[2],a[3]) + getMarkSpace(a[4],a[5]);
}
function isGameOver()
{
var s;
for (var i=0;i<gcoords.length;i++)
{
s = getLine(gcoords[i]);
if (s=="XXX")
{
showMessage("Game Over! You have won it!<br>Time Taken: " + gtime + " secs","success");
stopGame();
return true;
}
if (s=="OOO")
{
showMessage("Game Over! Sorry, you have lost it!<br>Time Taken: " + gtime + " secs","success");
stopGame();
return true;
}
}
return false;
}
function draw(obj)
{
var cell;
if (gintervalid == -1)
{
alert("Please press the \"Start Game\" button to start a new game.");
return;
}
if (isMarked(obj)) return; //exit if already marked
markCell(obj,"X");
if (isGameOver()) return;
cell = getTwoInLineCell("O");
if (cell != null) //found two O's and a blank in a line
{
markCell(cell,"O");
if (isGameOver()) return; //always returns!
}
cell = getTwoInLineCell("X");
if (cell != null) //found two X's and a blank in a line; block it!
{
markCell(cell,"O");
return;
}
cell = getOneInLineCell("O");
if (cell != null)
{
markCell(cell,"O");
return;
}
cell = getRandomFreeCell();
if (cell != null)
{
markCell(cell,"O");
return;
}
else //no free cells available
{
showMessage("Game Over! It's a TIE!","success");
stopGame();
}
}
function startGame()
{
gtime = 0;
drawBoard()
showMessage("");
clearInterval(gintervalid);
gintervalid = setInterval("tick()",1000);
tick();
}
function tick()
{
gtime++;
showMessage("Time: " + gtime + " secs","progress");
}
</script>
</head>
<body bgcolor="black" text="white" onload="toggleHelp();drawBoard()" background="images/bkg.gif">
<center>
<h1>JS Games!</h1>
<span class=msg>Copyright © 2002-2004 Arun Narayanan</span><br>
<a class=notelnk href="http://jsgames.sourceforge.net/">http://jsgames.sourceforge.net/</a>
<br>
<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 width=620 height=47 border=0 cellpadding=0 cellspacing=0 bgcolor="#606060">
<tr><td colspan=4 height=31 background="images/framebase.gif"><img src="images/clear.gif" height=31></td></tr>
<tr>
<td width=8> </td><td class=h2 align=center width=98%>Tic-Tac-Toe</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 background="images/body.gif" border=0 cellpadding=0 cellspacing=0 bgcolor="#606060">
<tr><td height="10"><img src="images/clear.gif" height=10></td></tr>
<tr><td class=help>
<ol>
<li>Press the "Start Game" button to start the game.</li>
<li>Click on any of the 9 cells on the board to mark a cross.</li>
<li>The computer would put a round in another cell.</li>
<li>The objective of the game is to complete a line (vertical, horizontal or diagonal).</li>
<li>The one who completes a line first wins.</li>
</ol>
</td></tr>
</table>
<table width=620 background="images/bottom.gif" border=0 cellpadding=0 cellspacing=0 bgcolor="#606060">
<tr><td height=29><td valign=middle align=center>
<h3>Complete a line in the shortest time...</h3>
</td></tr>
</table>
<p>
<table class=board>
<tr>
<td align=center>
<input class=but type=button value="Start Game" id=butStart onclick="startGame();">
</td>
</tr>
<tr>
<td align=center><br><div id=fldStatus class=progress></div><br></td>
</tr>
<tr>
<td align=center>
<div id=board><div>
</td>
</tr>
</table>
</center>
<br>
<p>
</center>
</body>
</html>
|