Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: problema gioco!

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    14

    problema gioco!

    ciao a tutti, sto creando un gioco (BattagliaNavale) ma ho un problema, ovvero quando colpisco una nave, già colpita, mi dice solamente che ho colpito la nave e non che l'ho affondata, nonostante l'istruzione.
    é evidente che sbaglio qualcosa, e vi chiedo se qualcuno può aiutarmi, correggendo il mio errore e magari spiegarmi dove sbaglio!


    codice:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    public class Bat2Nav {
    
    
    	private static int navi = 10;
    	private int[][] campoDaGioco;
    	// creo una nuova matrice delle dimensioni specificate
    	Bat2Nav(int righe, int colonne) {
    	campoDaGioco = new int[righe][colonne];
    	}
    	// creo una nuova matrice a partire da un array bidimensionale passato in
    	// input
    	Bat2Nav(int[][] campoDaGioco) {
    	this.campoDaGioco = campoDaGioco;
    	}
    	public int getRighe() {
    	return campoDaGioco.length;
    	}
    	public int getColonne() {
    	return campoDaGioco[0].length;
    	}
    	public static int ColpoRiga() throws Exception {
    	System.out.println("Inserire la riga del campo da gioco (da 1 a 10 ) ");
    	BufferedReader tastiera = new BufferedReader(new InputStreamReader(System.in));
    	// System.out.println("Inserire la riga del campo da gioco (da 1 a 10 ) ");
    	int ColpoRiga = Integer.parseInt(tastiera.readLine());
    	return ColpoRiga;
    	}
    	public static int ColpoColonna() throws Exception {
    	System.out.println("Inserire la colonna del campo da gioco (da 1 a 10 ) ");
    	BufferedReader tasto = new BufferedReader(new InputStreamReader(System.in));
    	// System.out.println("Inserire la colonna del campo da gioco (da 1 a 10 ) ");
    	int ColpoColonna = Integer.parseInt(tasto.readLine());
    	return ColpoColonna;
    	}
    	public void setColpo(int ColpoRiga, int ColpoColonna) throws Exception {
    	int	indiceRiga= ColpoRiga-1;
    	int indiceColonna= ColpoColonna-1;
    	if (ColpoRiga >= 0 & ColpoRiga <= getRighe() & ColpoColonna >= 0 & ColpoColonna <= getColonne()) {
    	if (campoDaGioco[indiceRiga][indiceColonna] == 0) {
    
    	System.out.println("Acqua, non ci sono navi in questa casella!");
    
    	} else { 
    	// Setto la casella in cui è presente la nave colpita uguale a 2
    	campoDaGioco[indiceRiga][indiceColonna] = 2;
    	//verifico se nelle righe o colonne adiacenti ci sono navi già colpite (2) in maniera tale       //da poter dire con il seguente controllo se la nave è anche affondata
    	try{
    	 {if (campoDaGioco[indiceRiga-1][indiceColonna-1] == 2||campoDaGioco[indiceRiga-1][indiceColonna+1] == 2||campoDaGioco[indiceRiga+1][indiceColonna-1] == 2||campoDaGioco[indiceRiga+1][indiceColonna+1] == 2){
    		System.out.println("Colpita e affondata!");
    // decremento il numero di navi
    		--navi;
    	}
    	 }}catch(IndexOutOfBoundsException e){
    		 System.out.println("Colpita!Ma non mi hai affondata!");
    		 //System.out.println("riscontrata eccezione");
    	 }
    	 
    	// System.out.println("Colpita!Ma non mi hai affondata!");
     
    	}
    	} else {
    	System.out.println("inserimento impossibile: indici errati");
    	}
    	}
    	@SuppressWarnings("static-access")
    	public static void main(String[] args) throws Exception {
    
    	Bat2Nav A = new Bat2Nav(new int[][] { 
    	{ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0 },
    	{ 1,1, 0, 0, 0, 0, 0, 0, 0, 0 },
    	{ 0, 0, 0, 1, 0, 1, 1,0, 0, 0 },
    	{ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 },
    	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    	{ 0, 1, 1, 0, 0, 0, 1, 1, 0, 0 },
    	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    	{ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
    	{ 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
    	{ 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 } });
    
    
    	for(;;){
    
    	if( navi > 0){
    	int riga = A.ColpoRiga();
    
    	int colonna = A.ColpoColonna();
    
    	A.setColpo(riga, colonna);
    	} else {
    	System.out.println("Complimenti, hai affondato tutte le mie navi!YOU WIN!!!");
    	break;
    	}
    	}
    	}
    }
    ps:il try/catch è corretto?
    Grazie a quanti mi aiuteranno.

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    L'idea di un gioco di battaglia navale è carina, il programma però potrebbe essere tantissimo migliorato
    iniziando dal non usare campi e funzioni statiche e dal modularizzare setColpo che fa troppe cose
    (scomponila in funzioni più semplici).
    Il problema mi pare sia in setColpo: ogni cella è circondata da 8 celle, tu le controlli tutte e 8?
    (dando per inteso che le tue navi possano essere al massimo lunghe 2).

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    14
    Non saprei come scomporla in funzioni piu semplici!Tu come faresti?
    Il problema è in setColpo questo è sicuro, ma vorrei capire dove sbaglio, cioè il motivo per il quale quando ho gia colpito una parte della nave, dopo al colpo (sulla parte restante) non mi dice colpita e affondata.
    È questo il mio problema!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Questo è il controllo che fai per vedere se una nave è affondata, controlli solo le 4 caselle diagonali a quella colpita:
    codice:
    if (campoDaGioco[indiceRiga-1][indiceColonna-1] == 2 ||
        campoDaGioco[indiceRiga-1][indiceColonna+1] == 2 ||
        campoDaGioco[indiceRiga+1][indiceColonna-1] == 2 ||
        campoDaGioco[indiceRiga+1][indiceColonna+1] == 2) {
    P.S. Sempre che tu voglia le navi anche in diagonale, altrimenti bastano 4 controlli ma diversi da quelli che hai fatto

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    14
    ma questo controllo è identico a quello che effettuo io!
    cosa cambia?
    Grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ho infatti scritto "Questo è il controllo che fai", nel senso che lo fai tu. Ti ho solo evidenziato il tuo pezzo di codice perché tu notassi che controlli solo le diagonali.

    P.S. hint: se vari l'indice sia della riga che della colonna sei sulla diagonale no?

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    14
    Hai proprio ragione!il comando corretto sarebbe:

    codice:
    if (campoDaGioco[indiceRiga][indiceColonna-1] == 2||campoDaGioco[indiceRiga][indiceColonna+1] == 2||campoDaGioco[indiceRiga-1][indiceColonna] == 2||campoDaGioco[indiceRiga+1][indiceColonna] == 2)
    grazie mille funziona!

    Ps: ora ho un dubbio: ora che inserirò navi più grandi, pensi ci sia un metodo piu efficace di questo per il controllo? se ho le navi da 4 caselle ad esempio, come posso fare questa verifica senza scrivere righe di codice?

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    My2cents: Io farei una classe Nave e utilizzerei un punto di partenza (x,y) , una lunghezza e un orientamento (orizzontale o verticale).
    Quando fai i controlli ciclierei sulle navi e controllerei se il punto X,Y è all'interno del segmento (con > e <, maggiore e minore).

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    14
    non riesco bene a seguirti, potresti farmi vedere un pezzo di codice?

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    14
    per esempio: se avessi un campo cosi

    [CODE ]{ 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
    { 0,0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 1, 1, 1, 1,0, 0, 0 },
    { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
    { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 1, 0, 0, 0, 0, 0, 0, 1, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },
    { 0, 0, 0, 1, 1, 1, 1, 0, 1, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } });[/CODE]

    come potrei fare il controllo in un modo alternativo a quello simile a quello sopra fatto?
    grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.