Εργαστηριακή Άσκηση – Greenfoot & Java

ESCAPE LAB – Απόδραση από το μυστικό εργαστήριο!

Μάθημα: Ειδικά Θέματα Προγραμματισμού – Γ΄ ΕΠΑΛ
Διάρκεια: 2 διδακτικές ώρες (90 λεπτά)
Επίπεδο: Αρχάριοι – Μέτριο

Ονοματεπώνυμο: ........................................
Τμήμα: ....................

Η ιστορία

Βρίσκεσαι παγιδευμένος σε ένα μυστικό εργαστήριο!

Η έξοδος είναι κλειδωμένη. Για να αποδράσεις, πρέπει πρώτα να βρεις την κάρτα πρόσβασης.

Η αποστολή σου:

  1. Να κινήσεις τον χαρακτήρα με τα βελάκια.

  2. Να βρεις τη μυστική κάρτα.

  3. Να φτάσεις στην πόρτα.

  4. Να ξεκλειδώσεις την έξοδο και να αποδράσεις!

Προσοχή: Αν φτάσεις στην πόρτα χωρίς την κάρτα, δεν μπορείς να φύγεις!


1η διδακτική ώρα – Κατασκευάζουμε το εργαστήριο

Αποστολή 1 – Δημιουργούμε τον κόσμο (10΄)

Βήμα 1

Ανοίξτε το Greenfoot και επιλέξτε Scenario → New Java Scenario.

Ονομάστε το σενάριο:

EscapeLab

Γιατί;

Δημιουργούμε ένα καινούργιο έργο, μέσα στο οποίο θα βρίσκονται όλες οι κλάσεις του παιχνιδιού.

Βήμα 2

Ανοίξτε την κλάση MyWorld.

Χρησιμοποιήστε τον παρακάτω κώδικα:

import greenfoot.*;

public class MyWorld extends World
{
    public MyWorld()
    {
        super(600, 400, 1);
    }
}

Τι σημαίνει;

Η MyWorld δημιουργεί τον κόσμο του παιχνιδιού.

Η εντολή super(600, 400, 1) ορίζει πλάτος 600 pixels και ύψος 400 pixels.

Μικρή πρόκληση

Αλλάξτε το φόντο του κόσμου ώστε να θυμίζει εργαστήριο.

Μπορείτε να χρησιμοποιήσετε μια εικόνα από τη συλλογή του Greenfoot ή μια δική σας.


Αποστολή 2 – Δημιουργούμε τον παίκτη (10΄)

Βήμα 1

Κάντε δεξί κλικ στην κλάση Actor.

Επιλέξτε New subclass.

Ονομάστε την:

Player

Επιλέξτε μια μικρή εικόνα ανθρώπου ή ρομπότ.

Γιατί;

Η Player είναι η κλάση που περιγράφει τον χαρακτήρα τον οποίο θα ελέγχουμε.

Βήμα 2

Ανοίξτε την Player και χρησιμοποιήστε:

import greenfoot.*;

public class Player extends Actor
{
    public void act()
    {

    }
}

Τι σημαίνει;

Η act() είναι η μέθοδος που εκτελείται επαναλαμβανόμενα όσο τρέχει το παιχνίδι.

Βήμα 3

Ανοίξτε την MyWorld και προσθέστε κάτω από την super(...):

addObject(new Player(), 80, 200);

Τι κάνει;

Δημιουργεί έναν παίκτη και τον τοποθετεί κοντά στην αριστερή πλευρά του κόσμου.

Πατήστε Compile.


Αποστολή 3 – Κινούμαστε μέσα στο εργαστήριο (15΄)

Θέλουμε ο παίκτης να κινείται προς τέσσερις κατευθύνσεις.

Στην 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 και στις τέσσερις κινήσεις.

Τι άλλαξε;

............................................................


Αποστολή 4 – Η μυστική κάρτα πρόσβασης (10΄)

Βήμα 1

Δημιουργήστε μια νέα υποκλάση της Actor με όνομα:

KeyCard

Επιλέξτε μια μικρή εικόνα κάρτας ή κλειδιού.

Η κλάση θα περιλαμβάνει:

import greenfoot.*;

public class KeyCard extends Actor
{
    public void act()
    {

    }
}

Γιατί είναι άδεια η act();

Η κάρτα δεν χρειάζεται να κινείται. Θα παραμένει στη θέση της μέχρι να τη συλλέξει ο παίκτης.

Βήμα 2

Στην MyWorld, προσθέστε:

addObject(new KeyCard(), 300, 100);

Τι κάναμε;

Τοποθετήσαμε την κάρτα στο σημείο (300, 100).

Μικρή πρόκληση

Αλλάξτε τη θέση της κάρτας για να γίνει πιο δύσκολο να τη βρει ο παίκτης.


