|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Sep 2019
Messaggi: 3
|
Sudoku in Java
Ciao a tutti ragazzi, sono nuovo del forum e in un certo senso anche di Java.
Sono alle prese con un esercizio che mi chiede di creare il gioco del Sudoku secondo queste indicazioni: Si crei una classe Sudoku che possiede i seguenti attributi: scacchiera: un array 9x9 di interi che rappresenta lo stato attuale del gioco e in cui gli zeri rappresentano le celle ancora non riempite. inizio: un array 9x9 di valori booleani che specifica quali elementi dell'array scacchiera possiedono un valore che non può essere modificato. e i seguenti metodi: Sudoku: un costruttore che crea un nuovo gioco in cui tutte le caselle sono vuote. toString: restituisce una stringa stampabile che rappresenta il gioco. aggiungiIniziali(riga, colonna, valore): aggiunge nella posizione specificata da riga e colonna il valore iniziale dato da valore che non può essere modificato. aggiungiMossa(riga, colonna,valore): aggiunge nella posizione specificata da riga e colonna il valore specificato da valore. Tale valore può essere modificato. verificaGioco(): restituisce vero se i valori inseriti non violano le regole del gioco. getValoreIn(riga,colonna): restituisce il valore contenuto nella posizione specificata da riga e colonna. getValoriValidi(riga, colonna): restituisce una array monodimensionale di nove valori booleani, ognuno dei quali corrisponde a una cifra e risulta vero se la cifra può essere posta alla posizione specificata da riga e colonna senza violare le regole del gioco. pieno():restituisce vero se ogni cella possiede un valore. reset(): imposta a zero tutte le celle che non contengono valori immutabili. Ho implementato il codice in questo modo: Codice:
public class Sudoku { private int scacchiera[][]=new int[9][9]; private boolean inizio[][]=new boolean[9][9]; public Sudoku() { for(int i=0;i<scacchiera.length;i++) { for(int j=0;j<scacchiera[0].length;j++) { scacchiera[i][j]=0; } } for(int i=0;i<inizio.length;i++) { for(int j=0;j<inizio[0].length;j++) { inizio[i][j]=false; } } } public void aggiungiIniziali(int riga, int colonna, int valore) { scacchiera[riga][colonna]=valore; inizio[riga][colonna]=true; } public void aggiungiMossa(int riga,int colonna,int valore) { if(getValoriValidi(riga, colonna)[colonna]==true) { scacchiera[riga][colonna]=valore; if(!verificaGioco()) { System.out.println("Hai gia inserito il "+getValoreIn(riga, colonna)+ " in questa riga o colonna"); System.out.println("inserisci un altro valore"); scacchiera[riga][colonna]=0; } }else { System.out.println("Non puoi modificare il valore di questa cella."); } } public boolean verificaGioco() { int riga[]=new int[9]; int colonna[]=new int[9]; for(int i=0;i<scacchiera.length;i++) { for(int j=0;j<scacchiera[0].length;j++) { riga[i]=scacchiera[i][j]; colonna[i]=scacchiera[j][i]; for(int j2=j+1;j2<riga.length;j2++) { if(riga[i]==0 || colonna[i]==0) { continue; } if( (riga[i]==scacchiera[i][j2]) || (colonna[i]==scacchiera[j2][i]) ) { return false; } } } } return true; } private int getValoreIn(int riga,int colonna) { return scacchiera[riga][colonna]; } private boolean[] getValoriValidi(int riga, int colonna) { boolean array[]=new boolean[9]; if(inizio[riga][colonna]==false ) { if(verificaGioco()) { array[colonna]=true; } } return array; } public boolean pieno() { for(int i=0;i<scacchiera.length;i++) { for(int j=0;j<scacchiera[0].length;j++) { if(scacchiera[i][j]==0) { return false; } } } return true; } public void reset() { for(int i=0;i<inizio.length;i++) { for(int j=0;j<inizio[0].length;j++) { if(inizio[i][j]==false) { scacchiera[i][j]=0; } } } } public void mioString() { for(int i=0;i<scacchiera.length;i++) { for(int j=0;j<scacchiera[0].length;j++) { if(scacchiera[i][j]==0) { System.out.print(" "+" "); }else { System.out.print(scacchiera[i][j]+" "); } } System.out.println(); } } } Qualche suggerimento? Grazie mille a tutti ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3233
|
Allora, prima di tutto c'è da capire che livello di programmazione java prevede il corso.
Perchè, così ad esempio, la funzione getValoreIn non va bene. E ti spiego il perchè: se richiami la funzione getValoreIn(-1; 99) otterai un outofboundexception. Quindi banalmente ti direi di estendere la classe con le Exception e fare un raise con i parametri del caso. per quanto riguarda getValoriValidi, devi fare un controllo per cui, il valore contenuto nell'indice x,y rispetti queste 3 regole 1) Non è ripetuto nella riga 2) Non è ripetuto nella colonna 3) Non è ripetuto nel quadrante quindi, diciamo in modo elementare, io svilupperei 3 metodi privati di supporto checkRiga, checkColonna, checkQuadrante Codice:
quindi checkRiga(numRiga){ i=0; int countValori[] = { 0,0,0,0,0,0,0,0,0}; //Uso questo come una lista di valori. //Potrei anche usare una lista , un array list o altro, dipende da quello che mi interessa //La iesima posizione corrisponde al valore, se è 0 il valore non è mai stato visto, uno altrimenti for (int i=0;i<10;i++){ int indice = scacchiera[numRiga][i]: if (countValori[indice] != 0 ){ countValori[indice] = 1; } else { return false } } return true; } AH, un suggerimento: COMMENTA IL CODICE! |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Sep 2019
Messaggi: 3
|
Ciao Kaya, intanto grazie per la cortese risposta.
Si lo so, commentare il codice è un abitudine che devo prendere ancora bene, ma finche il testo mi da indicazioni su quello che fanno vari metodi, non mi viene di farlo ![]() ![]() Per quanto riguarda il resto, ti spiego tutto. allora, il corso va dalla programmazione base a quella avanzata e sono arrivato al capitolo in cui vengono spiegate le classi ma non sono ancora arrivato alle Exception o alle liste. Inoltre devo svolgere gli esercizi attenendomi strettamente a quanto scritto nella loro descrizione. La funzione dei 3 metodi che mi suggerisci: checkRiga,Colonna Quadrante, in pratica è svolta dal metodo verificaGioco() che controlla se esistono duplicati per riga e colonna all'interno di scacchiera e per questo mi è venuto naturale inserirlo nel metodo getValoriValidi(). il problema è che non capisco come mi vuole far utilizzare getValoriValidi, secondo quale logica per intenderci |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3233
|
Quella sui commenti è una cazzata. "Si autoesplicano da soli" è una cosa aberrante che nessuno vuole sentire.
Detto questo credo che voglia che tu faccia un discorso diverso. Devi restituire un array in cui restituisce true o false, a seconda del caso in cui in quella cella puoi o non puoi mettere quel valore ad esempio getValoriValidi(1, 1) restituisce [f,f,f,f,f,t,t,t,t] ovvvero => 1-> false 2-> false 3-> false 4-> false 5-> false 6-> true 7-> true 8-> true 9-> true e dice che in quella cella puoi inserire i numeri 6,7,8 e 9. O almeno così ho capito io |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Sep 2019
Messaggi: 3
|
In effetti è il dubbio che ho anche io perché poi c'è il metodo verificaGioco che controlla che i numeri inseriti non violino le regole del gioco.
L'incrocio di questi due metodi mi sta mandando in confusione ![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2005
Messaggi: 3233
|
Infatti per quello ti avrei suggerito di fare 3 metodi nuovi, cosichè il metodo verificaGioca itera sui 3 metodi.
La funzione getValoriValidi secondo me è utilizzata poichè, in fase di inserimento di un valore ti identifica subito se c'è un errore o meno. Questo può in caso essere utile per creare una serie di flag che identificano dove sono gli errori, e poi verificaGioco controlla se c'è o meno l'errore. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:12.