spacer

Webref WebRef   Sitemap · Experts · Tools · Services · Newsletters · About i.com

home / experts / javascript / column24


The Connect Three game

Developer News
Mandrake Linux Founder Back, Virtually
Amazon: We're a Technology Company
Sun Expands MySQL With Closed Source

In our previous column, DHTML Behaviors, we showed you how to author a Behavior-based version of the classic Connect Three game. We use this game to demonstrate the Behavior-based persistence. In order to avoid confusion between the Behaviors from our previous column, DHTML Behaviors, and the persistence ones, we have rewritten the game so it does not use any scriptlet or non-persistence-related Behaviors. The rules of the game are very simple. There are two opponents, one playing the "x" pieces, and the other one playing the "o" pieces. They take turns in placing their pieces on a 3x3 grid. The objective of the game is to construct a row, a column, or a diagonal of identical pieces. A tie is declared when the board is fully populated.

The body of the HTML page includes nine <IMG> tags:

<IMG ID="box11" onClick="handleBoxClick(1,1)" SRC="initialbutton.gif">
<IMG ID="box21" onClick="handleBoxClick(2,1)" SRC="initialbutton.gif"> 
<IMG ID="box31" onClick="handleBoxClick(3,1)" SRC="initialbutton.gif"><BR>  
<IMG ID="box12" onClick="handleBoxClick(1,2)" SRC="initialbutton.gif">
<IMG ID="box22" onClick="handleBoxClick(2,2)" SRC="initialbutton.gif"> 
<IMG ID="box32" onClick="handleBoxClick(3,2)" SRC="initialbutton.gif"><BR>
<IMG ID="box13" onClick="handleBoxClick(1,3)" SRC="initialbutton.gif"> 
<IMG ID="box23" onClick="handleBoxClick(2,3)" SRC="initialbutton.gif"> 
<IMG ID="box33" onClick="handleBoxClick(3,3)" SRC="initialbutton.gif">

Notice the ID attribute. The ID value includes the string "box" appended to the i and j indices of the box' row and column, respectively. The grid structure is simply built by going to a new line every three boxes. The onClick event handler is handleBoxClick(i,j). Initially, all boxes have the same SRC attribute, the GIF of an empty box.

Let's look closer at the handleBoxClick() event handler:

function handleBoxClick(i, j) {
    if (eval("box" + i + j + ".src").indexOf('initialbutton.gif') < 0) return;
    if (lastPlayedBy == "o") {
      eval("document.all.box" + i + j + ".src = 'xbutton.gif'");
      lastPlayedBy = "x";
    } 
    else {  // lastPlayedBy = "x"
      eval("document.all.box" + i + j + ".src = 'obutton.gif'");
      lastPlayedBy = "o";
    }
    grid[i][j] = lastPlayedBy;
    if (rowComplete()) {
      alert("The " + lastPlayedBy + " wins");
      window.location.reload();
    }
    else if (itsAtie()) {
           alert("It's a tie");
           window.location.reload();
         }
}

The first line checks that the user did click on a non-occupied box:

    if (eval("box" + i + j + ".src").indexOf('initialbutton.gif') < 0) return;

Notice how we rebuild the ID of the <IMG> tag. Once a string is constructed ("box" + i + j + ".src"), the src property needs to be evaluated by the eval() function. A test is then conducted if this property is equal to initialbutton.gif, the GIF for empty boxes.

The global variable lastPlayedBy denotes the last player identity, "o" or "x." The new player is assigned, and the GIF is replaced, accordingly:

    if (lastPlayedBy == "o") {
      eval("document.all.box" + i + j + ".src = 'xbutton.gif'");
      lastPlayedBy = "x";
    } 
    else {  // lastPlayedBy = "x"
      eval("document.all.box" + i + j + ".src = 'obutton.gif'");
      lastPlayedBy = "o";
    }

Each element of the grid array holds the game piece currently stored in, "o" or "x." After updating it (grid[i][j] = lastPlayedBy;), the function checks for a row, column, or diagonal completion, by calling the rowComplete() function. Similarly, a tie is detected by calling the itsAtie() function.

