Οδηγίες χρήσης και σύντομη εισαγωγή στην πλατφόρμα Greenfoot Version 1.1 Επιμέλεια Σημειώσεων 1 : Πατρικάκης Χαράλαμπος, Λάζαρος Τουμανίδης, Κόγιας Δημήτριος 1 Οι σημειώσεις βασίζονται στους αντίστοιχους οδηγούς που βρίσκονται στην ιστοσελίδα του Greenfoot, και στην ελληνική μετάφραση αυτών (Mantzas Ioannis, Milolidakis Giannis). Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [1]
Πίνακας περιεχομένων Οδηγός 1: Αλληλεπιδρώντας με το Greenfoot... 3 Η διεπαφή Greenfoot... 3 Εισαγωγή αντικειμένων στον κόσμο... 6 Ενεργοποίηση των αντικειμένων... 7 Εκτέλεση σεναρίου... 9 Άμεση εκτέλεση μεθόδων... 10 Δημιουργία ενός νέου κόσμου... 10 Κλήση μεθόδων του κόσμου... 10 Οδηγός 2: Κίνηση και κλειδιά ελέγχου... 13 Το σενάριο Crabs... 13 Οδηγός 3: Εντοπισμός και αφαίρεση των Actors και δημιουργία μεθόδων... 17 Τρώγοντας σκουλήκια... 17 Refactoring Η αλλιώς ανακατασκευή του κώδικα μας... 20 Οδηγός 4: Αποθήκευση του κόσμου, αναπαραγωγή και καταγραφή ήχου... 22 Αποθήκευση του κόσμου... 22 Αναπαραγωγή και αποθήκευση ήχων... 23 Οδηγός 5: Προσθήκη τυχαία κινούμενου εχθρού... 24 Προσβασιμότητα ενός αντικειμένου από ένα άλλο... 26 Παράρτημα Α: Λήψη, εγκατάσταση και χρήση του Greenfoot... 31 Παράρτημα Β: Χρήσιμοι σύνδεσμοι... 32 Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [2]
Οδηγός 1: Αλληλεπιδρώντας με το Greenfoot Αυτός ο οδηγός εξηγεί τα βασικά στοιχεία της διεπαφής Greenfoot, και πως γίνεται η αλληλεπίδραση με αυτήν. Αλλαγή διεπαφής στα Ελληνικά για παλαιότερες εκδόσεις Για να αλλάξουμε την διεπαφή του Greenfoot στα Ελληνικά ακολουθούμε τα εξής βήματα: 1. Εντοπίζουμε το αρχείο greenfoot.defs. Το αρχείο θα το βρείτε στο: <φάκελος_greenfoot> / lib / greenfoot.defs 2. Αυτό το αρχείο περιέχει παραμέτρους της εφαρμογής στην μορφή: όνομα_παραμέτρου = τιμή 3. Εντοπίζουμε την παράμετρο στο αρχείο που ονομάζεται: bluej.language 4. Σε αυτήν την παράμετρο θέτουμε την γλώσσα στην οποία επιθυμούμε να εμφανίζεται η διεπαφή μας. Για τα Ελληνικά δώστε το εξής: bluej.language = greek 5. Αυτό ήταν όλο. Έχετε κατά νου ότι η αλλαγές που κάναμε θα μεταφράσουν την διεπαφή στα Ελληνικά αλλά όχι και τον κώδικα των σεναρίων που εκτελείται ή τα ονόματα των κλάσεων. Αλλαγή διεπαφής στα Ελληνικά για νεότερες εκδόσεις Για να αλλάξουμε την διεπαφή του Greenfoot στα Ελληνικά σε νεότερες εκδόσεις η διαδικασία έχει απλουστευθεί. 1. Επιλέγουμε από το μενού Edit Preferences. 2. Επιλέγουμε την ταμπέλα Interface και στο Language επιλέγουμε Greek. 3. Επανεκκινούμε το Greenfoot και πλέον η διεπαφή μας είναι στα Ελληνικά. Προσέξτε ότι ισχύει ότι ειπώθηκε παραπάνω πως μόνο η διεπαφή είναι στα Ελληνικά και όχι ο κώδικας των διαφόρων σεναρίων. Η διεπαφή Greenfoot Ο οδηγός αυτός χρησιμοποιεί ένα σενάριο που ονομάζεται wombats το οποίο διανέμεται με το Greenfoot αλλά μπορείτε να το βρείτε και στην πλατφόρμα του μαθήματος και να το κατεβάσετε. Ανοίγουμε το σενάριο wombats στο Greenfoot επιλέγοντας Scenario και Open και κατόπιν διαλέγουμε τη θέση του αρχείου Project για το wombat στον σκληρό μας. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [3]
Επιλέγουμε την τοποθεσία όπου θέλουμε να αποθηκεύσουμε το σενάριο και λαμβάνουμε την παρακάτω οθόνη: Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [4]
Αρχικά διαλέγουμε την επιλογή compile, ώστε να γίνει η μεταγλώττιση του κώδικα και να εμφανιστεί ο νέος κόσμος (world). Η μεγάλη περιοχή με το πλέγμα που καλύπτει την πλειοψηφία του παραθύρου, ονομάζεται The World δηλαδή Ο Κόσμος της εφαρμογής μας. Εφόσον έχουμε ένα σενάριο το οποίο έχει να κάνει με wombats βλέπουμε ένα wombat world. Στην δεξιά μεριά του παραθύρου είναι η οθόνη των κλάσεων. Εδώ μπορούμε να δούμε όλες τις κλάσεις τις java που εμπεριέχονται στο σενάριο (project). Οι κλάσεις world και actor θα είναι πάντα εκεί καθώς έχουν προστεθεί από το σύστημα του Greenfoot. Οι υπόλοιπες κλάσεις ανήκουν στο σενάριο wombat και θα είναι διαφορετικές ανάλογα με το σενάριο που ανοίγουμε ή δημιουργούμε. Κάτω από τον Κόσμο είναι τα εργαλεία εκτέλεσης (Η περιοχή με τα κουμπιά Act, Run Reset και τον ρυθμιστή της ταχύτητας). Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [5]
Ο κόσμος Οι κλάσεις Τα εργαλεία εκτέλεσης Εισαγωγή αντικειμένων στον κόσμο Για την εισαγωγή αντικειμένων στον νέο κόσμο, επιλέγουμε με δεξί κλικ (σε υπολογιστές Mac, όπου υπάρχει δεξί κλικ στον οδηγό αυτόν ο αντίστοιχος συνδυασμός είναι Control-κλικ) την κλάση Wombat από την περιοχή όπου υπάρχουν όλες οι κλάσεις. Το αναδυόμενο μενού είναι το παρακάτω: Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [6]
Επιλέγουμε 'new Wombat()' από το μενού και κάνουμε κλικ οπουδήποτε μέσα στον κόσμο. Μόλις δημιουργήσαμε ένα wombat (σε ορολογία της Java ένα αντικείμενο) και το τοποθετήσαμε στον κόσμο. Τα Wombats τρώνε φύλλα, οπότε ας προσθέσουμε και μερικά φύλλα στον κόσμο. Όπως και πριν, με δεξί κλικ στην κλάση Leaf, επιλέγουμε 'new Leaf()' και το τοποθετούμε στον κόσμο. Αν θέλουμε να τοποθετήσουμε περισσότερα αντικείμενα (της ίδιας κλάσης) μπορούμε έχοντας επιλέξει την κλάση (με αριστερό κλικ πάνω της το μαύρο περίγραμμα γίνεται πιο έντονο) και κρατώντας πατημένο το πλήκτρο Shift με κάθε αριστερό κλικ μέσα στον κόσμο προσθέτουμε και από ένα αντικείμενο. Αν θέλουμε να αφαιρέσουμε ένα αντικείμενο από τον κόσμο, μπορούμε να το κάνουμε με την επιλογή που εμφανίζεται με δεξί κλικ πάνω στο αντικείμενο αυτό. Ενεργοποίηση των αντικειμένων Πατώντας το κουμπί 'Act' από τα εργαλεία εκτέλεσης, κάθε αντικείμενο ενεργοποιείται και κάνει ότι έχει προγραμματιστεί για να κάνει. Στο παράδειγμά μας, τα φύλλα είναι προγραμματισμένα να μην κάνουν τίποτα, ενώ τα wombats είναι προγραμματισμένα να κινούνται με τη φορά που είναι τοποθετημένα. Αν τοποθετήσουμε δύο wombats στον κόσμο και επιλέξουμε Act θα κινηθούν και τα δύο. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [7]
Στα wombats όπως είπαμε αρέσει να τρώνε φύλλα, οπότε αν βρουν κάποιο φύλλο στο δρόμο τους, θα το φάνε. Αν τοποθετήσουμε κάποια φύλλα μπροστά τους, αφού βρεθούν στο ίδιο τετράγωνο, στο επόμενο Act τα φύλλα θα έχουν εξαφανιστεί. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [8]
Εκτέλεση σεναρίου Πατώντας το κουμπί Run, γίνεται εκτέλεση του σεναρίου. Αυτό είναι ισοδύναμο με την διαρκή εκτέλεση της εντολής Act. Παρατηρούμε πως μετά την εκτέλεση του Run το κουμπί αλλάζει σε Pause. Αν το πατήσουμε, οτιδήποτε είναι ενεργό σταματάει. Με τον ρυθμιστή δίπλα από τα κουμπιά εκτέλεσης μπορούμε να καθορίσουμε την ταχύτητα εκτέλεσης του σεναρίου. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [9]
Άμεση εκτέλεση μεθόδων Εάν αντί για εκτέλεση ολόκληρου του σεναρίου, μπορούμε απλά να καλέσουμε μεθόδους. Μία μέθοδος είναι μια μοναδική πράξη που ένα αντικείμενο μπορεί να εκτελέσει. Με δεξί κλικ πάνω σε ένα αντικείμενο (και χωρίς να εκτελείται το σενάριο) μπορούμε να δούμε τις διαθέσιμες μεθόδους που σχετίζονται με αυτό και να επιλέξουμε οποιαδήποτε από αυτές. Μπορούμε να επιλέξουμε μια μέθοδο που θα ζητάει από το αντικείμενο να εκτελέσει μια πράξη, όπως για παράδειγμα να στρίψει αριστερά: turnleft() ή απλά να κινηθεί κατά μία θέση: move(). Κάποιες άλλες μέθοδοι απλά επιστρέφουν μια απάντηση σε ερώτηση που κάνουμε. Η μέθοδος getleaveseaten(), για παράδειγμα, μας επιστρέφει τον αριθμό των φύλλων που το wombat έχει φάει μέχρι στιγμής. Βλέπουμε επίσης πως υπάρχει και η μέθοδος act(). Αυτή είναι η μέθοδος που καλείται κάθε φορά που πατάμε το αντίστοιχο κουμπί. Εδώ έχουμε την επιλογή της κλήσης μόνο για ένα αντικείμενο, αντί για όλα στον κόσμο. Δημιουργία ενός νέου κόσμου Αν έχουμε πολλά αντικείμενα στον κόσμο που δεν τα χρειαζόμαστε και θέλουμε να ξεκινήσουμε από την αρχή, ένας εύκολος τρόπος είναι να καταργήσουμε τον κόσμο αυτό και να δημιουργήσουμε έναν νέο. Αυτό γίνεται με την επιλογή του κουμπιού Reset από τα εργαλεία εκτέλεσης. Ο παλιός κόσμος συμπεριλαμβανομένων των αντικειμένων που υπήρχαν παύει να υπάρχει και δημιουργείται ένας νέος κενός κόσμος. Αξίζει να σημειώσουμε πως μπορούμε να έχουμε μόνο έναν κόσμο ανά σενάριο. Κλήση μεθόδων του κόσμου Όπως είδαμε κάθε αντικείμενο στον κόσμο έχει και κάποιες μεθόδους που μπορούμε να καλέσουμε από το αναδυόμενο μενού που εμφανίζεται με δεξί κλικ σε αυτό. Αντίστοιχα και ο ίδιος ο κόσμος έχει μεθόδους που μπορούμε να καλέσουμε από αναδυόμενο μενού. Με δεξί κλικ σε κάποια κενή περιοχή (κάπου όπου δεν υπάρχει αντικείμενο) ή στην γκρι περιοχή δίπλα από τον κόσμο, μπορούμε να δούμε τις επιλογές που έχουμε. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [10]
Μία από τις επιλογές αυτές είναι η populate(). Με την κλήση της μεθόδου αυτής δημιουργούνται διάφορα φύλλα και wombats και τοποθετούνται στον κόσμο. Μπορούμε στη συνέχεια να εκτελέσουμε το σενάριο. Μία άλλη μέθοδος είναι η 'randomleaves(int howmany)'. Με τη μέθοδο αυτή τοποθετούνται ορισμένα φύλλα σε τυχαίες θέσεις στον κόσμο. Παρατηρούμε πως μετά το όνομα της μεθόδου και μέσα στις παρενθέσεις έχουμε την παράμετρο int howmany, που σημαίνει πως πρέπει να συμπεριλάβουμε κάποια επιπλέον πληροφορία με την κλήση της μεθόδου αυτής. Ο όρος int δηλώνει πως ένας ακέραιος αριθμός πρέπει να δηλωθεί και ο όρος howmany μας προτρέπει να δηλώσουμε τον αριθμό των φύλλων που θέλουμε να δημιουργηθούν και τοποθετηθούν. Υπάρχει περίπτωση, αν μετρήσουμε τα φύλλα που βλέπουμε στον κόσμο μετά την κλήση της μεθόδου αυτής, να δούμε πως υπάρχουν λιγότερα από αυτά που θέσαμε. Κάτι τέτοιο μπορεί να συμβεί σε περίπτωση που κάποια φύλλα τοποθετούνται στην ίδια θέση, οπότε δεν μπορούμε τα ξεχωρίσουμε. Αφού εξοικειωθούμε με το περιβάλλον του Greenfoot μπορούμε να προχωρήσουμε στο μέρος του προγραμματισμού. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [11]
Aξίζει να παραθέσουμε μια σύντομη σημείωση σχετικά με τα σύμβολα οριοθέτησης (στην wikipedia υπάρχει ένα αρκετά περιεκτικό άρθρο).υπάρχουν τρία είδη συμβόλων οριοθέτησης στην Java: Οι στρογγυλές παρενθέσεις στην Java, χρησιμοποιούνται σε μαθηματικές εκφράσεις, και για να περιβάλλουν τις παραμέτρους στις κλήσεις μεθόδων. Οι αγκύλες στην Java χρησιμοποιούνται για τα διανύσματα. Τα άγκιστρα στην Java χρησιμοποιούνται για να πλαισιώσουν μπλοκ κώδικα, όπως οι μέθοδοι ή τα περιεχόμενα μιας κλάσης. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [12]
Οδηγός 2: Κίνηση και κλειδιά ελέγχου Στον οδηγό αυτό, θα δούμε πώς μπορούμε να έχουμε κίνηση στο Greenfoot, καθώς και το πώς μπορούμε να την ελέγξουμε με το πληκτρολόγιο. Το σενάριο Crabs Κατεβάζουμε το modern-crab.zip αρχείο και το αποσυμπιέζουμε κάπου στον υπολογιστή μας. Στη συνέχεια ανοίγουμε το σενάριο στην τοποθεσία αυτή πατώντας πάνω στο αρχείο project (αυτό με το εικονίδιο του Greenfoot), το μεταγλωττίζουμε (compile) και βλέπουμε έναν άδειο κόσμο. Με δεξί κλικ στην κλάση crab επιλέγουμε new Crab() και τοποθετούμε με αριστερό κλικ το νέο καβούρι οπουδήποτε στον κόσμο. Στη συνέχεια επιλέγουμε την εκτέλεση του σεναρίου(run) και παρατηρούμε πως δεν έχουμε καμία κίνηση. Για να δούμε τι ακριβώς θα έπρεπε να κάνει το καβούρι, με δεξί κλικ στην κλάση Crab επιλέγουμε Open editor και βλέπουμε τον κώδικα Java για το αντικείμενο Crab. Όπως βλέπουμε στα άγκιστρα κάτω από την γραμμή public void act() δεν υπάρχει τίποτα. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [13]
Αν θέλουμε να προσθέσουμε κίνηση στο αντικείμενό μας πρέπει να προσθέσουμε τη εντολή move: Χρειάζεται προσοχή έτσι ώστε να γράψουμε ακριβώς ότι βλέπουμε στην εικόνα, δηλαδή την εντολή move ακολουθούμενη από παρενθέσεις που περιέχουν τον αριθμό 4 ακολουθούμενες από το ελληνικό ερωτηματικό (;). Συνήθη λάθη είναι η χρήση κεφαλαίου M στο move (στη Java τα κεφαλαία και τα μικρά γράμματα παίζουν ρόλο), η έλλειψη του ελληνικού ερωτηματικού, η χρήση λάθος συμβόλων οριοθέτησης (παρένθεση) ή η από λάθος αφαίρεση των αγκίστρων {} πριν και μετά τον κώδικα. Αν λάβετε κάποιο μήνυμα σφάλματος κατά τη διάρκεια του οδηγού αυτού, ελέγξτε αν έχετε κάνει κάποιο από αυτά τα λάθη. Αφού γράψουμε τον κώδικα, πατάμε το κουμπί Compile στην κεντρική διεπαφή του Greenfoot (ή επάνω αριστερά στο παράθυρο του επεξεργαστή του κώδικα μας), τοποθετούμε ένα καβούρι (new Crab()) και επιλέγουμε την εκτέλεση του σεναρίου (Run). Αυτή τη φορά το καβούρι κινείται κατά μήκος του πλαισίου του κόσμου, έως ότου φτάσει στο τέλος του πλαισίου και σταματήσει. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [14]
Στην πραγματικότητα το καβούρι δεν σταματάει, προσπαθεί να συνεχίσει να κινείται αλλά το Greenfoot δεν το αφήνει να βγει έξω από τον κόσμο. Μπορούμε επίσης να αλλάξουμε την τιμή 4 στον κώδικα που γράψαμε προηγουμένως με κάποια άλλη, ώστε να διαμορφώσουμε την ταχύτητα κίνησης. Μεγαλύτερη τιμή θα δώσει μεγαλύτερη ταχύτητα ενώ μικρότερη τιμή, μικρότερη ταχύτητα. Μπορούμε επίσης να δώσουμε και αρνητική τιμή (τι θα αλλάξει στην κίνηση σε αυτή την περίπτωση;). Αν θέλουμε το καβούρι να μην κινείται μόνο σε μια ευθεία, μπορούμε να προσθέσουμε και την εντολή turn(n), ώστε να στρίβει κατά κάποιες μοίρες. Σε αυτή την περίπτωση βλέπουμε πως το καβούρι τώρα ακολουθεί μια κυκλική τροχιά και ακόμα κι αν βρεθεί σε κάποιο από τα όρια του κόσμου, κάποια στιγμή θα στρίψει και θα επιστρέψει εντός των ορίων. Μπορούμε με αλλαγή της παραμέτρου της στροφής να αλλάξουμε την ακτίνα του κύκλου σε μεγαλύτερη ή μικρότερη (Αν αλλάξουμε και την παράμετρο της μετακίνησης, τι αλλάζει στην τροχιά της κίνησης και γιατί;). Ας προσθέσουμε στον κώδικά μας λίγη διαδραστικότητα. Μπορούμε να πούμε στο καβούρι να στρίβει μόνο αν πιέσουμε το πλήκτρο ή του πληκτρολογίου. Χρησιμοποιούμε προκαθορισμένες μεθόδους του Greenfoot για να ελέγχουμε εάν ένα πλήκτρο είναι πατημένο. Ανάμεσα στα εισαγωγικά είναι το όνομα του πλήκτρου, "left" είναι το πλήκτρο με το αριστερό βελάκι, "right" είναι το πλήκτρο με το δεξί. Εάν θέλουμε κάτι σαν "a" ή "d", απλά Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [15]
χρησιμοποιούμε αυτά τα γράμματα αντί για right και left στον παραπάνω κώδικα. O κώδικας μας λέει: αν τα πλήκτρα είναι πατημένα, στρίψε κατά ένα συγκεκριμένο αριθμό. Αν βάλουμε πολλά καβούρια στον κόσμο, θα δούμε ότι πατώντας τα πλήκτρα ελέγχου όλα μαζί ταυτόχρονα με σωστό συγχρονισμό, θα υπάρξει υπερφόρτωση: όλα τα καβούρια εκτελούν τον ίδιο κώδικα, έτσι ώστε αν πατήσουμε το αριστερό πλήκτρο, όλα τους θα δουν ότι το αριστερό πλήκτρο είναι πατημένο, και όλα θα κινηθούν αναλόγως. Τι θα συμβεί αν κρατήσουμε πατημένο και το αριστερό και το δεξί την ίδια στιγμή; Δοκιμάστε το και ανακαλύψτε - στη συνέχεια εξετάστε τον κώδικα και δείτε αν μπορείτε να ανακαλύψετε το λόγο που συμβαίνει αυτό. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [16]
Οδηγός 3: Εντοπισμός και αφαίρεση των Actors και δημιουργία μεθόδων Στον οδηγό αυτό, θα εξετάσουμε πώς μπορούμε να διαπιστώσουμε ότι δύο αντικείμενα του κόσμου έχουν έρθει σε επαφή και κατά συνέπεια να αφαιρέσουμε το ένα από αυτά. Επίσης θα δούμε πώς να βελτιώσουμε τον κώδικά μας χρησιμοποιώντας μεθόδους. Τρώγοντας σκουλήκια Συνεχίζοντας από προηγούμενο μέρος, όπου είχαμε τα καβούρια να κινούνται στο εσωτερικό του κόσμου μας, κάτω από τον έλεγχό μας. Θα προσθέσουμε τώρα και μερικά σκουλήκια για να τρώνε τα καβούρια. Το σκουλήκι θα είναι κι αυτό ένας Actor, οπότε για να φτιάξουμε την νέα κλάση worm με δεξί κλικ στην κλάση Actor, επιλέγουμε New subclass. Εισάγουμε το όνομα της νέας κλάσης Worm σημειώστε πως χρησιμοποιούμε το κεφαλαίο γράμμα W. Πρόκειται για μια σύμβαση στην Java να χρησιμοποιούμε κεφαλαία για το πρώτο γράμμα του ονόματος μιας κλάσης. Για εικόνα επιλέγουμε το αρχείο worm.png και πατάμε ok. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [17]
Η νέα μας κλάση δεν θα έχει καθόλου κώδικα να τρέξει, όπως και η κλάση crab όταν ξεκινήσαμε. Θα την αφήσουμε ως έχει, αφού δεν χρειαζόμαστε να κάνουν κάτι τα αντικείμενα της κλάσης αυτής. Αυτό που θα διαμορφώσουμε είναι η κλάση crab, ώστε κάθε φορά που κάποιο καβούρι περάσει πάνω από ένα σκουλήκι, να το τρώει. Ανοίγουμε λοιπόν το αρχείο της κλάσης crab που μέχρι στιγμής είναι όπως παρακάτω: Στο τέλος της μεθόδου act(), θα πρέπει να δημιουργήσουμε ένα αντικείμενο της κλάσης Worm και να προσθέσουμε, κατόπιν, μια εντολή που θα ελέγχει αν ένα καβούρι ακουμπάει το σκουλήκι που δημιουργήσαμε. Θα χρησιμοποιήσουμε την μέθοδο getoneobjectatoffset. Η μέθοδος αυτή δέχεται τρεις παραμέτρους. Οι δύο πρώτες εκφράζουν την οριζόντια (Χ) και κάθετη (Υ) απόκλιση (απόσταση) από την τρέχουσα θέση του αντικειμένου μας. Θέλουμε να ξέρουμε τι βρίσκεται στην ίδια θέση με εμάς οπότε θα θέσουμε στις παραμέτρους αυτές την τιμή 0 (καμία απόσταση). Η τρίτη παράμετρος μας επιτρέπει να δηλώσουμε ποια κλάση μας ενδιαφέρει για την σύγκριση. Θα χρησιμοποιήσουμε την κλάση worm για την ενέργεια αυτή μιας και μας ενδιαφέρει να μελετήσουμε αν το καβούρι (αντικείμενο) ακουμπάει κάποιο σκουλήκι (worm). Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [18]
Πρέπει να σημειώσουμε πως δεν καλούμε απλά την μέθοδο, αλλά αποθηκεύουμε και το αποτέλεσμα της κλήσης της στην αριστερή πλευρά της εντολής (worm). Η μέθοδος αυτή επιστρέφει το αντικείμενο (worm στην περίπτωση μας) που βρίσκεται στην απόσταση που έχουμε εισάγει, αν αυτό υπάρχει. Οπότε στην μεταβλητή worm, που δηλώσαμε στην προηγούμενη γραμμή, θα εκχωρηθεί το αποτέλεσμα της μεθόδου. Αναλόγως την τιμή της μεταβλητής μας, μπορούμε να εξετάσουμε αν όντως υπάρχει κάποιο αντικείμενο στην ίδια θέση με εμάς. Αν δεν υπάρχει, η μεταβλητή μας θα έχει την ειδική τιμή null, οπότε μπορούμε να αφαιρέσουμε το σκουλήκι, μόνο εάν η μεταβλητή είναι διαφορετική από null, συνεπώς και θα πρέπει να γίνει ο αντίστοιχος έλεγχος. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [19]
Ο τελεστής!= είναι ο τελεστής διάφορο από στην Java. Αυτό σημαίνει πως ο κώδικας θα εκτελεστεί μόνο αν η μεταβλητή worm δεν έχει την τιμή null. Ο κώδικας που εισάγαμε μέσα στον έλεγχο δουλεύει ως εξής: Πρώτα ορίζουμε μια μεταβλητή (με το όνομα world) ώστε να μπορέσουμε να αλληλεπιδράσουμε με τον κόσμο μας και να του ζητήσουμε, στη συνέχεια, να αφαιρέσει ένα αντικείμενο (δηλαδή το worm). Έπειτα, αρχικοποιούμε αυτήν την μεταβλητή με τον συγκεκριμένο κόσμο που έχουμε δημιουργήσει με τη βοήθεια της εντολής getworld(). Τέλος, αφαιρούμε το σκουλήκι από τον κόσμο με την μέθοδο removeobject(). Refactoring Η αλλιώς ανακατασκευή του κώδικα μας Πριν συνεχίσουμε θα πρέπει να κάνουμε μια αλλαγή στον κώδικα. Αυτό είναι κάτι που είναι γνωστό ως refactoring: δηλαδή πρόκειται για αλλαγή στον κώδικα χωρίς να αλλάξει, όμως, η συμπεριφορά του. Στη μορφή που βρίσκεται τώρα, η μέθοδος act() για το Καβούρι έχει δύο διαφορετικές συμπεριφορές μέσα της: οι μισές συμπεριφορές έχουν να κάνουν με την κίνηση μέσα στον κόσμο, και οι άλλες μισές έχουν να κάνουν με το φάγωμα των σκουληκιών. Θα ήταν πιο ευδιάκριτο αν τις ονομάζαμε και τις χωρίζαμε, για να αποφύγουμε πιθανή σύγχυση στο μέλλον. Αυτό μπορούμε να το καταφέρουμε με τη δημιουργία διαφορετικών μεθόδων για κάθε συμπεριφορά. Στην πραγματικότητα έχουμε ήδη δει πώς γράφονται οι μέθοδοι: η act() είναι και αυτή μια μέθοδος. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [20]
Και οι δύο νέες μέθοδοι δεν απαιτούν παραμέτρους και δεν επιστρέφουν καμία τιμή, άρα μπορούν να δηλώνονται ακριβώς με τον ίδιο τρόπο όπως και η act() ; Ο διαμορφωμένος κώδικάς μας φαίνεται παρακάτω: Αν συγκρίνουμε τις δύο εκδόσεις θα δούμε πως δεν έχουμε αλλάξει ή αφαιρέσει καθόλου από τον υπάρχοντα κώδικα. Μεταφέραμε το πρώτο μισό σε μια νέα μέθοδο moveandturn(), και το δεύτερο μισό σε μια άλλη eat(). Στη συνέχεια αντικαταστήσαμε το περιεχόμενο της μεθόδου act() με κλήσεις των δύο νέων αυτών μεθόδων έτσι ώστε να διατηρηθεί η ίδια συμπεριφορά στο πρόγραμμα μας. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [21]
Οδηγός 4: Αποθήκευση του κόσμου, αναπαραγωγή και καταγραφή ήχου Στον οδηγό αυτό θα δούμε πώς μπορούμε να αρχικοποιήσουμε τον κόσμο μας με αντικείμενα χωρίς να χρειάζεται να τα τοποθετήσουμε εμείς, καθώς και πώς μπορούμε να αναπαράγουμε και αποθηκεύσουμε ήχους. Αποθήκευση του κόσμου Μέχρι τώρα, κάθε φορά που μεταγλωττίζουμε τον κώδικα, πρέπει στη συνέχεια να προσθέσουμε μόνοι μας τα αντικείμενα που θέλουμε μέσα στον κόσμο. Με την προσθήκη, όμως, λίγο ακόμα κώδικα, μπορούμε να επιτύχουμε να εισάγονται αυτόματα κάποια αντικείμενα (π.χ. ένα καβούρι και μερικά σκουλήκια), μετά από κάθε μεταγλώττιση του προγράμματος μας, κατευθείαν από το Greenfoot για εμάς! Για να το επιτύχουμε αυτό, επιλέγουμε Reset και στη συνέχεια προσθέτουμε τα αντικείμενα που θέλουμε να δημιουργούνται στον κόσμο μας. Πριν πατήσουμε Run, με δεξί κλικ στον κόσμο επιλέγουμε Save the World. Με αυτή την επιλογή, προσθέσαμε λίγο κώδικα στην κλάση CrabWorld, έτσι ώστε όποτε επιλέξουμε Reset ή να κάνουμε κάποια μεταγλώττιση, να τοποθετούνται πάντα τα αντικείμενα που έχουμε βάλει στο σενάριο αυτό, στις θέσεις που επιλέξαμε. Δεν θα εμβαθύνουμε στον κώδικα αυτό τώρα, αλλά μπορείτε να τον δείτε στο παράθυρο που αναδύεται μετά την επιλογή Save the World. Αν θέλουμε να επιστρέψουμε στην αρχική κατάσταση, χωρίς την αυτόματη αρχική προσθήκη αντικειμένων στον κόσμο, θα έπρεπε να αφαιρέσουμε από την κλάση CrabWorld τον κώδικα αυτό. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [22]
Για να μπορέσετε να το καταλάβετε καλύτερα, ανοίξτε στον editor τον κώδικα της κλάσης πριν πατήσετε Save the World, μετά δημιουργήστε την αρχική εικόνα που επιθυμείτε και μελετήστε τον κώδικα (αφού πατήσετε Save the World ). Ό,τι έχει προστεθεί αφορά την αρχικοποίηση του κόσμου. Αναπαραγωγή και αποθήκευση ήχων Μπορούμε να προσθέσουμε ήχο στο σενάριό μας. Υπάρχει ήδη διαθέσιμο ένα αρχείο ήχου eating.wav στο σενάριο που κατεβάσαμε στην αρχή. Μπορούμε να παίζουμε αυτόν τον ήχο κάθε φορά που κάποιο καβούρι τρώει ένα σκουλήκι, προσθέτοντας μια μόνο γραμμή κώδικα στην κλάση crab που καλεί την μέθοδο Greenfoot.playSound αφού αφαιρέσουμε το σκουλήκι από τον κόσμο: Μπορούμε επίσης εάν διαθέτουμε μικρόφωνο στον υπολογιστή μας, να ηχογραφήσουμε τους δικούς μας ήχους. Στο μενού Controls υπάρχει η επιλογή εμφάνισης του παραθύρου ηχογράφησης. Αφού το επιλέξουμε πατάμε το κουμπί Record, μιλάμε ή κάνουμε τον ήχο που θέλουμε και μετά πατάμε stop. Για να αφαιρέσουμε το μέρος του ήχου στην αρχή (ή και στο τέλος) όπου υπάρχει ησυχία, επιλέγουμε με αριστερό κλικ την αρχή από το μέρος που θέλουμε να κρατήσουμε και σέρνουμε την επιλογή μας μέχρι το τέλος του. Στη συνέχεια επιλέγουμε Trim to selection. Αφού καταλήξουμε στον ήχο που θέλουμε να χρησιμοποιήσουμε και κρατήσουμε δίνουμε ένα όνομα στο αρχείο που θα σώσουμε (π.χ. myeating) και επιλέγουμε save. Αφού κλείσουμε το παράθυρο της ηχογράφησης, επιστρέφουμε στον κώδικα και αντικαθιστούμε στην γραμμή που υπάρχει το eating.wav σε myeating.wav (ή όποιο όνομα δώσατε στο αρχείο). Τώρα κάθε φορά που θα ακούγεται ο ήχος θα είναι από το αρχείο που προσθέσαμε εμείς. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [23]
Οδηγός 5: Προσθήκη τυχαία κινούμενου εχθρού Στο τέλος του προηγούμενου οδηγού είχαμε καταλήξει στο σενάριο όπου ένα καβούρι που μπορούμε να ελέγξουμε, κινείται κυκλικά και τρώει σκουλήκια. Αν και είναι λίγο δύσκολο να ελέγξουμε την κίνηση του καβουριού, το παιχνίδι είναι αρκετά εύκολο. Είναι καιρός να το δυσκολέψουμε λίγο προσθέτοντας έναν εχθρό: έναν αστακό! Ας ξεκινήσουμε προσθέτοντας έναν αστακό που κινείται σε μία ευθεία γραμμή και τρώει καβούρια. Μπορούμε να το κάνουμε με κώδικα που έχουμε ήδη χρησιμοποιήσει προηγουμένως. Αρχικά δημιουργούμε την κλάση Lobster κάνοντας δεξί κλικ στην κλάση Actor=> new subclass και δίνοντας στην καινούργια κλάση το όνομα Lobster. Η εικόνα του αστακού βρίσκεται στη λίστα με τις εικόνες στα αριστερά. Έχοντας δημιουργήσει την κλάση Lobster, μπορούμε να περάσουμε τον απαραίτητο κώδικα για την κίνηση και το φάγωμα του καβουριού. Όλα τα βήματα αυτά έχουν γίνει στους προηγούμενους οδηγούς, οπότε δε παραθέτουμε κάποια εικόνα ή κάποιο κώδικα. Δοκιμάστε και αν δεν τα καταφέρετε μπορείτε να δείτε τον κώδικα εδώ. Μπορούμε να ελέγξουμε ότι ο αστακός συμπεριφέρεται όπως τον έχουμε προγραμματίσει, τοποθετώντας έναν στα αριστερά ενός καβουριού, ξεκινώντας την εκτέλεση (Run) και αφήνοντας και τους δύο να κινούνται στο δεξί μέρος του κόσμου όπου ο αστακός θα φάει τελικά το καβούρι. Όλα καλά, αλλά ο αστακός μας δεν είναι και πολύ έξυπνος, αφού είναι εύκολο να τον αποφύγουμε κινούμενοι κυκλικά δεξιά ή αριστερά με τα αντίστοιχα πλήκτρα. Επίσης, μόλις ο αστακός φτάσει στη δεξιά άκρη του κόσμου, σταματάει, όπως έκανε και το καβούρι σε προηγούμενο οδηγό. Ας δυσκολέψουμε λίγο το παιχνίδι, εισάγοντας λίγη τυχαιότητα στην κίνηση του αστακού. Το Greenfoot μας παρέχει μία συνάρτηση Greenfoot.getRandomNumber η οποία μας επιστρέφει έναν τυχαίο αριθμό. Μια πρώτη δοκιμή στη συνάρτηση turn, όπου παράγουμε έναν τυχαίο αριθμό σαν όρισμα της και επιτυγχάνουμε τυχαία στροφή περίπου ανά frame είναι η παρακάτω: Με τον κώδικα αυτό έχουμε τυχαία στροφή σε κάθε frame κατά γωνία ανάμεσα σε 0 (συμπεριλαμβανομένου του 0) και 90 (χωρίς να συμπεριλαμβάνεται το 90) μοίρες (0 φ < 90). Δοκιμάζοντάς τον κώδικα μας παρατηρούμε πως ο εχθρός που δημιουργήσαμε δεν είναι και πολύ απειλητικός: ο αστακός περιστρέφεται ως επί το πλείστον σε ένα σημείο και γυρίζει πάντα προς τα δεξιά. Ας διορθώσουμε αυτά τα προβλήματα ένα-ένα, ξεκινώντας με την περιστροφή γύρω από ένα σημείο. Μέχρι στιγμής, ο αστακός μας κινείται σε κάθε frame, κάτι που τον κάνει να περιστρέφεται και όχι να περιπλανιέται. Υπάρχουν διάφοροι τρόποι, με τους οποίους θα μπορούσε να περιστρέφεται λιγότερο Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [24]
συχνά. Μία λύση είναι να χρησιμοποιήσουμε μια μεταβλητή μετρητή η οποία θα καταγράφει τον χρόνο που πέρασε από την προηγούμενη περιστροφή, και να γίνεται στροφή για παράδειγμα κάθε 10 frames. Ένας άλλος τρόπος είναι να χρησιμοποιήσουμε μια γεννήτρια τυχαίων αριθμών για να γυρίζει τυχαία, με μια ορισμένη συχνότητα (π.χ. κάθε 10 καρέ). Ας δούμε την χρήση της γεννήτριας τυχαίων αριθμών, για να κάνουμε ένα λιγότερο προβλέψιμο αστακό. Ας πούμε ότι ο αστακός έχει 10% πιθανότητα να περιστρέφεται ανά frame. Μπορούμε να το προγραμματίσουμε αυτό, συγκρίνοντας το Greenfoot.getRandomNumber(100) με ένα δεδομένο ποσοστό. Για το παράδειγμα μας, αφού το ποσοστό είναι 10%, θα συγκρίνουμε το Greenfoot.getRandomNumber(100) με το 10: Προσπαθήστε να σκεφτείτε πως δουλεύει ο παραπάνω κώδικας και, ιδιαίτερα, γιατί χρησιμοποιούμε το σύμβολο < αντί για <=. Θα μπορούσαμε να το υλοποιήσουμε αυτό με διαφορετικό τρόπο; Για παράδειγμα χρησιμοποιώντας Greenfoot.getRandomNumber(50) ή Greenfoot.getRandomNumber(10); Τι γίνεται με: Greenfoot.getRandomNumber(5); Ο παραπάνω κώδικας μας θα κάνει τον αστακό μας να γυρίζει (κατά μέσο όρο) κάθε 10 καρέ. Αν το μεταγλωττίσουμε, θα δούμε πως ο αστακός κινείται κυρίως σε μια ευθεία, περιστασιακά στρίβοντας δεξιά. Αυτό είναι αποδεκτό, και μας φέρνει πίσω στο άλλο πρόβλημά μας: ο αστακός γυρίζει πάντα δεξιά. Γνωρίζουμε από το καβούρι μας ότι ο τρόπος για να στρίψει αριστερά είναι να χρησιμοποιήσουμε έναν αρνητικό αριθμό για τη γωνία. Αν μπορούσαμε να αλλάξουμε τη στροφή του αστακού μας από την εμβέλεια 0 ο έως 90 ο στην εμβέλεια -45 ο έως 45 ο, θα έφτιαχνε το πρόβλημα μας. Υπάρχουν αρκετοί τρόποι για να επιτευχθεί αυτό, αλλά θα δούμε τον απλούστερο, κατά τη γνώμη μας: Κοιτάξτε ότι εάν αφαιρέσουμε από τον τυχαία παραγόμενο αριθμό το 45, θα καταλήξουμε με έναν αριθμό στη σωστή εμβέλεια. Ας προσαρμόσουμε λοιπόν ανάλογα τον κώδικα μας: Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [25]
Είναι η εμβέλεια μας σωστή για να γυρίζει ο αστακός απόλυτα συμμετρικά αυτή τη στιγμή; Αν όχι, πώς θα μπορούσαμε να το διορθώσουμε αυτό; Το μεταγλωττίζουμε, το εκτελούμε και τώρα έχουμε έναν αποτελεσματικό εχθρό που μπορεί να γυρίσει προς το μέρος μας ανά πάσα στιγμή. Βάζουμε ένα καβούρι, μερικούς αστακούς και πολλά, πολλά σκουλήκια στον κόσμο μας. Θυμηθείτε, πως μπορείτε ανά πάσα στιγμή να αποθηκεύσετε τον κόσμο αν θέλετε. Παρατηρούμε, ωστόσο, ότι υπάρχει ένα ακόμα ελάττωμα: οι αστακοί μπορεί να κολλήσουν για ένα διάστημα στις άκρες του κόσμου. Αυτό οφείλεται στο γεγονός ότι από τη στιγμή που χτύπησε την άκρη του κόσμου, θα κινηθεί μακριά από εκεί μόνο μετά από μερικές τυχαίες στροφές. Μπορούμε να επιταχύνουμε τη διαδικασία του να φεύγουν οι αστακοί από τις άκρες, προγραμματίζοντας τους να κάνουν στροφή 180 μοιρών μόλις φτάσουν στην άκρη του κόσμου. Για να ελέγξουμε αν είναι στην άκρη του κόσμου μπορούμε να κοιτάξουμε αν η συντεταγμένη Χ τους είναι κοντά στο μηδέν, ή κοντά στο πλάτος του κόσμου. Κατόπιν, χρησιμοποιούμε παρόμοια λογική για την συντεταγμένη Υ (και το ύψος του κόσμου, αυτήν την φορά). Ο κώδικας είναι παρακάτω: Με αυτό τελειώνουμε και τον οδηγό για τα καβούρια. Μπορείτε να πειραματιστείτε, προσθέτοντας νέα χαρακτηριστικά (όπως ένας δεύτερος παίχτης), ή να χρησιμοποιήσετε ότι μάθατε για να δημιουργήσετε ένα νέο σενάριο. Προσβασιμότητα ενός αντικειμένου από ένα άλλο Μια συνήθης ερώτηση που ρωτάνε οι αρχάριοι στο Greenfoot είναι: Πώς μπορώ να έχω πρόσβαση στις μεταβλητές (ή τις μεθόδους) ενός αντικειμένου/κλάσης από μία άλλη; Φυσικά η διατύπωση της ερώτησης συνήθως γίνεται διαφορετικά, αφού συνήθως οι αρχάριοι τις έννοιες μεταβλητή ή αντικείμενο δεν τις κατανοούν πλήρως. Συνεπώς, η ερώτησh για το παιχνίδι που βλέπετε στην Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [26]
εικόνα, μπορεί να τεθεί ως εξής: Πώς μπορώ να ενημερώνω το σκορ κάθε φορά που ένας αστεροειδής καταστρέφεται από έναν πύραυλο; Ας δούμε το παρακάτω σενάριο στο Greenfoot: tut-access-p1 (ανοίγουμε τον σύνδεσμο σε νέο παράθυρο ή νέα καρτέλα) Το σενάριο αυτό είναι ένα απλό παιχνίδι όπου, όταν πατάμε το πλήκτρο του κενού (Space bar) ένας πύραυλος πυροβολεί τους αστεροειδής που περνάνε. Επίσης, υπάρχει ένας μετρητής του σκορ, αλλά δεν λειτουργεί ακόμα. Ανοίγουμε το σενάριο από την τοποθεσία στον υπολογιστή μας όπου κατεβάσαμε το αρχείο και ξεκινάμε. Στο παράδειγμα αυτό, υπάρχουν διάφορες κλάσεις όπως Counter, Rocket και Shot. Η κλάση Counter έχει μια μέθοδο bumpcount() η οποία αυξάνει το σκορ που εμφανίζει ο μετρητής: Δεν πειράζει αν δεν καταλαβαίνετε ακόμα τον κώδικα. Το σημαντικό που πρέπει να κρατήσουμε είναι το εξής: αν καλέσουμε την μέθοδο bumpcount(), ο αριθμός που εμφανίζει ο μετρητής θα αυξηθεί κατά το ποσό που έχουμε καθορίσει κατά την κλήση της συνάρτησης (δηλαδή το amount στο παραπάνω πρόγραμμα). Στην κλάση Shot τώρα, μπορούμε να έχουμε μία μέθοδο η οποία και θα καλείται από την μέθοδο act() της ίδιας κλάσης, όποτε χτυπάμε έναν αστεροειδή: Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [27]
Ανοίγουμε την επεξεργαστή της κλάσης Shot (διπλό κλικ στην κλάση Shot στα δεξιά ή δεξί κλικ και Open Editor). Αν προσπαθήσουμε να καλέσουμε απλά τη μέθοδο bumpcount από την κλάση Counter, στην μεταγλώττιση λαμβάνουμε σφάλμα: Λαμβάνουμε το σφάλμα αυτό γιατί ο μεταγλωττιστής ψάχνει μόνο στην ίδια κλάση (την Shot) για την bumpcount() μέθοδο, η οποία φυσικά και δεν υπάρχει σε αυτή την κλάση. Επομένως, θα πρέπει με κάποιο τρόπο να πούμε στον μεταγλωττιστή να ψάξει για τη μέθοδο bumpcount() στην κλάση Counter. Πριν συνεχίσουμε, αφαιρούμε τον κώδικα κλήσης της μεθόδου bumpcount() από τη μέθοδο hitanasteroid() ώστε να αποφύγουμε το παραπάνω σφάλμα μεταγλώττισης. Λύση: Αποθήκευση της αναφοράς στον κόσμο σε δημιουργία του αντικειμένου Σε αυτή τη λύση, θα αποθηκεύσουμε μια αναφορά στο μετρητή του σκορ στον κόσμο, ώστε να μπορούμε να τον ανακτήσουμε από εκεί όποτε αυτό χρειαστεί. Ας δούμε τον κατασκευαστή (constructor) στην κλάση Space : Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [28]
Όπως βλέπετε είναι μια μέθοδος που δεν επιστρέφει κάποια τιμή και έχει το ίδιο όνομα με την κλάση. Στη συνέχεια, πρέπει να μεριμνήσουμε για δύο πράγματα: αρχικά, να δηλώσουμε ένα πεδίο όπου θα αποθηκεύσουμε την αναφορά στον μετρητή και μετά να εκχωρίσουμε τη μεταβλητή αυτή όταν δημιουργείται ο μετρητής. Αφού σιγουρευτούμε ότι ο κώδικας μεταγλωττίζεται κανονικά, παρατηρούμε ότι έχουμε προσθέσει μια δήλωση για μια μεταβλητή thecounter. Πρόκειται για μια μεταβλητή στιγμιότυπου, που σημαίνει ότι θέλουμε να κρατήσουμε την τιμή της για όσο υπάρχει ο κόσμος, γι αυτό δηλώνεται εκτός του κατασκευαστή SpaceWorld (αλλά εντός της κλάσης SpaceWorld). Τώρα προσθέτουμε μια μέθοδο στην κλάση Space που λαμβάνει την τιμή του thecounter ώστε να μπορεί αυτή να είναι προσβάσιμη από τον πύραυλο. Τώρα μπορούμε να έχουμε πρόσβαση στον κόσμο από την κλάση Shot και να καλέσουμε την μέθοδο getcounter() στον κόσμο έτσι ώστε να αποκτήσουμε μια αναφορά στον μετρητή μας. Τέλος καλούμε τη μέθοδο bumpcount() στην αναφορά του μετρητή μας. Σύμφωνα με τα παραπάνω, η μέθοδος hitanasteroid() στην κλάση Shot που περιλαμβάνει όλα τα παραπάνω, θα πρέπει να είναι: Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [29]
Λύσαμε λοιπόν το πρόβλημα μας. Τώρα, όταν ένα επιτυχημένο χτύπημα σε αστεροειδή πρέπει να αυξήσει τον μετρητή, θα ζητάει μία αναφορά από τον κόσμο, και μετά θα τροποποιεί τον μετρητή χρησιμοποιώντας την αναφορά αυτή. Όλη η λύση είναι διαθέσιμη εδώ: tut-access-p2 Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [30]
Παράρτημα Α: Λήψη, εγκατάσταση και χρήση του Greenfoot Για την λήψη του Greenfoot μεταβαίνουμε με τον περιηγητή μας στον ιστότοπο του προγράμματος και επιλέγουμε την λήψη (download). Όπως βλέπουμε και στον ιστότοπο για να μπορέσουμε να χρησιμοποιήσουμε το πρόγραμμα πρέπει να έχουμε εγκατεστημένη την έκδοση 7 ή 8 του Java Development Kit (JDK), το οποίο μπορούμε να κατεβάσουμε ξεχωριστά ή μαζί με το αρχείο εγκατάστασης του Greenfoot. Αφού εγκαταστήσουμε το JDK και κατεβάσουμε το Greenfoot, προχωράμε στη διαδικασία εγκατάστασης του τελευταίου: Κατά την πρώτη εκκίνηση του προγράμματος, εμφανίζεται ένας διάλογος, απ όπου επιλέγουμε τι θέλουμε να κάνουμε. Επειδή, αν επιλέξουμε την πρώτη (Open tutorial and tutorial scenario) ή την δεύτερη (Choose a scenario) επιλογή και ανοίξουμε ένα από τα σενάρια που βρίσκονται στον φάκελο εγκατάστασης, θα λάβουμε μια προειδοποίηση που σχετίζεται με τα δικαιώματα ανάγνωσης και γραφής στον φάκελο αυτό, όπου θα πρέπει να δημιουργήσουμε έναν νέο φάκελο για το σενάριο που θα ανοίξουμε, μπορούμε εκ των προτέρων να έχουμε ένα αντίγραφο των σεναρίων σε κάποιον άλλο φάκελο όπου έχουμε όλα τα δικαιώματα, και να ανοίγουμε τα σενάρια που θέλουμε από εκεί. Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [31]
Παράρτημα Β: Χρήσιμοι σύνδεσμοι Περιεχόμενο συνδέσμου Φάκελοι και αρχεία που χρησιμοποιήθηκαν στους οδηγούς του εγγράφου αυτού Ο Δικτυακός τόπος λήψης της Java Δικτυακός χώρος του Greenfoot To API του Greenfoot Σύνδεσμος http://networklab.teipir.gr/cnlab/files/greenfoot-guide-files.rar http://www.oracle.com/technetwork/java/javase/downloads/index.html http://www.greenfoot.org/ http://www.greenfoot.org/files/javadoc/ Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [32]