Игра Tic Tac Toe, которую могут играть между двумя клиент AP

Этот совет Java Swing иллюстрирует игра Крестики-нолики, которую могут играть между двумя апплеты клиента. Двумя клиентами подключенными к розетке. Таким образом, разработчик может настроить эту игру, которую должна играть по локальной сети или Интернета.


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() );

   }

}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>