The function rowComplete() is somewhat long but straightforward nonetheless. We pick one pivot square and compare it with the other two along its row, column, or diagonal. We show here the diagonal check:

  lastPlayedBy = grid[1][1];
  if ((lastPlayedBy != "") && 
      (grid[2][2] == lastPlayedBy) &&
      (grid[3][3] == lastPlayedBy)) return(true);

A tie is tested for by looping over all grid boxes and checking that there are no empty ones:

function itsAtie() {
  for( var i = 1; i <= 3; i++)
    for( var j = 1; j <= 3; j++)
      if (grid[i][j] == "") return(false);
  return(true);
}

The initialization section includes the arbitrary assignment of lastPlayedBy to "x," the creation of the 3x3 grid array, and the initialization of this array with empty strings:

var lastPlayedBy = "x";
var grid = new Array();
grid[1] = new Array();
grid[2] = new Array();
grid[3] = new Array();

for (var i = 1; i <= 3; i++)
  for (var j = 1; j <= 3; j++)
    grid[i][j] = "";

The full script can be found towards the end of the column, Non-persistent Connect Three game.

http://www.internet.com

internet.comearthweb.comDevx.commediabistro.comGraphics.com

Search:

Jupitermedia Corporation has two divisions: Jupiterimages and JupiterOnlineMedia

Jupitermedia Corporate Info

Legal Notices, Licensing, Reprints, Permissions, Privacy Policy.
Advertise | Newsletters | Tech Jobs | Shopping | E-mail Offers

Whitepapers and eBooks

Intel Whitepaper: Comparing Two- and Four-Socket Platforms for Server Virtualization
IBM Solutions Brief: Go Green With IBM System xTM And Intel
HP eBook: Simplifying SQL Server Management
IBM Contest: Are You the Next Superstar? Join the "Search for the XML Superstar" Contest to Find Out
Microsoft PDF: Top 10 Reasons to Move to Server Virtualization with Hyper-V
Microsoft PDF: Six Reasons Why Microsoft's Hyper-V Will Overtake Vmware
Microsoft Step-by-Step Guide: Hyper-V and Failover Clustering
Intel PDF: Quad-Core Impacts More Than the Data Center
Intel PDF: Virtualization Delivers Data Center Efficiency
Go Parallel Article: PDC 2008 in Review
Microsoft PDF: Top 11 Reasons to Upgrade to Windows Server 2008
Avaya Article: Communication-Enabled Mashups: Empowering Both Business Owners and IT
Intel Whitepaper: Building a Real-World Model to Assess Virtualization Platforms
  PDF: Intel Centrino Duo Processor Technology with Intel Core2 Duo Processor
Microsoft Article: Build and Run Virtual Machines with Hyper-V Server 2008
Go Parallel Article: Q&A with a TBB Junkie
IBM Whitepaper: Innovative Collaboration to Advance Your Business
Internet.com eBook: Real Life Rails
IBM eBook: The Pros and Cons of Outsourcing
Internet.com eBook: Best Practices for Developing a Web Site
IBM CXO Whitepaper: The 2008 Global CEO Study "The Enterprise of the Future"
Avaya Article: Call Control XML in Action - A CCXML Auto Attendant
IBM CXO Whitepaper: Unlocking the DNA of the Adaptable Workforce--The Global Human Capital Study 2008
Adobe Acrobat Connect Pro: Web Conferencing and eLearning Whitepapers
HP eBook: Guide to Storage Networking
MORE WHITEPAPERS, EBOOKS, AND ARTICLES
webref The latest from WebReference.com Browse >
Popular JavaScript Framework Libraries: An Overview - Part 3 · Accessing Your MySQL Database from the Web with PHP · Working with the DOM Stylesheets Collection
Sitemap · Experts · Tools · Services · Email a Colleague · Contact FREE Newsletters 
 The latest from internet.com
Crucial Triples Up With New Three-Channel DDR3 Kits · Meet the Finalists: Excellence in Technology Awards · Tealeaf Offers Insight to Mobile Customer Behavior


Created: August 28, 1998
Revised: August 28, 1998

URL: http://www.webreference.com/js/column24/connect3.html