Oppure

Loading
08/01/11 0:41
f.l.c.r
Salve ragazzi,

mi sono accorto che ho deti dubbi in merito agli oggetti.
Oramai ho a che fare con Java da circa 5 mesi, prima gli oggetti non li conoscevo, vengo da una mediocre preparazione di Pascal, e da un periodo pratica autonoma con C.
Ho migliorato il giusto da quando ho incominciato a buttarmici seriamente, e ora sto cercando di progettare una Battaglia navale. Non conosco assolutamente la grafica ma sto cercando comunque di applicare i concetti che ho amparato. Per ora, sono arrivato fino alle classi astratte.

Mi spiego velocemente:

Ho creato una classe Display, con attributo private displayDiGioco, una matrice int[][].

Poi ho scritto:

un costruttore Display() che riempie la matrice inizializzandola con tutti valori 0(zero).
Inoltre ho deciso di inserire già lettere e numeri nella matrice.

un metodo getDispaly() che stampa a video la matrice.

+ altri metodi a cui ci sto ancora pensando.

Ora la mia domanda, io devo istanziare un oggetto di di tipo Display nel metodo main, viene invocato il costruttore e riempita la matrice, dopo di che per mostrare la matrice utilizzo il metodo getMatrice.

Lavoro dunque sull'oggetto Display creato , e su questo creerò un metodo disponiNavi() nel quale verranno diposte random le navi. Con ovviamente un controllo sull'inserimento.

è giusto il modo in cui ho impostato il programma?

Secondo voi dovrei dare più spazio al metodo main oppure lavorare esclusiamente sulla classe Display e quindi sull'oggetto istanziato?

Anche l'attributo della classe DIsplay, che esserndo una matrice è sempre un oggetto, è soltanto un riferimento ad un altro oggetto, e comunque io lo usi mediante l'oggetto istanziato nel metodo principale(con i vari metodi get, set..) esso verrà sempre modificato dai metodi che chiamo. Le operazioni verrano effettuate solo ed esclusivamente su quell'oggetto matrice istanziato al momento dell'invocazione al costruttore.

Giusto?
aaa
08/01/11 9:53
Numa Pompilio
Postato originariamente da f.l.c.r:
è giusto il modo in cui ho impostato il programma?
Giusto?


Non esiste un modo "giusto" di impostare un programma, dipende tutto da cosa vuoi fare tu.
Se per giusto intendi corretto..........beh, per come lo hai descritto, non credo ci siano errori evidenti

Postato originariamente da f.l.c.r:
Secondo voi dovrei dare più spazio al metodo main oppure lavorare esclusiamente sulla classe Display e quindi sull'oggetto istanziato?
Giusto?


Un pò strana come domanda. Evidentemente non hai ancora afferrato pienamente il concetto di programmazione ad oggetti. ;)
Detto in maniera molto semplicistica, nella classe Display devi implementare tutte le funzioni (metodi) che agiscono sull'oggetto Display. Una volta create tutte le funzioni che credi ti servano (per manipolare l'oggetto Display), le utilizzerai nel main.

Postato originariamente da f.l.c.r:
Inoltre ho deciso di inserire già lettere e numeri nella matrice.
Giusto?


Ma non hai detto che hai creato una matrice di interi? Evidentemente non puoi inserirci delle lettere 8-)
Non so a cosa possano servirti le lettere ma....prova ad utilizzare una matrice di Object :k:
aaa
08/01/11 11:20
f.l.c.r
Di confusione ce n'è ancora, ma sto studiando ed esercitandomi mlto per chiarire molti dubbi.

Matrice di object? Utilizzando la classe Vector?
aaa
08/01/11 12:07
Numa Pompilio
Postato originariamente da f.l.c.r:
Matrice di object? Utilizzando la classe Vector?


no, semplicemente una matrice di Object :)

Object[][] m
aaa
08/01/11 13:03
f.l.c.r
Postato originariamente da Numa Pompilio:

Postato originariamente da f.l.c.r:
Matrice di object? Utilizzando la classe Vector?


no, semplicemente una matrice di Object :)

Object[][] m


Oggi provo , grazie!

La mia domanda vi sarà parsa senz'altro strana, mi sono appellato a voi perchè mai nessuno controlla il codice che scrivo, si, all'università ci sono gli esercizi e le prove di valutazione, ma qualche volta ho bisogno di qualcuno che giudichi criticamente quello che produco.

Spesso mi sembra di creare costrutti troppo complessi, vedi, anche tu mi hai risposto con "semplicemente una matrice di Object" ed è esattamente quello che penso io, tendo sempre a pensare complicato quando in realtà è tutto molto più semplice.

