2. Σκοπός
Η εργασία αυτή είχε ως στόχο την δημιουργία μιας android εφαρμογής. Πιο
συγκεκριμένα την επίλυση Sudoku.Ο χρήστης έχει την δυνατότητα να επιλέγει
αριθμούς που αρχικά θα υπάρχουν στο Sudoku και πατώντας ένα συγκεκριμένο
button να του επιστρέφεται αυτό λυμένο.
Εργαλεία
Η υλοποίηση της εργασίας πραγματοποιήθηκε στην πλατφόρμα eclipse,σε
γλώσσα προγραμματισμού JAVA σε συνδυασμό με XML. Ακόμα προστέθηκε το
Android SDK το οποίο παρέχει βιβλιοθήκες και εργαλεία για την ανάπτυξη
εφαρμογών που ήταν απαραίτητα.
Περιγραφή υλοποίησης
Διάγραμμα Υλοποίησης
3. Αρχικά δημιουργήσαμε την κλάση ΜainActivity η όποια περιέχει το
κεντρικό Menu της εφαρμογής. Στην συνάρτηση onCreate() η όποια εκτελείτε
με την εκκίνηση του activity, συνδέουμε με setContentView() το XML αρχείο
activity_main που περιέχει τα γραφικά που εμφανίζονται στην οθόνη καθώς
και τα buttons που δίνουν κάποιες επιλογές στον χρηστή :
Lets solve
Help
Exit
Η κάθε μια επιλογή δημιουργεί- ξεκινά ένα καινούργιο activity. Πιο
συγκεκριμένα :
Πατώντας ο χρήστης το button Lets Solve το πρόγραμμα μεταφέρεται στην
κλάση Draw, η οποία είναι ένα νέο activity. Το κύριο μέρος της εφαρμογής
ώστε να υλοποιηθεί η εφαρμογή βρίσκεται σε αυτή την κλάση. Κατά την
εκκίνηση αυτού του activity δημιουργούμε ένα αντικείμενο της κλάσης
SudokuBoardCreate στην όποια γίνεται η σχεδίαση του πίνακα και τον
αριθμών πάνω σε έναν καμβά (οθόνη). Ειδικότερα έγινε χρήση της κλάσης
View κάνοντας την extend στην SudokuBoardCreate. Αυτό μας έδωσε την
δυνατότητα χρήσης της συνάρτησης onDraw η όποια είναι υπεύθυνη για να
ζωγραφίσει πάνω στον καμβά.
4. Για την σχεδίαση του πίνακα δημιουργήσαμε
τις κάθετες και τις οριζόντιες γραμμές με την
βοήθεια της drawLine() δίνοντας σαν ορίσματα
το χρώμα και τη θέση που θα χρωματίσει. Στο
Sudoku όμως ο πινάκας πρέπει να χωρίζεται σε
εννέα κουτιά 3x3 των εννέα θέσεων. Για να γίνει
αυτό σχεδιαστήκαν οι βασικές γραμμές και ανά
τρία κάθετα και οριζόντια προσθέσαμε ένα pixel
πριν και ένα pixel μετά άλλη μια γραμμή
πετυχαίνοντας έτσι πιο έντονη γραμμή.
Στη συνεχεία αυτόν τον πίνακα που δημιουργήσαμε τον κάναμε ενεργό.
Δηλαδή ο χρήστης επιλέγει κάθε κουτί ,το όποιο και χρωματίζεται, αγγίζοντας
την οθόνη. Αυτό έγινε με την συνάρτηση onTouchEvent(). Επιπλέον κρατάμε
τις συντεταγμένες του σημείου που έχει πατήσει ώστε επιλέγοντας κάποιον
αριθμό (η επιλογή γίνεται και χρησιμοποιείτε listener ώστε να καθοριστεί η
συμπεριφορά του κουμπιού) να σχηματίζεται στη σωστή θέση του πίνακα. Ο
αριθμός αυτός αποθηκεύεται σε έναν πίνακα 81 θέσεων ο όποιος έχει
αρχικοποιηθεί με μηδενικά και δηλωθεί στην κλάση Draw. Η αποθήκευση
αυτή μας βοηθάει ώστε να γνωρίζουμε σε ποιο κουτί του πίνακα βρίσκεται
κάθε αριθμός που έχει εισαχθεί. Η drawText() μας επιτρέπει να ζωγραφίζουμε
πάνω στον καμβά κείμενο (strings) . Παράλληλα με την σχεδίαση και την
εισαγωγή των αριθμών γίνεται και έλεγχος για το αν μπορεί ο αριθμός που
έχει επιλεγεί να μπει στην συγκεκριμένη θέση του πίνακα. Ελέγχουμε κάθε
γραμμή, κάθε στήλη και κάθε κουτί 3x3 αν περιέχει τον αριθμό που θέλουμε
να εισάγουμε. Αν βρίσκεται στην ίδια γραμμή ή στήλη ή στο ίδιο κουτί τότε ο
χρήστης λαμβάνει μήνυμα (toast) που τον ενημερώνει πως η επιλογή κελίου
είναι λανθασμένη. Αν στη συνεχεία ο χρήστης επιλέξει να λυθεί το Sudoku
έχοντας λάθος, αυτό δεν λύνεται και του εμφανίζει εκ νέου γραπτό και
ηχητικό μήνυμα λάθους.
5. Εφόσον ο χρήστης έχει εισάγει κάποια
νούμερα μπορεί να επιλέξει την λύση του
Sudoku με το button Solve. Από τη στιγμή που
πατηθεί ενεργοποιείται ο αλγόριθμος και
αναλαμβάνει να λύσει το Sudoku.
Ο αλγόριθμος αυτός είναι backtracking.
Δηλαδή καθώς ο αλγόριθμος προχωρεί
μπορεί να βρεθεί σε κάποιο αδιέξοδο και να
μην μπορεί να γεμίσει κάποια κουτιά γιατί
έχει προσθέσει κάποιους αριθμούς χωρίς να
γνωρίζει τι θα πρέπει να προσθέσει αργότερα.
Γι’ αυτό το λόγο χρειαστήκαμε έναν backtrack
αλγόριθμο ώστε να υπάρχει η δυνατότητα αν
βρεθεί σε αυτό το αδιέξοδο να μπορεί να
ξανατρέξει από παλιότερο σημείο.
Λειτουργία Αλγορίθμου
Αναλυτικότερα, η εφαρμογή του αλγορίθμου ξεκινά από το πρώτο κελί του
πίνακα.
6. Ελέγχει οριζόντιες, κάθετες και τα κουτιά 3x3 αν περιέχουν τον ίδιο αριθμό.
Τοποθετεί τον αριθμό και προχωράει στο επόμενο κελί κάνοντας τους ίδιους
ελέγχους. Αν βρεθεί σε αδιέξοδο όπως είπαμε και παραπάνω επιστρέφει στο
επόμενο κελί και ξαναεκτελεί τους ελέγχους δοκιμάζοντας άλλο αριθμό.
7. Επειδή ο χρόνος επίλυσης κάθε Sudoku διαφέρει ανάλογα με το επίπεδο
δυσκολίας, προσθέσαμε ένα παράθυρο(ProgressDialog) που μας ενημερώνει ότι
η επίλυση του παζλ είναι σε εξέλιξη. Αυτό θέτει την επίλυση του αλγορίθμου στο
παρασκήνιο και μας φέρνοντας στο προσκήνιο το παράθυρο που αναφέραμε
νωρίτερα.
Μόλις η διαδικασία επίλυσης ολοκληρωθεί το λυμένο Sudoku βρίσκετε πλέον
στην οθόνη μας και αντίστοιχο γραπτό μήνυμα(Toast) εμφανίζεται στην οθόνη
μας.
8. Ακόμα ο χρήστης έχει την δυνατότητα από το αρχικό menu πατώντας το
button Help να πάρει κάποια βοήθεια για το πώς παίζεται το παιχνίδι Sudoku σε
περίπτωση που κάποιος δεν γνωρίζει.
Τέλος με βάση τον κύκλο ζωής μιας εφαρμογής-activity θα πρέπει να
καταστρέφεται και να κλείνει ώστε να μην δεσμεύει μνήμη, έτσι προστέθηκε ένα
Button Exit το οποίο τερματίζει και την εφαρμογή μας ελευθερώνοντας όλους
τους δεσμευμένους πόρους.
Προβλήματα
Τα προβλήματα που αντιμετωπίσαμε ήταν κυρίως προγραμματιστικά
και όχι τόσο θέματα μνήμης. Δηλαδή, πρόβληματα στο πως θα κάνουμε τον
πίνακα να ‘’ακούει’’ και να παίρνει σωστές τιμές ώστε να επιλεγεί το σωστό
κελί και να βάζει τους αριθμούς.
9. Ακόμα τρέχοντας και δοκιμάζοντας αλγορίθμους είδαμε ότι το σύστημα
αργεί χωρίς να κάνουμε μεγάλες αλλαγές. Προσθέταμε ένα for-loop και αυτό
αρκούσε για να το καθυστερήσει για κάποιο μικρό χρονικό διάστημα. Κατά
την δόκιμη επίσης συναντήσαμε το πρόβλημα ότι ο αλγόριθμος έφτανε συχνά
σε αδιέξοδο. Αυτό λύθηκε με την χρήση backtrack αλγορίθμου.
Σημειώσεις-Παρατηρήσεις
Η εφαρμογή δημιουργήθηκε βάση της έκδοσης Jelly Bean 4.0 επειδή το
μεγαλύτερο ποσοστό των κινητών Android που κυκλοφορούν έχουν αυτή ή
νεότερη έκδοση του κινητού.
Επιπλέον δόκιμες έγιναν σε όσο των δυνατόν περισσότερες οθόνες και
tablet.