java left logo
java middle logo
java right logo
 

Home arrow Java SE Tips
 
 
Main Menu
Home
Java Tutorials
Book Reviews
Java SE Tips
Java ME Tips
Java EE Tips
Other API Tips
Java Applications
Java Libraries
Java Games
Java Network
Java Forums
Java Blog




Most Visited Tips
Java SE Tips
Java ME Tips
Java EE Tips
Other API Tips
Java Applications
Java Libraries
Java Games
Book Reviews
Top Rated Tips
Java SE Tips
Java ME Tips
Java EE Tips
Other API Tips
Java Applications
Java Libraries
Java Games
Book Reviews


Statistics
Registered Users: 4094
Java SE Tips: 614
Java ME Tips: 202
Java EE Tips: 183
Other API Tips: 779
Java Applications: 298
Java Libraries: 209
Java Games: 16
Book Reviews:
 
 
 
A game of Tic-Tac-Toe that can be played between two client applets E-mail
User Rating: / 222
PoorBest 

This Java swing tip illustrates a game of Tic-Tac-Toe that can be played between two client applets. The two clients are connected through a socket. Therefore, developer may also customize this game to be played over a local network or internet.

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;

public class TicTacToeServer extends JFrame {

   private byte board[];
   private boolean xMove;
   private JTextArea output;
   private Player players[];
   private ServerSocket server;
   private int currentPlayer;

   public TicTacToeServer()
   {
      super"Tic-Tac-Toe Server" );

      board = new byte];
      xMove = true;
      players = new Player];
      currentPlayer = 0;
 
      // set up ServerSocket
      try {
         server = new ServerSocket5000);
      }
      catchIOException e ) {
         e.printStackTrace();
         System.exit);
      }

      output = new JTextArea();
      getContentPane().addoutput, BorderLayout.CENTER );
      output.setText"Server awaiting connections\n" );

      setSize300300 );
      show();
   }

   // wait for two connections so game can be played
   public void execute()
   {
      for int i = 0; i < players.length; i++ ) {
         try {
            players=
               new Playerserver.accept(), this, i );
            players].start();
         }
         catchIOException e ) {
            e.printStackTrace();
            System.exit);
         }
      }

      // Player X is suspended until Player O connects.
      // Resume player X now.          
      synchronized players] ) {
         players].threadSuspended = false;   
         players].notify();
      }
  
   }
   
   public void displayString s )
   {
      output.appends + "\n" );
   }
 
   // Determine if a move is valid.
   // This method is synchronized because only one move can be
   // made at a time.
   public synchronized boolean validMoveint loc,
                                          int player )
   {
      boolean moveDone = false;

      while player != currentPlayer ) {
         try {
            wait();
         }
         catchInterruptedException e ) {
            e.printStackTrace();
         }
      }

      if !isOccupiedloc ) ) {
         boardloc =
            (byte) ( currentPlayer == 'X' 'O' );
         currentPlayer = currentPlayer + 2;
         playerscurrentPlayer ].otherPlayerMovedloc );
         notify();    // tell waiting player to continue
         return true;
      }
      else 
         return false;
   }

   public boolean isOccupiedint loc )
   {
      if boardloc == 'X' || board loc == 'O' )
          return true;
      else
          return false;
   }

   public boolean gameOver()
   {
      // Place code here to test for a winner of the game
      return false;
   }

   public static void mainString args[] )
   {
      TicTacToeServer game = new TicTacToeServer();

      game.addWindowListenernew WindowAdapter() {
        public void windowClosingWindowEvent e )
            {
               System.exit);
            }
         }
      );

      game.execute();
   }
}

// Player class to manage each Player as a thread
class Player extends Thread {
   private Socket connection;
   private DataInputStream input;
   private DataOutputStream output;
   private TicTacToeServer control;
   private int number;
   private char mark;
   protected boolean threadSuspended = true;

   public PlayerSocket s, TicTacToeServer t, int num )
   {
      mark = num == 'X' 'O' );

      connection = s;
      
      try {
         input = new DataInputStream(
                    connection.getInputStream() );
         output = new DataOutputStream(
                    connection.getOutputStream() );
      }
      catchIOException e ) {
         e.printStackTrace();
         System.exit);
      }

      control = t;
      number = num;
   }

   public void otherPlayerMovedint loc )
   {
      try {
         output.writeUTF"Opponent moved" );
         output.writeIntloc );
      }
      catch IOException e ) { e.printStackTrace()}
   }

   public void run()
   {
      boolean done = false;

      try {
         control.display"Player " +
            number == 'X' 'O' " connected" );
         output.writeCharmark );
         output.writeUTF"Player " +
            number == "X connected\n" :
                            "O connected, please wait\n" ) );

         // wait for another player to arrive
         if mark == 'X' ) {
            output.writeUTF"Waiting for another player" );

            try {
               synchronizedthis ) {   
                  while threadSuspended )
                     wait();  
               }
            
            catch InterruptedException e ) {
               e.printStackTrace();
            }

            output.writeUTF(
               "Other player connected. Your move." );
         }

         // Play game
         while !done ) {
            int location = input.readInt();

            if control.validMovelocation, number ) ) {
               control.display"loc: " + location );
               output.writeUTF"Valid move." );
            }
            else 
               output.writeUTF"Invalid move, try again" );

            if control.gameOver() )
               done = true;
         }         

         connection.close();
      }
      catchIOException e ) {
         e.printStackTrace();
         System.exit);
      }
   }
}                                                         

// Client for the TicTacToe program
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;

