Relazione SudokuMatch - gianpaolo francesco trotta

Transcript

Relazione SudokuMatch - gianpaolo francesco trotta
SUDOKU
MATCH (beta)
Gianpaolo Francesco Trotta
Sommario
INTRODUZIONE.................................................................................................................................................. 3
OBIETTIVI ........................................................................................................................................................... 3
LINGUAGGI E AMBIENTI DI SVILUPPO USATI .................................................................................................... 4
TECNOLOGIA USATA .......................................................................................................................................... 5
CREAZIONE GRIGLIE SUDOKU: PSEUDO CODICE ............................................................................................... 6
Creazione della griglia soluzione ................................................................................................................... 6
Backtracking .................................................................................................................................................. 7
Creazione della griglia incompleta ................................................................................................................ 7
Verifica di univocità della soluzione .............................................................................................................. 8
Backtracking .................................................................................................................................................. 9
Calcola un’altra soluzione............................................................................................................................ 10
SITO WEB E PRESENTAZIONE DELL’APP .......................................................................................................... 10
OBIETTIVI FUTURI ............................................................................................................................................ 12
INTRODUZIONE
Il noto gioco Sudoku ha introdotto milioni di persone a problemi di soddisfacimento di
vincoli, anche se non se ne accorgono.
Una griglia di un Sudoku è formata da 81 caselle, alcune delle quali contengono cifre
da 1 a 9 altre, invece, sono vuote.
Il gioco consiste nel riempire tutte le caselle vuote in maniera tale che nessuna cifra
compaia due volte in una riga, colonna o riquadro 3x3. Una riga, colonna o riquadro si
chiama unità.
Una griglia di Sudoku è valida se ha esattamente un’unica soluzione.
OBIETTIVI
a) Implementazione di un algoritmo per la creazione di griglie Sudoku con
un’unica soluzione di livello facile (18 caselle vuote), medio (36 caselle vuote)
e difficile (54 caselle vuote).
b) Implementazione di un’app per dispositivi android che permetta all’utente di
risolvere griglie Sudoku precedentemente create e di poter competere con i
propri amici in una gara in cui vince chi è riuscito a completare prima la
griglia.
L’obiettivo a) è stato raggiunto.
L’obiettivo b) è stato raggiunto in parte. L’app creata permette solo la modalità “Single
Player”.
LINGUAGGIEAMBIENTIDISVILUPPO
USATI
Per il raggiungimento degli obiettivi lo studente ha impiegato:
a) Eclipse come ambiente di sviluppo per la creazione delle griglie Sudoku
b) il plugin ADT (Android Development Tools) per la creazione dell’app per
sistemi operativi Android.
c) l’editor di testo Gedit per la creazione di script che permettono
l’interfacciamento dell’app con un database MYSQL in cui sono salvate le
griglie e le relative soluzioni
I linguaggi di programmazione usati sono:
a) Java
b) PHP
c) Javascript
TECNOLOGIAUSATA
a) Raspberry Pi, un single-board computer con CPU ARM1176JZF-S 700MHz,
512 MB di RAM 16 GB di memoria che funge da server ospitante eseguibili
JAR per la creazione di griglie, un database per il salvataggio delle griglie e un
sito web che riguarda l’app. Il Raspberry Pi ha un sistema operativo Raspbian
(sistema operativo libero basato su Debian e ottimizzato per l’hardware del,
raspberry)
b) LG NEXUS 4, quarto smartphone di casa Google realizzato da LG e composto
da un processore Quad Core Snapdragon S4 Pro da 1.5 GHz, 2 GB di RAM e
16 GB di memoria con sistema operativo Android 4.4.2 KitKat Build KOT49H
usato come device per il test dell’app durante lo sviluppo
CREAZIONEGRIGLIESUDOKU:PSEUDO
CODICE
Creazione della griglia soluzione
alloca matrice grid 9x9
inizializza matrice grid
alloca matrice grid_domain 81x9
inizializza matrice grid_domain
inizializza un indice k a zero
while(indice i minore della larghezza di grid)
while(indice j minore della lunghezza di grid)
aggiorna dominio della variabile i,j in base ai valori trovati nella riga [1]
aggiorna dominio della variabile i,j in base ai valori trovati nella colonna [2]
aggiorna dominio della variabile i,j in base ai valori trovati nel riquadro 3x3 [3]
alloca domain
riempi domain [4]
if (la lunghezza di domain è 1)
assegna alla cella in posizione i,j il primo valore di domain
else if (la lunghezza di domain è maggiore di 1)
assegna alla cella in posizione i,j un valore in posizione random di domain
else
backtracking
incrementa k [5]
incrementa j
incrementa i
[1],[2],[3] l’aggiornamento del domino consiste nel mettere a -1 in grid_domain i valori
delle variabili che si trovano nella riga, colonna o riquadro 3x3 di grid relativi alla
posizione i,j
[4] domain è un vettore contenente solo i valori che è possibile inserire all’interno della
cella in posizione i,j
[5] k è l’indice di riga della grid_domain
Backtracking
ripristina il dominio della variabile in grid_domain alla riga k
decrementa l’indice k relativo a grid_domain
calcola la posizione i,j di grid in base all’indice k di grid_domain
assegna -1 il valore assegnato alla variabile in posizione i,j in grid, in grid_domain
assegna zero alla cella in posizione i,j in grid
decrementa k
calcola i,j
Creazione della griglia incompleta
Sono stati previsti 3 livelli di difficoltà:
1. Facile - 18 caselle vuote
2. Medio - 36 caselle vuote
3. Difficile - 54 caselle vuote
do
do
copia grid in sudokuZero
metti a zero in sudokuZero 18,36 o 54 caselle
calcola l’hash di sudokuZero
while ( hash di sudokuZero è presente nel database)
copia sudokuZero in newGrid
copia sudokuZero in newNewGrid
while( la soluzione non è unica ) [1]
inserisci nel database hash di sudokuZero, difficoltà, grid, sudokuZero [2]
[1] sudokuZero sarà la griglia incompleta con un’unica soluzione
[2] grid è la soluzione di sudokuZero (griglia incompleta)
Verifica di univocità della soluzione
alloca memoria per la matrice grid_domain 81x9 (contenente i domini delle singole celle)
inizializza grid_domain
inizializza l’indice k a zero
inizializza solution a zero
while (k è uguale a zero)
while (i è minore della lunghezza di newGrid)
while (j è minore della larghezza di newGrid)
aggiorna dominio della variabile i,j in base ai valori trovati nella riga [1]
aggiorna dominio della variabile i,j in base ai valori trovati nella colonna [2]
aggiorna dominio della variabile i,j in base ai valori trovati nel riquadro 3x3 [3]
alloca domain
riempi domain [4]
if (lunghezza di domain è maggiore o uguale a 1)
assegna a newGrid in posizione i,j il primo valore di domain
else
backtracking
incrementa k
incrementa solution
if (solution è uguale a 1)
if ( la soluzione trovata e salvata in newGrid è diversa da grid )
calcola altra soluzione
if ( l’altra soluzione è uguale a newGrid )
la soluzione è unica
else
la soluzione non è unica
else
la soluzione non è unica
else
la soluzione non è unica
[1],[2],[3] l’aggiornamento del domino consiste nel mettere a -1 in grid_domain i valori
delle variabili che si trovano nella riga, colonna o riquadro 3x3 di grid relativi alla
posizione i,j
[4] domain è un vettore contenente solo i valori che è possibile inserire all’interno della
cella in posizione i,j
[5] k è l’indice di riga della grid_domain
Backtracking
ripristina il dominio della variabile in grid_domain alla riga k
decrementa k
if ( k è minore di zero ) [5]
assegna 1 a k
assegna a i la lunghezza di newGrid
assegna a j la larghezza di newGrid
assegna -1 a solution
else
assegna valore -1 ad una variabile countK
while ( x è minore della lunghezza di sudokuZero )
while ( y è minore della larghezza di sudokuZero )
if ( sudokuZero in posizione x,y è uguale a zero )
incrementa countK
if ( countK è uguale a k )
assegna a i il valore di x
assegna a j il valore di y
assegna a x il valore della lunghezza di sudokuZero
assegna a y il valore della larghezza di sudokuZero
incrementa y
incrementa x
assegna -1 il valore assegnato alla variabile in posizione i,j in newGrid, in grid_domain
assegna zero alla cella in posizione i,j in newGrid
decrementa k
if ( k è minore di zero )
assegna a i il valore della lunghezza di newGrid
assegna a j il valore della larghezza di newGrid
else
assegna –1 a countK
while ( x è minore della lunghezza di sudokuZero )
while ( y è minore della larghezza di sudokuZero )
if ( sudokuZero in posizione x,y è uguale a zero )
incrementa countK
if ( countK è uguale a k )
assegna a i il valore di x
assegna a j il valore di y
assegna a x il valore della lunghezza di sudokuZero
assegna a y il valore della larghezza di sudokuZero
incrementa y
incrementa x
[5] Non esistono soluzioni
Calcola un’altra soluzione
A differenza del calcolo della prima soluzione (effettuato prima di creare la matrice
incomplete sudokuZero), considero una grid_domain inversa cioè con righe in cui i
valori dei domini vengono letti dal più grande al più piccolo e non dal più piccolo al più
grande come è stato fatto per la creazione della griglia soluzione.
In questa maniera possiamo affermare che la soluzione è unica nel caso in cui l’altra
soluzione è uguale alla griglia soluzione.
SITOWEBEPRESENTAZIONEDELL’APP
Il sito web è raggiungibile all’indirizzo http://gftrotta.no-ip.biz/sudokumatch
L’index contiene degli script PHP che leggono alcuni dati da file creati dagli eseguibili
JAR per ottenere informazioni circa la creazione delle griglie.
Ogni secondo, viene rilanciata l’index grazie ad una funzione jQuery che richiama uno
script AJAX per aggiornare i dati letti dai file.
L’app ha una grafica molto spartana, da migliorare in futuro, e si presenta in questa
maniera:
Cliccando su Easy, Medium o Difficult si richiamano rispettivamente easy.php,
medium.php e difficult.php.
Sono degli script in PHP che recuperano le matrici incomplete e le soluzioni di tutte le
griglie di livello facile, medio o difficile. Tra tutte le griglie, una a caso, viene stampata
come stringa JSON. Questa stringa viene letta da una funzione dell’app e si può
procedere alla creazione della griglia incompleta.
Maggiori sono le griglie, maggiore è il tempo di loading. In futuro si potrebbe
ottimizzare la funzione di recupero della griglia di gioco.
E’ possibile scaricare l’app collegandosi alla pagina web.
OBIETTIVIFUTURI
Ottimizzare gli algoritmi di creazione griglia e verifica di univocità della soluzione.
Trovare una soluzione al problema del tempo di loading della griglia sull’app.
Implementare la modalità “Player vs Player” usando, magari, l’email di un qualsiasi
social network a cui è iscritto l’utente per tenere traccia nel database dell’utente stesso.
Varie ed eventuali