9
2014 Ενσωματωμένα Συστήματα Μικροεπεξεργαστών Στέλιος Μπαλαμπάνης 2008030083 Αλέξανδρος Πιαλόγλου 2008030097 [SUDOKU SOLVER (ANDROID APPLICATION)] Αναφορά εργασίας

SudokuSolver anafora

Embed Size (px)

Citation preview

Page 1: SudokuSolver anafora

2014 Ενσωματωμένα

Συστήματα Μικροεπεξεργαστών

Στέλιος Μπαλαμπάνης 2008030083 Αλέξανδρος Πιαλόγλου 2008030097

[SUDOKU SOLVER (ANDROID APPLICATION)] Αναφορά εργασίας

Page 2: SudokuSolver anafora

Σκοπός

Η εργασία αυτή είχε ως στόχο την δημιουργία μιας android εφαρμογής. Πιο

συγκεκριμένα την επίλυση Sudoku.Ο χρήστης έχει την δυνατότητα να επιλέγει

αριθμούς που αρχικά θα υπάρχουν στο Sudoku και πατώντας ένα συγκεκριμένο

button να του επιστρέφεται αυτό λυμένο.

Εργαλεία

Η υλοποίηση της εργασίας πραγματοποιήθηκε στην πλατφόρμα eclipse,σε

γλώσσα προγραμματισμού JAVA σε συνδυασμό με XML. Ακόμα προστέθηκε το

Android SDK το οποίο παρέχει βιβλιοθήκες και εργαλεία για την ανάπτυξη

εφαρμογών που ήταν απαραίτητα.

Περιγραφή υλοποίησης

Διάγραμμα Υλοποίησης

Page 3: SudokuSolver anafora

Αρχικά δημιουργήσαμε την κλάση Μ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 η όποια είναι υπεύθυνη για να

ζωγραφίσει πάνω στον καμβά.

Page 4: SudokuSolver anafora

Για την σχεδίαση του πίνακα δημιουργήσαμε

τις κάθετες και τις οριζόντιες γραμμές με την

βοήθεια της drawLine() δίνοντας σαν ορίσματα

το χρώμα και τη θέση που θα χρωματίσει. Στο

Sudoku όμως ο πινάκας πρέπει να χωρίζεται σε

εννέα κουτιά 3x3 των εννέα θέσεων. Για να γίνει

αυτό σχεδιαστήκαν οι βασικές γραμμές και ανά

τρία κάθετα και οριζόντια προσθέσαμε ένα pixel

πριν και ένα pixel μετά άλλη μια γραμμή

πετυχαίνοντας έτσι πιο έντονη γραμμή.

Στη συνεχεία αυτόν τον πίνακα που δημιουργήσαμε τον κάναμε ενεργό.

Δηλαδή ο χρήστης επιλέγει κάθε κουτί ,το όποιο και χρωματίζεται, αγγίζοντας

την οθόνη. Αυτό έγινε με την συνάρτηση onTouchEvent(). Επιπλέον κρατάμε

τις συντεταγμένες του σημείου που έχει πατήσει ώστε επιλέγοντας κάποιον

αριθμό (η επιλογή γίνεται και χρησιμοποιείτε listener ώστε να καθοριστεί η

συμπεριφορά του κουμπιού) να σχηματίζεται στη σωστή θέση του πίνακα. Ο

αριθμός αυτός αποθηκεύεται σε έναν πίνακα 81 θέσεων ο όποιος έχει

αρχικοποιηθεί με μηδενικά και δηλωθεί στην κλάση Draw. Η αποθήκευση

αυτή μας βοηθάει ώστε να γνωρίζουμε σε ποιο κουτί του πίνακα βρίσκεται

κάθε αριθμός που έχει εισαχθεί. Η drawText() μας επιτρέπει να ζωγραφίζουμε

πάνω στον καμβά κείμενο (strings) . Παράλληλα με την σχεδίαση και την

εισαγωγή των αριθμών γίνεται και έλεγχος για το αν μπορεί ο αριθμός που

έχει επιλεγεί να μπει στην συγκεκριμένη θέση του πίνακα. Ελέγχουμε κάθε

γραμμή, κάθε στήλη και κάθε κουτί 3x3 αν περιέχει τον αριθμό που θέλουμε

να εισάγουμε. Αν βρίσκεται στην ίδια γραμμή ή στήλη ή στο ίδιο κουτί τότε ο

χρήστης λαμβάνει μήνυμα (toast) που τον ενημερώνει πως η επιλογή κελίου

είναι λανθασμένη. Αν στη συνεχεία ο χρήστης επιλέξει να λυθεί το Sudoku

έχοντας λάθος, αυτό δεν λύνεται και του εμφανίζει εκ νέου γραπτό και

