Newsgroup: it.comp.java
Titolo: Help!!!! Battaglia Navale

Stiamo facendo un progetto per l'università ma abbiamo un grosso
problema....
Dobbiamo realizzare un giocatore di battaglia navale che interagisca
con il gestore del gioco(creato dal professore) e in particolare
dobbiamo creare cinque metodi : uno per il posizionamento delle
navi,uno per dimensioni del tabellone e della flotta,un altro per
comunicare il risultato dell'ultimo sparo effettuato dall'avversario,il
quarto per ricevere il rsultato del nostro ultimo sparo e infine quello
per sparare.
Non riusciamo a completare una strategia per sparare.Avevamo pensato di
procedere una casella si una no partendo dalla prima e di girare poi
attorno alla nave una volta colpita,ma quando proviamo il giocatore il
programma si blocca.
Qualcuno può gentilmente auitarci,magari con consigli o sopratutto
pezzi di codice( anche con altre strategie).
Vi pregoooooooo!!!!!!
Grazie
Davide
davidesi...@libero.it

 ma quando proviamo il giocatore il programma si blocca.
Ah, allora il problema non e' trovare una strategia :D
More info, please...
Saluti
CarMas

 ...
Il sistema più semplice è quello di sorteggiare due numeri a caso e 
usarli come coordinate della cellla in cui si deve sparare.
Se hai un tabellone 10x10, sorteggi due numeri così
int x = (int)Math.random() * 10;
int y = (int)Math.random() * 10;
Per non sparare dove hai già fatto ci sono varie soluzioni. La più 
semplice è creare un altro tabellone in cui segni solo dove ha sparato o 
inserisci un flag nel tabellone e sorteggi una coppia di numeri 
(coordinate della cella) fino a che non ne trovi una in cui non hai 
sparato. Così però non è molto elegante. Per migliorarlo io avevo 
inserito (era per un gioco di carte) un vector con tutte le possibile 
coppie di coordinate (100 nel vostro caso ;-) ) e quando devi 
sorteggiare la coppia, la scegli tra quele rimaste e poi la elimini, una 
cosa del tipo:
Class Coordinate
{
	public int x;
	public int y;
}
..
Vector CoppieRimaste = new Vector();
// aggiungi tutte le coppie..
..
// sorteggi una coppia rimasta
int pos = (int)Math.random() * CoppieRimaste.size();
Coordinata Sparo = (Coordinate)CoppieRimaste.get(pos);
	// questo sopra lo elimina pure
Questo però è un modo molto stupido di far giocare il computer! Ignora 
in pratica quando colpisce una nave e continua a caso! Potreste 
migliorarlo facendo in modo che quando colpisca qualche cosa, cominci a 
controllare nelle quattro direzioni e se in una direzione continua a 
colpire continuate su quella fino a che non sentite "acqua!". Questo è 
un pò più lungo da scrivere, ma non è molto difficile, e poi è così che 
si gioca alla battaglia navale!
Ciao
FF

 uno per dimensioni del tabellone e della flotta
Questo non dovrebbe appartenere al gestore del gioco?

Si in realtà le coordinate del tabellone e la composizione della
flotta(numero di navi e lunghezza) le sceglie il gestore del
gioco...questo metodo serve solo per salvare queste informazioni in
modo da poterle utilizzare negli altri metodi

Il metodo che devo realizzare per sparare si chiama  Square shoot e
deve ritornare un oggetto di tipo Square che specifica la casella su
cui avviene lo sparo
La classe Square(creata dal gestore del gioco)
ha due variabili d'istanza di tipo int che corrispondono alle
coordinate della casella e a cui è possibile accedere mediante i due
metodi GetX() e GetY(); inoltre ha un costruttore che riceve come
argomenti l'ascissa e l'ordinata della casella.
La mia idea era quella di sparare in una casella si una no partendo
dalla prima e poi nel caso io colpisca una nave di girarci intorno per
affondarla.Ho creato un ciclo for che a seconda che la riga del
tabellone sia pari o dispari parte dalla prima o dalla seconda colonna
e continui di due in due fino in fondo al tabellone.Quando vado a
provare il gioco però mi si blocca.Probabilmente ho impostato male il
ciclo.Puoi aiutarmi per favore

 ciclo.Puoi aiutarmi per favore
Non vedendo il tuo codice non capisco a cosa serva il ciclo. Visto che
si spara a turno, per andare avanti di due in due basterebbe
conservarti l'ultima mossa e fare + 2 sull'indice di colonna fino alla
dimensione della matrice. Quando arrivi al limite sulle colonne,
aumenti quello di riga e resetti quello di colonna (con un if controlli
se è pari o dispari e lo fai partire dalla prima o seconda).
In ogni caso la tua stategia non mi sembra il massimo. E' quasi una
brute force. Basterebbe infatti che l'avversario disponga le navi tutte
nella parte inferiore e tu per molti turni non beccheresti nulla.
Potresti per esempio pensare di suddividere la matrice logicamente in
zone (per esempio quattro quadranti) e partire da uno di questi magari
dal centro. Per ogni zona ti conservi le mosse che hai fatto. Potresti
decidere di abbandonare l'esplorazione di una zona per passare ad un
altra se gli ultimi 4 o 5 spari sono andati a vuoto. Nota che fatto
'algoritmo per una zona, è lo stesso per le altre.