Problemas com código programa Jogo da velha

1 resposta
D
Pessoal estou tendo problemas com o código do programa do Jogo da Velha que vem no CD do livro Java Como Programar dos irmãos Deitel. Acontece que tanto no arquivo TicTacToeClient.java como no TicTacToeServer.java aparece um erro nas linhas onde tenho:
output.format(  );
Segue abaixo o código do arquivo TicTacToeClient.java no qual o erro aparece na linha onde tenho o seguinte código:
output.format( "%d\n", location );
// Fig. 24.15: TicTacToeClient.java
// Classe cliente para deixar um usuário jogar o jogo-da-velha com um outro usuário por uma rede.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.Socket;
import java.net.InetAddress;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.util.Formatter;
import java.util.Scanner;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

public class TicTacToeClient extends JFrame implements Runnable 
{
   private JTextField idField; // campo de texto para exibir a marca do jogador
   private JTextArea displayArea; // JTextArea para exibir a saída
   private JPanel boardPanel; // painel para o tabuleiro do jogo-da-velha
   private JPanel panel2; // painel para conter o tabuleiro
   private Square board[][]; // tabuleiro do jogo-da-velha
   private Square currentSquare; // quadrado atual
   private Socket connection; // conexão com o servidor
   private Scanner input; // entrada a partir do servidor
   private Formatter output; // saída para o servidor
   private String ticTacToeHost; // nome do host para o servidor
   private String myMark; // marca desse cliente
   private boolean myTurn; // determina de qual cliente é a vez
   private final String X_MARK = "X"; // marca para o primeiro cliente
   private final String O_MARK = "O"; // marca para o segundo cliente

   // configura a interface com o usuário e o tabuleiro
   public TicTacToeClient( String host )
   { 
      ticTacToeHost = host; // configura o nome do servidor
      displayArea = new JTextArea( 4, 30 ); // configura JTextArea
      displayArea.setEditable( false );
      add( new JScrollPane( displayArea ), BorderLayout.SOUTH );

      boardPanel = new JPanel(); // configura o painel para os quadrados no tabuleiro
      boardPanel.setLayout( new GridLayout( 3, 3, 0, 0 ) );

      board = new Square[ 3 ][ 3 ]; // cria o tabuleiro

      // faz um loop pelas linhas no tabuleiro
      for ( int row = 0; row < board.length; row++ ) 
      {
         // faz um loop pelas colunas no tabuleiro
         for ( int column = 0; column < board[ row ].length; column++ ) 
         {
            // cria um quadrado
            board[ row ][ column ] = new Square( " ", row * 3 + column );
            boardPanel.add( board[ row ][ column ] ); // adiciona um quadrado
         } // fim do for interno
      } // fim do for externo

      idField = new JTextField(); // configura o campo de texto
      idField.setEditable( false );
      add( idField, BorderLayout.NORTH );
      
      panel2 = new JPanel(); // configure o painel que irá conter o boardPanel
      panel2.add( boardPanel, BorderLayout.CENTER ); // adiciona o painel do tabuleiro
      add( panel2, BorderLayout.CENTER ); // adiciona o painel contêiner

      setSize( 300, 225 ); // configura o tamanho da janela
      setVisible( true ); // mostra a janela

      startClient();
   } // fim do construtor TicTacToeClient

   // inicia a thread do cliente
   public void startClient()
   {
      try // conecta-se ao servidor, obtém os fluxos e inicia o outputThread
      {
         // faz uma conexão com o servidor
         connection = new Socket(                           
            InetAddress.getByName( ticTacToeHost ), 12345 );

         // obtém os fluxos de entrada e saída
         input = new Scanner( connection.getInputStream() );    
         output = new Formatter( connection.getOutputStream() );
      } // fim do try
      catch ( IOException ioException )
      {
         ioException.printStackTrace();
      } // fim do catch

      // cria e inicia a thread de trabalhador para esse cliente
      ExecutorService worker = Executors.newFixedThreadPool( 1 );
      worker.execute( this ); // executa o cliente
   } // fim do método startClient

   // thread de controle que permite atualização contínua da displayArea
   public void run()
   {
      myMark = input.nextLine(); // obtém a marca do jogador (X ou O)

      SwingUtilities.invokeLater( 
         new Runnable() 
         {         
            public void run()
            {
               // exibe a marca do jogador
               idField.setText( "You are player \"" + myMark + "\"" );
            } // fim do método run
         } // fim da classe interna anônima
      ); // fim da chamada para SwingUtilities.invokeLater
         
      myTurn = ( myMark.equals( X_MARK ) ); // determina se a vez do cliente

      // recebe as mensagens enviadas para o cliente e gera saída delas
      while ( true ) 
      {
         if ( input.hasNextLine() )
            processMessage(input.nextLine());
      } // fim do while
   } // fim do método run

