RaulKen.It :: Leggi il Topic - [java] Battaglia navale
Precedente :: Successivo
Autore
Messaggio
rikgesha Nuovo del Forum Registrato: Nov 24, 2003 Messaggi: 16
Inviato: Ven Apr 01, 2005 10:18 am Oggetto: [java] Battaglia navale
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
Non puoi inserire nuovi Topic in questo forumNon puoi rispondere ai Topic in questo forumNon puoi modificare i tuoi messaggi in questo forumNon puoi cancellare i tuoi messaggi in questo forumNon puoi votare nei sondaggi in questo forum
Powered by phpBB © 2001, 2005 phpBB Group