pezzo di battaglia navale in java

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

pezzo di battaglia navale in java

Messaggio da simo_magic »

sto creando un programma per la battaglia navale per la scuola e ho finito tutto il programma
piccolo problema
quando il pc deve inserire le navi casualmente il programma continua a calcolare ma non finisce mai di completare il suo campo di battaglia(quello del giocatore è manuale e funziona benissimo ;))
ecco qui il pezzo di sorgente che mi aiuterebbe che voi guardaste

Codice: Seleziona tutto

/*1,2,3,4 navi m=mare c=colpito a=affondato n=nebbia b=bandiera(nessuna nave intorno)*/
int DIM=8;
int i=0,j=0,k=0;
char difesa_pc[][]=new char[DIM][DIM],attacco_giocatore[][]=new char[DIM][DIM],attacco_pc[][]=new char[DIM][DIM],difesa_giocatore[][]=new char[DIM][DIM]; //le varie matrici per il campo
int navi_inserite=0,l=0;
int nave[]=new int[5];//le 4 navi(ho messo il vettore lungo 5 così è più comodo usare l come indice facendo finta che non esista nave[0]
int ins_r,ins_c;//indici di inserimento di del primo blocco della nave
boolean casella_ok,fuori_indice;
char v_o=0;//nave verticale o orizzontale
for(i=0;i<DIM;i++)for(j=0;j<DIM;j++){difesa_pc[i][j]='m';attacco_giocatore[i][j]='n';}
for(i=0;i<DIM;i++)for(j=0;j<DIM;j++){difesa_giocatore[i][j]='m';attacco_pc[i][j]='n';}
nave[1]=1;nave[2]=1;nave[3]=1;nave[4]=1;
while(navi_inserite<4)
{
	for(i=0;i<DIM;i++){System.out.print("\n");for(j=0;j<DIM;j++)System.out.print(" "+difesa_pc[i][j]);}System.out.print("\n");
	do{l=(int)(Math.random()*4);}while(l<=0 || l>4);
	if(l==1)v_o='v';
	else do{k=(int)(Math.random()*1000);if(k%2==0)v_o='v';if(k%2==1)v_o='o';}while(v_o!='v' && v_o!='o');
	do{
		do{ins_r=(int)(Math.random()*DIM);}while(ins_r<0 || ins_r>=DIM);
		do{ins_c=(int)(Math.random()*DIM);}while(ins_c<0 || ins_c>=DIM);
		casella_ok=true;
		if(v_o=='o')
			for(k=ins_c;k<ins_c+l;k++)
				for(i=ins_r-1;i<ins_r+2;i++)
					for(j=k-1;j<k+2;j++)
						if(i>=0 && i<DIM && j>=0 && j<DIM)
							if(difesa_pc[i][j]!='m' && difesa_pc[i][j]!='b')
								casella_ok=false;
		if(v_o=='v')
			for(k=ins_r;k<ins_r+l;k++)
				for(i=k-1;i<k+2;i++)
					for(j=ins_c-1;j<ins_c+2;j++)
						if(i>=0 && i<DIM && j>=0 && j<DIM)
							if(difesa_pc[i][j]!='m' && difesa_pc[i][j]!='b')
								casella_ok=false;
	}while(casella_ok==false);
	fuori_indice=false;
	if(v_o=='v')for(i=ins_r;i<l+ins_r;i++)if(i<0 || i>=DIM)fuori_indice=true;
	if(v_o=='o')for(i=ins_c;i<l+ins_c;i++)if(i<0 || i>=DIM)fuori_indice=true;
	if(nave[l]==1 && fuori_indice==false)
	{
		if(v_o=='v')
			{
				for(i=ins_r-1;i<ins_r+1+l;i++)for(j=ins_c-1;j<ins_c+2;j++)if(i>=0 && i<DIM && j>=0 && j<DIM)difesa_pc[i][j]='b';
				for(i=ins_r;i<l+ins_r;i++)if(i>=0 && i<DIM)difesa_pc[i][ins_c]=(char)(48+l);
			}
		if(v_o=='o')
			{
				for(i=ins_r-1;i<ins_r+2;i++)for(j=ins_c-1;j<ins_c+l+1;j++)if(i>=0 && i<DIM && j>=0 && j<DIM)difesa_pc[i][j]='b';
				for(i=ins_c;i<l+ins_c;i++)if(i>=0 && i<DIM)difesa_pc[ins_r][i]=(char)(48+l);
			}
		nave[l]=0;
		navi_inserite++;
	}
}
for(i=0;i<DIM;i++)for(j=0;j<DIM;j++)if(difesa_pc[i][j]=='b')difesa_pc[i][j]='m';

