el:school:lessons:programmatismos:pascal:game:stage3
Παιχνίδι - 3ο Στάδιο - Φαντασμα
ΔΙΑΓΡΑΦΗ ΠΡΟΗΓΟΥΜΕΝΟΥ
Αφαιρούμε λοιπόν το 2ο clrscr πριν από το gotoxy(x,y); στο τέλος της επανάληψης. (Προσοχή το 1ο clrscr πριν την επανάληψη το θέλουμε). Μεταγλωττίστε και εκτελεστε. Τι παρατηρείτε;
Ο προηγούμενος χαρακτήρας pacman μένει και είναι σαν να ζωγραφίζουμε! Ωραίο, αλλά δεν θέλουμε αυτό..
Ακριβώς πριν ξεκινήσει η
case θα εισάγουμε τις παρακάτω εντολές
gotoxy(x,y);
writeln(' ');
ΟΡΓΑΝΩΣΗ - ΔΙΑΔΙΚΑΣΙΑ writexy
Μετά το τέλος του
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
Πάνω από το
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<x then
xf:=xf+1
Αλλιώς (else) εάν το
xf είναι μεγαλύτερο του x σημαίνει ότι το φάντασμα είναι δεξιά μας και θα προσπαθήσει να κινηθεί αριστερά
μειώνοντας το xf κατά 1. Οπότε προσθέτουμε κώδικα και συνολικά θα γίνει
if xf<x then
xf:=xf+1
else
if xf>x 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
el/school/lessons/programmatismos/pascal/game/stage3.txt · Last modified: Y/m/d H:i by vagk