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
[code]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;
}
}
[/code]
CLASSE que contem a mensagem
[code]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;
}
}
[/code]
ClASSE que imprime resultados
[code]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();
}
}
[/code]
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
[code]
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);
}
}
}
}
}[/code]
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!!!