Παιχνίδι - 3ο Στάδιο - Φαντασμα

  1. ΔΙΑΓΡΑΦΗ ΠΡΟΗΓΟΥΜΕΝΟΥ
    • Όταν μετακινούμε τον χαρακτήρα του pacman, πρέπει πάντα να διαγράφεται ο προηγούμενος. Ήδη το κάναμε με την clrscr η οποία όμως καθαρίζει όλη την οθόνη. Αυτό δεν το θέλουμε πλέον γιατί θα βάλουμε και άλλα σχήματα μέσα στην οθόνη.
    1. Αφαιρούμε λοιπόν το 2ο clrscr πριν από το gotoxy(x,y); στο τέλος της επανάληψης. (Προσοχή το 1ο clrscr πριν την επανάληψη το θέλουμε). Μεταγλωττίστε και εκτελεστε. Τι παρατηρείτε;
    2. Ο προηγούμενος χαρακτήρας pacman μένει και είναι σαν να ζωγραφίζουμε! Ωραίο, αλλά δεν θέλουμε αυτό..
      • Ακριβώς πριν ξεκινήσει η case θα εισάγουμε τις παρακάτω εντολές
        gotoxy(x,y);
        writeln(' ');
    • Έτσι διαγράφουμε το pacman από την προηγούμενη θέση.
  2. ΟΡΓΑΝΩΣΗ - ΔΙΑΔΙΚΑΣΙΑ writexy
    • Σε 3 σημεία στο πρόγραμμά μας έχουμε την εντολή gotoxy και αμέσως μετά μια writeln. Θα φτιάξουμε μία διαδικασία writexy με τις 2 παραπάνω εντολές.
    1. Μετά το τέλος του var και πάνω από το BEGIN του κυρίως προγράμματος εισάγουμε τον παρακάτω κώδικα
      procedure writexy(x : integer; y : integer; keimeno : string);
      begin
      	gotoxy(x,y);
      	writeln(keimeno);
      end;
    2. Αντικαθιστούμε τώρα σε 2 σημεία τον κώδικα
      gotoxy(x,y);
      writeln(pacman); 

      με

       writexy(x,y,pacman); 
    3. και τον κώδικα
      gotoxy(x,y);
      writeln(' '); 

      με

       writexy(x,y,' '); 
  3. ΟΡΓΑΝΩΣΗ - ΔΙΑΔΙΚΑΣΙΑ pacmanMetakinisi
    • Συνεχίζοντας την οργάνωση του κώδικα θα φτιάξουμε την διαδικασία pacmanMetakinisi με όλο τον κώδικα που είναι μέσα στην repeat .. until.
    1. Πάνω από το BEGIN του κυρίως προγράμματος εισάγουμε τον παρακάτω κώδικα. Για λόγους απλότητας δεν βάζουμε παραμέτρους στην διαδικασία pacmanMetakinisi.
      procedure pacmanMetakinisi;
      begin
        // Εδώ θα μπεί όλος ο κώδικας που υπάρχει ανάμεσα στο repeat .. until
      end; 
    2. Κάντε αποκοπή τον κώδικα ανάμεσα στο repeat .. until (χωρίς το repeat .. until) και εισάγετέ τον μέσα στο begin .. end της διαδικασίας pacmanMetakinisi.
    3. Στην θέση του κώδικα που πήραμε από το κυρίως πρόγραμμα θα καλέσουμε την διαδικασία pacmanMetakinisi, δηλαδή
      repeat
      	pacmanMetakinisi;
      until pliktro=pliktroexodou;
  4. ΕΜΦΑΝΙΣΗ ΦΑΝΤΑΣΜΑΤΟΣ
    1. Πάμε να εμφανίσουμε ένα φάντασμα που θα μας κυνηγάει. Έστω ότι θα εμφανίζεται ως #. Εισάγουμε στο const την νέα σταθερά
      fantasma = '#';
    2. Έστω ότι θα εμφανιστεί αρχικά στην γραμμή 5 στην στήλη 10. Θα χρησιμοποιήσουμε 2 νέες μεταβλητές xf και yf (δεν ξεχνάμε να τις ορίζουμε στο var). Εισάγουμε ακριβώς πάνω από την repeat τον κώδικα
      xf:=3;
      yf:=10;
      writexy(xf,yf,fantasma);
    3. Μήπως το φάντασμά μας είναι πολύ κοντά; Αλλάζουμε κάποιες από τις μεταβλητές x,y, xf και yf ώστε να το τοποθετήσουμε τουλάχιστον 10 θέσεις μακριά. (Αλλιώς όταν αρχίσει να μας κυνηγάει δεν θα προλάβουμε να κάνουμε βήμα!!)
  5. ΚΙΝΗΣΗ ΦΑΝΤΑΣΜΑΤΟΣ
    • Ωραίο το φάντασμά μας, αλλά ακίνδυνο. Μπορούμε ακόμα και να το φάμε! Προσωρινά, γιατί σε λίγο θα μας κυνηγάει αυτό..
    1. Πάμε να φτιάξουμε την διαδικασία fantasmaMetakinisi. Πάνω από το BEGIN του κυρίως προγράμματος εισάγουμε τον παρακάτω κώδικα
      procedure fantasmaMetakinisi;
      begin
       
      end; 
    2. Μέσα στο begin .. end, θα βάλουμε τις εντολές μετακίνησης. Αρχικά θα διαγράψουμε το φάντασμα στην προηγούμενη θέση xf, yf, εισάγοντας έναν κενό χαρακτήρα με την εντολή
       writexy(xf,yf,' '); 
    3. Στην συνέχεια θα πρέπει να δούμε εάν θα πάει το φάντασμα δεξιά, αριστερά, πάνω ή κάτω για να μας κυνηγήσει. Αρχικά κοιτάμε αν θα πάει δεξιά. Εμείς βρισκόμαστε στην στήλη x και το φάντασμα στην στήλη xf. Αν το xf είναι μικρότερο του x σημαίνει ότι το φάντασμα είναι αριστερά μας και θα προσπαθήσει να κινηθεί δεξιά αυξάνωντας το xf κατά 1. Δηλαδή
      if xf<x then
         xf:=xf+1 
    4. Αλλιώς (else) εάν το xf είναι μεγαλύτερο του x σημαίνει ότι το φάντασμα είναι δεξιά μας και θα προσπαθήσει να κινηθεί αριστερά μειώνοντας το xf κατά 1. Οπότε προσθέτουμε κώδικα και συνολικά θα γίνει
      if xf<x then
         xf:=xf+1
      else
         if xf>x then
            xf:=xf-1
    5. Με την ίδια λογική, συνεχίστε άλλες 2 else και if για να ελέγξετε με τις μεταβλητές yf και y εάν θα πάει κάτω ή πάνω
    6. Τέλος εμφανίστε το φάντασμα στην νέα θέση xf,yf με την εντολή writexy(xf,yf,fantasma);
  6. ΑΡΧΙΖΕΙ ΤΟ ΚΥΝΗΓΙ
    • Έχουμε φτιάξει την διαδικασία κίνησης του φαντάσματος και πρέπει να την εντάξουμε με μια λογική (έναν αλγόριθμο) στο κυρίως πρόγραμμά μας.
    • Θα κινούνται 2 πράγματα στην οθόνη. Εμείς (το pacman) και το φάντασμα. Παρόλο που θα φαίνονται να κινούνται σχεδόν ταυτόχρονα, προγραμματιστικά θα κινείται το ένα κάθε φορά, οπότε θέλουμε μια επιλογή, αν θα κινηθούμε εμείς ή το φάντασμα.
    1. Εμείς κινούμαστε όταν πατάμε κάποιο πλήκτρο και ο έλεγχος αυτός μπορεί να γίνει με την διαδικασία keypressed που επιστρέφει true αν έχει πατηθεί κάποιο πλήκτρο ή false αν δεν πατήθηκε κάτι. Τροποποιούμε λοιπόν τον κώδικα μέσα στην repeat .. until ώστε να είναι ως εξής:
      if keypressed then
         pacmanMetakinisi
      else
      begin
         delay(200);
         fantasmaMetakinisi;
      end;
    2. Βλέπουμε ότι έχουμε εισάγει και μια εντολή delay(200) πριν την μετακίνηση του φαντάσματος. Αυτό καθυστερεί την κίνηση του φαντάσματος κατά 200 χιλιοστά του δευτερολέπτου. Αλλιώς το φάντασμα θα μας έπιανε αστραπιαία. Όμως δεν αρκεί αυτό θα πρέπει εμείς να δώσουμε την εκκίνηση του παιχνιδιού ώστε να προετοιμαστούμε. Αυτό μπορούμε να το κάνουμε εισάγωντας ακριβώς πάνω από την repeat την εντολή readkey ή οποία θα περιμένει να πατήσουμε κάποιο πλήκτρο πριν ξεκινήσει η repeat και το παιχνίδι.
    3. Έχουμε αρχίσει να παίζουμε ήδη, αλλά είναι πολύ εύκολο! Ας το δυσκολέψουμε κάνοντας το φάντασμα να κινείται πιο γρήγορα. Πώς θα το κάνουμε αυτό; Την όλη καθυστέρηση την κάνει το delay οπότε μειώνουμε το χρόνο που καθυστερεί σε 100 ms.
  7. GAMEOVER
    • Καλά μέχρι τώρα, αλλά θα πρέπει να χάνουμε όταν μας πιάσει το φάντασμα, έτσι δεν είναι; Πως μπορούμε να το ελέγξουμε αυτό; Με τις συντεταγμένες θέσης. Το φάντασμα βρίσκεται στην xf και yf ενώ εμείς στην x και y. Πότε μας έπιασε; Όταν xf=x και yf=y.
    1. Πάμε λοιπόν στην συνθήκη εξόδου της επανάληψης, δηλαδή στην until. Την τροποποιούμε ώστε να τελειώνει όταν πατάμε το πλήκτρο εξόδου ή όταν μας πιάσει το φάντασμα. Δηλαδή:
       until (pliktro=pliktroexodou) or ( (xf=x) and (yf=y) );
    2. Προσοχή. Το ( (xf=x) and (yf=y) ) είναι η συνθήκη που μας έπιασε το φάντασμα και πάει όλη μαζί, γιαυτό και βάζουμε παρενθέσεις.
    3. Τέλος μένει να εμφανίσουμε και το χαρακτηριστικό μήνυμα ότι τελείωσε το παιχνίδι. Τελευταία εντολή λοιπόν μετά την repeat .. until, εμφανίστε το μήνυμα GAME OVER