Introdução às Redes de Computadores/Jogo da Velha

Jogo da Velha com arquiteturar Cliente/Servidor

editar

Referencial teórico KUROSE,J. F.; ROSS,K. W. Redes de Computadores e a Internet - Uma abordagem top-down, 3ª Edição ;http://java.sun.com/;


Os códigos java abaixo possibilitam 2 usuários jogarem um jogo da velha pela internet. É uma arquitetura Cliente/Servidor, onde o usuário denominado servidor fica sempre disponível para uma conexão. Ele irá aceitar a conexão do cliente, criar o tabuleiro, e realizar a primeira jogada. Após realizar a primeira jogada, o servidor atualiza seu tabuleiro e envia os dados ao Cliente. Este, por sua vez, lê os dados recebidos, verifica se houve vencedores, e, em caso negativo, faz sua jogada, atualizando seu tabuleiro e enviado dados ao servidor. Em caso de vitória, é mostrada uma mensagem indicando quem venceu e o Cliente fecha as conexões.

Há uma série de melhorias a serem implementadas, como a parte gráfica e a possibilidade de escolher quem fará a primeira jogada, se o servidor ou o cliente.

FSM do Cliente

editar

Ficheiro:FSM CLIENTE2.JPG


FSM do Sevidor

editar

Ficheiro:FSM SERVIDOR2.JPG


Código do Cliente

editar
package jogovelha;

import java.io.*;
import java.net.*;

public class Cliente {
    private static JogoVelha jogo = new JogoVelha('X');

    public static void main(String[] args) throws Exception {
        
        String host = "127.0.0.1";
        int porta = 6666;
        String situacaoTabuleiro;
        
        System.out.println("Rodando...");
        System.out.println("Conectando com servidor...");
        
        Socket socketCliente = new Socket(host, porta);
        System.out.println("Conectado...");
        
        System.out.println("Criando cadeias...");
        
        BufferedReader entradaServidor = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));
        DataOutputStream saidaServidor = new DataOutputStream(socketCliente.getOutputStream());
        System.out.println("Cadeias criadas...");
        
        jogo.criarTabuleiro();
        
        while(true) {
            situacaoTabuleiro = entradaServidor.readLine();
            jogo.atualizarTabuleiro(situacaoTabuleiro);

            if(jogo.vitoria())
            {
                System.out.println("O servidor venceu!!!");
                break;
            }
            
            situacaoTabuleiro = jogo.jogada();
            
            saidaServidor.writeBytes(situacaoTabuleiro+"\n");
            
            if(jogo.vitoria())
            {
                System.out.println("O cliente venceu!!!");
                break;
            }
        }
        
        entradaServidor.close();
        saidaServidor.close();
        socketCliente.close();
    }
}

Código do Servidor

editar
package fodasekkk

import java.io.*;
import java.net.*;

public class Servidor {
    private static JogoVelha jogo = new JogoVelha('O');
    
    public static void main(String[] args) throws Exception {
        
        int porta = 6666;
        
        ServerSocket servidor = new ServerSocket(porta);
        
        
        while(true) {
            String situacaoTabuleiro;
            
            System.out.println("Esperando cliente...");
            Socket conexao = servidor.accept();
            System.out.println("Cliente Conectado...");
            
            BufferedReader entradaCliente = 
                    new BufferedReader(new InputStreamReader(conexao.getInputStream()));
            
            DataOutputStream saidaCliente = new DataOutputStream(conexao.getOutputStream());
            
            System.out.println("Cadeias criadas...");
            
            jogo.criarTabuleiro();
            jogo.mostrarTabuleiro();
            
            while(true) {
                situacaoTabuleiro = jogo.jogada();
                
                saidaCliente.writeBytes(situacaoTabuleiro+"\n");
                
                if(jogo.vitoria())
                {
                    System.out.println("O servidor venceu!!");
                    break;
                }
                
                situacaoTabuleiro = entradaCliente.readLine();
                jogo.atualizarTabuleiro(situacaoTabuleiro);

                if(jogo.vitoria())
                {
                    System.out.println("O cliente venceu!!!");
                    break;
                }
            }
        }
    }
}

Protocolo JogoVelha

editar
package jogovelha;

import java.io.*;

public class JogoVelha {
    private char[][] tabuleiro = new char[3][3];
    private char jogador;
    
    public JogoVelha() {}
    
    public JogoVelha(char jogador) {
        this.jogador = jogador;
    }
    