2η διδακτική ώρα – Ξεκλειδώνουμε την έξοδο

Αποστολή 5 – Συλλέγουμε την κάρτα (15΄)

Θέλουμε ο παίκτης να μπορεί να συλλέγει την κάρτα όταν την αγγίζει.

Βήμα 1

Στην αρχή της κλάσης Player, πριν από την act(), προσθέστε:

private boolean hasKey = false;

Τι σημαίνει;

Η hasKey είναι μια μεταβλητή που θυμάται αν ο παίκτης έχει την κάρτα.

Η boolean μπορεί να έχει μόνο δύο τιμές:

Αρχικά ο παίκτης δεν έχει την κάρτα.

Βήμα 2

Κάτω από την 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() εμφανίζει μήνυμα στην οθόνη.

Βήμα 3

Στο τέλος της act(), πριν από το κλείσιμό της, προσθέστε:

collectKey();

Γιατί;

Έτσι ζητάμε από το πρόγραμμα να ελέγχει συνεχώς αν ο παίκτης αγγίζει την κάρτα.

Δοκιμή

Πατήστε Compile → Run και οδηγήστε τον παίκτη στην κάρτα.

Τι συνέβη;

............................................................


Αποστολή 6 – Δημιουργούμε την πόρτα (10΄)

Βήμα 1

Δημιουργήστε νέα υποκλάση της Actor με όνομα:

Door

Επιλέξτε μια εικόνα πόρτας.

Ο κώδικας θα είναι:

import greenfoot.*;

public class Door extends Actor
{
    public void act()
    {

    }
}

Τι κάναμε;

Δημιουργήσαμε ένα νέο είδος αντικειμένου, την πόρτα.

Βήμα 2

Στην MyWorld, προσθέστε:

addObject(new Door(), 530, 200);

Η πόρτα θα εμφανιστεί κοντά στη δεξιά πλευρά του κόσμου.

Μικρή πρόκληση

Τοποθετήστε την πόρτα σε διαφορετικό σημείο του εργαστηρίου.


Αποστολή 7 – Η πόρτα ελέγχει την κάρτα! (15΄)

Αυτή είναι η σημαντικότερη αποστολή.

Θέλουμε:

ΑΝ ο παίκτης αγγίζει την πόρτα ΚΑΙ έχει την κάρτα → ΚΕΡΔΙΣΕ!

ΑΝ αγγίζει την πόρτα αλλά δεν έχει την κάρτα → η πόρτα παραμένει κλειδωμένη.

Βήμα 1

Στην κλάση 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()

Σταματά το παιχνίδι όταν ο παίκτης κερδίσει.

Βήμα 2

Στο τέλος της act(), μετά την collectKey();, προσθέστε:

checkDoor();

Γιατί;

Με αυτή την εντολή το πρόγραμμα ελέγχει αν ο παίκτης αγγίζει την πόρτα.

Δοκιμή 1

Πατήστε Compile → Run.

Πηγαίνετε πρώτα στην πόρτα, χωρίς να πάρετε την κάρτα.

Τι εμφανίζεται;

............................................................

Δοκιμή 2

Πατήστε Reset.

Αυτή τη φορά συλλέξτε πρώτα την κάρτα και μετά πηγαίνετε στην πόρτα.

Τι συνέβη;

............................................................


Αποστολή 8 – Κάνουμε το παιχνίδι δικό μας! (5΄)

Τώρα το παιχνίδι λειτουργεί!

Επιλέξτε δύο από τις παρακάτω αλλαγές:

Πρώτη αλλαγή:

............................................................

Δεύτερη αλλαγή:

............................................................


Τελική πρόκληση – Μπορείς να βελτιώσεις το παιχνίδι;

Σκεφτείτε πώς θα μπορούσε να γίνει δυσκολότερο.

Για παράδειγμα:

Να χρειάζεται ο παίκτης δύο διαφορετικές κάρτες για να ανοίξει την πόρτα.

Δεν χρειάζεται να γράψετε ακόμη όλο τον κώδικα.

Συζητήστε με τον διπλανό σας:

  1. Ποια νέα κλάση θα δημιουργούσατε;

  2. Ποια νέα μεταβλητή θα χρειαζόσασταν;

  3. Τι θα έπρεπε να ελέγχει η πόρτα;

Οι ιδέες μας:

............................................................

............................................................


Ερωτήσεις κατανόησης

1. Τι κάνει η μέθοδος act();

............................................................

2. Τι είναι η μεταβλητή hasKey;

............................................................

3. Τι σημαίνει hasKey = true;

............................................................

4. Τι κάνει η μέθοδος isTouching();

............................................................

5. Γιατί χρησιμοποιήσαμε την else;

............................................................

6. Τι θα συνέβαινε αν αφαιρούσαμε τον έλεγχο if (hasKey == true);

............................................................


Συγχαρητήρια!