Un altra cosa, un pò off topic e mi scuso, mediamente (lo so che ci sono mille fattori che incidono) quanto tempo si impiega a padroneggiare un linguaggio come Java, quindi mi par di capire abbastanza semplice)?
E con ciò intendo il tempo necessario per acquisire quelle competenze che ti permettono di poter sviluppare, che so, di gestire i thread, la parte grafica o sviluppare per android...

Grazie per la vostra pazienza
Ultima modifica effettuata da f.l.c.r 08/01/11 13:49
aaa
08/01/11 14:15
Numa Pompilio
Postato originariamente da f.l.c.r:
Grazie per la vostra pazienza


"e smettila de ringrazià" (cit.) ahahaahhahah siamo qui per aiutarci :k:

Postato originariamente da f.l.c.r:
mai nessuno controlla il codice che scrivo


prova a postare il tuo codice, sicuramente ti sarei più d'aiuto ;)

Postato originariamente da f.l.c.r:
quanto tempo si impiega a padroneggiare un linguaggio come Java, quindi mi par di capire abbastanza semplice


beh, anche questo è molto relativo. Dipende da quanto tempo ci passi su.......e dalle "aree" nelle quali ti vuoi specializzare. Java è molto semplice da apprendere (infatti lo utilizzano nei corsi universitari) ma anche molto vasto, copre i campi più vari.

Il consiglio che ti posso dare è quello di pensare a qualche programmino e iniziare a svilupparlo (magari prendi spunto da qualche progetto universitario). Incontrerai difficoltà e concetti che dovrai apprendere, ma nello stesso tempo farai tue quelle nozioni ;)

ps. non tralasciare lo studio del cosiddetto "Algoritmi e strutture dati", è fondamentale quasi quanto il linguaggio stesso
Ultima modifica effettuata da Numa Pompilio 08/01/11 14:16
aaa
08/01/11 14:35
f.l.c.r
:k: quel corso sarà nel secondo semestre. Ora sto ancora seguendo il corso di programmazione1/2. Il prossimo argomento che faremo sarà l'ereditarietà, anche se ho già visto qualcosa per conto mio.

Comunque ecco il sorgente o meglio i sorgenti, vi posto anche quelli dell'altro esercizio visto che m sta dando problemi.

PRIMO ESERCIZIO

Classe display (sto ancora pensando come fare il setNave e setDisplayDefault).

import java.util.Random;

public class Display {

	private Casella displayGioco[][]; 
	
	public static final int LUNG_RIGA = 11;
	public static final int LUNG_COLONNA = 11;
	
	public Display(){
		
		displayGioco = new Casella[LUNG_RIGA][LUNG_COLONNA];
		
		for(int i=0;i<LUNG_RIGA;i++){

				for(int j=0;j<LUNG_COLONNA ;j++){
				displayGioco[i][j] = new Casella();
				
				if(i==0 && j>0)
				{
					displayGioco[i][j].setCasella(j);
				}
				
				if(j==0 && i>0)
				{
					displayGioco[i][j].setCasella(i);
				}
				
				
			}
		}
		
	}
	
	public void getDisplay(){
		for(int i=0;i<displayGioco.length ;i++){
			for(int j=0;j<displayGioco[i].length ;j++)
			{
				System.out.print(displayGioco[i][j].getCasella() + "  ");
			}
			System.out.println();
		}
	}
	
	public void setNave(int contatore){
		
		Random rnd = new Random();
		switch(contatore){
		
		case 0:
			  	displayGioco[rnd.nextInt(10) + 1][rnd.nextInt(10)+1].setCasella(contatore);
				
			  	break;
		case 1:
			
		case 2:
			
		case 3:
			
		case 4:
			
		case 5:
		}
	}
	
	
	public void setDisplayDefault(){
		
		//Posizionamento navi
		
		int contatoreNavi = 0;
		
		while(contatoreNavi<6)
		{
			setNave(contatoreNavi);
			break;
		}
		
		
	}
	
}

 



Classe casella()


public class Casella{
	
	private int statoCasella;
	
	public Casella(){
		
		statoCasella = 0;
	
	}
	
	public int getCasella(){
		return statoCasella;
	}
	
	public void setCasella(int nuovoStato){
		
		if(nuovoStato == 0)
		{
		  statoCasella = 2;
		}
	
	}

}


 


e poi il main:


public class Battaglia {

	public static void main(String[] args) {
		
		Display tabella = new Display();
		
		tabella.setDisplayDefault();
		
		tabella.getDisplay();
		
	}

}





SECONDO ESERCIZIO -SUDOKU-



import java.util.Random;


public class Sudoku {
	
