====== Άσκηση 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.
*