// Client class to let a user play Tic-Tac-Toe with
// another user across a network.
public class TicTacToeClient extends JApplet
                             implements Runnable {
   private JTextField id;
   private JTextArea display;
   private JPanel boardPanel, panel2;
   private Square board[][], currentSquare;
   private Socket connection;
   private DataInputStream input;
   private DataOutputStream output;
   private Thread outputThread;
   private char myMark;
   private boolean myTurn;

   // Set up user-interface and board
   public void init()
   {
      display = new JTextArea430 );
      display.setEditablefalse );
      getContentPane().addnew JScrollPanedisplay ),
                            BorderLayout.SOUTH );

      boardPanel = new JPanel();
      GridLayout layout = new GridLayout330);
      boardPanel.setLayoutlayout );

      board = new Square][ ];

      // When creating a Square, the location argument to the
      // constructor is a value from 0 to 8 indicating the
      // position of the Square on the board. Values 0, 1,
      // and 2 are the first row, values 3, 4, and 5 are the
      // second row. Values 6, 7, and 8 are the third row.
      for int row = 0; row < board.length; row++ )
      {
         for int col = 0;
                   col < boardrow ].length; col++ ) {
            boardrow ][ col =
               new Square' ', row * + col );
            boardrow ][ col ].addMouseListener(
               new SquareListener(
                  this, boardrow ][ col ] ) );

            boardPanel.addboardrow ][ col ] );        
         }
      }

      id = new JTextField();
      id.setEditablefalse );
      
      getContentPane().addid, BorderLayout.NORTH );
      
      panel2 = new JPanel();
      panel2.addboardPanel, BorderLayout.CENTER );
      getContentPane().addpanel2, BorderLayout.CENTER );
   }

   // Make connection to server and get associated streams.
   // Start separate thread to allow this applet to
   // continually update its output in text area display.
   public void start()
   {
      try {
         connection = new Socket(
            InetAddress.getByName"127.0.0.1" )5000 );
         input = new DataInputStream(
                        connection.getInputStream() );
         output = new DataOutputStream(
                        connection.getOutputStream() );
      }
      catch IOException e ) {
         e.printStackTrace();         
      }

      outputThread = new Threadthis );
      outputThread.start();
   }

   // Control thread that allows continuous update of the
   // text area display.
   public void run()
   {
      // First get player's mark (X or O)
      try {
         myMark = input.readChar();
         id.setText"You are player \"" + myMark + "\"" );
         myTurn = myMark == 'X' true  false );
      }
      catch IOException e ) {
         e.printStackTrace();         
      }

      // Receive messages sent to client
      while true ) {
         try {
            String s = input.readUTF();
            processMessage);
         }
         catch IOException e ) {
            e.printStackTrace();         
         }
      }
   }

   // Process messages sent to client
   public void processMessageString s )
   {
      if s.equals"Valid move." ) ) {
         display.append"Valid move, please wait.\n" );
         currentSquare.setMarkmyMark );
         currentSquare.repaint();
      }
      else if s.equals"Invalid move, try again" ) ) {
         display.appends + "\n" );
         myTurn = true;
      }
      else if s.equals"Opponent moved" ) ) {
         try {
            int loc = input.readInt();
 
            boardloc / ][ loc % ].setMark(
                  myMark == 'X' 'O' 'X' ) );
            boardloc / ][ loc % ].repaint();
                 
            display.append(
               "Opponent moved. Your turn.\n" );
            myTurn = true;
         }
         catch IOException e ) {
            e.printStackTrace();         
         }
      }
      else
         display.appends + "\n" );

      display.setCaretPosition(
         display.getText().length() );
   }

   public void sendClickedSquareint loc )
   {
      if myTurn )
         try {
            output.writeIntloc );
            myTurn = false;
         }
         catch IOException ie ) {
            ie.printStackTrace();         
         }
   }

   public void setCurrentSquareSquare s )
   {
      currentSquare = s;
   }
}

// Maintains one square on the board
class Square extends JPanel {
   private char mark;
   private int location;

   public Squarechar m, int loc)
   {
      mark = m;
      location = loc;
      setSize 3030 );
      
      setVisible(true);
   }

   public Dimension getPreferredSize() { 
      return new Dimension3030 ) );
   }

   public Dimension getMinimumSize() {
      return getPreferredSize() );
   }

   public void setMarkchar ) { mark = c; }

   public int getSquareLocation() { return location; }

   public void paintComponentGraphics g )
   {
      super.paintComponent);
      g.drawRect002929 );
      g.drawStringString.valueOfmark )1120 );   
   }
}

class SquareListener extends MouseAdapter {
   private TicTacToeClient applet;
   private Square square;

   public SquareListenerTicTacToeClient t, Square s )
   {
      applet = t;
      square = s;
   }

   public void mouseReleasedMouseEvent e )
   {
      applet.setCurrentSquaresquare );
      applet.sendClickedSquaresquare.getSquareLocation() );
   }
}


 Related Tips

 
< Prev   Next >

Page 1 of 0 ( 0 comments )

You can share your information about this topic using the form below!

Please do not post your questions with this form! Thanks.


Name (required)


E-Mail (required)

Your email will not be displayed on the site - only to our administrator
Homepage(optional)



Comment Enable HTML code : Yes No



 
       
         
     
 
 
 
   
 
 
java bottom left
java bottom middle
java bottom right
RSS 0.91 FeedRSS 1.0 FeedRSS 2.0 FeedATOM FeedOPML Feed

Home - About Us - Privacy Policy
Copyright 2005 - 2008 www.java-tips.org
Java is a trademark of Sun Microsystems, Inc.