Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-09-2019, 09:48   #1
Nigy
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();
		}
	}

}
ma quello che non riesco proprio a capire è che logica vuole farmi usare attraverso il metodo getValoriValidi. Penso di averlo sviluppato in accordo con l'indicazione per quel metodo, ma non riesco ad inserirlo correttamente nel programma.
Qualche suggerimento?
Grazie mille a tutti
Nigy è offline   Rispondi citando il messaggio o parte di esso
Old 11-09-2019, 12:22   #2
Kaya
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;
}
A te il modo su cui implementare il resto.
AH, un suggerimento: COMMENTA IL CODICE!
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 11-09-2019, 20:50   #3
Nigy
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
Nigy è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2019, 09:34   #4
Kaya
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
Kaya è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2019, 21:37   #5
Nigy
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
Nigy è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2019, 08:06   #6
Kaya
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.
Kaya è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Changan lancia la Deepal S05 in Europa, ...
Substrati in vetro, Intel smentisce le v...
ECOVACS DEEBOT T50 PRO OMNI Gen2 fa piaz...
Windelo 62: catamarano a vela che unisce...
Francia, in arrivo un incentivo di 1.000...
Haier, la sorpresa a IFA: la lavatrice C...
GeForce RTX 5000 SUPER in arrivo? Sembra...
Ionity prova una soluzione contro i ladr...
Pirateria, svolta clamorosa: Dazn e Lega...
Maxi richiamo Toyota e Lexus: oltre 900....
Blackwell Ultra: fino al 45% di prestazi...
Neuralink: 12 pazienti hanno usato l'imp...
Amazon sorprende tutti oggi: valanga di ...
A19 e A19 Pro: Apple svela le differenze...
NASA: inizia l'esperimento CHAPEA per si...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:12.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v