Threads + send/receive!

0 respostas
J

Estou implementando um jogo de bingo com Threads. São 10 Threads do tipo jogador e 1 do tipo mesa.

Cada jogador inicialmete gera a sua cartela e avisa a mesa que esta pronto para iniciar o jogo. Quando todos informarem a mesa que estão prontos, esta sorteia um numero (pedra) e envia a todos os jogadores. Cada jogador confere a sua cartela com a pedra sorteada e assinala se acertou.Após a conferencia cada jogador envia para a mesa dizendo se fez bingo ou não. Novamente a mesa aguarda as mensagens de todas as threads jogadoras. nãon havendo ganhador, a mesa sorteia uma nova pedra e distribui. Quando um jogador envia uma mensagem aos jogadores qye bingou o jogo termina: a mesa envia uma mensagem aos jogadores comunicando o fim do jogo. O programa é implementado usando send/receive!!!

O problema na minha implementação é que quando as Threads recebem a notificação de que a mesa sorteou um numero o jogo não anda mais! Vou passar o codigo:

CLASSE que contem os valores do jogo
public class RegMsg{
	private int sender, pedra ;
	private boolean bingo;
	public RegMsg(){
		//sender  = 999;
		bingo   = false;
		//pedra   = 0;
	}
	public void setSender( int origem ){
		sender = origem;
	}
	public void setBingo ( boolean bingo ){
		this.bingo  =  bingo;
	}
	public void setPedra ( int pedra ){
		this.pedra = pedra;
	}
	public int getSender(){
		return sender;
	}
	public boolean getBingo(){
		return bingo;
	}
	public int getPedra() {
		return pedra;
	}
}
CLASSE que contem a mensagem
public class Message {
	RegMsg  []   caixa;
	boolean [] cxcheia;
	int numthr;
	public Message( int numthr ){
		this.numthr  = numthr;
		caixa   = new RegMsg [ numthr ];
		cxcheia = new boolean[ numthr ];
		
		for ( int i= 0; i < numthr; i++ ){
			cxcheia[i] = false;
			caixa  [i] = new RegMsg();
		}
	}
	public synchronized void send ( int destino, RegMsg msg){
		try{
			while ( cxcheia [ destino ] )  wait();
			
			caixa   [ destino ] = msg;
			
			cxcheia [ destino ] = true;
			
			notifyAll();
			
		}catch ( Exception e ){ System.out.println(e); }
	}
	public synchronized RegMsg receive( int pid ){
		try{
			while (!cxcheia [ pid ]) wait();
			
			cxcheia [ pid ] = false;
			
			notifyAll();
			
			return ( caixa [ pid ] );
			
		} catch ( Exception e ){ System.out.println(e); }
		
		return null;
	}

}
ClASSE que imprime resultados
public class Print {
	
		int i;
		public synchronized void cartela ( int jogador, int [] cartela ){
			   System.out.println();
			   System.out.println("========================================================== " );
			   System.out.println(">>>>> CARTELA JOGADOR:  " + jogador );
			   for( int i = 0; i < 10;  i++ ) System.out.print(" | "+ cartela [ i  ] );
			   System.out.println();
			   System.out.println("========================================================== " );
			
		}
		public synchronized void bingo ( int jogador ){
			   System.out.println(".....................................................................");
			   System.out.println(".....................................................................");
			   System.out.println("   >>>>>>  BINGO >>>  BINGO >>>   JOGADOR "+jogador+ "   >>>>>>>>>>>>>>>" );
			   System.out.println(".....................................................................");
			   System.out.println(".....................................................................");
		}
		public synchronized void pedra ( int pedra ){
			   System.out.println();
			   System.out.println("**********************************************************");
		       System.out.println("********          PEDRA SORTEADA: "+pedra+ "       ***************");
			   System.out.println("**********************************************************");
			   System.out.println();
		}
		

}
CLASSE jogador
class Jogador extends Thread {
	
	static boolean fimDoJogo = false;
	int [] cartela;
	int id;
	Message message;
	RegMsg msg;
	
	int pedra;
	int pontos;
	
	boolean bin = false;
	
	Print p = new Print();
	
	Jogador(int id, Message ms){
		
		this.id = id;
		cartela = new int[10];
		
		for(int i = 0; i<10; i++){
			cartela[i] = (int)(1+Math.random()*30);
		}
		p.cartela(id, cartela);
		message = ms;
		pedra = 0;
		pontos = 0;
		msg = new RegMsg();
		
	}

    public void run(){
    	
    	message.send(10,msg);
    	while(!bin){
    		
    	
    		msg = message.receive(id);
    		
    		if(msg.getBingo()){
    		  p.bingo(id);
    		  bin=true;
    		}
    		else{
    		 
    		  pedra = msg.getPedra();
    		  //System.out.println(pedra);
    		   for(int i = 0; i<10; i++){
    			 if(cartela[i]==pedra){
    				pontos++;
    			 }
    		   }
    		   if(pontos==10){
    	    	  msg.setBingo(true);
    	    	  message.send(id,msg);
    	    	  p.bingo(id);
    	       }
    	    }   	        		
    	}
    }
}
CLASSE mesa
class Mesa extends Thread {
	
	int numero;
	Message message;
	RegMsg msg = new RegMsg();
	
	Print p = new Print();
	
	boolean bingaram = false;
	static boolean fimDoJogo = false;
	int ped;
	Mesa(Message m){
		message = m;
		//msg = r;
		numero = 0;
		ped = 0;
	}
	
	public void run(){
	
		   for(int i =0; i<10; i++)
			   msg = message.receive(10);
			    
		   while(!fimDoJogo){    
			    ped=(int)(1+Math.random()*30);
			    p.pedra(ped);
			    
			    msg.setPedra(ped);
			   			    
			 for(int i =0; i<10; i++){
			 
			    message.send(i,msg);
			    //System.out.println(i);
			 }   
			 for(int i =0; i<10; i++){
			 
			    msg = message.receive(10);
			     // System.out.println(i);
			    bingaram = msg.getBingo();
			    if(bingaram==true){
			    	
			    	msg.setBingo(true);
			    	fimDoJogo = true;
			    	for(int j =0; i<10; i++)
			    	   message.send(j,msg);
			    }
	     	 }
	    }	
    }

}
CLASSE main
class Main {
	
public static void main(String [] args){

	
	Message message = new Message(11);
		
	Jogador [] jogador = new Jogador[10]; 
	
	Mesa mesa = new Mesa(message);
	
	for(int i =0; i<10; i++){
		jogador[i] = new Jogador(i,message);
		jogador[i].start();
		
	}
	mesa.start();
	
	}
}

Obrigado pela ajuda!!!

Criado 24 de novembro de 2009
Respostas 0
Participantes 1