Logo by Irenicus giovedì 04-dic-08 00:04


RaulKen.It :: Leggi il Topic - [java] Battaglia navale
 FAQFAQ   CercaCerca   Gruppi utentiGruppi utenti   ProfiloProfilo   Messaggi PrivatiMessaggi Privati   LoginLogin 

[java] Battaglia navale

 
Nuovo Topic   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
rikgesha
Nuovo del Forum
Nuovo del Forum


Registrato: Nov 24, 2003
Messaggi: 16

MessaggioInviato: Ven Apr 01, 2005 10:18 am    Oggetto: [java] Battaglia navale Rispondi citando

Ciao ho un problema con un programma.
Il programma in questione è una specie di battaglia navale. Ho 3 classi : un server multithreading, una class giocatore e una class CampoDiGioco che rappresenta l'oggetto condiviso.
Praticamente i vari client condividono una matrice che rappresenta il campo : sul campo ci sono vari obiettivi (o navi) ed ogni obiettivo ha un valore che varia da 1 a MAX. Le celle che non coprono obiettivi hanno valore 0. Una volta scoperto un obiettivo (affondata la nave) il valore della cella corrispondente viene posto a zero.
Ho fatto le 3 classi ma provando tutto in locale ottengo uno stallo:probabilmente commetto qualche errore nell'uso della wait e notifyAll... Vi posto il codice , spero che qualcuno possa aiutarmi, grazie in anticipo:

Codice:

import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;

class giocatore extends Thread{
 
 private CampoDiGioco campo;
 private int righe;
 private int colonne;
 private Socket client_socket;
 
 public giocatore(int n,int m,CampoDiGioco campodigioco ,Socket client_socket){
 
 righe=n;
 colonne=m;
 campo=campodigioco;
 this.client_socket=client_socket;
 
 }
 
 
 
 
 
 
 
 public void run()
 
 {
 
 String coordinate="Le coordinate generate sono : ";
 String colpito="OBIETTIVO COLPITO";
 String nonColpito="OBIETTIVO MANCATO" ;
 String msg_punti="Punti totalizzati : ";
 String nomeThread="Player :" + this.getName() + "\n\r";
 
 OutputStream os;
 int punteggio=0;
 
 
 campo.attesa(); //si attende che arrivino tutti i giocatori
 
 
 try {
 
 os=client_socket.getOutputStream();
 for(int i=0; i<nomeThread.length(); i++)
 os.write((byte)nomeThread.charAt(i));
 }
 
 
 catch(IOException e)
 {
 
 System.err.println("Errore di comunicazione");
 }
 
 
 
 
 
 
 while(true)
 
 {
 
 int n,m;
 n=(int)Math.random()*righe;
 m=(int)Math.random()*colonne;
 int punti=campo.calcolaPunteggio(n,m);
 if(punti<0)
 break;
 
 else if(punti!=0)
 {
 
 punteggio=punteggio+punti;
 String coord1=Integer.toString(n);
 String coord2=Integer.toString(m);
 String pti=Integer.toString(punti);
 String msg=coordinate + coord1 + " , " + coord2 + " <---> " + colpito + " <---> " + msg_punti + pti + "\n\r"; ;
 
 try
 
 {
 
 os=client_socket.getOutputStream();
 for(int j=0; j<msg.length(); j++)
 os.write((byte)msg.charAt(j));
 
 }
 
 
 catch(IOException e)
 
 {
 
 System.err.println("Errore di Comunicazione");
 
 }
 
 
 
 }
 
 
 
 else
 {
 String coord1=Integer.toString(n);
 String coord2=Integer.toString(m);
 String msg=coordinate + coord1 + " , " + coord2 + " <---> " + nonColpito + "\n\r";
 
 
 }
 
 
 
 
 
 }
 
 
 campo.notifica();
 
 String risultato= "Punteggio finale : " + Integer.toString(punteggio) + "\n\r";
 
 
 try
 
 {
 
 os=client_socket.getOutputStream();
 for(int j=0; j<risultato.length(); j++)
 os.write((byte)risultato.charAt(j));
 
 }
 
 
 catch(IOException e)
 
 {
 
 System.err.println("Errore di Comunicazione");
 
 }
 
 
 
 finally
 
 {
 try
 
 {
 client_socket.close();
 }
 
 catch(IOException e)
 
 {
 System.err.println("Errore di I/O");
 }
 
 }
 
 
 }
 
 
 
}






Codice:



import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;

class giocatore extends Thread{
 
 private CampoDiGioco campo;
 private int righe;
 private int colonne;
 private Socket client_socket;
 
 public giocatore(int n,int m,CampoDiGioco campodigioco ,Socket client_socket){
 
 righe=n;
 colonne=m;
 campo=campodigioco;
 this.client_socket=client_socket;
 
 }
 
 
 
 
 
 
 