ηχητικό μήνυμα λάθους.

Page 5: SudokuSolver anafora

Εφόσον ο χρήστης έχει εισάγει κάποια

νούμερα μπορεί να επιλέξει την λύση του

Sudoku με το button Solve. Από τη στιγμή που

πατηθεί ενεργοποιείται ο αλγόριθμος και

αναλαμβάνει να λύσει το Sudoku.

Ο αλγόριθμος αυτός είναι backtracking.

Δηλαδή καθώς ο αλγόριθμος προχωρεί

μπορεί να βρεθεί σε κάποιο αδιέξοδο και να

μην μπορεί να γεμίσει κάποια κουτιά γιατί

έχει προσθέσει κάποιους αριθμούς χωρίς να

γνωρίζει τι θα πρέπει να προσθέσει αργότερα.

Γι’ αυτό το λόγο χρειαστήκαμε έναν backtrack

αλγόριθμο ώστε να υπάρχει η δυνατότητα αν

βρεθεί σε αυτό το αδιέξοδο να μπορεί να

ξανατρέξει από παλιότερο σημείο.

Λειτουργία Αλγορίθμου

Αναλυτικότερα, η εφαρμογή του αλγορίθμου ξεκινά από το πρώτο κελί του

πίνακα.

Page 6: SudokuSolver anafora

Ελέγχει οριζόντιες, κάθετες και τα κουτιά 3x3 αν περιέχουν τον ίδιο αριθμό.

Τοποθετεί τον αριθμό και προχωράει στο επόμενο κελί κάνοντας τους ίδιους

ελέγχους. Αν βρεθεί σε αδιέξοδο όπως είπαμε και παραπάνω επιστρέφει στο

επόμενο κελί και ξαναεκτελεί τους ελέγχους δοκιμάζοντας άλλο αριθμό.

Page 7: SudokuSolver anafora

Επειδή ο χρόνος επίλυσης κάθε Sudoku διαφέρει ανάλογα με το επίπεδο

δυσκολίας, προσθέσαμε ένα παράθυρο(ProgressDialog) που μας ενημερώνει ότι

η επίλυση του παζλ είναι σε εξέλιξη. Αυτό θέτει την επίλυση του αλγορίθμου στο

παρασκήνιο και μας φέρνοντας στο προσκήνιο το παράθυρο που αναφέραμε

νωρίτερα.

Μόλις η διαδικασία επίλυσης ολοκληρωθεί το λυμένο Sudoku βρίσκετε πλέον

στην οθόνη μας και αντίστοιχο γραπτό μήνυμα(Toast) εμφανίζεται στην οθόνη

μας.

Page 8: SudokuSolver anafora

Ακόμα ο χρήστης έχει την δυνατότητα από το αρχικό menu πατώντας το

button Help να πάρει κάποια βοήθεια για το πώς παίζεται το παιχνίδι Sudoku σε

περίπτωση που κάποιος δεν γνωρίζει.

Τέλος με βάση τον κύκλο ζωής μιας εφαρμογής-activity θα πρέπει να

καταστρέφεται και να κλείνει ώστε να μην δεσμεύει μνήμη, έτσι προστέθηκε ένα

Button Exit το οποίο τερματίζει και την εφαρμογή μας ελευθερώνοντας όλους

τους δεσμευμένους πόρους.

Προβλήματα

Τα προβλήματα που αντιμετωπίσαμε ήταν κυρίως προγραμματιστικά

και όχι τόσο θέματα μνήμης. Δηλαδή, πρόβληματα στο πως θα κάνουμε τον

πίνακα να ‘’ακούει’’ και να παίρνει σωστές τιμές ώστε να επιλεγεί το σωστό

κελί και να βάζει τους αριθμούς.

Page 9: SudokuSolver anafora

Ακόμα τρέχοντας και δοκιμάζοντας αλγορίθμους είδαμε ότι το σύστημα

αργεί χωρίς να κάνουμε μεγάλες αλλαγές. Προσθέταμε ένα for-loop και αυτό

αρκούσε για να το καθυστερήσει για κάποιο μικρό χρονικό διάστημα. Κατά

την δόκιμη επίσης συναντήσαμε το πρόβλημα ότι ο αλγόριθμος έφτανε συχνά

σε αδιέξοδο. Αυτό λύθηκε με την χρήση backtrack αλγορίθμου.

Σημειώσεις-Παρατηρήσεις

Η εφαρμογή δημιουργήθηκε βάση της έκδοσης Jelly Bean 4.0 επειδή το

μεγαλύτερο ποσοστό των κινητών Android που κυκλοφορούν έχουν αυτή ή

νεότερη έκδοση του κινητού.

Επιπλέον δόκιμες έγιναν σε όσο των δυνατόν περισσότερες οθόνες και

tablet.