Μάθημα: Ειδικά Θέματα Προγραμματισμού – Γ΄ ΕΠΑΛ
Διάρκεια: 2 διδακτικές ώρες (90 λεπτά)
Επίπεδο: Αρχάριοι – Μέτριο
Ονοματεπώνυμο: ........................................
Τμήμα: ....................
Βρίσκεσαι παγιδευμένος σε ένα μυστικό εργαστήριο!
Η έξοδος είναι κλειδωμένη. Για να αποδράσεις, πρέπει πρώτα να βρεις την κάρτα πρόσβασης.
Η αποστολή σου:
Να κινήσεις τον χαρακτήρα με τα βελάκια.
Να βρεις τη μυστική κάρτα.
Να φτάσεις στην πόρτα.
Να ξεκλειδώσεις την έξοδο και να αποδράσεις!
Προσοχή: Αν φτάσεις στην πόρτα χωρίς την κάρτα, δεν μπορείς να φύγεις!
Ανοίξτε το Greenfoot και επιλέξτε Scenario → New Java Scenario.
Ονομάστε το σενάριο:
EscapeLab
Γιατί;
Δημιουργούμε ένα καινούργιο έργο, μέσα στο οποίο θα βρίσκονται όλες οι κλάσεις του παιχνιδιού.
Ανοίξτε την κλάση MyWorld.
Χρησιμοποιήστε τον παρακάτω κώδικα:
import greenfoot.*;
public class MyWorld extends World
{
public MyWorld()
{
super(600, 400, 1);
}
}
Τι σημαίνει;
Η MyWorld δημιουργεί τον κόσμο του παιχνιδιού.
Η εντολή super(600, 400, 1) ορίζει πλάτος 600 pixels και ύψος 400 pixels.
Αλλάξτε το φόντο του κόσμου ώστε να θυμίζει εργαστήριο.
Μπορείτε να χρησιμοποιήσετε μια εικόνα από τη συλλογή του Greenfoot ή μια δική σας.
Κάντε δεξί κλικ στην κλάση Actor.
Επιλέξτε New subclass.
Ονομάστε την:
Player
Επιλέξτε μια μικρή εικόνα ανθρώπου ή ρομπότ.
Γιατί;
Η Player είναι η κλάση που περιγράφει τον χαρακτήρα τον οποίο θα ελέγχουμε.
Ανοίξτε την Player και χρησιμοποιήστε:
import greenfoot.*;
public class Player extends Actor
{
public void act()
{
}
}
Τι σημαίνει;
Η act() είναι η μέθοδος που εκτελείται επαναλαμβανόμενα όσο τρέχει το παιχνίδι.
Ανοίξτε την MyWorld και προσθέστε κάτω από την super(...):
addObject(new Player(), 80, 200);
Τι κάνει;
Δημιουργεί έναν παίκτη και τον τοποθετεί κοντά στην αριστερή πλευρά του κόσμου.
Πατήστε Compile.
Θέλουμε ο παίκτης να κινείται προς τέσσερις κατευθύνσεις.
Στην Player, αντικαταστήστε την act() με:
public void act()
{
if (Greenfoot.isKeyDown("right"))
{
setLocation(getX() + 3, getY());
}
if (Greenfoot.isKeyDown("left"))
{
setLocation(getX() - 3, getY());
}
if (Greenfoot.isKeyDown("up"))
{
setLocation(getX(), getY() - 3);
}
if (Greenfoot.isKeyDown("down"))
{
setLocation(getX(), getY() + 3);
}
}
Greenfoot.isKeyDown("right")
Ελέγχει αν πατάμε το δεξί βελάκι.
getX() και getY()
Μας δίνουν την τωρινή θέση του παίκτη.
setLocation(x, y)
Μετακινεί τον παίκτη σε μια νέα θέση.
Για παράδειγμα:
setLocation(getX() + 3, getY());
σημαίνει:
«Μετακίνησε τον παίκτη 3 pixels προς τα δεξιά».
Πατήστε Compile → Run.
Δοκιμάστε όλα τα βελάκια.
Αλλάξτε τον αριθμό 3 σε 6 και στις τέσσερις κινήσεις.
Τι άλλαξε;
............................................................
Δημιουργήστε μια νέα υποκλάση της Actor με όνομα:
KeyCard
Επιλέξτε μια μικρή εικόνα κάρτας ή κλειδιού.
Η κλάση θα περιλαμβάνει:
import greenfoot.*;
public class KeyCard extends Actor
{
public void act()
{
}
}
Γιατί είναι άδεια η act();
Η κάρτα δεν χρειάζεται να κινείται. Θα παραμένει στη θέση της μέχρι να τη συλλέξει ο παίκτης.
Στην MyWorld, προσθέστε:
addObject(new KeyCard(), 300, 100);
Τι κάναμε;
Τοποθετήσαμε την κάρτα στο σημείο (300, 100).
Αλλάξτε τη θέση της κάρτας για να γίνει πιο δύσκολο να τη βρει ο παίκτης.
Θέλουμε ο παίκτης να μπορεί να συλλέγει την κάρτα όταν την αγγίζει.
Στην αρχή της κλάσης Player, πριν από την act(), προσθέστε:
private boolean hasKey = false;
Τι σημαίνει;
Η hasKey είναι μια μεταβλητή που θυμάται αν ο παίκτης έχει την κάρτα.
Η boolean μπορεί να έχει μόνο δύο τιμές:
true: ΝΑΙ, έχει την κάρτα.
false: ΟΧΙ, δεν έχει την κάρτα.
Αρχικά ο παίκτης δεν έχει την κάρτα.
Κάτω από την act(), αλλά μέσα στην κλάση Player, προσθέστε:
public void collectKey()
{
if (isTouching(KeyCard.class))
{
removeTouching(KeyCard.class);
hasKey = true;
getWorld().showText(
"ΒΡΗΚΕΣ ΤΗΝ ΚΑΡΤΑ!", 300, 30
);
}
}
Τι κάνει ο κώδικας;
Η isTouching(KeyCard.class) ελέγχει αν ο παίκτης αγγίζει την κάρτα.
Η removeTouching(KeyCard.class) αφαιρεί την κάρτα από τον κόσμο.
Η hasKey = true αποθηκεύει ότι ο παίκτης έχει πλέον την κάρτα.
Η showText() εμφανίζει μήνυμα στην οθόνη.
Στο τέλος της act(), πριν από το κλείσιμό της, προσθέστε:
collectKey();
Γιατί;
Έτσι ζητάμε από το πρόγραμμα να ελέγχει συνεχώς αν ο παίκτης αγγίζει την κάρτα.
Πατήστε Compile → Run και οδηγήστε τον παίκτη στην κάρτα.
Τι συνέβη;
............................................................
Δημιουργήστε νέα υποκλάση της Actor με όνομα:
Door
Επιλέξτε μια εικόνα πόρτας.
Ο κώδικας θα είναι:
import greenfoot.*;
public class Door extends Actor
{
public void act()
{
}
}
Τι κάναμε;
Δημιουργήσαμε ένα νέο είδος αντικειμένου, την πόρτα.
Στην MyWorld, προσθέστε:
addObject(new Door(), 530, 200);
Η πόρτα θα εμφανιστεί κοντά στη δεξιά πλευρά του κόσμου.
Τοποθετήστε την πόρτα σε διαφορετικό σημείο του εργαστηρίου.
Αυτή είναι η σημαντικότερη αποστολή.
Θέλουμε:
ΑΝ ο παίκτης αγγίζει την πόρτα ΚΑΙ έχει την κάρτα → ΚΕΡΔΙΣΕ!
ΑΝ αγγίζει την πόρτα αλλά δεν έχει την κάρτα → η πόρτα παραμένει κλειδωμένη.
Στην κλάση Player, προσθέστε κάτω από τη μέθοδο collectKey():
public void checkDoor()
{
if (isTouching(Door.class))
{
if (hasKey == true)
{
getWorld().showText(
"ΑΠΕΔΡΑΣΕΣ!", 300, 200
);
Greenfoot.stop();
}
else
{
getWorld().showText(
"ΧΡΕΙΑΖΕΣΑΙ ΚΑΡΤΑ!", 300, 30
);
}
}
}
isTouching(Door.class)
Ελέγχει αν ο παίκτης βρίσκεται σε επαφή με την πόρτα.
if (hasKey == true)
Ελέγχει αν ο παίκτης έχει συλλέξει την κάρτα.
else
Σημαίνει «διαφορετικά».
Άρα, αν ο παίκτης δεν έχει την κάρτα, εμφανίζεται το μήνυμα ότι χρειάζεται κάρτα.
Greenfoot.stop()
Σταματά το παιχνίδι όταν ο παίκτης κερδίσει.
Στο τέλος της act(), μετά την collectKey();, προσθέστε:
checkDoor();
Γιατί;
Με αυτή την εντολή το πρόγραμμα ελέγχει αν ο παίκτης αγγίζει την πόρτα.
Πατήστε Compile → Run.
Πηγαίνετε πρώτα στην πόρτα, χωρίς να πάρετε την κάρτα.
Τι εμφανίζεται;
............................................................
Πατήστε Reset.
Αυτή τη φορά συλλέξτε πρώτα την κάρτα και μετά πηγαίνετε στην πόρτα.
Τι συνέβη;
............................................................
Τώρα το παιχνίδι λειτουργεί!
Επιλέξτε δύο από τις παρακάτω αλλαγές:
Αλλάξτε την εικόνα του παίκτη.
Αλλάξτε το φόντο του εργαστηρίου.
Μετακινήστε την κάρτα.
Μετακινήστε την πόρτα.
Αλλάξτε την ταχύτητα του παίκτη.
Αλλάξτε τα μηνύματα του παιχνιδιού.
Πρώτη αλλαγή:
............................................................
Δεύτερη αλλαγή:
............................................................
Σκεφτείτε πώς θα μπορούσε να γίνει δυσκολότερο.
Για παράδειγμα:
Να χρειάζεται ο παίκτης δύο διαφορετικές κάρτες για να ανοίξει την πόρτα.
Δεν χρειάζεται να γράψετε ακόμη όλο τον κώδικα.
Συζητήστε με τον διπλανό σας:
Ποια νέα κλάση θα δημιουργούσατε;
Ποια νέα μεταβλητή θα χρειαζόσασταν;
Τι θα έπρεπε να ελέγχει η πόρτα;
Οι ιδέες μας:
............................................................
............................................................
1. Τι κάνει η μέθοδος act();
............................................................
2. Τι είναι η μεταβλητή hasKey;
............................................................
3. Τι σημαίνει hasKey = true;
............................................................
4. Τι κάνει η μέθοδος isTouching();
............................................................
5. Γιατί χρησιμοποιήσαμε την else;
............................................................
6. Τι θα συνέβαινε αν αφαιρούσαμε τον έλεγχο if (hasKey == true);
............................................................