 public void run()
 
 {
 
 String coordinate="Le coordinate generate sono : ";
 String colpito="OBIETTIVO COLPITO";
 String nonColpito="OBIETTIVO MANCATO" ;
 String msg_punti="Punti totalizzati : ";
 String nomeThread="Player :" + this.getName() + "\n\r";
 
 OutputStream os;
 int punteggio=0;
 
 
 campo.attesa(); //si attende che arrivino tutti i giocatori
 
 
 try {
 
 os=client_socket.getOutputStream();
 for(int i=0; i<nomeThread.length(); i++)
 os.write((byte)nomeThread.charAt(i));
 }
 
 
 catch(IOException e)
 {
 
 System.err.println("Errore di comunicazione");
 }
 
 
 
 
 
 
 while(true)
 
 {
 
 int n,m;
 n=(int)Math.random()*righe;
 m=(int)Math.random()*colonne;
 int punti=campo.calcolaPunteggio(n,m);
 if(punti<0)
 break;
 
 else if(punti!=0)
 {
 
 punteggio=punteggio+punti;
 String coord1=Integer.toString(n);
 String coord2=Integer.toString(m);
 String pti=Integer.toString(punti);
 String msg=coordinate + coord1 + " , " + coord2 + " <---> " + colpito + " <---> " + msg_punti + pti + "\n\r"; ;
 
 try
 
 {
 
 os=client_socket.getOutputStream();
 for(int j=0; j<msg.length(); j++)
 os.write((byte)msg.charAt(j));
 
 }
 
 
 catch(IOException e)
 
 {
 
 System.err.println("Errore di Comunicazione");
 
 }
 
 
 
 }
 
 
 
 else
 {
 String coord1=Integer.toString(n);
 String coord2=Integer.toString(m);
 String msg=coordinate + coord1 + " , " + coord2 + " <---> " + nonColpito + "\n\r";
 
 
 }
 
 
 
 
 
 }
 
 
 campo.notifica();
 
 String risultato= "Punteggio finale : " + Integer.toString(punteggio) + "\n\r";
 
 
 try
 
 {
 
 os=client_socket.getOutputStream();
 for(int j=0; j<risultato.length(); j++)
 os.write((byte)risultato.charAt(j));
 
 }
 
 
 catch(IOException e)
 
 {
 
 System.err.println("Errore di Comunicazione");
 
 }
 
 
 
 finally
 
 {
 try
 
 {
 client_socket.close();
 }
 
 catch(IOException e)
 
 {
 System.err.println("Errore di I/O");
 }
 
 }
 
 
 }
 
 
 
}







Codice:




public class CampoDiGioco{
 
 
 private int matrice[][];
 private final static int MAX=5;
 private int numeroObiettivi;
 private int riga;
 private int colonna;
 
 public CampoDiGioco(int n,int m)
 {
 riga=n;
 colonna=m;
 numeroObiettivi=(int)((n*m)/4);
 matrice=new intNo[m];
 popola(matrice);
 }




 public void popola(int m [ ][])
 {
 
 
 int row,column;
 
 for(row=0; row<m.length;row++)
 {
 for(column=0; column<m[row].length;column++)
 
 m[row][column]=0;
 }
 
 int i=0;
 while(i<numeroObiettivi)
 {
 
 row=(int)Math.random()*riga;
 column=(int)Math.random()*colonna;
 if (m[row][column]==0)
 {
 m[row][column]=(int)Math.random()*MAX;
 i++;
 }
 }
 
}




 public synchronized void attesa()
 
 {
 try
 {
 wait();
 }
 
 catch(InterruptedException e) {}
 
 
 }
 
 
 
 
 
 public synchronized void notifica()
 
 {
 notifyAll();
 }
 
 
 
 
 
 public synchronized int calcolaPunteggio(int n,int m)
 
 {
 notifyAll();
 int i=matrice[ n ][m];
 if(i!=0)
 {
 numeroObiettivi--;
 matriceNo[m]=0;
 }
 
 
 try
 {
 wait();
 }
 
 catch(InterruptedException e) {}
 
 
 
 
 if(numeroObiettivi==0)
 
 
 
 return -1;
 
 else
 
 
 return i;
 
 
 
 

 }

}
Torna in cima
Profilo Messaggio privato
Mostra prima i messaggi di:   
Nuovo Topic   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi Topic in questo forum
Non puoi rispondere ai Topic in questo forum
Non puoi modificare i tuoi messaggi in questo forum
Non puoi cancellare i tuoi messaggi in questo forum
Non puoi votare nei sondaggi in questo forum

Powered by phpBB © 2001, 2005 phpBB Group

 
© 1999-2008 by Hyarbor S.r.l. PI 04698901215 ®
Usando questo sito si accettano le Note Legali in termini di privacy.
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Generazione pagina: 0.28 Secondi