Tic Tac Toe game : Applet « Development « Java Tutorial

Java Tutorial
1. Language
2. Data Type
3. Operators
4. Statement Control
5. Class Definition
6. Development
7. Reflection
8. Regular Expressions
9. Collections
10. Thread
11. File
12. Generics
13. I18N
14. Swing
15. Swing Event
16. 2D Graphics
17. SWT
18. SWT 2D Graphics
19. Network
20. Database
21. Hibernate
22. JPA
23. JSP
24. JSTL
25. Servlet
26. Web Services SOA
27. EJB3
28. Spring
29. PDF
30. Email
31. J2ME
32. J2EE Application
33. XML
34. Design Pattern
35. Log
36. Security
37. Apache Common
38. Ant
39. JUnit
Java
Java Source Code / Java Documentation
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
Photoshop Tutorials
Maya Tutorials
Flash Tutorials
3ds-Max Tutorials
Illustrator Tutorials
GIMP Tutorials
C# / C Sharp
C# / CSharp Tutorial
C# / CSharp Open Source
ASP.Net
ASP.NET Tutorial
JavaScript DHTML
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
Ruby
PHP
Python
Python Tutorial
Python Open Source
SQL Server / T-SQL
SQL Server / T-SQL Tutorial
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Flash / Flex / ActionScript
VBA / Excel / Access / Word
XML
XML Tutorial
Microsoft Office PowerPoint 2007 Tutorial
Microsoft Office Excel 2007 Tutorial
Microsoft Office Word 2007 Tutorial
Java Tutorial » Development » Applet 
6. 28. 9. Tic Tac Toe game
File: test.htm
<title>TicTacToe</title>
<hr>
<applet code=TicTacToe.class width=120 height=120>
</applet>



File: TicTacToe.java

/*
 * @(#)TicTacToe.java 1.2 95/10/13 
 *
 * Copyright (c) 1994-1996 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
 * without fee is hereby granted. 
 * Please refer to the file http://java.sun.com/copy_trademarks.html
 * for further important copyright and trademark information and to
 * http://java.sun.com/licensing.html for further important licensing
 * information for the Java (tm) Technology.
 
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 
 * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
 * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
 * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
 * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
 * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
 * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
 * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
 * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
 * HIGH RISK ACTIVITIES.
 */

import java.awt.*;
import java.awt.image.*;
import java.net.*;
import java.applet.*;

/**
 * A TicTacToe applet. A very simple, and mostly brain-dead
 * implementation of your favorite game! 
 *
 * In this game a position is represented by a white and black
 * bitmask. A bit is set if a position is ocupied. There are
 * 9 squares so there are 1<<9 possible positions for each
 * side. An array of 1<<9 booleans is created, it marks
 * all the winning positions.
 *
 @version   1.2, 13 Oct 1995
 @author Arthur van Hoff
 * @modified 96/04/23 Jim Hagen : winning sounds
 */
public
class TicTacToe extends Applet {
    /**
     * White's current position. The computer is white.
     */
    int white;

    /**
     * Black's current position. The user is black.
     */
    int black;

    /**
     * The squares in order of importance...
     */
    final static int moves[] {402681357};