   // processa as mensagens recebidas pelo cliente
   private void processMessage( String message )
   {
      // ocorreu uma jogada válida
      if ( message.equals( "Valid move." ) ) 
      {
         displayMessage( "Valid move, please wait.\n" );
         setMark( currentSquare, myMark ); // configura a marca no quadrado
      } // fim do if
      else if ( message.equals( "Invalid move, try again" ) ) 
      {
         displayMessage( message + "\n" ); // exibe jogada inválida
         myTurn = true; // ainda é a vez desse cliente
      } // fim de else if
      else if ( message.equals( "Opponent moved" ) ) 
      {
         int location = input.nextInt(); // obtém a posição da jogada
         input.nextLine(); // pula uma nova linha depois da posição de int
         int row = location / 3; // calcula a linha
         int column = location % 3; // calcula a coluna

         setMark(  board[ row ][ column ], 
            ( myMark.equals( X_MARK ) ? O_MARK : X_MARK ) ); // marca a jogada
         displayMessage( "Opponent moved. Your turn.\n" );
         myTurn = true; // agora é a vez desse cliente
      } // fim de else if
      else
         displayMessage( message + "\n" ); // exibe a mensagem
   } // fim do método processMessage

   // manipula outputArea na thread de despacho de eventos
   private void displayMessage( final String messageToDisplay )
   {
      SwingUtilities.invokeLater(
         new Runnable() 
         {
            public void run() 
            {
               displayArea.append( messageToDisplay ); // atualiza a saída
            } // fim do método run
         }  // fim da classe inner
      ); // fim da chamada para SwingUtilities.invokeLater
   } // fim do método displayMessage

   // método utilitário para configurar a marca sobre o tabuleiro na thread de despacho de eventos
   private void setMark( final Square squareToMark, final String mark )
   {
      SwingUtilities.invokeLater(
         new Runnable() 
         {
            public void run()
            {
               squareToMark.setMark( mark ); // configura a marca no quadrado
            } // fim do método run
         } // fim da classe interna anônima
      ); // fim da chamada para SwingUtilities.invokeLater
   } // fim do método setMark

   // envia mensagem para o servidor indicando o quadrado clicado
   public void sendClickedSquare( int location )
   {
      // se for minha vez
      if ( myTurn ) 
      {
         output.format( "%d\n", location ); // envia a posição ao servidor
         output.flush();                                              
         myTurn = false; // não é minha vez
      } // fim do if
   } // fim do método sendClickedSquare

   // configura o Squareatual
   public void setCurrentSquare( Square square )
   {
      currentSquare = square; // configura o quadrado atual para o argumento
   } // fim do método setCurrentSquare

   // classe interna privada para os quadrados no tabuleiro
   private class Square extends JPanel 
   {
      private String mark; // marca a ser desenhada nesse quadrado
      private int location; // posição do quadrado
   
      public Square( String squareMark, int squareLocation )
      {
         mark = squareMark; // configura a marca para esse quadrado
         location = squareLocation; // configura a posição desse quadrado

         addMouseListener( 
            new MouseAdapter()
            {
               public void mouseReleased( MouseEvent e )
               {
                  setCurrentSquare( Square.this ); // configura o quadrado atual

                  // envia a posição desse quadrado
                  sendClickedSquare( getSquareLocation() );
               } // fim do método mouseReleased
            } // fim da classe interna anônima
         ); // fim da chamada para addMouseListener
      } // fim do construtor Square

      // retorno o tamanho preferido de Square
      public Dimension getPreferredSize() 
      { 
         return new Dimension( 30, 30 ); // retorna o tamanho preferido 
      } // fim do método getPreferredSize         

      // retorna o tamanho mínimo de Square
      public Dimension getMinimumSize() 
      {
         return getPreferredSize(); // retorna o tamanho preferido 
      } // fim do método getMinimumSize     

      // configura a marca para Square
      public void setMark( String newMark ) 
      { 
         mark = newMark; // configura a marca do quadrado
         repaint(); // repinta o quadrado
      } // fim do método setMark
   
      // retorna a posição de Square
      public int getSquareLocation() 
      {
         return location; // retorna a posição do quadrado
      } // fim do método getSquareLocation
   
      // desenha Square
      public void paintComponent( Graphics g )
      {
         super.paintComponent( g );

         g.drawRect( 0, 0, 29, 29 ); // desenha o quadrado
         g.drawString( mark, 11, 20 ); // desenha a marca
      } // fim do método paintComponent
   } // fim da classe interna Square
} // fim da classe TicTacToeClient
No erro aparece que o método format aceita String e object[] e não String e int como no caso. Já tentei alterar mais não funcionou. Agradeço se alguém puder me dar uma dica de como resolver este problema.

1 Resposta

I

Aqui funcionou de boa… pode ser a versão do seu compilador…

Criado 29 de março de 2006
Ultima resposta 29 de abr. de 2006
Respostas 1
Participantes 2