Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Πέμπτη 19 / 12 / 2016 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Σχετικά έγγραφα
Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Πέμπτη 11 / 12 / 2014 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Πέμπτη 24 / 12 / 2015 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Δευτέρα 22 / 11 / 2017 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών ΤΗΜΜΥ Α.Π.Θ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. DS Gomoku.

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών ΤΗΜΜΥ Α.Π.Θ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ.

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Τρίτη 1 / 12 / 2015 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Αυτόνομοι Πράκτορες. Εργασία εξαμήνου. Μάθηση του παιχνιδιού British square με χρήση Temporal Difference(TD) Κωνσταντάκης Γιώργος

Αυτόνομοι Πράκτορες. Εργασία εξαμήνου. Value Iteration και Q- Learning για Peg Solitaire

Προγραμματιστικές Ασκήσεις, Φυλλάδιο 1

Εργασία για το Facility Game Μάθημα: Δομές Δεδομένων Σωτήρης Γυφτόπουλος

Δομές Δεδομένων. Σημειώσεις από το εργαστήριο για τον χειρισμό του προγράμματος Eclipse. 5ο εξάμηνο. v1.0

[ΠΛΗ 417] Τεχνητή Νοημοσύνη. Project Εξαμήνου ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ

ΑΥΤΟΝΟΜΟΙ ΠΡΑΚΤΟΡΕΣ. ΑΝΑΦΟΡΑ ΕΡΓΑΣΙΑΣ Othello-TD Learning. Βόλτσης Βαγγέλης Α.Μ

Οδηγίες Εργασίας 1 Facility-Game

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ EPL035: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΚΑΙ ΑΛΓΟΡΙΘΜΟΙ

ΕΠΙΣΗΜΟΙ ΚΑΝΟΝΕΣ ΤΟΥ ΟΙ ΚΑΡΤΕΣ

Τσάπελη Φανή ΑΜ: Ενισχυτική Μάθηση για το παιχνίδι dots. Τελική Αναφορά

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

1 η ΑΣΚΗΣΗ ΣΤΗΝ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ. Ακ. έτος , 5ο Εξάμηνο, Σχολή ΗΜ&ΜΥ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΘΕΜΑ 1ο. Μονάδες 10. Β. ίνεται το παρακάτω τμήμα αλγορίθμου: Όσο Ι < 10 επανάλαβε Εμφάνισε Ι Ι Ι + 3 Τέλος_επανάληψης ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Αλγόριθμοι Αναζήτησης σε Παίγνια Δύο Αντιπάλων

