Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

Leminski

Jogo entre 2 jogadores

Mensagens Recomendadas

Leminski    0
Leminski

Boa tarde.

Estou a desenvolver um projeto para uma cadeira de programação onde tenho que implementar um jogo para ser jogado entre 2 jogadores. A ideia é ter 2 tipos de agentes a comunicar: jogadores e distribuidor, onde cada agente lê standard input e escreve standard output, fazendo o distribuidor essas interações em dois sentidos. Algo como:

JOGADOR 1 -> <- DISTRIBUIDOR -> <- JOGADOR 2

Sem utilizar um modelo Cliente/Servidor, apenas com algo baseado em pipes, como posso concretizar isto?

Tenho pouca experiência e os meus professores não demonstram muita abertura...

Editado por Leminski

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
saca-rolhas    11
saca-rolhas

Por Distribuidor deves querer dizer Servidor, não?

O que podes usar para isso é java.net.

Constróis o engine do jogo no Servidor e este encarrega-se de comunicar com os clientes por rede através de ObjectsOutputStream e ObjectInputStream.

Necessitas de criar 2 aplicações uma servidor e outra cliente, a cliente, por sua vez vais executar uma instância para cada jogador e cabe depois ao servidor limitar o numero de conexões (neste caso 2).

Dá uma olhadela nisto: http://www.java2s.com/Code/Java/Network-Protocol/ObjectInputStreamandObjectOutputStreamfromSocket.htm


The worst part of censorship is ****

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leminski    0
Leminski

Não.

Já fiz algumas aplicações assentes num modelo Cliente/Servidor mas não é isso que se pretende aqui.

Há alguma forma de ter um jogo onde faço dois clientes(jogadores do jogo) conectarem-se a uma aplicação (que não seja um servidor, mas usando um host e um port) e apenas trocar mensagens stdio que depois desencadeam o jogo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon    276
KTachyon

Aquilo que estás a dizer é praticamente a definição de servidor. Se, por servidor estás a falar de hardware, então não, não precisas de ter um "servidor". Podes meter uma das máquinas dos teus clientes a servir o jogo para os dois jogadores.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Leminski    0
Leminski

Decidi-me a usar um modelo Cliente/Servidor mas estou com problemas na comunicação

Tenho esta classe do jogo do galo onde tenho ainda a classe Processo:

package lp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
class JDG {

char tabuleiro[][] = new char[L][C];
boolean terminou = false;
final static int L = 3;
final static int C = 3;

(implementação do jogo)

class Processo{

 char mark;
 Socket socket;
 BufferedReader input;
 PrintWriter output;
 public Processo(Socket socket, char mark) {
	 this.socket = socket;
	 this.mark = mark;
	 try {
		 input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		 output = new PrintWriter(socket.getOutputStream(), true);
		 output.println("ENTROU"+mark);
	 }
	 catch (IOException e) {
		 System.out.println("Player died: " + e);
	 }
 }

 public void inicio(){
	 output.println("IN");
 }

 public void pedejogada(){
	 int pos;
	 try{
		 output.println("MOVE");
		 System.out.println("ordem feita");
		 pos=input.read();
		 System.out.print("\nJogador "+mark+" jogou em: "+pos+"\n");
	 }
	 catch(Exception e){
	 System.out.println("Falha na conexão do jogador.");
 }
	 finally{
		 try{
			 socket.close();
		 }
		 catch(IOException e){}
	 }
 }	
}
}

Depois tenho o meu cliente onde é ideia é ele entrar e, no play() aguardar comunicação:

public class Jogador {

private static int PORT = 8901;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
 public Jogador(String serverAddress) throws Exception {
 socket = new Socket(serverAddress, PORT);
 in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 out = new PrintWriter(socket.getOutputStream(), true);
}
public void play() throws Exception {
 String response;
 Scanner sc = new Scanner(System.in);
 try {
	 //response = in.readLine();		
	 //aguarda comunicações do processo
	 while (true) {
		 System.out.println("esperando");
		 response = in.readLine();
		 if (response.startsWith("IN")){
			 System.out.println("\nAdversário encontrado. Jogadores prontos. \nJogo vai ter início:");
		 }
		 if (response.startsWith("ENTROU")) {
			 char mark = response.charAt(6);
			 System.out.println("Bem Vindo, jogador: "+mark);
			 System.out.println("A procurar adversário...");
		 }
		 //NAO CSG LER ESTE MOVE DA SEGUNDA VEZ
		 if (response.startsWith("MOVE")){
			 System.out.println("leu");
			 System.out.println("\nEscolha um nr:");
			 int casa = sc.nextInt();
			 out.println(casa);
			 break;
		 }
	 }
 }
 finally {
	 socket.close();
 }
}
public static void main(String[] args) throws Exception {
 while (true) {
	 String serverAddress = (args.length == 0) ? "localhost" : args[1];
	 Jogador cliente = new Jogador(serverAddress);
	 cliente.play();
 }
}

}

E aqui tenho o servidor. Quando um cliente entra é-lhe associado um processo. Quando entram os dois é chamado o método initial() onde se avisam ambos os clientes que o jogo pode começar. Isto funciona, quando executo cada um recebe aquilo que deve. Depois, enquanto o jogo ainda não terminou, é pedida, à vez, uma jogada a cada um e o tabuleiro é impresso.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
/**
*
* @author ze
*/
public class Visualizador {

public static void main(String[] args) throws Exception {
 ServerSocket listener = new ServerSocket(8901);
 System.out.println("VISUALIZADOR A FUNCIONAR...");
 try {
	 JDG jogo = new JDG();
	 ArrayList<JDG.Processo> jogadores = new ArrayList<JDG.Processo>();
	 while (true) {
		 JDG.Processo pX = jogo.new Processo(listener.accept(), 'X');
		 jogadores.add(pX);
		 System.out.println("Jogador X entrou.");
		 JDG.Processo pO = jogo.new Processo(listener.accept(), 'O');
		 jogadores.add(pO);
		 System.out.println("Jogador O entrou.");
		 System.out.println("Jogadores prontos! Jogo vai ter início!");
		 //avisar inicio
		 for(int i=0;i<jogadores.size();i++){
			 jogadores.get(i).inicio();
		 }
		 //pedir jogada e mostra tabuleiro
		 while(jogo.terminou==false){
			 for(int i=0;i<jogadores.size();i++){
				 jogadores.get(i).pedejogada();
				 jogo.print();
			 }
		 }
	 }
 }
 finally {
	 listener.close();
 }
}
}

O método pedejogada() está definido no processo, pois é pelo processo (a que está associado cada cliente) que eu envio os comandos de comunicação. Ao enviar "MOVE" através Buffer o cliente que está no WHILE do play() à espera de comandos lê o que foi escrito e entra no IF. Isto funciona (+/-) a primeira vez para o cliente 1 e para o cliente 2. Digo +/- porque é pedido um valor ao cliente e depois, na classe processo, faço um print... e o valor não é o mesmo. E na segunda ronda de pedir jogadas dá a excepção definida no pedejogada() e os clientes não recebem o pedido para inserir o valor.

Alguém percebe porque é que isto acontece? Estou a fazer mal a comunicação entre servidor/cliente?

Editado por Leminski

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
vildor    0
vildor

Na segunda jogada o que é que está dentro da variavel response do Jogador.play()???

Melhoria:

Faz um else para o caso em que o response não faz "match" com nenhuma das condições e pede ao jogador para introduzir um comando válido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.