    public void criarTabuleiro() {
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                tabuleiro[i][j] = ' ';
    }
    
    public void mostrarTabuleiro() {
        System.out.println("O tabuleiro segue esquema abaixo: \n");
        
        for(int i=1;i<10;i++)
                if((i==3)||(i==6))
                    System.out.println(i+"\n----------");
                else if(i==9)
                    System.out.println(i);
                else
                    System.out.print(i+" | ");
        
        
        System.out.println("\n\nTabuleiro atual: ");
        
        for(int i=0;i<3;i++)
            for(int j=0;j<3;j++)
                if((i==0 && j==2)||(i==1 && j==2))
                    System.out.println(tabuleiro[i][j]+"\n----------");
                else if (i==2 && j==2)
                    System.out.println(tabuleiro[i][j]);
                else
                    System.out.print(tabuleiro[i][j]+" | ");
    }
    
    public String jogada() throws Exception {
        BufferedReader doUsuario = new BufferedReader(new InputStreamReader(System.in));
        String situacaoTabuleiro = "";
        String jogada;
        int jogadaInt; 
                
            do {
                System.out.print("Escolha a sua próxima jogada(1 a 9, 0 termina o jogo): ");
                jogada = doUsuario.readLine();
                try {
                    jogadaInt = Integer.parseInt(jogada);

                    if (Integer.signum(jogadaInt) == -1) {
                        jogadaInt = 10;
                        System.out.println("Essa jogada não é válida. Jogue Novamente.");
                    } else if(jogadaInt == 0)
                    {
                        System.exit(0);
                    }

                } catch (NumberFormatException e) {
                    jogadaInt = 10;
                    System.out.println("Essa jogada não é válida. Jogue Novamente.");
                }
            } while (jogadaInt > 9);

        switch (jogadaInt) {
            case (1):
                tabuleiro[0][0] = jogador;
                break;
            case (2):
                tabuleiro[0][1] = jogador;
                break;
            case (3):
                tabuleiro[0][2] = jogador;
                break;
            case (4):
                tabuleiro[1][0] = jogador;
                break;
            case (5):
                tabuleiro[1][1] = jogador;
                break;
            case (6):
                tabuleiro[1][2] = jogador;
                break;
            case (7):
                tabuleiro[2][0] = jogador;
                break;
            case (8):
                tabuleiro[2][1] = jogador;
                break;
            case (9):
                tabuleiro[2][2] = jogador;
                break;
        }

        mostrarTabuleiro();

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                situacaoTabuleiro += tabuleiro[i][j];
            }
        }
        
        return situacaoTabuleiro;
    }
    
    public void atualizarTabuleiro(String situacao) {
        int cont = 0;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                tabuleiro[i][j] = situacao.charAt(cont);
                cont++;
            }
        }
        
        mostrarTabuleiro();
    }
    
    public boolean vitoria() {
        if(tabuleiro[0][0]!=' ' && tabuleiro[0][0]==tabuleiro[0][1] && tabuleiro[0][1]==tabuleiro[0][2])
            return true;
        else if (tabuleiro[1][0]!=' ' && tabuleiro[1][0]==tabuleiro[1][1] && tabuleiro[1][1]==tabuleiro[1][2])
            return true;
        else if (tabuleiro[2][0]!=' ' && tabuleiro[2][0]==tabuleiro[2][1] && tabuleiro[2][1]==tabuleiro[2][2])
            return true;
        else if (tabuleiro[0][0]!=' ' && tabuleiro[0][0]==tabuleiro[1][0] && tabuleiro[1][0]==tabuleiro[2][0])
            return true;
        else if (tabuleiro[0][1]!=' ' && tabuleiro[0][1]==tabuleiro[1][1] && tabuleiro[1][1]==tabuleiro[2][1])
            return true;
        else if (tabuleiro[0][2]!=' ' && tabuleiro[0][2]==tabuleiro[1][2] && tabuleiro[1][2]==tabuleiro[2][2])
            return true;
        else if (tabuleiro[0][0]!=' ' && tabuleiro[0][0]==tabuleiro[1][1] && tabuleiro[1][1]==tabuleiro[2][2])
            return true;
        else if (tabuleiro[0][2]!=' ' && tabuleiro[0][2]==tabuleiro[1][1] && tabuleiro[1][1]==tabuleiro[2][0])
            return true;
        
        return false;
    }
}