====== Άσκηση 9 - Μάντεψε τον αριθμό - Επαναληπτική ====== * Στην προηγούμενη άσκηση είδαμε συνδυασμό συνθηκών με **AND** (και), **OR** (ή), **ΝΟΤ** (όχι) . * Στην νέα άσκηση θα δούμε επιπλέον τα εξής : * Επανάληψη των προηγουμένων - **repeat until, const, if .. then .. else, case** κτλ. - **ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ** : Θα δημιουργήσουμε το νέο έργο **mantepse** * Κάνουμε όμοιες ενέργειες όπως στην Άσκηση1, όπου hello τώρα ο τίτλος είναι **mantepse** - **ΕΙΣΑΓΩΓΗ - ΥΠΟΛΟΓΙΣΜΟΣ ΤΥΧΑΙΟΥ ΑΡΙΘΜΟΥ** * Σκοπός μας είναι να φτιάξουμε το εξής. Το πρόγραμμά μας θα σκεφτεί έναν τυχαίο αριθμό. Στην συνέχεια ο χρήστης θα προσπαθεί να τον μαντέψει. Θα του λέμε εάν είναι μικρότερος ή μεγαλύτερος ο αριθμός μας και Θα μετράμε τις προσπάθειές του, μέχρι τελικά να τον βρει - Πάμε να εμφανίσουμε έναν ωραίο τίτλο και μια περιγραφή στο πρόγραμμά μας. ****ΒΡΕΣ ΤΟΝ ΑΡΙΘΜΟ**** Έχω σκεφτεί έναν αριθμό από 1 .. 100 Μπορείς να τον μαντέψεις; - Όπως βλέπετε έχουμε αφήσει **1 κενή** γραμμή κάτω από το ****ΒΡΕΣ ΤΟΝ ΑΡΙΘΜΟ**** και **άλλες 2 κενές γραμμές στο τέλος**. (Αν δεν θυμάστε πως, δείτε την αρχή της Άσκησης 6) - Τώρα πρέπει σαν Υπολογιστής να σκεφτούμε έναν αριθμό. Πρώτα θα εισάγουμε την εντολή **randomize()** η οποία ανακατεύει την γεννήτρια τυχαίων αριθμός (σαν να ανακατεύουμε μια τράπουλα). - Στην συνέχεια υπολογίζουμε έναν τυχαίο αριθμό. Αυτό γίνεται με την εντολή **random(100)**. Αυτή υπολογίζει έναν δεκαδικό αριθμό από **0 .. 99.9999**, οπότε για να γίνει από 1 έως 100 **θα προσθέσουμε + 1**. Το αποτέλεσμα το αποθηκεύουμε σε μία μεταβλητή έστω **arithmos**. (Ξέρετε πλέον πως γίνεται αυτό, δεξιά ο υπολογισμός και ανάθεση τιμής στην μεταβλητή που βρίσκεται στα αριστερά.) - Για να φύγουν τα δεκαδικά ψηφία αρκεί να δηλώσουμε την μεταβλητή **arithmos** ως **ακέραιος** (όχι πραγματικός) - **ΠΡΟΣΠΑΘΕΙΑ ΝΑ ΤΟΝ ΒΡΕΙ Ο ΧΡΗΣΤΗΣ** * Θα ζητάμε από τον χρήστη να μας δώσει έναν αριθμό ξανά και ξανά μέχρι να τον βρει. Άρα θα βάλουμε τις εντολές μας μέσα σε μία **repeat .. until**. Προσοχή στην στοίχιση! - Μέσα στην **repeat .. until**, εμφανίστε ένα μήνυμα **Δώσε αριθμό : ** και διαβάστε από τον χρήστη (στην ίδια γραμμή) ότι σας δώσει, αποθηκεύοντας την απάντησή του σε μία μεταβλητή π.χ. **mantepsia**. - Ποια θα είναι η συνθήκη εξόδου από την επανάληψη; Πότε θα σταματήσει να εισάγει αριθμούς ο χρήστης; Όταν πετύχει τον αριθμό, βέβαια! Δίπλα από την **until** λοιπόν, βάλτε την συνθήκη που θα ισχύσει όταν ο χρήστης μαντέψει τον αριθμό. - Πρέπει όμως να τον βοηθήσουμε λίγο για να μην κάνει 100 προσπάθειες να τον βρει. Με μια **if .. then .. else**, ελέγξτε λοιπόν εάν ο **arithmos** είναι μεγαλύτερος από την **mantepsia** και εμφανίστε μήνυμα **Ο αριθμός μου είναι μεγαλύτερος**, αλλιώς εμφανίστε μήνυμα **Ο αριθμός μου είναι μικρότερος**. (Ξέρετε πλέον να χρησιμοποιείται την **if**, δείτε και προηγούμενες ασκήσεις) - **ΥΠΟΛΟΓΙΣΜΟΣ ΠΡΟΣΠΑΘΕΙΩΝ ΚΑΙ ΤΕΛΙΚΟ ΜΗΝΥΜΑ** - Έξω από την **repeat .. until** θα εμφανίσουμε το **μια κενή γραμμή** και μετά το μήνυμα **Βρήκες τον αριθμό σε //τόσες// προσπάθειες!**. Όπου //τόσες// η τιμή μιας μεταβλητής **μετρητή** π.χ. **prospatheies** η οποία έχει τον αριθμό των προσπαθειών. - Πάμε να υπολογίσουμε τις προσπάθειες του χρήστη. Αρχικά δεν έχει κάνει καμία προσπάθεια. Πριν μπούμε λοιπόν στην **repeat .. until** δίνουμε τιμή **0** στην μεταβλητή **prospatheies**. prospatheies:=0; repeat .. - Μέσα στην επανάληψη, στο τέλος των εντολών της, θα αυξήσουμε την μεταβλητή **μετρητή** κατά 1. .. prospatheies:=prospatheies+1; until mantepsia=arithmos; - **ΤΡΟΠΟΠΟΙΗΣΗ ΕΛΕΓΧΟΥ** * Στον έλεγχο που κάναμε μέσα στην επανάληψη με την if arithmos>mantepsia then writeln('Ο αριθμός μου είναι μεγαλύτερος') else writeln('Ο αριθμός μου είναι μικρότερος'); * η περίπτωση ο **arithmos** να είναι ίσος με **mantepsia** πήγε στο else που δεν έπρεπε. Βασικά τα 2 μηνύματα θα πρέπει να εμφανίζονται μόνο όταν ο **arithmos** είναι διαφορετικός από την **mantepsia**. - Οπότε θα βάλουμε όλη την παραπάνω **if .. then .. else .. ** μέσα σε μια άλλη if που θα ελέγχει ότι ο **arithmos** είναι διαφορετικός από την **mantepsia** if arithmos<>mantepsia then if arithmos>mantepsia then writeln('Ο αριθμός μου είναι μεγαλύτερος') else writeln('Ο αριθμός μου είναι μικρότερος'); - **BONUS** - Για να κάνουμε πιο ωραίο το πρόγραμμά μας βάζουμε μια **clrscr** και χρώματα φόντου με την **textbackground** και κειμένου με την **textcolor** - Αλλάζουμε το χρώμα κειμένου επίσης πριν το μήνυμα **Βρήκες τον αριθμό σε //τόσες// προσπάθειες!**, ώστε να ξεχωρίσει. - **ΕΠΑΝΑΛΗΨΗ - const** - Στο πρόγραμμά μας έχουμε μέγιστο αριθμό που μαντεύουμε το 100. Ο αριθμός 100 εμφανίζεται 2 φορές στο πρόγραμμά μας. Δηλώστε μια **σταθερά** **megistos** με τιμή **100** και αντικαταστήστε το 100, και στις 2 εμφανίσεις του, με την σταθερά **megistos**. - Ανοίξτε το **agora.pas** που είχαμε φτιάξει σε προηγούμενη άσκηση. Έχουμε 4 μεταβλητές **onoma_proion1, kostos_proion1, onoma_proion2, kostos_proion2** στις οποίες βάζουμε μια τιμή στην αρχή του προγράμματος και **δεν την αλλάζουμε** μέχρι το τέλος του. Μας φωνάζουν ξεκάθαρα ότι δεν θα πρέπει να οριστούν ως μεταβλητές, αφού **δεν αλλάζουν ποτέ την αρχική τους τιμή**. Τις ορίζουμε λοιπόν ως **σταθερές** με τις τιμές που είχαμε βάλει στην αρχή του προγράμματος. - **ΕΠΑΝΑΛΗΨΗ - case** * Ανοίγουμε πάλι το **mantepse.pas**. * Σε ένα παιχνίδι παίζει ρόλο πόσο καλά θα τα πάμε. Έτσι στο δικό μας είναι διαφορετικό να βρούμε τον αριθμό σε 5-6 προσπάθειες αντί για πάνω από 15. Θα εμφανίσουμε λοιπόν τα παρακάτω μηνύματα. (Μπορείτε να βάλετε και τα δικά σας!) * 12, 13, 14 προσπάθειες : **Μέτρια επίδοση** * 9, 10, 11 προσπάθειες : **Τα κατάφερες σχετικά καλά!!** * 7, 8 προσπάθειες : **Μπράβο! Πάρα πολύ καλή επίδοση!!** * έως 6 προσπάθειες : **Συγχαρητήρια! Είσαι καταπληκτικός!** * πάνω από 15 προσπάθειες : **Όχι και τόσο καλή επίδοση** - Θα χρησιμοποιήσουμε την **case** και την μεταβλητή **prospatheies**. Πάμε να φτιάξουμε την περίπτωση **12, 13, 14 προσπάθειες**. Πριν την αλλαγή χρώματος και πριν το μήνυμα **Βρήκες τον αριθμό σε //τόσες// προσπάθειες!** θα εισάγουμε μια case case prospatheies of 12, 13, 14 : writeln('Μέτρια επίδοση'); end; - Βλέπουμε ότι χρησιμοποιούμε πολλές τιμές μέσα στην **case**, χωρίζοντάς τις με **κόμμα**. Με όμοιο τρόπο κάνουμε τα υπόλοιπα εκτός από το **πάνω από 15 προσπάθειες** που θα το βάλουμε στην **else** αφού δεν έχει πάνω όριο. Πώς θα φτιάξουμε το **έως 6 προσπάθειες**; ---- * **ΕΠΕΚΤΑΣΗ 1 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ** * Έστω ότι θέλουμε να φτιάξουμε το παιχνίδι με τα χαρτιά **blackjack** - (**21**). * Θεωρούμε ότι παίζουν τα χαρτιά από **2 έως και 11** (θεωρώντας ότι ο Άσσος είναι πάντα 11 για απλότητα) * Ο Υπολογιστής τραβάει **2 τυχαία χαρτιά**. Μας **εμφανίζει το 1ο** αλλά κρατάει **κρυφό το 2ο** . * Ο χρήστης τραβάει **1 τυχαίο χαρτί που εμφανίζεται**. * Ο χρήστης βλέποντας το 2ο χαρτί του ΗΥ και το δικό του **ποντάρει**. Ελέγχουμε ότι το ποντάρισμα είναι πάντα θετικό και κάτω από ένα όριο, αν όχι ξαναζητάμε. (Όποιο όριο θέλουμε π.χ. 100€). (Με χρήση **repeat .. until** ή ακόμα καλύτερα **while**) * Ο χρήστης τραβάει **2ο τυχαίο χαρτί που εμφανίζεται**. * Με **2 χαρτιά μόνο και τα 2 άσσους**, αλλάξτε το σύνολο από 22 σε 21. Αυτό ισχύει και για τον χρήστη και για τον ΗΥ. * Επαναληπτικά ενώ ο χρήστης έχει **κάτω από 21** **και (AND)** θέλει να συνεχίζει. (ορίστε μια μεταβλητή τύπου boolean με αρχική τιμή true) * Ρωτάμε τον χρήστη εάν θέλει και άλλο χαρτί. * Εάν ναι ο χρήστης τραβάει και άλλο χαρτί το οποίο εμφανίζουμε και προσθέτουμε στο σύνολό του. * ο ΗΥ **εμφανίζει το δικό του 2ο χαρτί**. * Εάν το σύνολο των χαρτιών του είναι μεγαλύτερο ή ίσο με του χρήστη **ή (or)** ο χρήστης έχει καεί, έχει πάνω από 21 * τότε κερδίζει o HY οπότε** αφαιρούμε** το ποντάρισμα από τα χρήματα του χρήστη. * αλλιώς κερδίζει ο χρήστης οπότε **προσθέτουμε** το ποντάρισμα στα χρήματα του χρήστη. * Εμφανίζουμε τα χρήματα του χρήστη. * Ρωτάμε εάν ο χρήστης θέλει και άλλο γύρο και εάν ναι συνεχίζουμε ΕΝΔΕΙΚΤΙΚΗ ΕΚΤΕΛΕΣΗ - (Το δικό σας να γίνει πιο ωραίο σε εμφάνιση) ****Blackjack - 21**** HY : 10 Παίκτης : 11 Δώσε ποντάρισμα -3 Το ποντάρισμα να είναι μεταξύ 1 και 100€ 0 Το ποντάρισμα να είναι μεταξύ 1 και 100€ 30 Παίκτης : 7 -> 18 Θέλεις άλλο χαρτί (ν/ο) ο ΗΥ : 10 3 -> 13 Παίκτης : 18 Κερδίσες! Χρήματα παίκτη : + 30 -> 30€ Θέλεις άλλο γύρο (ν/ο) ν HY : 11 Παίκτης : 5 Δώσε ποντάρισμα 22 Παίκτης : 6 -> 11 Θέλεις άλλο χαρτί (ν/ο) ν Παίκτης : 2 -> 13 Θέλεις άλλο χαρτί (ν/ο) ο ΗΥ : 11 6 -> 17 Παίκτης : 13 Κερδίζει ο ΗΥ!, Χρήματα παίκτη : - 22 -> 8€ Θέλεις άλλο γύρο (ν/ο) ν HY : 11 Παίκτης : 6 Δώσε ποντάρισμα 56 Παίκτης : 5 -> 11 Θέλεις άλλο χαρτί (ν/ο) ν Παίκτης : 7 -> 18 Θέλεις άλλο χαρτί (ν/ο) ν Παίκτης : 11 -> 29 ΗΥ : 11 11 -> 21 Παίκτης : 29 Κερδίζει ο ΗΥ!, Χρήματα παίκτη : - 56 -> -48€ Θέλεις άλλο γύρο (ν/ο) * **ΕΠΕΚΤΑΣΗ 2 / ΑΣΚΗΣΗ ΓΙΑ ΤΟ ΣΠΙΤΙ** * Στο παιχνίδι **blackjack** * Όταν σταματήσει ο χρήστης να τραβάει χαρτιά και ο ΗΥ εμφανίσει το δικό του 2ο χαρτί, ελέγχουμε εάν το σύνολο των χαρτιών του ΗΥ είναι **μικρότερο από 17**. Τότε ο ΗΥ υποχρεωτικά ξανατραβάει νέο χαρτί. Οπότε τραβάει χαρτιά μέχρι το σύνολο να είναι μεγαλύτερο είτε ίσο με 17. * Ο ΗΥ τώρα μπορεί να καεί οπότε το ελέγχουμε όταν είναι να αποφασίσουμε ποιος έχει κερδίσει. * Το όριο πονταρίσματος να μπει σε σταθερά const. *