Περιεχόμενα. Πέτρα. Χρυσός. Βιβλίο. Τροφή. Πόντοι Νίκης. Ρίξιμο ξανά. Ανάλυση ενός πλακιδίου. Ονομασία Κόστος ( ή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Coop-in Εγχειρίδιο χρήστη

Σχετικά με το Παιχνίδι. Περιεχόμενα. Ένα παιχνίδι στρατηγικών κατασκευών για 2 παίκτες ηλικίας 8 και άνω, από τον Arve D. Fuhler

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ»

2-5 Παίκτες - Ηλικία λεπτά

Διδάσκων: Κωνσταντίνος Κώστα

Ασκήσεις μελέτης της 6 ης διάλεξης

Δυαδικά Δένδρα Αναζήτησης, Δένδρα AVL

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Το δεύτερο παιχνίδι ΤΟΥΒΛΑΚΙΑ

Εισαγωγή στην Στατιστική (ΔΕ200Α-210Α)

Συναρτήσεις. Εισαγωγή

Ημερομηνία Ανάρτησης: 08/1/2018 Ημερομηνία Παράδοσης: - Αρχές Γλωσσών Προγραμματισμού

Επίλυση Προβλημάτων 1

DS - Pacman. 2.1 Η calculatenextpacmanposition... 3

Βυζαντινός Ρεπαντής Κολλέγιο Αθηνών 2010

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Εισαγωγή. Περιεχόμενα. Μέσα στο Κουτί. Εισαγωγή Στόχος Μέσα στο Κουτί Οι Κάρτες Περιγραφή των Καρτών Επιβίβαση!...

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

53 Χρόνια ΦΡΟΝΤΙΣΤΗΡΙΑ ΜΕΣΗΣ ΕΚΠΑΙΔΕΥΣΗΣ Σ Α Β Β Α Ϊ Δ Η Μ Α Ν Ω Λ Α Ρ Α Κ Η

1ο μέρος 1. Φτιάχνουμε την πίστα. Μια ενδεικτική πίστα φαίνεται παρακάτω:

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Μελετήστε την θεωρία που αφορά Επαναληπτικές Μεθόδους Επίλυσης Γραμμικών Συστημάτων.

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

AVL-trees C++ implementation

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

1 κεντρικό ταμπλό. 1 εγχειρίδιο οδηγιών. Κύβοι μεταναστών. 25 Ιρλανδοί 25 Άγγλοι 25 Γερμανοί 25 Ιταλοί. Δείκτες πολιτικής εύνοιας


Ένα παιχνίδι του Stefan Feld ΣΧΕΤΙΚΑ ΜΕ ΤΟ ΠΑΙΧΝΙΔΙ ΠΕΡΙΕΧΟΜΕΝΑ

32 κάρτες-πόλης 9 κάρτες-χαρακτήρων 5 κάρτες-αστυνομίας

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κεφάλαιο 5. Αλγόριθµοι Αναζήτησης σε Παίγνια ύο Αντιπάλων. Τεχνητή Νοηµοσύνη - Β' Έκδοση

Εισαγωγή στον Προγραμματισμό με C++

Το Λειτουργικό Σύστημα MS-DOS

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

καθώς και το παρακάτω τμήμα αλγορίθμου γραμμένο σε «ΓΛΩΣΣΑ»:

Δημιουργώντας ένα παιχνίδι λαβυρίνθου(maze game) με εμπόδια

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2019 Β ΦΑΣΗ Γ ΓΕΝΙΚΟΥ ΛΥΚΕΙΟΥ

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Σκοπός του παιχνιδιού. Περίληψη

Οδηγίες Χρήσης της MySQL

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δημιουργία και επεξεργασία διανυσματικών επιπέδων στο QGIS

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Οδηγίες Χρήσης της MySQL

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

Ένα έξυπνο παιχνίδι τοποθέτησης πλακιδίων για 2-5 παίκτες, 8 ετών και άνω από τον Klaus-Jurgen Wrede

Διδάσκων: Παναγιώτης Ανδρέου

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

Αντικειμενοστρεφής Προγραμματισμός

Πληρουορική Γ Γσμμασίοσ

Ιδιότητες αντικειμένων, συγγραφή κώδικα, συντακτικά λάθη

Μάθημα 8 ο Η εντολή ανδιαφορετικά

Δέντρα Απόφασης (Decision(

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Το Κ2 είναι ένα παιχνίδι για 1 έως 5 παίκτες, ηλικίας 8 ετών και άνω, με διάρκεια περίπου 60 λεπτά.

1. Μία συνάρτηση δεν μπορεί να έχει παραπάνω από μία παραμέτρους.

ΘΕΜΑ 1ο. Μονάδες 10. Β. ίνεται το παρακάτω τμήμα αλγορίθμου: Όσο Ι < 10 επανάλαβε Εμφάνισε Ι Ι Ι + 3 Τέλος_επανάληψης ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ

Ηλεκτρονικοί Υπολογιστές

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Β. ίνεται το παρακάτω τμήμα δηλώσεων ενός προγράμματος σε «ΓΛΩΣΣΑ»: ΜΕΤΑΒΛΗΤΕΣ ΑΚΕΡΑΙΕΣ: Χ, Ζ[15] ΠΡΑΓΜΑΤΙΚΕΣ: Ω

Ένα παιχνίδι για 2-4 εξερευνητές, ηλικίας 8 και άνω. Διάρκεια παιχνιδιού περίπου 60 λεπτά

21. ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 4 - ΔΗΜΙΟΥΡΓΩΝΤΑΣ ΜΕ ΤΟ BYOB BYOB. Αλγόριθμος Διαδικασία Παράμετροι

Transcript:

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών 5 o Εξάμηνο ΤΗΜΜΥ Α.Π.Θ 2015-2016 Πέμπτη 19 / 12 / 2016 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ DS Candy Crush Part 3 MinMax Algorithm (0,5 βαθμοί) Στο τρίτο παραδοτέο καλείστε να υλοποιήσετε τον αλγόριθμο MinMax για την βελτιστοποίηση του παίκτη σας. Σκοπός σας είναι να δημιουργήσετε ένα δέντρο βάθους 2 (τουλάχιστον), το όποιο σε συνδυασμό με την συνάρτηση αξιολόγησης που είχατε δημιουργήσει στην δεύτερη εργασία, θα αξιολογεί τις διαθέσιμές κινήσεις σε βάθος χρόνου και θα επιλέγει την καλύτερη δυνατή για τον επόμενο γύρο. Εικόνα 1: Το περιβάλλον του παιχνιδιού DS-Candy Crush. Ο νέος κώδικας της πλατφόρμας περιέχει την random υλοποίηση για τον ένα παίκτη καθώς και μια τυπική evaluation υλοποίηση για τον Heuristic παίκτη, η οποία θα είναι ίδια για όλους. Στον MinMax Player θα χρησιμοποιήσετε την δική σας υλοποίηση της evaluation function που είχατε φτιάξει για το δεύτερο παραδοτέο. ΠΡΟΣΟΧΗ!!! ΜΗΝ ΑΝΤΙΚΑΤΑΣΤΗΣΕΤΕ ΤΙΣ ΥΛΟΠΟΙΗΣΕΙΣ ΑΥΤΕΣ ΜΕ ΑΥΤΕΣ ΠΟΥ ΥΛΟΠΟΙΗΣΑΤΕ ΣΤΑ ΠΡΟΗΓΟΥΜΕΝΑ ΠΑΡΑΔΟΤΕΑ. ΘΕΛΟΥΜΕ ΟΛΟΙ ΝΑ ΕΧΟΥΝ ΤΗΝ ΙΔΙΑ ΠΛΑΤΦΟΡΜΑ.

Αλγόριθμος MinMax AB Pruning Όπως σε πολλά παιχνίδια, έτσι και στο δικό μας παιχνίδι, για τον υπολογισμό της βέλτιστης κίνησης οι υπολογιστές δεν μπορούν να αναπτύξουν όλους τους δυνατούς συνδυασμούς των δικών μας κινήσεων και των κινήσεων του αντιπάλου σε εύλογο χρονικό διάστημα. Εξαιτίας αυτού του γεγονότος, το δένδρο των πιθανών συνδυασμών αναπτύσσεται μέχρι ενός βάθους (π.χ. για βάθος 2 έχω όλες τις κινήσεις μου και όλες τις πιθανές απαντήσεις του αντιπάλου). Σε κάθε φύλλο του δένδρου (στο τέλος της απάντησης του αντιπάλου) εξετάζω τη συνάρτηση αξιολόγησης που υλοποιήθηκε στη δεύτερη εργασία. Σε περίπτωση που ένας κόμβος του δένδρου είναι τελικός (το παιχνίδι τελειώνει), μπορούμε να υπολογίσουμε το νικητή και να σταματήσουμε εκεί. Το δένδρο που θα φτιαχτεί θα έχει τη δομή του Σχήματος 2, δίνοντας σε κάθε φύλλο του το αποτέλεσμα της συνάρτησης αξιολόγησης. Η δική μας νίκη συμβολίζεται με +, ενώ η νίκη του αντιπάλου με -. Με τετράγωνα εμφανίζονται οι κινήσεις μας, ενώ με κύκλους οι κινήσεις του αντιπάλου. Για τον αντίπαλο θεωρούμε ότι θα παίξει τη χειρότερη για εμάς κίνηση. Για αυτό επιλέγουμε το ελάχιστο (Minimum) της συνάρτησης αξιολόγησης (γραμμές 1 και 3). Εμείς φυσικά θα παίξουμε την κίνηση που μεγιστοποιεί (Maximum) τη συνάρτηση αξιολόγησης (γραμμές 0 και 2), λαμβάνοντας ως δεδομένο ότι ο αντίπαλος θα παίξει την καλύτερη κίνηση για αυτόν. Στο σχήμα, λοιπόν, θα επιλέξουμε τη δεξιά κίνηση γιατί μεγιστοποιεί τη συνάρτηση αξιολόγησης, ασχέτως με το τι θα επιλέξει να παίξει ο αντίπαλος. Το βάθος του δέντρου μας δείχνει πόσες κινήσεις μπροστά κοιτάμε, και κάθε επίπεδο του δείχνει ακριβώς ποια από τις μελλοντικές κινήσεις εξετάζουμε. Σχήμα 2: Ο αλγόριθμος MinMax για βάθος 4. Δομές Δεδομένων 2 2016

Κλάση Αποθήκευσης Διαθέσιμων Κινήσεων Για την υλοποίηση των διαθέσιμων κινήσεων προτείνεται η δημιουργία μιας δικής σας κλάσης με το όνομα NodeΑΕΜ1ΑΕΜ2 1. Η κλάση αυτή θα έχει ως μεταβλητές: 1. Node parent: Ο κόμβος πατέρας του κόμβου που δημιουργήσατε. 2. ArrayList<Node> children: Ο πίνακας που περιλαμβάνει τα παιδιά του κόμβου που δημιουργήσατε. 3. int nodedepth: το βάθος του κόμβου στο δέντρο του MinMax Αλγορίθμου. 4. int[] nodemove: Τον κίνηση που αντιπροσωπεύει το Node, σαν πίνακας ακεραίων που περιλαμβάνει το x, το y και την κατεύθυνση. (όπως σας δίνονται από την λίστα με τις διαθέσιμες κινήσεις). 5. Board nodeboard: το ταμπλό του παιχνιδιού για αυτό τον κόμβο-κίνηση. 6. double nodeevaluation: Την τιμή της συνάρτησης αξιολόγησης που έχετε δημιουργήσει για αυτή τη κίνηση. Οι συναρτήσεις της κλάσης που θα πρέπει να υλοποιηθούν είναι: 1. Node(): Ένας ή περισσότεροι constructors για την κλάση σας, με διαφορετικά ορίσματα. 2. Κατάλληλες συναρτήσεις get και set. 3. double evaluate(): η συνάρτηση αυτή θα υπολογίζει το πόσο αξιόλογη είναι η συγκεκριμένη κίνηση (μπορείτε να χρησιμοποιήσετε αυτή που υλοποιήσατε στην δεύτερη εργασία ή μια βελτιωμένη έκδοση της). Οι συναρτήσεις που είχατε στην προηγούμενη υλοποίηση του δεύτερου παραδοτέου για την evaluate() θα αποτελέσουν την βάση σας και για αυτή την εργασία, με όσες αλλαγές χρειάζονται για να συμπεριληφθούν και οι νέες μεταβλητές. Στο package node βρίσκεται μια πρότυπη κλάση με το όνομα Node. Θα πρέπει να την μετονομάσετε (δεξί κλικ Refactor Rename) σύμφωνα με την εκφώνηση και να υλοποιήσετε τις κατάλληλες συναρτήσεις. Χρήσιμες Μεταβλητές και Συναρτήσεις Για την κλάση CrushUtilities: Στατικές Μεταβλητές της κλάσης CrushUtilities Αριθμός Γραμμών και Στηλών: NUMBER_OF_ROWS = 500; NUMBER_OF_PLAYABLE_ROWS = 10; NUMBER_OF_COLUMNS = 10; 1 Όπου AEM1 και ΑΕΜ2 ο αριθμός μητρώου των δύο ατόμων κάθε ομάδας. Δομές Δεδομένων 3 2016

Κωδικός Κατευθύνσεων: LEFT = 0 (Αριστερά) DOWN = 1 (Κάτω) RIGHT = 2 (Δεξιά) UP = 3 (Πάνω) Κωδικοί Χρωμάτων: RED = 0 (Κόκκινο) GREEN = 1 (Πράσινο) BLUE = 2 (Μπλε) YELLOW = 3 (Κίτρινο) BLACK = 4 (Μαύρο) PURPLE = 5 (Μωβ) CYAN = 6 (Κυανό) Κωδικοί Παικτών: BLUE_PLAYER = 7 (Μπλε Παίκτης) RED_PLAYER = 8 (Κόκκινος Παίκτης) Όριο για το Σκορ (αν θέλετε μεγαλύτερα ή μικρότερα παιχνίδια): SCORE_LIMIT = 300; Ταχύτητα του παιχνιδιού (αν θέλετε να το επιταχύνετε ή να το επιβραδύνετε κι άλλο): TIME_STEP = 100; Στατικές Συναρτήσεις της κλάσης CrushUtilities Board cloneboard(board board): Επιστρέφει ένα ακριβές αντίγραφο του ταμπλό. Η χρήση της συνάρτησης αυτής κρίνεται απαραίτητη για να μπορέσετε να δείτε τις επόμενες κινήσεις σε βάθος χρόνου. int[] calculatenextmove (int[] move): Επιστρέφει την κίνηση που θα πρέπει να κάνετε στο ταμπλό. Είναι ίδια με αυτή που χρησιμοποιήσατε στην προηγούμενη εργασία, απλά μεταφέρθηκε από την κλάση Player στην κλάση CrushUtilities. ArrayList<int[]> getavailablemoves (Board board): Επιστρέφει μια λίστα με τις διαθέσιμες κινήσεις για τον παίκτη που πρόκειται να παίξει στην παρούσα κατάσταση του ταμπλό. Τέσσερεις συναρτήσεις για να δείτε στο μέλλον Έστω πως την χρονική στιγμή tο έχουμε ένα ταμπλό διαστάσεων 5*5 όπως αυτό παρουσιάζεται στην Εικόνα 2. Δομές Δεδομένων 4 2016

Εικόνα 2 Ταμπλό την χρονική στιγμή tο Σας δίνονται τρεις συναρτήσεις μέσα στην κλάση CrushUtilities οι οποίες σας επιτρέπουν να δείτε πως θα είναι το ταμπλό σε κάποια στιγμή στο μέλλον. Αυτές είναι οι εξής: Board boardafterfirstmove (Board board, int[] move): Η συνάρτηση αυτή παίρνει ως ορίσματα το ταμπλό της χρονικής στιγμής to board, την κίνηση move (της μορφής int[] τριών θέσεων που περιλαμβάνει [x, y, κατεύθυνση]) που θέλουμε να εκτελέσουμε και επιστρέφει ένα αντίγραφο του ταμπλό με αλλαγμένες τις θέσεις των ζαχαρωτών που ορίστηκαν από την move. Στην περίπτωσή μας το ταμπλό που θα επιστρέφονταν θα ήταν αυτό που φαίνεται στην Εικόνα 3 (θεωρούμε ότι επιλέξαμε να κάνουμε την 3άδα με τα μπλε ζαχαρωτά στην κάτω γραμμή). Εικόνα 3: Το ταμπλό στην χρονική στιγμή t 1 μετά την αναδιάταξη των ζαχαρωτών. Επιστρέφεται καλώντας την συνάρτηση boardafterfirstmove() Board boardafterfirstcrush(board board, int[] move): Η συνάρτηση αυτή παίρνει ως ορίσματα το ταμπλό της χρονικής στιγμής to board, την κίνηση move που θέλουμε να εκτελέσουμε (ομοίως με επάνω) και επιστρέφει ένα αντίγραφο του Δομές Δεδομένων 5 2016

ταμπλό με σπασμένα τα ζαχαρωτά που συμμετείχαν σε 3άδα η οποία δημιουργήθηκε λόγω της κίνηση move. Στο παράδειγμά μας το ταμπλό που θα επιστρέφονταν θα ήταν αυτό που φαίνεται στην Εικόνα 4 (θεωρούμε ότι επιλέξαμε να κάνουμε την 3άδα με τα μπλε ζαχαρωτά στην κάτω γραμμή, και η τριάδα αυτή έσπασε). Εικόνα 4: Το ταμπλό μετά το σπάσιμο τον τριάδων που δημιουργήθηκαν από την κίνηση move. Επιστρέφεται από την boardafterfirstcrush () Board boardafterfullmove(board board, int[] move): Η συνάρτηση αυτή παίρνει ως ορίσματα το ταμπλό της χρονικής στιγμής to board, την κίνηση move που θέλουμε να εκτελέσουμε (ομοίως με πάνω) και επιστρέφει ένα αντίγραφο του ταμπλό με σπασμένα τα ζαχαρωτά που συμμετείχαν σε 3άδα η οποία δημιουργήθηκε λόγω της κίνηση move, καθώς και σπασμένα όλα τα πιθανά chain moves. Στην ουσία επιστρέφει τα ταμπλό στην κατάσταση που θα το βρει ο αντίπαλος όταν πάει να παίξει την δική του κίνηση. Στο παράδειγμά μας το ταμπλό που θα επιστρέφονταν θα ήταν αυτό που φαίνεται στην Εικόνα 5 (θεωρούμε ότι επιλέξαμε να κάνουμε την 3άδα με τα μπλε ζαχαρωτά στην κάτω γραμμή, η τριάδα αυτή έσπασε, και στην συνέχεια έσπασε και η chain τριάδα που δημιουργήθηκε στα κίτρινα). Δομές Δεδομένων 6 2016

Εικόνα 5: Το ταμπλό μετά το σπάσιμο τον τριάδων που δημιουργήθηκαν από την κίνηση move και το σπάσιμο όλων των πιθανών chain moves. Επιστρέφεται από την boardafterfullmove() Board boardafterdeletingnples(board board): Η συνάρτηση αυτή παίρνει ως όρισμα το ταμπλό σε κάποια χρονική στιγμή t και επιστρέφει ένα αντίγραφό του με διαγραμμένες τις ήδη υπάρχουσες ν-άδες που τυχόν υπάρχουν. Τοποθετεί στην πάνω γραμμή του ταμπλό ζαχαρωτά με χρώμα -1 (άχρωμα). Όλες τις παραπάνω συναρτήσεις μπορείτε να τις καλέσετε χρησιμοποιώντας ένα επιπλέον όρισμα. Για παράδειγμα μπορείτε να καλέσετε την clone ως εξής: CrushUtilities.cloneBoard(Board board, int numofrowstokeep): Σε αυτή την περίπτωση το αντικείμενο που θα σας επιστραφεί θα είναι της κλάσης Board και θα είναι αντίγραφο του αρχικού board που όμως θα περιλαμβάνει μόνο όσες γραμμές ορίζονται στο όρισμα numofrowstokeep. Αν δηλαδή το Βoard Α έχει μέγεθος 1000 γραμμών η CrushUtilities.cloneBoard(Α,100) θα σας επιστρέψει ένα αντίγραφο των πρώτων 60 γραμμών του A. Μπορείτε να καλέσετε όλες τις συναρτήσεις που περιγράφονται σε αυτήν την παράγραφο με αυτό τον τρόπο, δηλαδή θέτοντας ως τελευταίο όρισμα το πλήθος των γραμμών που θέλετε να κρατήσετε. Θα σας φανούν χρήσιμες στην περίπτωση που θέλετε να επιταχύνετε τους υπολογισμούς του MinMax παίκτη σας ή αν θέλετε να αυξήσετε το βάθος του δέντρου που θα υλοποίησετε. Αξιολόγηση Κατάστασης Ταμπλό Δομές Δεδομένων 7 2016

Για να χρησιμοποιήσετε την αξιολόγηση που είχατε κάνει στην προηγούμενη εργασία θα πρέπει να κάνετε κάποιες (μικρές) αλλαγές. Οι περισσότερες είναι αποτέλεσμα του κώδικα που γράφτηκε στην πλατφόρμα για να σας βοηθήσει. Πιο συγκεκριμένα: 1. Στην παρούσα εργασία σας δίνουμε βοηθητικές συναρτήσεις ώστε να μπορέσετε να υπολογίσετε και την ανταμοιβή του παίκτη σας από τα chain moves. Αν στην 2 η εργασία για να υπολογίσετε το πόσα πλακίδια σπάνε φτιάξατε συνάρτηση που διατρέχει όλο το ταμπλό για πιθανές τριάδες, τότε μπορείτε να χρησιμοποιήσετε την ίδια συνάρτηση, σε συνδυασμό με τις βοηθητικές συναρτήσεις που σας δίνουμε, για τον υπολογισμό των chain moves. Διαφορετικά θα πρέπει να την δημιουργήσετε. 2. Επειδή η αξιολόγηση στο 2 ο επίπεδο (που είναι το ελάχιστο που ζητείται να υλοποιήσετε) γίνεται για την κατάσταση του ταμπλό για κίνηση του αντιπάλου σας, θα πρέπει να την αξιολογήσετε ως το αρνητικό της τιμής αξιολόγησης σας (πχ αν η evaluate σας για την κίνηση του αντιπάλου σας δίνει 50 τότε η πραγματική της τιμή είναι -50). Σε περίπτωση που κάνετε δέντρο μεγαλύτερου βάθους, θα πρέπει να το κάνετε αυτό κάθε φορά που αξιολογείτε την κατάσταση του ταμπλό για κίνηση του αντιπάλου. 3. Ο αλγόριθμος MinMax στην συγκεκριμένη περίπτωση έχει μια ιδιαιτερότητα. Επειδή έχουμε διάφορες καταστάσεις ταμπλό που το τι παίζει ο κάθε παίκτης επηρεάζει την βαθμολογία της κίνησης του επόμενου παίκτη, θα πρέπει να αξιολογείται ΚΑΘΕ επίπεδο καθώς κατεβαίνετε και να λαμβάνετε υπόψη σας την επιμέρους βαθμολογία την αξιολόγηση του κατώτερου επιπέδου. Όταν η αξιολόγηση φτάσει στο τέλος, δηλαδή έχετε αξιολογήσει το τελευταίο επίπεδο, τότε κάνετε το MinMax αλγόριθμο κανονικά, μη λαμβάνοντας υπόψη τις αξιολογήσεις των ενδιάμεσων επιπέδων. Αυτό γίνεται γιατί τα έχετε συμπεριλάβει στην αξιολόγηση του τελικού επιπέδου. Παράδειγμα: Έστω το δέντρο βάθους δύο που δίνεται παρακάτω. Επίπεδο 0 παρούσα καταστασή Επίπεδο 1 κίνηση Α κίνηση Β Επίπεδο 2 κίνηση Α/Α κίνηση Α/Β κίνηση Β/Α Δομές Δεδομένων 8 2016

Στο επίπεδο 0, έχετε την κατάσταση του ταμπλό όπως είναι τώρα. Στο επίπεδο 1, έχετε την κατάσταση του ταμπλό όπως είναι αν μετακινήσετε τα ζαχαρωτά σύμφωνα με την διαθέσιμη κίνηση Α. Στο επίπεδο 2, έχετε την κατάσταση του ταμπλό αφού έχετε παίξει εσείς την κίνησή σας και ενώ ο αντίπαλος έχει επιλέξει την δική του διαθέσιμη κίνηση Α, και ουτω καθ εξής. Επίπεδο 0 παρούσα καταστασή Επίπεδο 1 10 50 Επίπεδο 2-40 -10-90 Στην επόμενη φάση, θα πρέπει να δημιουργήσετε το δέντρο και να τρέξετε την συνάρτηση αξιολόγησης για κάθε ένα από τα επίπεδα του δέντρου (και όχι μόνο για το τελευταίο). Αυτό γίνεται γιατί χρειάζεται να λάβετε υπόψη σας και την αξιολόγηση της δικής σας κίνησης που οδήγησε σε εκείνο το φύλλο του δέντρου. Επίπεδο 0 παρούσα καταστασή Επίπεδο 1 0 0 Επίπεδο 2-30 0-40 Στην τελική κατάσταση, πριν ξεκινήσει η διαδικασία του MinMax αλγορίθμου, προσθέτουμε την τιμή της αξιολόγησης του ενδιάμεσου επιπέδου στην τιμή των φύλλων. Στην συνέχεια, μηδενίζουμε (ή απειρίζουμε) τις τιμές στο πρώτο επίπεδο, καθώς οι τελικές τιμές του κάθε κόμβου θα υπολογιστούν από τα φύλλα στον αλγόριθμο MinMax (βλέπε σχήμα που ακολουθεί). Δομές Δεδομένων 9 2016

Επίπεδο 0 παρούσα καταστασή Επίπεδο 1-30 -40 Επίπεδο 2-30 0-40 Το αρχείο boardconfig.properties Μέσα στο project του eclipse θα βρείτε το αρχείο boardconfig.properties το οποίο περιέχει 2 μεταβλητές. numofrows : Ορίζει την τιμή του συνόλου των γραμμών του board. scorelimit: Ορίζει το σύνολο των βαθμών που πρέπει να μαζέψει κάποιος παίκτης για να κερδίσει. Είστε ελεύθεροι να αλλάξετε τις τιμές των μεταβλητών αυτών για να δείτε πως συμπεριφέρεται ο παίκτης σας. Η κλάση gr.auth.ee.dsproject.crush.player.heuristicplayer Μπορείτε να χρησιμοποιήστε αυτή την κλάση αν θέλετε να χρησιμοποιήσετε τον HeuristicPlayer που δημιουργήσατε στο δεύτερο παραδοτέο και να το συγκρίνετε με τον MinMax. Για να το κάνετε αυτό θα πρέπει να αντιγράψετε τα περιεχόμενα της κλάσης που δημιουργήσατε στο 2 ο παραδοτέο μέσα στην κλάση HeuristicPlayer του πακέτου gr.auth.ee.dsproject.crush.player. Προσοχή στην εισαγωγή των πακέτων στην αρχή του κώδικα. Αν αντιγράψετε τις δηλώσεις import από την παλιά σας κλάση στην νέα, ο eclipse θα σας πει ότι έχετε λάθος. Επίσης, αν στο προηγούμενο παραδοτέο χρησιμοποιήσατε την εντολή board.getrows()/2 για να σαρώσετε το ορατό τμήμα του board, θα πρέπει να το αντικαταστήσετε, όπως αναφέρεται και στην εκφώνηση, με την συνάρτηση board.getprows() που επιστρέφει τις γραμμές που είναι ορατές στο ταμπλό. Μετά τις απαραίτητες διορθώσεις, μπορείτε να χρησιμοποιήσετε τον παίκτη σας επιλέγοντάς τον από το μενού επιλογής του παιχνιδιού. Είναι ο παίκτης με το όνομα "Your Heuristic". Δομές Δεδομένων 10 2016

Αλγόριθμος Δημιουργίας Δέντρου για βάθος 2 κινήσεων void getnextmove (ArrayList<int[]> availablemoves, Board board) Make a copy of the board as it is now using cloneboard(). Use this clone to create a new node which corresponds to the root of the tree. Call createmysubtree(root, 1) // The tree is now finished Call the chooseminmaxmove(node root) Choose the best move as input to calculatenextmove() function. void createmysubtree(node parent, int depth) Find the available moves of the board of the parent. For each available move on the board: Take the board after using the move using boardaftermovingcandies(). Create a new node as child of the parent node using new board state. Evaluate the node. Add the node as child of the parent node. Complete the tree branches by calling createopponentsubtree(newnode, depth+1) void createopponentsubtree(node parent, int depth) Create the new state of the board after a full move using boardafterfullmove() Find the available moves of this new state of board. For each available move for the opponent s turn: Take the board after using the move using boardaftermovingcandies(). Create a new node as child of the parent node using new board state. Evaluate the new node as a negative evaluation of the state. Add the value of the parent node in the evaluation state of the node. Add the node as child of the parent node. int chooseminmaxmove(node root) Implement a minmax algorithm to find the best available move. Return the index of the best available move. Δομές Δεδομένων 11 2016

Οδηγίες Τα προγράμματα θα πρέπει να υλοποιηθούν σε Java, με πλήρη τεκμηρίωση του κώδικα. Το πρόγραμμά σας πρέπει να περιέχει επικεφαλίδα σε μορφή σχολίων με τα στοιχεία σας (ονοματεπώνυμα, ΑΕΜ, τηλέφωνα και ηλεκτρονικές διευθύνσεις). Επίσης, πριν από κάθε κλάση ή μέθοδο θα υπάρχει επικεφαλίδα σε μορφή σχολίων με σύντομη περιγραφή της λειτουργικότητας του κώδικα. Στην περίπτωση των μεθόδων, πρέπει να περιγράφονται και οι μεταβλητές τους. Είναι δική σας ευθύνη η απόδειξη καλής λειτουργίας του προγράμματος. Παραδοτέα για κάθε μέρος της εργασίας 1. Ηλεκτρονική αναφορά που θα περιέχει: εξώφυλλο, περιγραφή του προβλήματος, του αλγορίθμου και των διαδικασιών που υλοποιήσατε και τυχόν ανάλυσή τους. Σε καμία περίπτωση να μην αντιγράφεται ολόκληρος ο κώδικας μέσα στην αναφορά (εννοείται ότι εξαιρούνται τμήματα κώδικα τα οποία έχουν ως στόχο τη διευκρίνιση του αλγορίθμου) Προσοχή: Ορθογραφικά και συντακτικά λάθη πληρώνονται. 2. Ένα αρχείο σε μορφή.zip με όνομα ΑΕΜ1_ΑΕΜ2_PartC.zip, το οποίο θα περιέχει όλο το project σας στον eclipse καθώς και το αρχείο της γραπτής αναφοράς σε pdf (αυστηρά). Το αρχείο.zip θα γίνεται upload στο site του μαθήματος στην ενότητα των ομαδικών εργασιών και μόνο. Τα ονόματα των αρχείων να είναι με λατινικούς χαρακτήρες. Προθεσμία υποβολής Κώδικας και αναφορά Κυριακή 15 Ιανουαρίου, 23:59 (ηλεκτρονικά) Δε θα υπάρξει καμία παρέκκλιση από την παραπάνω προθεσμία. Δομές Δεδομένων 12 2016