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