ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τµήµα Πληροφορικής

Σχετικά έγγραφα
ΕΠΛ132 Άσκηση 3 - Αρχές Προγραμματισμού ΙΙ Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Πληροφορικής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Πληροφορικής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Πληροφορικής

Εκφώνηση άσκησης. Η Κρεμάλα σαν παιχνίδι. Ανάλυση. Μέρος Α Αναφoρά, ανάλυση τακτικής. Υλοποίηση του παιχνιδιού «Κρεμάλα»

Αριστείδης Παλιούρας Ανακαλύψτε το Scratch 2

FAIL PASS PASS οριακά

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

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

for for for for( . */

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 131: ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I ΕΡΓΑΣΙΑ 2

Γράψτε ένα πρόγραμμα που θα προσομοιώνει τη ρίψη ενός νομίσματος και θα εμφανίζει στην οθόνη Κορώνα» ή «Γράμματα».

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

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

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

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

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσμία: Τετάρτη 23/11/2016, 21:00

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Σχηματίζοντας Γραφικές Παραστάσεις για Ημίτονο και Συνημίτονο και Ελέγχοντας Περιορισμούς σε Συστάδες Καρτών Τόμπολας

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

lab13grades Άσκηση 2 -Σωστά απελευθερώνετε ολόκληρη τη λίστα και την κεφαλή

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 13/1/13, 22:00

Προγραμματισμός ΙI (Θ)

Στοίβες με Δυναμική Δέσμευση Μνήμης

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

Παίζοντας Τόμπολα. Ημερομηνία Ανάρτησης: 16/03/2017 Ημερομηνία Παράδοσης: 30/03/2017, 23:59

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 7/1/2014, 22:00

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

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

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

επιµέλεια Θοδωρής Πιερράτος

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

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Διαδικασιακός Προγραμματισμός

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Πληροφορικής

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τμήμα Πληροφορικής

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/10, 23:59

6. Εισαγωγή στον προγραµµατισµό

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

6η Δραστηριότητα. Ναυμαχία Αλγόριθμοι αναζήτησης. Περίληψη. Αντιστοιχία με το σχολικό πρόγραμμα * Ικανότητες. Ηλικία. Υλικά

ΤΡΙΩΡΗ ΓΡΑΠΤΗ ΔΟΚΙΜΑΣΙΑ

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Το Jungle Speed είναι ένα παιχνίδι για 2 έως 10 παίκτες (ή και ακόμη περισσότερους!) ηλικίας 7 και άνω.

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

ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ

Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον

Μάντεψε τον Αριθμό. Ενδεικτικές Απαντήσεις Φύλλου Εργασίας. Οδηγίες

Α1. (α). ώστε τον ορισµό του προβλήµατος (Μονάδες 3)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Sheet2 Α.Μ FAIL. οριακό PASS. - Έπρεπε να χρησιµοποιήσετε συναρτήσεις από τη string.h

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ 23/04/2012. Α. Να απαντήσετε με Σ ή Λ στις παρακάτω προτάσεις:

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσμία: 17/1/14, 22:00

ΕΡΓΑΣΙΑ 3. Παίζοντας Sudoku. Ημερομηνία Ανάρτησης: 16/03/2018 Ημερομηνία Παράδοσης: 03/04/2018, 09:00

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

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

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

ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Επίλυση προβληµάτων. Περιγραφή προβληµάτων Αλγόριθµοι αναζήτησης Αλγόριθµοι τυφλής αναζήτησης Αλγόριθµοι ευρετικής αναζήτησης

Προγραµµατισµός Ι ΕΡΓΑΣΤΗΡΙΟ 5 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

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

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

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Γραφικά υπολογιστών Εργαστήριο 1 Εισαγωγή στην Python

Κεφάλαιο Αλφαριθµητικές Σειρές Χαρακτήρων (Strings)

ΟΜΟΣΠΟΝ ΙΑ ΕΚΠΑΙ ΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑ ΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2017 Β ΦΑΣΗ ÅÐÉËÏÃÇ

ΑΡΧΗ 1ΗΣ ΣΕΛΙ ΑΣ Γ ΤΑΞΗ

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

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

ΠΑΙΓΝΙΑ Παιχνίδια Γενική Θεώρηση μεγιστοποιήσει την πιθανότητά

a = 10; a = k; int a,b,c; a = b = c = 10;

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Προγραµµατισµός Ι Εργαστήριο 3ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 3 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

ΣΕΤ ΑΣΚΗΣΕΩΝ 3. Προθεσµία: 18/12/12, 22:00

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

ÁÎÉÁ ÅÊÐÁÉÄÅÕÔÉÊÏÓ ÏÌÉËÏÓ

Πρόταση για Ανασχηματισμό του Προγράμματος Προπτυχιακών Σπουδών της ΣΗΜΜΥ

ΠΛΗ111. Ανοιξη Μάθηµα 8 ο. Αναζήτηση. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

8. Λεξιλόγιο μιας γλώσσας είναι όλες οι ακολουθίες που δημιουργούνται από τα στοιχεία του αλφαβήτου της γλώσσας, τις λέξεις.

Α. Ερωτήσεις Ανάπτυξης

Σημειωματάριο Τετάρτης 25 Οκτ. 2017

ΠΛΗΡΟΦΟΡΙΚΗ Ι Εργαστήριο 1 MATLAB ΠΛΗΡΟΦΟΡΙΚΗ Ι ΕΡΓΑΣΤΗΡΙΟ 1. Θέμα εργαστηρίου: Εισαγωγή στο MATLAB και στο Octave

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00

επιµέλεια Θοδωρής Πιερράτος

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τµήµα Πληροφορικής ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ ΑΣΚΗΣΗ 3 Υλοποίηση Παιχνιδιού Δόλιας «Κρεµάλας» µε Δυναµική Δέσµευση Μνήµης Διδάσκων: Δηµήτρης Ζεϊναλιπούρ Υπεύθυνος Άσκησης: Πύρρος Μπράτσκας Ηµεροµηνία Ανάθεσης: Δευτέρα, 9 Μαρτίου 2015 Ηµεροµηνία Παράδοσης: Τρίτη, 24 Μαρτίου 2015 στις 10:30 π.µ. (15 ηµέρες) (ο κώδικας να υποβληθεί σε zip µέσω του Moodle και εκτυπωµένη στο εργαστήριο) http://www.cs.ucy.ac.cy/courses/epl132 Ι. Στόχος Στην εργασία αυτή θα ασχοληθούµε µε γραµµικές δοµές δεδοµένων και δυναµική δέσµευση µνήµης. Το θέµα της άσκησης είναι η υλοποίηση ενός προγράµµατος δόλιας κρεµάλας το οποίο δεν χρησιµοποιεί τους συµβατικούς και γνωστούς κανόνες του παιχνιδιού. Η άσκηση αποτελείται από πολλαπλά µέρη. Οι λειτουργίες του προγράµµατος και το αναµενόµενο αποτέλεσµα περιγράφονται αναλυτικότερα στην συνέχεια. Για την υλοποίηση της εργασίας αυτής θα πρέπει, πέρα από την χρήση συναρτήσεων και τεχνικών δοµηµένου προγραµµατισµού, να χρησιµοποιήσετε τα ακόλουθα στοιχεία: 1. Διάσπαση του προγράµµατος σε πολλαπλά αρχεία.c και.h µε χρήση generic makefile. Ενδεικτικά αναφέρουµε ότι το πρόγραµµα µπορεί να αποτελείται από µερικά αντικείµενα και αρχεία κεφαλίδας (.c και.h) µαζί µε ένα βασικό αρχείο εκκίνησης as3.c. 2. Ανάπτυξη του προγράµµατος σε eclipse CDT IDE (να συµπεριλάβετε το.project αρχείο µαζί µε το συµπιεσµένο πηγαίο σας κώδικα). Το πρόγραµµα πρέπει να µεταγλωττίζεται τόσο µέσω του eclipse όσο και µέσω της γραµµής εντολής µε χρήση του makefile. Κάθε αντικείµενο πρέπει να συµπεριλαµβάνει τον σχετικό οδηγό χρήσης (driver functions, δείτε διάλεξη 12) και θα πρέπει να έχετε σχόλια και οδηγό σχολίων µε χρήση του doxygen. ΙΙ. Περιγραφή Δεν είναι εύκολο να γράψει κανείς προγράµµατα που υλοποιούν παιχνίδια. Όταν εµείς οι άνθρωποι παίζουµε παιχνίδια, βασιζόµαστε στην εµπειρία του παρελθόντος, προσαρµοζόµαστε στις στρατηγικές των αντιπάλων µας, και µαθαίνουµε από τα λάθη µας. Οι Ηλεκτρονικοί Υπολογιστές (Η/Υ) από την άλλη πλευρά, ακολουθούν τυφλά ένα προκαθορισµένο αλγόριθµο που (ενδεχοµένως) τους αναγκάζει να ενεργήσουν έξυπνα. Σε κάποιες περιπτώσεις παιχνιδιών, όπως στο σκάκι, οι υπολογιστές έχουν επικρατήσει των ανθρώπων. Τα προγράµµατα που τρέχουν τέτοιοι Η/Υ βασίζονται σε εκατοντάδες χρόνια ανθρώπινης εµπειρίας, στη χρήση προηγµένων αλγόριθµων, καθώς επίσης και στην τεχνητή νοηµοσύνη. Ενώ υπάρχουν πολλές βιώσιµες στρατηγικές για τη δηµιουργία ανταγωνιστικών τεχνικών βάση των οποίων λειτουργεί ο υπολογιστής κατά την διάρκεια του παιχνιδιού, υπάρχει µια εναλλακτική προσέγγιση που στηρίζεται στη δολίευση. Το ερώτηµα που τίθεται είναι: γιατί να περάσετε πάρα πολύ χρόνο προσπαθώντας να «διδάξετε» σε ένα υπολογιστή όλες τις στρατηγικές, όταν µπορείτε απλά να γράψετε ένα πρόγραµµα που παίζει µε δόλο και κερδίζει επιδέξια κάθε φορά; Αυτό ακριβώς πρέπει να κάνετε σε αυτήν την εργασία. Πρέπει να γράψετε ένα πρόγραµµα που θα παραβλέπει κάποιους κανόνες του παιχνιδιού Κρεµάλα, κάνοντας τον υπολογιστή υπερπαίκτη, δηλαδή να κερδίζει τον ανθρώπινο αντίπαλό του συνεχώς αλλά όχι πάντα. Σε περίπτωση που δεν είστε εξοικειωµένοι µε το παιχνίδι Hangman (Κρεµάλα) σε ηλεκτρονικό υπολογιστή (Η/Υ), οι κανόνες του έχουν ως εξής:

1. Ο Η/Υ επιλέγει µια µυστική λέξη από ένα προκαθορισµένο και συµφωνηµένο µε τον παίκτη λεξικό, και στη συνέχεια, τυπώνει µια σειρά από παύλες ίση µε το µήκος µιας λέξης, στον παίκτη. Παράλληλα ενηµερώνει το χρήστη για τον αριθµό των προσπαθειών που έχει στη διάθεση του για να µαντέψει τη µυστική λέξη (ίσως αυτό να συµφωνείται πριν την εκκίνηση του παιχνιδιού µεταξύ του Η/Υ και του παίκτη). 2. Ο παίκτης ξεκινά να µαντεύει ένα-ένα τα γράµµατα µε στόχο να βρει τη λέξη που επέλεξε ο Η/Υ. Κάθε φορά που µαντεύει σωστά ένα γράµµα που περιέχεται στην µυστική λέξη, ο Η/Υ αποκαλύπτει κάθε εµφάνιση του εν λόγω γράµµατος αφαιρώντας την (τις) αντίστοιχη (αντίστοιχες) παύλα (παύλες). Σε αντίθετη περίπτωση, η εικασία θεωρείται λάθος και µειώνεται κατά ένα ο αριθµός των εναποµενουσών προσπαθειών. 3. Το παιχνίδι τελειώνει είτε όταν όλα τα γράµµατα της λέξης έχουν αποκαλυφθεί ή όταν η παίκτης έχει τελειώσει όλες τις προσπάθειες του. Σηµαντικό για το παιχνίδι είναι το γεγονός, ότι σε ένα συµβατικό παιχνίδι κρεµάλας ο Η/Υ έχει προεπιλεγµένη µια συγκεκριµένη λέξη και δεν αλλάζει την λέξη αυτή κατά τη διάρκεια της εκτέλεσης του προγράµµατος. Από την άλλη στην εργασία αυτή, ο Η/Υ έχει την ευχέρεια να επιλέγει κατά την εκτέλεση οποιαδήποτε από τις λέξεις του λεξικού και η προσπάθεια του χρήστη θα πρέπει να είναι ο περιορισµός των επιλογών του Η/Υ έτσι ώστε να τον νικήσει. Ας δούµε τώρα ένα παράδειγµα για να αντιληφθούµε την λογική υλοποίησης. Ας υποθέσουµε ότι ο παίκτης προσπαθεί να µαντέψει τη (µη-επιλεγµένη) λέξη του Η/Υ, και αποκαλύπτοντας γράµµατα, αναγκάζει τον Η/Υ να φτάσει στο παρακάτω σηµείο (µε µια τελευταία προσπάθεια για τον παίκτη): D O _ B L E Υπάρχουν µόνο δύο λέξεις στο λεξικό του UNIX (/usr/share/dict/words) που ταιριάζουν µε αυτό το µοτίβο: "DOABLE" και "DOUBLE". Εάν ο Η/Υ παίζει τίµια, τότε o παίκτης έχει 50% πιθανότητες να κερδίσει αυτό το παιχνίδι, αν πρόκειται να µαντέψει το «Α» ή το «U», σαν το γράµµα που λείπει. Ωστόσο, αν ο Η/Υ τον εξαπατά και στην πραγµατικότητα δεν έχει διαλέξει κάποια από τις δυο λέξεις, τότε δεν υπάρχει κανένας πιθανός τρόπος ο παίκτης να κερδίσει αυτό το παιχνίδι αφού ο Η/Υ µπορεί να ισχυριστεί ότι είχε διαλέξει την άλλη λέξη, λέγοντας ότι η εικασία είναι λανθασµένη (και εφόσον έµεινε µόνο 1 προσπάθεια στον παίκτη). Έτσι, ο παίκτης θα χάσει το παιχνίδι. Δηλαδή, αν έχει µαντέψει ότι η λέξη είναι "DOABLE", ο Η/Υ µπορεί να προσποιείται ότι είχε διαλέξει από την αρχή την λέξη "DOUBLE", ή αντίστροφα. Ας περιγράψουµε αυτή την τεχνική (της δολίευσης) µε ένα παράδειγµα. Ας υποθέσουµε ότι παίζετε το παιχνίδι Hangman, και είναι η σειρά του Η/Υ να επιλέξει µια λέξη, η οποία θεωρούµε ότι είναι µήκους τεσσάρων χαρακτήρων. Αντί να διαλέξει µια συγκεκριµένη µυστική λέξη, ο Η/Υ δηµιουργεί µια λίστα µε κάθε λέξη ενός λεξικού που έχει τέσσερα γράµµατα. Για να µπορέσουµε να εξηγήσουµε καλυτέρα το παράδειγµα, ας υποθέσουµε ότι ένα δοσµένο λεξικό έχει µόνο λίγες λέξεις µε τέσσερα γράµµατα, τα οποία παρουσιάζονται παρακάτω: ALLY BETA COOL DEAL ELSE FLEW GOOD HOPE IBEX Τώρα, ας υποθέσουµε ότι ο παίκτης µαντεύει το γράµµα «Ε». Θα πρέπει τώρα ο Η/Υ να πει στον παίκτη ποια γράµµατα της λέξης που έχει "διαλέξει" είναι «Ε». Φυσικά, δεν έχει διαλέξει µια λέξη, και έτσι έχει πολλαπλές επιλογές για το πού θα αποκαλύψει τα «Ε». Παρακάτω φαίνεται η παραπάνω λίστα λέξεων, µε το «Ε» υπογραµµισµένο στην κάθε λέξη: ALLY BETA COOL DEAL ELSE FLEW GOOD HOPE IBEX Όπως θα παρατηρήσετε, κάθε λέξη στο λεξικό (ή σε µια λίστα λέξεων), εµπίπτει σε µία από τα πέντε σύνολα λέξεων:, το οποίο περιλαµβάνει τις λέξεις ALLY, COOL και GOOD _ Ε, το οποίο περιλαµβάνει τη λέξη HOPE E _, το οποίο περιλαµβάνει τις λέξεις FLEW και IBEX 2/10

_ Ε, το οποίο περιλαµβάνει τις λέξεις BETA και DEAL Ε Ε, το οποίο περιλαµβάνει τη λέξη ELSE Δεδοµένου ότι τα γράµµατα που αποκαλύπτει ο Η/Υ πρέπει να αντιστοιχούν σε κάποια λέξη στη λίστα λέξεών του, ο Η/Υ µπορεί να επιλέξει να αποκαλύψει οποιοδήποτε από τα παραπάνω πέντε σύνολα. Υπάρχουν πολλοί τρόποι για να επιλέξει ποιο σύνολο να αποκαλύψει - ίσως θέλει να πάει τον αντίπαλό του (τον παίκτη) προς ένα µικρότερο σύνολο µε πιο σπάνιες λέξεις, ή προς ένα µεγαλύτερο σύνολο µε την ελπίδα της διατήρησης περισσότερων επιλογών του. Για αυτήν την εργασία, θα υιοθετήσουµε την τελευταία προσέγγιση και θα επιλέξουµε πάντα το µεγαλύτερο από τα υπόλοιπα σύνολα λέξεων. Για το παράδειγµα µας, αυτό σηµαίνει ότι θα πρέπει ο Η/Υ να επιλέξει το σύνολο. Αυτό µειώνει λίστα των λέξεών του σε: ALLY COOL GOOD και από τη στιγµή που δεν υπάρχει το γράµµα «Ε», θα πει στον αντίπαλό του ότι η εικασία του ήταν λάθος. Ας δούµε µερικά ακόµη παραδείγµατα υλοποίησης αυτής της στρατηγικής. Λαµβάνοντας υπόψη αυτό το σύνολο τριών λέξεων, αν ο παίκτης µαντέψει το γράµµα «O», τότε θα σπάσει η λίστα (το σύνολο) λέξεων σε δύο υπο-σύνολα: _ Ο Ο _, το οποίο περιλαµβάνει τις λέξεις COOL και GOOD, το οποίο περιλαµβάνει τη λέξη ALLY To πρώτο από αυτά τα σύνολα είναι µεγαλύτερο από το δεύτερο, και έτσι ο Η/Υ µπορεί να το επιλέξει, αποκαλύπτοντας δύο «O» στην λέξη και µειώνοντας τη λίστα του σε: COOL και GOOD, δηλαδή: _ Ο Ο _, το οποίο περιλαµβάνει τις λέξεις COOL και GOOD Τι θα συµβεί αν ο παίκτης στη συνέχεια µαντεύει ένα γράµµα που δεν εµφανίζεται πουθενά στη λίστα λέξεων του Η/Υ; Για παράδειγµα, τι θα συµβεί εάν ο παίκτης µαντεύει τώρα «Τ»; Μετά το διαχωρισµό των δυο λέξεων σε σύνολα, παρατηρούµε ότι υπάρχει µόνο ένα σύνολο λέξεων, είναι τετριµµένα το µεγαλύτερο, και επιλέγοντάς το, θα διατηρηθεί η λίστα λέξεων που ήδη είχε, δηλαδή COOL και GOOD _ Ο Ο _, το οποίο περιλαµβάνει τις λέξεις COOL και GOOD Τέλος, υπάρχουν δύο πιθανά αποτελέσµατα αυτού του παιχνιδιού. Κατ 'αρχάς, ο παίκτης µπορεί να είναι αρκετά έξυπνος για να χωρίσει τη λίστα λέξεων προς µία λέξη και τελικά να µαντέψει αυτή τη λέξη. Σε αυτή την περίπτωση, θα πρέπει να λάβει συγχαρητήρια - αυτό είναι ένα εντυπωσιακό επίτευγµα λαµβάνοντας υπόψη την δολοπλοκία του Η/Υ! Δεύτερον, και κατά πολύ η συνηθέστερη περίπτωση, ο παίκτης θα χαθεί εντελώς και θα ξεµείνει από εικασίες (λόγω µπλεξίµατος) ή από προσπάθειες (λόγω λανθασµένων επιλογών). Όταν συµβαίνει αυτό, ο Η/Υ µπορεί να επιλέξει οποιαδήποτε λέξη θέλει από τη λίστα του και να πει ότι είναι η λέξη που είχε επιλέξει καθ όλη τη διάρκεια του παιχνιδιού. Η οµορφιά αυτής της στρατηγικής είναι ότι ο παίκτης δεν θα έχει καµία δυνατότητα να γνωρίζει ότι ο Η/Υ παρακάµπτει εικασίες κάθε φορά - αυτό µοιάζει απλά µε την περίπτωση που ο Η/Υ διάλεξε µια ασυνήθιστη λέξη και την κράτησε µέχρι τέλους παιχνιδιού. J ΙΙI. Ζητούµενα Άσκησης Ζητούµενο αυτής της άσκησης είναι η κατασκευή ενός προγράµµατος στη γλώσσα προγραµµατισµού C, το οποίο να υλοποιεί το παιχνίδι που περιγράφεται στις ενότητες Ι-ΙΙ αυτής της εκφώνησης. Το πρόγραµµα σας πρέπει να υλοποιεί τον παρακάτω αλγόριθµο: 1. Διαβάζει το αρχείο που αντιπροσωπεύει το λεξικό. Στην πρώτη γραµµή του αρχείου υπάρχει ένας ακέραιος που προσδιορίζει το µήκος των λέξεων αυτού του αρχείου. 3/10

2. Ζητά από το χρήστη να εισάγει έναν αριθµό προσπαθειών, ο οποίος πρέπει να είναι ένας ακέραιος αριθµός µεγαλύτερος από το µηδέν. Μην ανησυχείτε για το αν δοθεί ένας µεγάλος αριθµός προσπαθειών, καθώς επιλέγοντας περισσότερες από 26 προσπάθειες (όσα τα γράµµατα του λατινικού αλφαβήτου) δεν κερδίζει κάτι ο αντίπαλός σας! 3. Το πρόγραµµα να εµφανίζει ένα µήνυµα που παρουσιάζει τον αριθµό των λέξεων (από τη λίστα λέξεων) που έχουν τους συγκεκριµένους χαρακτήρες που έχει µαντέψει σωστά ο παίκτης. 4. Παίξτε το παιχνίδι όπως περιγράφεται παρακάτω: a. Εκτυπώστε πόσες προσπάθειες έµειναν στον παίκτη, και τη λέξη που πρέπει να µαντέψει η οποία να συµπεριλαµβάνει τα γράµµατα που ο παίκτης έχει µαντέψει σωστά και τις γραµµές ( _ ). Εάν ο χρήστης επιλέξει να εµφανιστεί το µήνυµα του βήµατος 3, τότε να εµφανίζει και αυτό το µήνυµα. b. Προτρέπει το χρήστη να εισάγει (µαντέψει) ένα γράµµα, ζητώντας από τον χρήστη να εισάγει ένα γράµµα το οποίο δεν έχει δώσει προηγουµένως. Βεβαιωθείτε ότι η είσοδος είναι ακριβώς ένας χαρακτήρας και ότι είναι ένα γράµµα της αλφαβήτου. Εναλλακτικά να δίνεται µήνυµα λάθους και ο παίχτης να προσπαθεί ξανά. c. Αφότου ο παίχτης µαντέψει ένα γράµµα: i. το πρόγραµµα χωρίζει τις λέξεις που πήρε από το λεξικό σε σύνολα λέξεων. ii. Βρίσκει και διαλέγει το πιο µεγάλο σύνολο λέξεων, αφαιρει όλες τις άλλες λέξεις από την λίστα λέξεων που δεν βρίσκονται σε αυτό το σύνολο, και αναφέρει τη θέση των γραµµάτων (εάν υπάρχουν) προς το χρήστη. Αν το σύνολο που διάλεξε δεν περιέχει καµία λέξη που να έχει τον εισαγόµενο χαρακτήρα, να αφαιρέσει ένα από τις προσπάθειες του παίκτη. d. Αν ο παίκτης έχει ξεµείνει από προσπάθειες, το πρόγραµµα να επιλέξει µια λέξη από τη λίστα λέξεων και να εµφανιστεί ως η λέξη που ο υπολογιστής "επέλεξε" από την αρχή. e. Αν ο παίκτης µαντέψει σωστά όλη τη λέξη, να εµφανιστεί ένα µήνυµα. Το πρόγραµµα που θα γράψετε διατηρεί µια µεγάλη ψευδαίσθηση: προσποιείται ότι παίζει ένα παιχνίδι κρεµάλας, αλλά, αντίθετα, κάνει κάτι άλλο στο παρασκήνιο. Κατά συνέπεια, θα πρέπει να προσπαθήσετε να κάνετε το πρόγραµµά σας να ανταποκρίνεται όσο το δυνατόν γρηγορότερα. Αν οι παίκτες πρέπει να περιµένουν τρία ή περισσότερα δευτερόλεπτα µετά την είσοδό ενός χαρακτήρα, είναι σχεδόν βέβαιο ότι ο παίχτης θα υποπτευθεί ότι κάτι πηγαίνει στραβά. IV. Θέµατα Υλοποίησης Για αυτήν την εργασία θα πρέπει να χρησιµοποιήσετε γραµµικές δοµές δεδοµένων όπως πίνακες κατακερµατισµού και λίστες. Η δοµή µπορεί να είναι η ακόλουθη: typedef struct node_s{ char *name; struct node_s *next; } NODE; typedef struct list_s{ NODE* head; int size; } LIST; typedef struct { LIST **slot; }HASHTABLE; 4/10

Κατά τον χωρισµό των λέξεων σε σύνολα, οι λέξεις θα µπουν στην δοµή HASHTABLE. Για το παράδειγµα που δώσαµε πιο πάνω στην εν πτητα ΙΙ η δοµή αυτή αναπαριστάνεται στο παρακάτω σχήµα: ALLY COOL GOOD HOPE FLEW IBEX BETA DEAL ELSE Εικόνα 1. Γραµµική Δοµή Δεδοµένων για επίλυση του προβλήµατος διαχωρισµού σε σύνολα λέξεων Κάθε φορά που δηµιουργείτε σύνολα λέξεων, αυτά πρέπει να αποθηκεύονται σε µια δοµή όπως στο παραπάνω σχήµα. Επειδή το λεξικό, άρα και τα σύνολα λέξεων, µπορεί να αποτελείται από πολλές λέξεις, φροντίστε να διαχειριστείτε ορθά την µνήµη. Η δοµή δεδοµένων που παρουσιάζεται στην Εικόνα 1, είναι µια δοµή δεδοµένων αποτελούµενη από ένα δυναµικά δεσµευόµενο πίνακα του οποίου τα στοιχεία είναι δείκτες σε λίστες. Για την δηµιουργία της δοµής αυτής χρησιµοποιείστε και µια συνάρτηση κατακερµατισµού, hash function, που να µετατρέπει αποτελεσµατικά ένα κλειδί (π.χ. λέξεις) στις σχετικές µε αυτόν τιµές. Στην εργασία µας, η συνάρτηση hash θα χρησιµοποιείται για να χωριστούν οι λέξεις του λεξικού σε σύνολα λέξεων. Συγκεκριµένα, θα πρέπει να βρείτε ένα τρόπο για την µετατροπή µιας λέξης σε ένα ακέραιο αριθµό που θα αντιπροσωπεύει µια θέση στον πίνακα (τη θέση της λίστας στην οποία ανήκει η λέξη). Μετά πρέπει να εισάγετε τη λέξη στην λίστα που αντιστοιχεί σε αυτήν τη θέση του πίνακα. Επίσης, οι ακόλουθες συµβουλές και τεχνάσµατα µπορούν να σας φανούν χρήσιµα: Η θέση ενός γράµµατος σε µια λέξη είναι τόσο σηµαντική όσο είναι και το πλήθος αυτού του γράµµατος στην λέξη. Κατά τον υπολογισµό των συνόλων των λέξεων, δεν αρκεί να µετρήσετε πόσες φορές ένα συγκεκριµένο γράµµα εµφανίζεται σε µια λέξη, αλλά πρέπει επίσης, να λάβετε υπόψη και τις θέσεις του γράµµατος στην λέξη. Για παράδειγµα, οι λέξεις "BEER" και "HERE" θα βρίσκονται σε δύο διαφορετικά σύνολα, παρόλο που και οι δύο έχουν δύο Ε. Βεβαιωθείτε ότι η αναπαράσταση των συνόλων λέξεων είναι σωστή ως προς την παραπάνω διάκριση. Προσέξτε να µην απαριθµούνται ρητά τα σύνολα λέξεων. Αν επεξεργάζεστε λέξεις µήκους n, τότε υπάρχουν 2 n πιθανά σύνολα λέξεων για κάθε γράµµα. Ωστόσο, οι περισσότερες από αυτές τις οικογένειες δεν υπάρχουν στην πραγµατικότητα στην αγγλική γλώσσα. Για παράδειγµα, δεν υπάρχουν αγγλικές λέξεις που περιέχουν τρία συνεχόµενα U, και δεν υπάρχει λέξη που ταιριάζει µε το µοτίβο E _ E E _ Ε Ε E. Αντί να δηµιουργήσετε κάθε σύνολο λέξεων κάθε φορά που ο χρήστης εισάγει ένα χαρακτήρα, δείτε αν µπορείτε να δηµιουργήσετε σύνολα λέξεων µόνο για τις λέξεις που εµφανίζονται στην πραγµατικότητα στη λίστα λέξεων. 5/10

V. Γενικές Οδηγίες Το πρόγραµµα σας θα πρέπει να συµβαδίζει µε το πρότυπο ISO C, να περιλαµβάνει εύστοχα και περιεκτικά σχόλια, να έχει καλή στοίχιση και το όνοµα κάθε µεταβλητής, σταθεράς, ή συνάρτησης να είναι ενδεικτικό του ρόλου της. Να χρησιµοποιήσετε το λογισµικό τεκµηρίωσης doxygen έτσι ώστε να µπορούµε να µετατρέψουµε τα σχόλια του προγράµµατός σας σε HTML αρχεία και να τα δούµε µε ένα browser. Η συστηµατική αντιµετώπιση της λύσης ενός προβλήµατος περιλαµβάνει στο παρόν στάδιο τη διάσπαση του προβλήµατος σε µικρότερα ανεξάρτητα προβλήµατα που κατά κανόνα κωδικοποιούµε σε ξεχωριστές συναρτήσεις. Για αυτό τον λόγο σας καλούµε να κάνετε χρήση συναρτήσεων και άλλων τεχνικών δοµηµένου προγραµµατισµού που διδαχτήκατε στο ΕΠΛ131. Επίσης, σας θυµίζουµε ότι κατά την διάρκεια της εκτέλεσης του προγράµµατος σας αυτό θα πρέπει να δίνει τα κατάλληλα µηνύµατα σε περίπτωση λάθους. Τέλος το πρόγραµµα σας θα πρέπει να µεταγλωττίζεται στις µηχανές του εργαστηρίου. Παρακαλώ όπως µελετηθούν ξανά οι κανόνες υποβολής εργασιών όπως αυτοί ορίζονται στο συµβόλαιο του µαθήµατος. Επίσης να ακολουθήσετε τα πιο κάτω βήµατα όταν υποβάλετε την άσκηση σας στο Moodle: 1. Δηµιουργείστε ένα κατάλογο µε το όνοµά σας π.χ., PyrrosBratskas/ χωρίς να αφήνετε κενά στο όνοµα του καταλόγου. 2. Βάλτε µέσα στον κατάλογο αυτό όλα τα αρχεία της εργασίας (κώδικας, doxygen configuration file, README.dox) που πρέπει να υποβάλετε. 3. Συµπιέστε (zip) τον κατάλογο (και όχι τα αρχεία ξεχωριστά) χρησιµοποιώντας την εντολή zip c PyrrosBratskas.zip PyrrosBratskas/* 4. Βεβαιωθείτε ότι κάνατε σωστά τα τρία προηγούµενα βήµατα 5. Ανεβάστε στο Moodle το συµπιεσµένο αρχείο π.χ., PyrrosBratskas.zip VI. Κριτήρια αξιολόγησης Υλοποίηση Δυναµικών Δοµών Δεδοµένων του Παιχνιδιού 30 Χωρισµός Λέξεων σε Σύνολα Λέξεων 30 Βαθµός Δυσκολίας Παιχνιδιού 20 Διαχωρισµός Προγράµµατος σε Πολλαπλά Αρχεία µε Makefile 10 Γενική εικόνα (ευανάγνωστος κώδικας, σχολιασµός, κλπ.) 10 ΣΥΝΟΛΟ 100 VIΙ. Παράδειγµα εκτέλεσης Παράδειγµα 1: $./hangman toyexample.txt *** Welcome to (Evil) Hangman *** *** You are going to play against the computer *** How many total guesses? 100 6/10 $ cat toyexample.txt 4 ALLY BETA COOL DEAL ELSE FLEW GOOD HOPE IBEX

Number of Guesses: 100 Guess a letter: E E not in secret word Words possible: 3 Number of Guesses: 99 Guess a letter: O Words possible: 2 Progress: _OO_ Number of Guesses: 99 Guess a letter: G G not in secret word Words possible: 1 Progress: _OO_ Number of Guesses: 98 Guess a letter: C Words possible: 1 Progress: COO_ Number of Guesses: 98 Guess a letter: L Congratulations, you win the game The secret word is: COOL Παράδειγµα 2: $./hangman length4test.txt *** Welcome to (Evil) Hangman *** *** You are going to play against the computer *** How many total guesses? 8 Number of Guesses: 8 Guess a letter: e e not in secret word Words possible: 13 Number of Guesses: 7 7/10 $ cat length4test.txt 4 acer ache achy acid acis acta acts actu acyl adad adai adam adar adat adaw elsa else emil emim flew flex feat feck feed feel

Guess a letter: a Number of Guesses: 7 Guess a letter: h h not in secret word Words possible: 5 Number of Guesses: 6 Guess a letter: t t not in secret word Words possible: 3 Number of Guesses: 5 Guess a letter: c Words possible: 3 Number of Guesses: 5 Guess a letter: a Letter a was given before Words possible: 3 Number of Guesses: 5 Guess a letter: d d not in secret word Words possible: 2 Number of Guesses: 4 Guess a letter: i i not in secret word Words possible: 1 Number of Guesses: 3 Guess a letter: y Words possible: 1 Progress: acy_ Number of Guesses: 3 Guess a letter: l Congratulations, you win the game 8/10

The secret word is: acyl Παράδειγµα 3: $./hangman length4test.txt *** Welcome to (Evil) Hangman *** *** You are going to play against the computer *** How many total guesses? 7 Number of Guesses: 7 Guess a letter: e e not in secret word Words possible: 13 Number of Guesses: 6 Guess a letter: a Number of Guesses: 6 Guess a letter: w w not in secret word Number of Guesses: 5 Guess a letter: q q not in secret word Number of Guesses: 4 Guess a letter: c Number of Guesses: 4 Guess a letter: j j not in secret word Number of Guesses: 3 9/10

Guess a letter: k k not in secret word Number of Guesses: 2 Guess a letter: l l not in secret word Words possible: 5 Number of Guesses: 1 Guess a letter: b b not in secret word You run out of guesses. You lost The secret word was: achy Καλή Επιτυχία! 10/10