System.out.print("Difesa giocatore");
for(i=0;i<DIM;i++){System.out.print("\n");for(j=0;j<DIM;j++)System.out.print(" "+difesa_pc[i][j]);}System.out.print("\n");
lasciamo perdere gli errori di sintassi che non dovrebbero essercene(ho solo sostituito agli input manuali un numero casuale generato da Math.random)
come potrei avere un numero casuale ma che cambia ogni volta?tipo che ha a che fare con il tempo ad esempio...
lo so sono abbastanza incasinato con i pensieri ma dovrebbe essere giusto e non capisco perchè si inchioda e non genera il campo...
se servono delucidazioni sono qui ;)
ps se è entro oggi meglio ancora :P
Avatar utente
Guiodic
Accecante Asceta
Accecante Asceta
Messaggi: 28474
Iscrizione: martedì 24 aprile 2007, 15:28
Località: Roma
Contatti:

Re: pezzo di battaglia navale in java

Messaggio da Guiodic »

simo_magic ha scritto: come potrei avere un numero casuale ma che cambia ogni volta?tipo che ha a che fare con il tempo ad esempio...
Non conosco bene java, ma si fa come in ogni altro linguaggio: moltiplichi il numero pseudocasuale per il valore che ti ritorna la funzione che legge l'orario dell'orologio del computer. Certi linguaggi lo fanno già loro, in altri lo devi fare tu.
Ovviamente poi devi "aggiustare" il risultato in modo che rientri all'interno del range che ti serve.
In questo modo la sequenza di numeri "estratti" non sarà sempre la stessa.

Inoltre se il momento in cui il programma calcola il numero casuale è determinato dalle reazioni dell'utente, usare la funzione che restituisce il numero pseudocasuale è pure inutile visto che non capiterà mai che l'utente, in tutte le partite, reagirà esattamente con la stessa velocità e quindi che il programma calcolerà il risultato sempre in certi momenti in cui, ad esempio, i centesimi di secondo sono 10, 20, 30, eccetera.

Infine, non so java, ma altri linguaggi hanno funzioni che restituiscono il tempo trascorso dall'avvio del sistema, in tal caso sei proprio a cavallo.
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: pezzo di battaglia navale in java

Messaggio da simo_magic »

a me serve per l'appunto che il programma generi dei numeri pseudocasuali diversi da esecuzione a esecuzione e diversi da ogni passata del while(navi_inserite<navi_da_inserire)
se qualcuno sa una funzione che ritorni un numero(i secondi dall'avvio di sistema sarebbero perfetti) dovrei essere a posto

sempre ricordando che il programma deve funzionare sia su windows(dove lo porterò ad eseguire) sia su unix-like dove lo sto testando
Avatar utente
Guiodic
Accecante Asceta
Accecante Asceta
Messaggi: 28474
Iscrizione: martedì 24 aprile 2007, 15:28
Località: Roma
Contatti:

Re: pezzo di battaglia navale in java

Messaggio da Guiodic »

simo_magic ha scritto: a me serve per l'appunto che il programma generi dei numeri pseudocasuali diversi da esecuzione a esecuzione e diversi da ogni passata del while(navi_inserite<navi_da_inserire)
se qualcuno sa una funzione che ritorni un numero(i secondi dall'avvio di sistema sarebbero perfetti) dovrei essere a posto

sempre ricordando che il programma deve funzionare sia su windows(dove lo porterò ad eseguire) sia su unix-like dove lo sto testando
Magari fai una ricerca su google o su un sito specializzato...
Avatar utente
Bobby
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1978
Iscrizione: lunedì 15 gennaio 2007, 17:29

Re: pezzo di battaglia navale in java

Messaggio da Bobby »

Cerco di essere chiaro e conciso (impresa).

Ho visto un nuovo metodo: java.lang.System.nanoTime(): misura il tempo in nanosecondi!!! Non è legato all'orologio né all'inizio della sessione, devi essere tu a dire quando cominciare a contare, ma accidenti i ragionare in nanosecondi genera numeri spaventosi rispetto ai millisecondi.

Quando ho problemi con i cicli, metto System.out.println ovunque, in ogni fase del ciclo, quando entra, esce e mentre elabora; coì facendo dovresti capire dov'è il problema. Di solito l'output è il nome del ciclo e la condizione.

Ultima cosa, una domanda/appunto. Tu scrivi sempre così i programmi, in modo così compatto intendo? Io andavo a caporiga sempre dopo if, do, else, graffe, ecc... Sarà che non l'ho scritto io, ma un po' mi ci perdo nel tuo codice.
Prendilo solo come una mia opinione, nessun rimprovero, solo la curiosità di sapere...  ;)
The time is out of joint; - O cursed spite,
That even I was born to set it right! -
                                            Hamlet
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: pezzo di battaglia navale in java

Messaggio da simo_magic »

per la funzione me la studierò grazie

per i cicli anche io faccio così inserendo stampate a video delle varie variabili e condizioni tanto per capire gli errori ma visto che il programma funziona(è identico in tutto e per tutto solo che al posto di un inserimento manuale ha dei numeri random ;))

