Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών 5 Εξάμηνο ΤΗΜΜΥ Α.Π.Θ 2014-2015 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ DS Gmku Το παιχνίδι Το φετινό παιχνίδι αποτελεί μια απλουστευμένη παραλλαγή του παιχνιδιού Gmku, το οποίο με την σειρά του αποτελεί παραλλαγή του γνωστού παιχνιδιού Σκορ-4 (περισσότερες λεπτομέρειες στο http://en.wikipedia.rg/wiki/gmku). Έχουμε δύο παίκτες (άσπρος / μαύρος) που παίζουν εναλλάξ τοποθετώντας πλακίδια πάνω στο ταμπλό, με σκοπό να καταφέρουν να δημιουργήσουν μια πεντάδα, οριζόντια, κάθετα ή διαγώνια, πριν από τον αντίπαλο τους (Εικόνα 1). Εικόνα 1: Το περιβάλλον του παιχνιδιού DS-Gmku για το μάθημα των Δομών Δεδομένων 2014-2015 Το παιχνίδι παίζεται σε ένα ταμπλό διαστάσεων 15x15 (οι διαστάσεις μπορεί να αλλάξουν στο μέλλον). Πρώτος παίζει ο παίκτης με τα μαύρα πλακίδια. Κάθε παίκτης μπορεί, όταν έρθει η σειρά του, να τοποθετήσει ένα πλακίδιο σε οποιαδήποτε κενή θέση του ταμπλό. Ο πρώτος παίκτης που θα τοποθετήσει 5 πλακίδια στην σειρά, προς οποιαδήποτε κατεύθυνση, κερδίζει.
Εγκατάσταση Για να εγκαταστήσετε το prject στον eclipse, αρκεί να κάνετε unzip το αρχείο Gmku Part A.zip μέσα στον φάκελο wrkspace που έχετε ορίσει, και στη συνέχεια από το περιβάλλον του eclipse να κάνετε: File Imprt General Existing Prjects int Wrkspace Για να τρέξετε το prject κάνετε δεξί κλικ πάνω στο prject και στη συνέχεια επιλέγετε: Run As Java Applicatin Εργασία Α Randm Mvement (0,75 βαθμοί) Σκοπός της πρώτης εργασίας είναι η τροποποίηση ή η συμπλήρωση κάποιων συναρτήσεων των κλάσεων που είναι απαραίτητες για την ομαλή λειτουργία του παιχνιδιού. Αυτές είναι: 1. Κλάση Tile: Η κλάση αυτή δημιουργεί τα πλακίδια του ταμπλό του παιχνιδιού. Θα πρέπει να έχει τις εξής μεταβλητές: int id: είναι μια μεταβλητή που δείχνει το μοναδικό κωδικό ενός πλακιδίου. int x: η μεταβλητή αυτή δείχνει την θέση του πλακιδίου στον άξονα x x. int y: η μεταβλητή αυτή δείχνει την θέση του πλακιδίου στον άξονα y y. int clr: η μεταβλητή αυτή δείχνει το χρώμα του που πλακιδίου. Συγκεκριμένα έχουμε τα εξής χρώματα: 0 Gray (Υποδηλώνει κενή θέση) 1 Black (Υποδηλώνει θέση όπου έχει τοποθετήσει πλακίδιο ο μαύρος παίκτης) 2 White (Υποδηλώνει θέση όπου έχει τοποθετήσει πλακίδιο ο άσπρος παίκτης) blean mark: αυτή είναι μια βοηθητική μεταβλητή, που μπορεί να σας φανεί χρήσιμη σε επόμενη εργασία. int PlayerId: η μεταβλητή αυτή δείχνει αν στην θέση του συγκεκριμένου πλακιδίου έχει παίξει κάποιος από τους 2 παίκτες και αν ναι, ορίζει τον παίκτη στον οποίο ανήκει το συγκεκριμένο πλακίδιο. Συγκεκριμένα έχουμε: 0 Κενό πλακίδιο 1 Πλακίδιο του παίκτη Α 2 Πλακίδιο του παίκτη Β Δομές Δεδομένων 2 2013
Οι συναρτήσεις που πρέπει να υλοποιήσετε είναι οι εξής: a. Cnstructr της κλάσης: ο cnstructr θα πρέπει να παίρνει 6 ορίσματα τα οποία θα αρχικοποιούν όλες τις μεταβλητές της κλάσης. Θα πρέπει να ορίσετε σωστά τον τύπο των ορισμάτων και να τα αντιστοιχίσετε στις κατάλληλες μεταβλητές της κλάσης. Προσοχή!!!! Τα ορίσματα μεταβλητές που θα έχει ο cnstructr θα πρέπει να είναι ορισμένα με την σειρά που δίνονται παραπάνω. b. Όλες οι συναρτήσεις get και set για τις μεταβλητές της κλάσης. 2. Κλάση RandmPlayer: Η κλάση αυτή δημιουργεί τους παίκτες της πλατφόρμας. Θα πρέπει να έχει τρεις μεταβλητές: 1. int id: είναι μια μεταβλητή που παίρνει την τιμή 1 ή 2 ανάλογα με το αν ο παίκτης είναι ο άσπρος ή ο μαύρος. Το αν ο παίκτης σας είναι ο 1 ή 2 θα αλλάζει από παιχνίδι σε παιχνίδι. Για να ελέγχετε αν ένα πλακίδιο είναι δικό σας θα πρέπει να συγκρίνεται την τιμή id του παίκτης σας με την τιμή της μεταβλητής playerid του πλακιδίου που ελέγχετε. 2. String name: η μεταβλητή αυτή δίνει το όνομα που επιθυμούμε στον παίκτη. 3. int scre: η μεταβλητή αυτή αποθηκεύει τον αριθμό των νικών του κάθε παίκτη. Οι συναρτήσεις που πρέπει να υλοποιήσετε είναι οι εξής: a. Cnstructr της κλάσης: ο cnstructr θα πρέπει να παίρνει ένα όρισμα (Integer pid), το οποίο αντιστοιχεί στην μεταβλητή id του παίκτη. Προσοχή!!!! Το όρισμα μέσα στην παρένθεση είναι τύπου Integer και όχι int, σε αυτή τη συγκεκριμένη συνάρτηση μόνο. b. Cnstructr της κλάσης 2: αποτελεί τον δεύτερο cnstructr της κλάσης και παίρνει 3 ορίσματα τα οποία θα αρχικοποιούν όλες τις μεταβλητές της κλάσης. Θα πρέπει να ορίσετε σωστά τον τύπο των ορισμάτων και να τα αντιστοιχίσετε στις κατάλληλες μεταβλητές της κλάσης. Προσοχή!!!! Τα ορίσματα μεταβλητές που θα έχει ο cnstructr θα πρέπει να είναι ορισμένα με την σειρά που δίνονται παραπάνω. Επίσης και εδώ το όρισμα μέσα στη παρένθεση θα πρέπει να είναι τύπου Integer και όχι int. c. Όλες οι συναρτήσεις get και set για τις μεταβλητές της κλάσης. Δομές Δεδομένων 3 2013
d. Συνάρτηση int[] getnextmve (Bard bard):η συγκεκριμένη συνάρτηση παίρνει σαν όρισμα την μεταβλητή bard η οποία είναι αντικείμενο της κλάσης Bard (περισσότερα για την μεταβλητή bard στην συνέχεια) και επιστρέφει έναν μονοδιάστατο πίνακα ακεραίων, μεγέθους δύο (2) ο οποίος θα περιέχει την θέση (x,y) στην οποία θα τοποθετηθεί το επόμενο πούλι. Η θέση x,y επιλέγετε με τυχαίο τρόπο. Θα πρέπει επίσης να ελέγξετε αν η θέση (x,y) είναι ήδη κατειλημμένη και αν ναι, θα πρέπει να επιλέξετε μια νέα θέση (x1,y1), με επίσης τυχαίο τρόπο. Σημείωση: Οι συναρτήσεις των κλάσεων Tile και RandmPlayer που θα δημιουργήσετε, θα πρέπει να είναι ορατές από τον υπόλοιπο κώδικα του παιχνιδιού ο οποίος βρίσκετε σε διαφορετικό πακέτο. Θα πρέπει λοιπόν να χρήσιμοποιήσετε τους κατάλληλους τροποποιητές. Βοηθητικές Κλάσεις - Συναρτήσεις Για την υλοποίηση των παραπάνω συναρτήσεων χρειάζεται να χρησιμοποιήσετε κάποιες μεταβλητές / συναρτήσεις που υπάρχουν ήδη υλοποιημένες στην πλατφόρμα. Στατικές Μεταβλητές της κλάσης GmkuUtilities Αριθμός Γραμμών και Στηλών: NUMBER_OF_ROWS = 15; NUMBER_OF_COLUMNS = 15; Οι συγκεκριμένες μεταβλητές μπορούν να χρησιμοποιηθούν για την σάρωση του ταμπλό. Αν δεν χρησιμοποιήσετε τις μεταβλητές αλλά γράψετε στον κώδικα απευθείας τον αριθμό 15, ίσως αντιμετωπίσετε πρόβλημα στο μέλλον π.χ. αν απόφασίσουμε να μεγαλώσουμε το ταμπλό, θα πρέπει να κάνετε αλλαγές στον κώδικά σας. Η μεταβλητή bard και η συνάρτηση gettile(int x,int y): Όπως αναφέραμε προηγουμένως, η μεταβλητή bard αναπαριστά στην ουσία τον ταμπλό του παιχνιδιού. Σε αυτή τη μεταβλητή ανήκει μια συνάρτηση gettile(int x,int y), η οποία επιστρέφει το πλακίδιο που υπάρχει στην θέση x,y. Ελέγχοντας το χρώμα του πλακιδίου μπορείτε να συμπεράνετε αν έχει ήδη καταληφθεί από κάποιον παίκτη ή αν είναι ελεύθερο. duble Math.randm(): Η συνάρτηση αυτή σας επιστρέφει έναν τυχαίο αριθμό τύπου duble στο διάστημα [0,1). Θα σας χρειαστεί ώστε να επιλέξετε την επόμενή σας κίνηση με τυχαίο τρόπο. Στόχος σας στο πρώτο παραδοτέο είναι να φτιάξετε τον παίκτη σας ώστε να μπορεί να επιλέξει τυχαία μια θέση (x,y) πάνω στο ταμπλό. Στην συνέχεια πρέπει να ελέγξει αν η θέση αυτή είναι άδεια, ώστε να τοποθετήσει εκεί το πλακίδιο για την επόμενη κίνησή του. Σε αντίθετη περίπτωση θα πρέπει να διαλέξει μια άλλη τυχαία θέση. Αν γράψετε τον κώδικά σας σωστά, θα δείτε το παιχνίδι να ξεκινάει και τους 2 παίκτες να τοποθετούν πλακίδια σε τυχαίες θέσεις, μέχρι κάποιος από τους 2 να σχηματίσει πεντάδα. Δομές Δεδομένων 4 2013
Εικόνα 2: Πώς ορίζονται οι άξονες στο ταμπλό. Δομές Δεδομένων 5 2013
Οδηγίες Τα προγράμματα θα πρέπει να υλοποιηθούν σε Java, με πλήρη τεκμηρίωση του κώδικα. Το πρόγραμμά σας πρέπει να περιέχει επικεφαλίδα σε μορφή σχολίων με τα στοιχεία σας (ονοματεπώνυμα, ΑΕΜ, τηλέφωνα και ηλεκτρονικές διευθύνσεις). Επίσης, πριν από κάθε κλάση ή μέθοδο θα υπάρχει επικεφαλίδα σε μορφή σχολίων με σύντομη περιγραφή της λειτουργικότητας του κώδικα. Στην περίπτωση των μεθόδων, πρέπει να περιγράφονται και οι μεταβλητές τους. Είναι δική σας ευθύνη η απόδειξη καλής λειτουργίας του προγράμματος. Παραδοτέα για κάθε μέρος της εργασίας 1. Ηλεκτρονική αναφορά που θα περιέχει: εξώφυλλο, περιγραφή του προβλήματος, του αλγορίθμου και των διαδικασιών που υλοποιήσατε και τυχόν ανάλυσή τους. Σε καμία περίπτωση να μην αντιγράφεται ολόκληρος ο κώδικας μέσα στην αναφορά (εννοείται ότι εξαιρούνται τμήματα κώδικα τα οποία έχουν ως στόχο τη διευκρίνιση του αλγορίθμου) Προσοχή: Ορθογραφικά και συντακτικά λάθη πληρώνονται. 2. Ένα αρχείο σε μορφή.zip με όνομα ΑΕΜ1_ΑΕΜ2_PartA.zip, το οποίο θα περιέχει όλο το prject σας στον eclipse καθώς και το αρχείο της γραπτής αναφοράς σε pdf (αυστηρά). Το αρχείο.zip θα γίνεται uplad στο site του μαθήματος στην ενότητα των ομαδικών εργασιών και μόνο. Τα ονόματα των αρχείων πρέπει να είναι με λατινικούς χαρακτήρες. Προθεσμία υποβολής Κώδικας και αναφορά Τετάρτη 20 Νοεμβρίου, 23:59 (ηλεκτρονικά) Δε θα υπάρξει καμία παρέκκλιση από την παραπάνω προθεσμία. Δομές Δεδομένων 6 2013