	Random rnd = new Random();
	
	private int scacchiera[][];
	private boolean temp[][];
	
	
	/*
	 * Preparazione iniziale tabella.
	 * Viene settata con tutti 0.
	 */
	public Sudoku()
	{
		scacchiera = new int[9][9];
		temp = new boolean[9][9];
		for(int i=0; i<scacchiera.length; i++)
			for(int j=0;j<scacchiera[i].length ;j++)
			{
				scacchiera[i][j] = 0;
			}	
	}
	
	
	
	/*
	 * Settaggio tabella di controloo
	 * Se è presente 0, viene assegnato valore true
	 * Se è presente un numero diverso da 0, viene assegnato valore false 
	 */	
	public void setInizio()
	{
			for(int i=0; i<scacchiera.length; i++)
			{
				for(int j=0;j<scacchiera[i].length ;j++)
				{
					if(scacchiera[i][j] == 0)
					{
						temp[i][j] = false;
					}
					else
					{
						temp[i][j] = true;
					}
				}
			}
				
	}
	
	
	
	/*
	 * Stampa a video la tabella
	 */
	public void getScacchiera()
	{
		System.out.println(" ==================================");
		for(int i=0; i<scacchiera.length; i++)
		{
			if(i==3)
				System.out.println(" ==================================");
			else if(i==6)
				System.out.println(" ==================================");
			
			for(int j=0;j<scacchiera[i].length ;j++)
			{	
				if(j==0)
					System.out.print(" | ");
				if(j==3)
					System.out.print("| ");
				else if(j==6)
					System.out.print("| ");	
			
				System.out.print(scacchiera[i][j] + "  ");
				
				if(j == 8)
					System.out.print("| ");
			}
		System.out.println();
		}
		System.out.println(" ==================================");
	}
	
	
	
	/*
	 * Controlla se il valore da inserire è presente nella stessa riga
	 */
	private boolean isValoreInRiga(int riga, int valore)
	{
		boolean controllo = false;
		
		for(int i=0; i<9 ; i++)
		{
			// Se all'interno della riga è presente lo stesso valore che si sta cercando di inserire ritorna true altrimenti false
			if(scacchiera[riga][i] == valore)
			{
				controllo = true;
				break;
			}
		}
		return controllo;
	}
	
	
	
	/*
	 * Controlla se il valore da inserire è presente nella stessa colonna
	 */
	private boolean isValoreInColonna(int colonna, int valore)
	{
		
		boolean controllo = false;
		
		for(int i=0;i<9 ;i++)
		{
			if(scacchiera[i][colonna] == valore)
			{
				controllo = true;
			}
		}
		return controllo;
	}

	
	
	/*
	 * Controlla se il valore è presente in una cella di 3*3
	 */
	private boolean isValoreInCella(int indiceRiga, int indiceColonna, int valore)
	{
		boolean controllo = false;
		
		for(int i = indiceRiga, contatoreRiga = 0; contatoreRiga<3 ; i++ , contatoreRiga++){
			
			for (int j = indiceColonna, contatoreColonna = 0 ; contatoreColonna<3 ; j++, contatoreColonna++){
				
				if(scacchiera[i][j] == valore)
				{
					controllo = true;
					break;
				}
			}
		}
		return controllo;
	}
	
	/*
	 * Inserimento di un valore
	 */
	private boolean isInserimentoOK(int riga, int colonna, int valore){
		
		boolean controllo = true;
		
		// Se valore già presente nella stessa casella
		if(temp[riga][colonna])
		{
			controllo = false;
			return controllo;
		}	
		// Se valore già presente sulla stessa riga
		else if (isValoreInRiga(riga, valore) || isValoreInColonna(colonna, valore))
		{
			controllo = false;
			return controllo;
		}
		
		else if(controllo == true)
		{
			switch(riga)
			{
				case 0: 
				case 1:
				case 2: 
						
						if(colonna == 0 || colonna == 1 || colonna == 2)
						{
							if(isValoreInCella(0,0,valore))
							{
								controllo = false;
							}		
						}
						else if(colonna == 3 || colonna == 4 || colonna == 5)
						{
							if(isValoreInCella(0,3,valore))
							{
								controllo = false;
							}
						}
						else
						{
							if(isValoreInCella(0,6,valore))
							{
								controllo = false;
							}
						}
						
				break;
				
				case 4:
				case 5:
				case 6:		
						if(colonna == 0 || colonna == 1 || colonna == 2)
						{
							if(isValoreInCella(3,0,valore))
							{
								controllo = false;
							}		
						}
						else if(colonna == 3 || colonna == 4 || colonna == 5)
						{
							if(isValoreInCella(3,3,valore))
							{
								controllo = false;
							}
						}
						else
						{
							if(isValoreInCella(3,6,valore))
							{
								controllo = false;
							}
						}
				break;
				
				case 7:
				case 8:
				case 9:
						if(colonna == 0 || colonna == 1 || colonna == 2)
						{
							if(isValoreInCella(6,0,valore))
							{
								controllo = false;
							}			
						}
						else if(colonna == 3 || colonna == 4 || colonna == 5)
						{
							if(isValoreInCella(6,3,valore))
							{
								controllo = false;
							}
						}
						else
						{
							if(isValoreInCella(6,6,valore))
							{
								controllo = false;
							}
						}
				break;	
			}	// switch
		}
		
		return controllo;	
			
		}

	
	
		
	/*
	 * Inizializzazione tabella con valori casuali
	 */
	public void setScacchieraDefault(){
		
		int contatore = 30;
		
		while(contatore >=0)
		{
			contatore--;
			
			int riga = rnd.nextInt(9);
			int colonna = rnd.nextInt(9);
			int valore = rnd.nextInt(9)+1;
			
			if (isInserimentoOK(riga, colonna, valore ))
				scacchiera[riga][colonna] = valore;
			else
				contatore++;
		
		}
	}

	
	
