Introdução às Redes de Computadores/Jogo da Velha
Jogo da Velha com arquiteturar Cliente/Servidor
[editar | editar código-fonte]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/;
RFC
[editar | editar código-fonte]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 | editar código-fonte]
FSM do Sevidor
[editar | editar código-fonte]
Código do Cliente
[editar | editar código-fonte]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 | editar código-fonte]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 | editar código-fonte]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;
}
}