anche io faccio come te non ti spaventare ma quando ho tanti for annidati o if eccecc e so già che il codice funziona...beh li raccolgo insieme per accorciare il sorgente(altrimenti non mi stava nemmeno tutto perchè il forum ha il limite di 100000 caratteri a post  :P)
se dovessi ricontrollarlo anche io mi ci perderei e infatti lo "riapro" se serve ma non capita spesso perchè lo compatto solo se sono sicuro che non ci siano errori  ;D
Avatar utente
Bobby
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1978
Iscrizione: lunedì 15 gennaio 2007, 17:29

Re: pezzo di battaglia navale in java

Messaggio da Bobby »

Mi era venuto il dubbio, o c'era il limite di righe o tu hai un controllo superiore, e nel secondo caso non avresti problemi con i cicli.
The time is out of joint; - O cursed spite,
That even I was born to set it right! -
                                            Hamlet
Avatar utente
Bobby
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1978
Iscrizione: lunedì 15 gennaio 2007, 17:29

Re: pezzo di battaglia navale in java

Messaggio da Bobby »

Hai controllato che valore viene fuori da random? Mi viene il sospetto che il problema sia l'arrotondamento.
Non è che butti fuori valori da 0.0 a 1.0, arrotondando ottieni 0 sempre salvo quando c'è 1. Se è così moltiplica per 10, 100, 1000 o quello che vuoi tu.

EDIT:  :-[ come non detto il tuo codice lo fa già.
Ultima modifica di Bobby il martedì 5 giugno 2007, 18:10, modificato 1 volta in totale.
The time is out of joint; - O cursed spite,
That even I was born to set it right! -
                                            Hamlet
Avatar utente
thelo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 269
Iscrizione: lunedì 8 gennaio 2007, 17:16

Re: pezzo di battaglia navale in java

Messaggio da thelo »

simo_magic ha scritto: per la funzione me la studierò grazie

per i cicli anche io faccio così inserendo stampate a video delle varie variabili e condizioni tanto per capire gli errori ma visto che il programma funziona(è identico in tutto e per tutto solo che al posto di un inserimento manuale ha dei numeri random ;))

anche io faccio come te non ti spaventare ma quando ho tanti for annidati o if eccecc e so già che il codice funziona...beh li raccolgo insieme per accorciare il sorgente(altrimenti non mi stava nemmeno tutto perchè il forum ha il limite di 100000 caratteri a post  :P)
se dovessi ricontrollarlo anche io mi ci perderei e infatti lo "riapro" se serve ma non capita spesso perchè lo compatto solo se sono sicuro che non ci siano errori  ;D
ma non usi il debugger?
è molto più comodo per fare queste operazioni
Navigammo su fragili vascelli
per affrontar del mondo la burrasca
ed avevamo gli occhi troppo belli...
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: pezzo di battaglia navale in java

Messaggio da simo_magic »

euhmmm diciamo che non ho mai imparato come fare...sono solo 8 mesi che programmo sul serio e a scuola non ce lo hanno ancora insegnato...sono solo in terza informatica ad un itis...
Avatar utente
thelo
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 269
Iscrizione: lunedì 8 gennaio 2007, 17:16

