Introdução às Redes de Computadores/Jogo da Velha
De Wikiversidade
Índice |
[editar] Jogo da Velha com arquiteturar Cliente/Servidor
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/;
[editar] RFC
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.
[editar] FSM do Cliente
[editar] FSM do Sevidor
[editar] Código do Cliente
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(); } }
[editar] Código do Servidor
package Servidor; 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; } } } } }
[editar] Protocolo JogoVelha
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; } }