LinuxFanClub Wiki

Υπηρεσίες, Προγραμματισμός, Εκπαίδευση ..

User Tools

Site Tools


el:school:lessons:programmatismos:pascal:askisi9_mantepse_epanaliptiki

Άσκηση 9 - Μάντεψε τον αριθμό - Επαναληπτική

  • Στην προηγούμενη άσκηση είδαμε συνδυασμό συνθηκών με AND (και), OR (ή), ΝΟΤ (όχι) .
  • Στην νέα άσκηση θα δούμε επιπλέον τα εξής :
    • Επανάληψη των προηγουμένων - repeat until, const, if .. then .. else, case κτλ.
  1. ΔΗΜΙΟΥΡΓΙΑ ΕΡΓΟΥ : Θα δημιουργήσουμε το νέο έργο mantepse
    • Κάνουμε όμοιες ενέργειες όπως στην Άσκηση1, όπου hello τώρα ο τίτλος είναι mantepse
  2. ΕΙΣΑΓΩΓΗ - ΥΠΟΛΟΓΙΣΜΟΣ ΤΥΧΑΙΟΥ ΑΡΙΘΜΟΥ
    • Σκοπός μας είναι να φτιάξουμε το εξής. Το πρόγραμμά μας θα σκεφτεί έναν τυχαίο αριθμό. Στην συνέχεια ο χρήστης θα προσπαθεί να τον μαντέψει. Θα του λέμε εάν είναι μικρότερος ή μεγαλύτερος ο αριθμός μας και Θα μετράμε τις προσπάθειές του, μέχρι τελικά να τον βρει
    1. Πάμε να εμφανίσουμε έναν ωραίο τίτλο και μια περιγραφή στο πρόγραμμά μας.
      ****ΒΡΕΣ ΤΟΝ ΑΡΙΘΜΟ****
       
      Έχω σκεφτεί έναν αριθμό από 1 .. 100
      Μπορείς να τον μαντέψεις;
       
       
    2. Όπως βλέπετε έχουμε αφήσει 1 κενή γραμμή κάτω από το ΒΡΕΣ ΤΟΝ ΑΡΙΘΜΟ και άλλες 2 κενές γραμμές στο τέλος. (Αν δεν θυμάστε πως, δείτε την αρχή της Άσκησης 6)
    3. Τώρα πρέπει σαν Υπολογιστής να σκεφτούμε έναν αριθμό. Πρώτα θα εισάγουμε την εντολή randomize() η οποία ανακατεύει την γεννήτρια τυχαίων αριθμός (σαν να ανακατεύουμε μια τράπουλα).
    4. Στην συνέχεια υπολογίζουμε έναν τυχαίο αριθμό. Αυτό γίνεται με την εντολή random(100). Αυτή υπολογίζει έναν δεκαδικό αριθμό από 0 .. 99.9999, οπότε για να γίνει από 1 έως 100 θα προσθέσουμε + 1. Το αποτέλεσμα το αποθηκεύουμε σε μία μεταβλητή έστω arithmos. (Ξέρετε πλέον πως γίνεται αυτό, δεξιά ο υπολογισμός και ανάθεση τιμής στην μεταβλητή που βρίσκεται στα αριστερά.)
    5. Για να φύγουν τα δεκαδικά ψηφία αρκεί να δηλώσουμε την μεταβλητή arithmos ως ακέραιος (όχι πραγματικός)
  3. ΠΡΟΣΠΑΘΕΙΑ ΝΑ ΤΟΝ ΒΡΕΙ Ο ΧΡΗΣΤΗΣ
    • Θα ζητάμε από τον χρήστη να μας δώσει έναν αριθμό ξανά και ξανά μέχρι να τον βρει. Άρα θα βάλουμε τις εντολές μας μέσα σε μία repeat .. until. Προσοχή στην στοίχιση!
    1. Μέσα στην repeat .. until, εμφανίστε ένα μήνυμα Δώσε αριθμό : και διαβάστε από τον χρήστη (στην ίδια γραμμή) ότι σας δώσει, αποθηκεύοντας την απάντησή του σε μία μεταβλητή π.χ. mantepsia.
    2. Ποια θα είναι η συνθήκη εξόδου από την επανάληψη; Πότε θα σταματήσει να εισάγει αριθμούς ο χρήστης; Όταν πετύχει τον αριθμό, βέβαια! Δίπλα από την until λοιπόν, βάλτε την συνθήκη που θα ισχύσει όταν ο χρήστης μαντέψει τον αριθμό.
    3. Πρέπει όμως να τον βοηθήσουμε λίγο για να μην κάνει 100 προσπάθειες να τον βρει. Με μια if .. then .. else, ελέγξτε λοιπόν εάν ο arithmos είναι μεγαλύτερος από την mantepsia και εμφανίστε μήνυμα Ο αριθμός μου είναι μεγαλύτερος, αλλιώς εμφανίστε μήνυμα Ο αριθμός μου είναι μικρότερος. (Ξέρετε πλέον να χρησιμοποιείται την if, δείτε και προηγούμενες ασκήσεις)
  4. ΥΠΟΛΟΓΙΣΜΟΣ ΠΡΟΣΠΑΘΕΙΩΝ ΚΑΙ ΤΕΛΙΚΟ ΜΗΝΥΜΑ
    1. Έξω από την repeat .. until θα εμφανίσουμε το μια κενή γραμμή και μετά το μήνυμα Βρήκες τον αριθμό σε τόσες προσπάθειες!. Όπου τόσες η τιμή μιας μεταβλητής μετρητή π.χ. prospatheies η οποία έχει τον αριθμό των προσπαθειών.
    2. Πάμε να υπολογίσουμε τις προσπάθειες του χρήστη. Αρχικά δεν έχει κάνει καμία προσπάθεια. Πριν μπούμε λοιπόν στην repeat .. until δίνουμε τιμή 0 στην μεταβλητή prospatheies.
        prospatheies:=0;
        repeat
        ..
    3. Μέσα στην επανάληψη, στο τέλος των εντολών της, θα αυξήσουμε την μεταβλητή μετρητή κατά 1.
            ..
            prospatheies:=prospatheies+1;
        until mantepsia=arithmos;
  5. ΤΡΟΠΟΠΟΙΗΣΗ ΕΛΕΓΧΟΥ
    • Στον έλεγχο που κάναμε μέσα στην επανάληψη με την
        if arithmos>mantepsia then          
            writeln('Ο αριθμός μου είναι μεγαλύτερος')
        else
            writeln('Ο αριθμός μου είναι μικρότερος');
    • η περίπτωση ο arithmos να είναι ίσος με mantepsia πήγε στο else που δεν έπρεπε. Βασικά τα 2 μηνύματα θα πρέπει να εμφανίζονται μόνο όταν ο arithmos είναι διαφορετικός από την mantepsia.
    1. Οπότε θα βάλουμε όλη την παραπάνω if .. then .. else .. μέσα σε μια άλλη if που θα ελέγχει ότι ο arithmos είναι διαφορετικός από την mantepsia
        if arithmos<>mantepsia then
            if arithmos>mantepsia then          
                writeln('Ο αριθμός μου είναι μεγαλύτερος')
            else
                writeln('Ο αριθμός μου είναι μικρότερος');
  6. BONUS
    1. Για να κάνουμε πιο ωραίο το πρόγραμμά μας βάζουμε μια clrscr και χρώματα φόντου με την textbackground και κειμένου με την textcolor
    2. Αλλάζουμε το χρώμα κειμένου επίσης πριν το μήνυμα Βρήκες τον αριθμό σε τόσες προσπάθειες!, ώστε να ξεχωρίσει.
  7. ΕΠΑΝΑΛΗΨΗ - const
    1. Στο πρόγραμμά μας έχουμε μέγιστο αριθμό που μαντεύουμε το 100. Ο αριθμός 100 εμφανίζεται 2 φορές στο πρόγραμμά μας. Δηλώστε μια σταθερά megistos με τιμή 100 και αντικαταστήστε το 100, και στις 2 εμφανίσεις του, με την σταθερά megistos.
    2. Ανοίξτε το agora.pas που είχαμε φτιάξει σε προηγούμενη άσκηση. Έχουμε 4 μεταβλητές onoma_proion1, kostos_proion1, onoma_proion2, kostos_proion2 στις οποίες βάζουμε μια τιμή στην αρχή του προγράμματος και δεν την αλλάζουμε μέχρι το τέλος του. Μας φωνάζουν ξεκάθαρα ότι δεν θα πρέπει να οριστούν ως μεταβλητές, αφού δεν αλλάζουν ποτέ την αρχική τους τιμή. Τις ορίζουμε λοιπόν ως σταθερές με τις τιμές που είχαμε βάλει στην αρχή του προγράμματος.
  8. ΕΠΑΝΑΛΗΨΗ - case
    • Ανοίγουμε πάλι το mantepse.pas.
    • Σε ένα παιχνίδι παίζει ρόλο πόσο καλά θα τα πάμε. Έτσι στο δικό μας είναι διαφορετικό να βρούμε τον αριθμό σε 5-6 προσπάθειες αντί για πάνω από 15. Θα εμφανίσουμε λοιπόν τα παρακάτω μηνύματα. (Μπορείτε να βάλετε και τα δικά σας!)
      • 12, 13, 14 προσπάθειες : Μέτρια επίδοση
      • 9, 10, 11 προσπάθειες : Τα κατάφερες σχετικά καλά!!
      • 7, 8 προσπάθειες : Μπράβο! Πάρα πολύ καλή επίδοση!!
      • έως 6 προσπάθειες : Συγχαρητήρια! Είσαι καταπληκτικός!
      • πάνω από 15 προσπάθειες : Όχι και τόσο καλή επίδοση
    1. Θα χρησιμοποιήσουμε την case και την μεταβλητή prospatheies. Πάμε να φτιάξουμε την περίπτωση 12, 13, 14 προσπάθειες. Πριν την αλλαγή χρώματος και πριν το μήνυμα Βρήκες τον αριθμό σε τόσες προσπάθειες! θα εισάγουμε μια case
          case prospatheies of
              12, 13, 14 : 
                  writeln('Μέτρια επίδοση');
          end;
    2. Βλέπουμε ότι χρησιμοποιούμε πολλές τιμές μέσα στην 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.
el/school/lessons/programmatismos/pascal/askisi9_mantepse_epanaliptiki.txt · Last modified: Y/m/d H:i by vagk