    /**
     * The winning positions.
     */
    static boolean won[] new boolean[<< 9];
    static final int DONE = (<< 91;
    static final int OK = 0;
    static final int WIN = 1;
    static final int LOSE = 2;
    static final int STALEMATE = 3;

    /**
     * Mark all positions with these bits set as winning.
     */
    static void isWon(int pos) {
  for (int i = ; i < DONE ; i++) {
      if ((i & pos== pos) {
    won[itrue;
      }
  }
    }

    /**
     * Initialize all winning positions.
     */
    static {
  isWon((<< 0(<< 1(<< 2));
  isWon((<< 3(<< 4(<< 5));
  isWon((<< 6(<< 7(<< 8));
  isWon((<< 0(<< 3(<< 6));
  isWon((<< 1(<< 4(<< 7));
  isWon((<< 2(<< 5(<< 8));
  isWon((<< 0(<< 4(<< 8));
  isWon((<< 2(<< 4(<< 6));
    }

    /**
     * Compute the best move for white.
     @return the square to take
     */
    int bestMove(int white, int black) {
  int bestmove = -1;
  
      loop:
  for (int i = ; i < ; i++) {
      int mw = moves[i];
      if (((white & (<< mw)) == 0&& ((black & (<< mw)) == 0)) {
    int pw = white | (<< mw);
    if (won[pw]) {
        // white wins, take it!
        return mw;
    }
    for (int mb = ; mb < ; mb++) {
        if (((pw & (<< mb)) == 0&& ((black & (<< mb)) == 0)) {
      int pb = black | (<< mb);
      if (won[pb]) {
          // black wins, take another
          continue loop;
      }
        }
    }
    // Neither white nor black can win in one move, this will do.
    if (bestmove == -1) {
        bestmove = mw;
    }
      }
  }
  if (bestmove != -1) {
      return bestmove;
  }

  // No move is totally satisfactory, try the first one that is open
  for (int i = ; i < ; i++) {
      int mw = moves[i];
      if (((white & (<< mw)) == 0&& ((black & (<< mw)) == 0)) {
    return mw;
      }
  }

  // No more moves
  return -1;
    }

    /**
     * User move.
     @return true if legal
     */
    boolean yourMove(int m) {
  if ((m < 0|| (m > 8)) {
      return false;
  }
  if (((black | white(<< m)) != 0) {
      return false;
  }
  black |= << m;
  return true;
    }

    /**
     * Computer move.
     @return true if legal
     */
    boolean myMove() {
  if ((black | white== DONE) {
      return false;
  }
  int best = bestMove(white, black);
  white |= << best;
  return true;
    }

    /**
     * Figure what the status of the game is.
     */
    int status() {
  if (won[white]) {
      return WIN;
  }
  if (won[black]) {
      return LOSE;
  }
  if ((black | white== DONE) {
      return STALEMATE;
  }
  return OK;
    }

    /**
     * Who goes first in the next game?
     */
    boolean first = true;

    /**
     * The image for white.
     */
    Image notImage;

    /**
     * The image for black.
     */
    Image crossImage;

    /**
     * Initialize the applet. Resize and load images.
     */
    public void init() {
  notImage = getImage(getClass().getResource("images/not.gif"));
  crossImage = getImage(getClass().getResource("images/cross.gif"));
    }

    /**
     * Paint it.
     */
    public void paint(Graphics g) {
  Dimension d = getSize();
  g.setColor(Color.black);
  int xoff = d.width / 3;
  int yoff = d.height / 3;
  g.drawLine(xoff, 0, xoff, d.height);
  g.drawLine(2*xoff, 02*xoff, d.height);
  g.drawLine(0, yoff, d.width, yoff);
  g.drawLine(02*yoff, d.width, 2*yoff);

  int i = 0;
  for (int r = ; r < ; r++) {
      for (int c = ; c < ; c++, i++) {
    if ((white & (<< i)) != 0) {
        g.drawImage(notImage, c*xoff + 1, r*yoff + 1this);
    else if ((black & (<< i)) != 0) {
        g.drawImage(crossImage, c*xoff + 1, r*yoff + 1this);
    }
      }
  }
    }

    /**
     * The user has clicked in the applet. Figure out where
     * and see if a legal move is possible. If it is a legal
     * move, respond with a legal move (if possible).
     */
    public boolean mouseUp(Event evt, int x, int y) {
  switch (status()) {
    case WIN:
    case LOSE:
    case STALEMATE:
      play(getClass().getResource("audio/return.au"));
      white = black = 0;
      if (first) {
    white |= << (int)(Math.random() 9);
      }
      first = !first;
      repaint();
      return true;
  }

  // Figure out the row/colum
  Dimension d = getSize();
  int c = (x * 3/ d.width;
  int r = (y * 3/ d.height;
  if (yourMove(c + r * 3)) {
      repaint();

      switch (status()) {
        case WIN:
    play(getClass().getResource("audio/yahoo1.au"));
    break;
        case LOSE:
    play(getClass().getResource("audio/yahoo2.au"));
    break;
        case STALEMATE:
    break;
        default:
    if (myMove()) {
        repaint();
        switch (status()) {
          case WIN:
      play(getClass().getResource("audio/yahoo1.au"));
      break;
          case LOSE:
      play(getClass().getResource("audio/yahoo2.au"));
      break;
          case STALEMATE:
      break;
          default:
      play(getClass().getResource("audio/ding.au"));
        }
    else {
        play(getClass().getResource("audio/beep.au"));
    }
      }
  else {
      play(getClass().getResource("audio/beep.au"));
  }
  return true;
    }

    public String getAppletInfo() {
  return "TicTacToe by Arthur van Hoff";
    }
}
6. 28. Applet
6. 28. 1. Applet
6. 28. 2. A real applet
6. 28. 3. Add JButton to JApplet
6. 28. 4. Access applet parameters
6. 28. 5. An Swing-based applet skeleton
6. 28. 6. Swing Applet
6. 28. 7. A simple Swing-based applet
6. 28. 8. Mini Appletviewer
6. 28. 9. Tic Tac Toe game
6. 28. 10. WeatherWizard JApplet
6. 28. 11. Change an applet background color
6. 28. 12. Read an applet parameters
6. 28. 13. Calling methods of an Applet from JavaScript code
6. 28. 14. Passing Parameters to Java Applet
6. 28. 15. Display message in browser status bar
6. 28. 16. System properties accessible to applets
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.