	public int quantiInseriti()
	{
		int cont = 0;
		for(int i=0;i<9 ;i++)
			for(int j=0;j<9 ;j++)
			{
				if(temp[i][j])
					cont++;
			}
		return cont;
	}
	
	
	public String toString()
	{
		getScacchiera();
		setInizio();
		System.out.println(quantiInseriti());
		return ("");
	}


}



ed ecco il main:

  import java.util.Scanner;
import javax.swing.*;
import java.util.Random;

public class Main {

	
	public static void main(String[] args) {
		
		
		Random rnd = new Random();
		
		// Creazione scacchiera di gioco
		Sudoku table = new Sudoku();
		
		table.toString();
		
		// Impostazione configurazione iniziale
		
		System.out.println("Impostazione defult");
		System.out.println();
		table.setScacchieraDefault();
		table.setInizio();
		
		
		table.toString();
		
	
		
		
	}

}




Il problema sussiste nel controllo delle celle 3*3, il metodo per controllare righe e colonne (se è già presente il valore, mi apre che funzioni) non però quello maledetto per le 9 minimatrici da 3*3.
Eppure sono sicuro del procedimento da me utilizzato :k:
aaa
08/01/11 14:54
Numa Pompilio
Ora non avevo molto tempo per leggermi tutto il codice ma ho dato un'occhiata alla classe Display. Ti allego il codice con qualche correzione ;)

import java.util.Random;
 
public class Display {
 
        private Casella[][] displayGioco; <------- è una matrice di Casella
       
        public static final int LUNG_RIGA = 11;
        public static final int LUNG_COLONNA = 11;
       
	//Costruttore
        public Display(){
               
                displayGioco = new Casella[LUNG_RIGA][LUNG_COLONNA];
               
                for(int i=0;i<LUNG_RIGA;i++){
                              	for(int j=0;j<LUNG_COLONNA ;j++){

                              		displayGioco[i][j] = new Casella(); <<---------- Non c'è bisogno di questa riga
                               
					//Che vuol dire sta cosa?
                               	 	if(i==0 && j>0)
                                	{
                                        	displayGioco[i][j].setCasella(j);
                                	}
                               
                                	if(j==0 && i>0)
                                	{
                                        	displayGioco[i][j].setCasella(i);
                                	}
                               
                               
                        	}
                }
               
        }
       
	//Stampa la matrice displayGioco
        public void getDisplay(){
                for(int i=0;i<displayGioco.length ;i++){
                        for(int j=0;j<displayGioco[i].length ;j++)
                        {
                                System.out.print(displayGioco[i][j].getCasella() + "  ");
                        }
                        System.out.println();
                }
        }
       
	
        public void setNave(int contatore){
               
                Random rnd = new Random();
                switch(contatore){
               
                case 0:
                                displayGioco[rnd.nextInt(10) + 1][rnd.nextInt(10)+1].setCasella(contatore);
                               
                                break;
                case 1:
                       
                case 2:
                       
                case 3:
                       
                case 4:
                       
                case 5:
                }
        }
       
       
        public void setDisplayDefault(){
               
                //Posizionamento navi
               
                int contatoreNavi = 0;
               
                while(contatoreNavi<6)
                {
                        setNave(contatoreNavi);
                        break;
                }
               
               
        }
       
}


ps. La classe Casella, per come è strutturata, mi sembra superflua. Non basterebbe un semplice int?
aaa