Re: pezzo di battaglia navale in java

Messaggio da thelo »

mah, sono punti di vista differenti...
per me è la cosa che bisognerebbe insegnare dopo "hello world"  ;)
e ti consiglio caldamente di impararne le cose fondamentali...poche e semplici
almeno i break
Navigammo su fragili vascelli
per affrontar del mondo la burrasca
ed avevamo gli occhi troppo belli...
Avatar utente
acquarica
Prode Principiante
Messaggi: 216
Iscrizione: martedì 15 agosto 2006, 10:22
Contatti:

Re: pezzo di battaglia navale in java

Messaggio da acquarica »

ti posso dire solo che io quando programmo in java uso mettere degli output ogni tanto per vedere dove il programma da problemi e/o si blocca... non so se ti può essere d'aiuto in questo caso... era un consiglio in generale...  ;)
Ho visto entrare nell'oceano come brocche d'acqua sorgente tutte le gocce dei temporali.
Avatar utente
Bobby
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1978
Iscrizione: lunedì 15 gennaio 2007, 17:29

Re: pezzo di battaglia navale in java

Messaggio da Bobby »

Io ho provato questo:

Codice: Seleziona tutto


public class Test {

		
	public Test() {
	    int i = 0;
	    for (i = 0; i < 100;i++)
		System.out.println((int)java.lang.Math.random()*4);

			}
	
	 public static void main(String args[]) {
		new Test();
	 }

}
Risultato 100 volte 0.
Forse avevo ragione... confermi l'attedibilità del test?
The time is out of joint; - O cursed spite,
That even I was born to set it right! -
                                            Hamlet
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: pezzo di battaglia navale in java

Messaggio da simo_magic »

penso di aver risolto il problema del random
non so come...visto che il codice è identico a prima comunque ho risolto!
adesso pubblico il sorgente completo e vediamo se qualcuno mi da una mano a migliorarlo...
Avatar utente
Massimo S.
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1931
Iscrizione: giovedì 28 settembre 2006, 14:34

Re: pezzo di battaglia navale in java

Messaggio da Massimo S. »

Bobby ha scritto: Io ho provato questo:

Codice: Seleziona tutto

public class Test {
.......
}
Risultato 100 volte 0.
Forse avevo ragione... confermi l'attedibilità del test?
Prova a sostituire la riga con la print con questa

Codice: Seleziona tutto

        System.out.println((int) (java.lang.Math.random()*4) );
e vedrai che funziona.

Tu convertivi prima il numero in virgola mobile in int (che quindi facevo 0) e poi lo moltiplicavi per 4
Avatar utente
Bobby
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1978
Iscrizione: lunedì 15 gennaio 2007, 17:29

Re: pezzo di battaglia navale in java

Messaggio da Bobby »

Massimo S. ha scritto: Prova a sostituire la riga con la print con questa

Codice: Seleziona tutto

        System.out.println((int) (java.lang.Math.random()*4) );
e vedrai che funziona.

Tu convertivi prima il numero in virgola mobile in int (che quindi facevo 0) e poi lo moltiplicavi per 4
Ciò implica 2 cose:
- per anni ho fatto le conversioni in modi arzigogolati (utilizzando metodi, ecc...)
- in questo 3d ho tirato + conclusioni errate io che gli strateghi USA in vietnam

E @simo_magic
ci devi mostrare la soluzione, io devo capire... ;D
The time is out of joint; - O cursed spite,
That even I was born to set it right! -
                                            Hamlet
Avatar utente
simo_magic
Rampante Reduce
Rampante Reduce
Messaggi: 9496
Iscrizione: lunedì 18 dicembre 2006, 21:37
Località: Piemonte

Re: pezzo di battaglia navale in java

Messaggio da simo_magic »

penso che facevo anche io lo stesso errore una riga di random...così un controllo in coda mi dava sempre falso e non usciva mai :'(

adesso pubblico il sorgente...se avete voglia di aiutarmi a migliorarlo eccomi qui pronto...magari alla fine della 5a arriverò con un programma con gui da presentare all'esame
ps lo metto sotto gpl naturalmente  ;)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 4 ospiti