14. Κρατώντας το σκορ (Μεταβλητές-λίστες) και μετρώντας επιδόσεις
Subject Author Replies Views Last Message
No Comments

Ομάδα Διαδικτυακών πόρων


Προτεινόμενοι σύνδεσμοι :


1.http://ictmindtools.net/scratch/variables.htm
Παραδείγματα για το πώς χρησιμοποιώ τις μεταβλητές για να φτιάξω παιχνίδια.

2.http://www.shallwelearn.com/
Σε αυτό το σύνδεσμο αναλύεται στους χρήστες η έννοια της λίστας μέσα από ένα παράδειγμα μιας ''στοίβας'' (λίστας) από τσίχλες.

3.http://scratch.wik.is/Support/Help_Screens#variables
Παραδείγματα και επεξηγήσεις κάθε εντολής στην παλέτα Mεταβλητές.

4. http://users.soe.ucsc.edu/~karplus/scratch_programs/print_number.php
Σε αυτό το σύνδεσμο οι χρήστες μπορούν να κατεβάσουν ένα αριθμητικό παράδειγμα-project που αφορά συγκεκριμένα στις ακέραιες τιμές μεταβλητών.

5. http://www.redware.com/scratch/variables.html
Ένα παράδειγμα για το πως μπορείς να χρησιμοποιήσεις τις μεταβλήτες για να κάνεις ένα σχήμα.

6.http://www.cs.uni-potsdam.de/~romeike/UEWettbewerb/index-english.htm#_Toc181790515
Ένα tutorial του Scratch, που αναφέρεται κυρίως στους καθηγητές. Αρχικά κάνει μια εισαγωγή στο Scratch, αναφέρει τους διδακτικούς στόχους που μπορούν να επιτευχθούν μέσα από αυτό, καθώς και τις ηλικίες των παιδιών στα οποία αναφέρονται τα σχέδια μαθήματος που περιέχονται σε αυτό το site. Για της εξής ενότητες : Εισαγωγή σε προγραμματιστικό περιβάλλον, loops- κάνοντας κινήσεις, αλγόριθμοι- αποφάσεις βασισμένες σε γεγονότα, διαδραστικότητα με τον χρήστη, broadcasts, μεταβλητες, περιέχει σχέδιο μαθήματος με αναλυτικές οδηγίες προς τον καθηγητή για το πώς πρέπει να εισάγει αυτές τις έννοιες, τι διδακτικές μεθόδους και τί παραδείγματα πρέπει να χρησιμοποιήσει καθώς και τί projects πρέπει να αναθέσει στους μαθητές.

7.http://map.squeak.org/package/188fa009-22b3-44aa-ba93-e35e2c13fbb5/autoversion/1
Μέσα από το συγκεκριμένο σύνδεσμο οι χρήστες μπορούν να δημιουργήσουν user-lists και να τις προγραμματίσουν χρησιμοποιώντας custer command και reporter blocks.\

8.http://www.scratchguide.com/scratch-tutorial-lists-mod-if-else/
Πρόκειται για ένα οδηγό για αρχάριους στο Scratch όπου συγκεκριμένα ναλύονται μέσα από παραδείγματα οι έννοιες της λίστας και της συνθήκης ελέγχου (If-else statements) .

9.http://www.robodome.ca/scratch_taskcards/TASK%20CARDS%208.pdf
Μια πιθανή άσκηση.Να σχηματίσουν 3 μπάλες διαφορετικού μεγέθους που αναπηδούν και αναλόγως ποια ακουμπάνε να αυξάνεται το σκορ τους.




Το αρχείο που ακολουθεί περιλαμβάνει μια αρχική προσέγγιση των ενοτήτων του Κεφαλαίου 14





Σε αυτό το κεφάλαιο:
· Εισαγωγή στην έννοια των μεταβλητών
· Μεταβλητές στο Scratch – Αποθήκευση στη μνήμη
· Λίστες στο Scratch – Χρήση μεταβλητών ή λίστας;
· Παραδέιγματα χρήσης μεταβλητών και λίστας
· Χρονομέτρο – Παραδείγματα

Quotes:

The wonderful thing about life it that there will always be variables. You have to see them and be aware of them to know how to react to them.
Suzanne Farrell quotes
Το υπέροχο πράγμα στη ζωή είναι ότι πάντα θα υπάρχουν μεταβλητές. Πρέπει να τις βλέπεις και να είσαι ενήμερος για αυτές για να ξέρεις πώς να αντιδράσεις σε αυτές.
Suzanne Farrell

(Αν και πιστεύω ότι η μετάφραση το αδικεί)


Φάκελος με παραδείγματα


(αν τοποθετηθεί στο τέλος της σελίδας δεν εμφανίζεται)

Ενότητες

1. Εισαγωγή στην έννοια των μεταβλητών – Διαφοροποίηση από τις μαθηματικές μεταβλητές
Όταν πριν από πολλούς αιώνες ο Ηράκλειτος είπε τη φράση «Τα πάντα ρει», ίσως και ο ίδιος να μην πίστευε ότι αυτή η σκέψη του θα χαρακτήριζε τα πάντα μέχρι και σήμερα! Όντως τα πάντα γύρω μας αλλάζουν καθώς ο χρόνος τρέχει. Οι μέρες της εβδομάδας, η θερμοκρασία, η ώρα ή το ύψος ενός ανθρώπου είναι παραδείγματα καταστάσεων που μεταβάλλονται. Αν κοιτάξουμε στην καθημερινή μας ζωή μπορούμε να βρούμε πολύ πιο ενδιαφέροντα παραδείγματα τέτοιων καταστάσεων, όπως το σκορ ενός αγώνα, οι ψήφοι ενός υποψήφιου στις μαθητικές εκλογές, η ταχύτητα του μονοθέσιου στους αγώνες της Formula1, το μήκος ενός άλματος σε αγώνες άλματος εις μήκος και πολλά άλλα. Για να μπορέσουμε όμως να χειριστούμε και να εξετάσουμε τις μεταβαλλόμενες αυτές τιμές πρέπει να μπορούμε να τις κρατάμε ώστε να τις έχουμε ανά πάσα στιγμή στη διάθεσή μας. Για παράδειγμα, χρειάζεται να κρατήσουμε το μήκος του άλματος κάθε αθλητή ώστε να μπορούμε να τα συγκρίνουμε και να βρούμε το νικητή. Αυτή τη δυνατότητα μας τη δίνουν οι μεταβλητές!

2. Δημιουργία μεταβλητών - Τρόπος αποθήκευσης των μεταβλητών στη μνήμη και ανάθεση τιμής σε μία μεταβλητή
Δημιουργία μεταβλητής – Ανάθεση τιμής

Ας πάρουμε μια ιδέα λοιπόν από τη μορφή που έχουν οι μεταβλητές στο Scratch. Έστω ότι θέλουμε να φτιάξουμε ένα πρόγραμμα με το οποίο να παίζουμε basket.
Basket
Στόχος του παιχνιδιού φυσικά είναι να συγκεντρώσουμε όσους περισσότερους πόντους μπορούμε. Στο παιχνίδι αυτό λοιπόν θα προσομοιώσουμε την προπόνηση στις βολές! Για να το πετύχουμε αυτό θα χρειαστούμε ένα αντικείμενο για τον παίκτη που θα ρίχνει τις βολές, ένα αντικείμενο για τη μπάλα και ένα για το καλάθι! Όποτε η μπάλα αγγίζει τη στεφάνη του καλαθιού, θεωρούμε ότι ο παίκτης πέτυχε καλάθι. Κάθε φορά που ο παίκτης ρίχνει μία βολή και πετυχαίνει καλάθι από την περιοχή κάτω από το καλάθι, το σκορ του αυξάνεται κατά 2 πόντους. Αντίστοιχα, κάθε φορά που πετυχαίνει καλάθι ενώ βρίσκεται έξω από αυτήν την περιοχή το σκορ του αυξάνεται κατά 3 πόντους. Στο τέλος της προπόνησης αυτό που θέλουμε να ξέρουμε είναι οι πόντοι που έχει πετύχει ο παίκτης. Σε αυτό θα μας βοηθήσουν οι μεταβλητές! Θα χρειαστούμε μία μεταβλητή στην οποία θα αποθηκεύουμε το τρέχον σκορ που έχει πετύχει ο παίκτης. Όπως αναφέρθηκε και προηγουμένως, όποτε η μπάλα αγγίξει τη στεφάνη θεωρούμε ότι μπήκε καλάθι. Άρα όποτε το αντικείμενο «μπάλα» αγγίζει το αντικείμενο «στεφάνη» το περιεχόμενο της μεταβλητής στην οποία αποθηκεύουμε το σκορ θα πρέπει να μεταβάλλεται. Αυτό σημαίνει ότι τη μεταβλητή στην οποία αποθηκεύεται το σκορ την ελέγχει και τη μεταβάλλει το αντικείμενο «μπάλα». Ας ξεκινήσουμε λοιπόν να δημιουργούμε το σενάριο που θα κοθορίζει τη συμπεριφορά του αντικειμένου «μπάλα».
Ας μεταφερθούμε αρχικά στην παλέτα μεταβλητές. Από εκεί μπορούμε να δημιουργήσουμε μία μεταβλητή πατώντας την επιλογή «Δημιούργησε μια μεταβλητή». Στο πλαίσιο που θα εμφανιστεί δηλώνουμε το όνομα που θέλουμε να δώσουμε στη μεταβλητή αυτή. Καλό θα ήταν στις μεταβλητές που δημιουργούμε να δίνουμε ονόματα με νόημα, δηλαδή ονόματα που προσδιορίζουν τη χρησιμότητα της μεταβλητής. Στο συγκεκριμένο παράδειγμα τη μεταβλητή που θα κρατάει το σκορ από τα καλάθια που έχει πετύχει ο παίκτης μπορούμε να την ονομάσουμε «σκορ» (βλέπε Εικόνα 14.1).
Κάτω από τη δήλωση ονόματος, στο ίδιο πλαίσιο βλέπουμε ότι μας δίνονται δύο επιλογές. Η επιλογή «Για όλες τις μορφές (κοινή)» χρησιμοποιείται όταν θέλουμε η μεταβλητή που δημιουργούμε να είναι κοινή για όλα τα αντικείμενα δηλαδή να μπορούν όλα τα αντικείμενα να την χρησιμοποιούν ή να την τροποποιούν. Η δεύτερη επιλογή είναι η «Μόνο γι’ αυτή τη μορφή». Η επιλογή αυτή χρησιμοποιείται όταν θέλουμε η μεταβλητή που δημιουργούμε να αφορά μόνο ένα αντικείμενο. Στο παράδειγμα αυτό, τη μεταβλητή «σκορ» θέλουμε να την τροποποιεί μόνο το αντικείμενο «μπάλα». Για το λόγο κάνουμε κλικ στην επιλογή «Μόνο γι’ αυτή τη μορφή».

dimiourgia_metablitis.JPG
Εικόνα 14.1


Αφού δημιουργήσουμε τη μεταβλητή «σκορ» παρατηρούμε ότι στην παλέτα «Μεταβλητές» εμφανίζονται οι παρακάτω εντολές (βλέπε Εικόνα 14.2) :

entoles_metablitwn_greek.JPG
Εικόνα 14.2

Επιπλέον, θέλουμε να γνωρίζουμε από ποια περιοχή προήλθε η βολή που κατέληξε σε καλάθι έτσι ώστε να αυξήσουμε το σκορ κατά 2 ή κατά 3 πόντους. Στο σημείο αυτό λοιπόν αντιλαμβανόμαστε ότι χρειαζόμαστε ακόμη μία μεταβλητή που θα καθορίζει σε ποια περιοχή βρισκόταν το αντικείμενο «παίκτης» την ώρα της βολής. Άρα το αντικείμενο «παίκτης» πρέπει να μπορεί να καθορίζει τη μεταβλητή αυτή, την οποία έστω ότι την ονομάζουμε «περιοχή». Την «περιοχή» πρέπει να την αλλάζει το αντικείμενο «παίκτης» ανάλογα με το που βρίσκεται την ώρα που επιχειρεί τη βολή. Ας υποθέσουμε ότι αν την ώρα της βολής βρίσκεται στην περιοχή κάτω από το καλάθι. Τότε αποθηκεύει στη μεταβλητή «περιοχή» τον αριθμό 2, ενώ αν βρίσκεται έξω από αυτήν την περιοχή, αποθηκεύει τον αριθμό 3. Επιπλέον όμως τη μεταβλητή «περιοχή» πρέπει να μπορεί να την ελέγχει και το αντικείμενο μπάλα ώστε να αυξάνει κατάλληλα το σκορ κατά 2 ή 3 πόντους. Για το λόγο αυτό, καταλαβαίνουμε ότι η μεταβλητή «περιοχή» πρέπει να πρέπει να επιλεγεί κατά τη δημιουργία της ως «Για όλες τις μορφές (κοινή)».
Ας δούμε σε αυτό το σημείο λίγο πιο αναλυτικά τον τρόπο με τον οποίο μπορούμε να φτιάξουμε το παιχνίδι basket! Έστω ότι χρησιμοποιούμε το παρακάτω σκηνικό για το γήπεδο του basket (βλέπε Εικόνα 14.3). Πάνω στο σκηνικό φαίνονται και τα αντικείμενα «μπάλα», «στεφάνη» και «παίκτης». Το αντικείμενο «παίκτης» το αναπαριστούμε με ένα χέρι.

-μπαλα.JPG
Εικόνα 14.3


Όπως αναφέραμε προηγουμένως, το αντικείμενο «παίκτης» κινείται στο χώρο αλλάζοντας έτσι την περιοχή στην οποία βρίσκεται και από την οποία θα δοκιμάσει την επόμενη βολή του. Aπό αυτό καταλαβαίνουμε ότι τη μεταβλητή «περιοχή» πρέπει να την ορίζει και να την αλλάζει το αντικείμενο «παίκτης». Για να βρούμε σε ποια περιοχή βρίσκεται το αντικείμενο αυτό θα χρησιμοποιήσουμε αισθητήρες. Η περιοχή κάτω από το στεφάνι έχει χρώμα μπορντό ή λευκό. Αν λοιπόν το αντικείμενο «παίκτης» αγγίζει αυτά τα χρώματα τότε ορίζει τη μεταβλητή «περιοχή» σε 2. Αυτό το πετυχαίνουμε παίρνοντας την εντολή «όρισε το [περιοχή] σε [ ]» από την Παλέτα «Μεταβλητές». Στο πλαίσιο που ορίζουμε την τιμή της μεταβλητής θέτουμε την τιμή «2», δηλαδή στην εντολή θα θέσουμε «όρισε το [περιοχή] σε [2]». Διαφορετικά καταλαβαίνουμε ότι βρίσκεται έξω από τη περιοχή των δίποντων, οπότε και ορίζει τη μεταβλητή «περιοχή» σε 3 χρησιμοποιώντας την εντολή «όρισε το [περιοχή] σε [3]» (βλέπε Εικόνα 14.4).


perioxi.JPG
Εικόνα 14.4

Έπειτα, ας σκεφτούμε τον τρόπο με τον οποίο μπορούμε να γνωρίζουμε το σύνολο των πόντων. Τη μεταβλητή «σκορ» στη οποία αποθηκεύουμε το σύνολο των πόντων την ελέγχει κα την τροποποιεί μόνο το αντικείμενο «μπάλα». Άρα όλος ο κώδικας που αφορά στη μέτρηση και αποθήκευση των πόντων που έχει πετύχει ο παίκτης θα είναι στο αντικείμενο «μπάλα». Αρχικά το σκορ είναι μηδέν αφού δεν έχει μπει κανένα καλάθι. Οπότε στη μεταβλητή «σκορ» πρέπει αν δώσουμε την αρχική τιμή μηδέν. Αυτό το πετυχαίνουμε με την εντολή «όρισε το [σκορ] σε [0]» (βλέπε Εικόνα 14.5).

score__se__0.JPG
Εικόνα 14.5

Έπειτα, κάθε φορά που το αντικείμενο μπάλα αγγίζει το αντικείμενο «στεφάνη» πρέπει το αντικείμενο «μπάλα» να ελέγχει τη μεταβλητή «περιοχή». Αν η μεταβλητή αυτή έχει τιμή 2 τότε πρέπει να αυξήσει τη μεταβλητή «σκορ» κατά 2. Αυτό το πετυχαίνουμε με την εντολή «άλλαξε [σκορ] κατά [2]». Διαφορετικά, η μεταβλητή «περιοχή» θα έχει τιμή 3, καθώς μπορεί να πάρει μόνο αυτές τις δύο τιμές. Στην περίπτωση αυτή το αντικείμενο «μπάλα» πρέπει να αυξήσει τη μεταβλητή «σκορ» κατά 3. Αυτό το πετυχαίνουμε με την εντολή «άλλαξε [σκορ] κατά [3]» (Εικόνα 14.6).

allakse_score.JPG
Εικόνα 14.6


Κατά τη διάρκεια του παιχνιδιού θέλουμε η τιμή της μεταβλητής «σκορ» να φαίνεται στη σκηνή, έτσι ώστε να μπορούμε να βλέπουμε το σύνολό των πόντων που έχουμε πετύχει. Για να το πετύχουμε αυτό πρέπει να κοιτάξουμε τα κουτάκια που υπάρχουν στην παλέτα «Μεταβλητές», δίπλα από κάθε μεταβλητή που έχουμε ορίσει. Αν πατήσουμε μέσα στα κουτάκια αυτά, τότε θα εμφανιστεί το γνωστό « τικ ή Ö ». Αντίθετα, αν είναι ήδη πατημένο, τότε θα εξαφανιστεί. Όταν έχει γίνει «τικ» με τον τρόπο αυτό σε μία μεταβλητή, τότε η αντίστοιχη μεταβλητή και τιμή της θα εμφανιστούν στη σκηνή. Αν δεν έχει γίνει «τικ» τότε το όνομα και η τιμή της μεταβλητής αυτής δε θα είναι φανερά στη σκηνή. Για να είναι φανερή λοιπόν στη σκηνή η μεταβλητή «σκορ» και η τιμή της πρέπει να έχουμε κάνει «τικ» στο αντίστοιχο κουτάκι. Αντίθετα, η τιμή της μεταβλητής «περιοχή» δε θέλουμε να είναι ορατή στη σκηνή, οπότε πρέπει το αντίστοιχο κουτάκι να μην έχει γίνει «τικ» (βλέπε Εικόνα 14.7).

2.JPG
Εικόνα 14.7


Σημείωση: Για δική μας διευκόλυνση θα μπορούσαμε τα ονόματα που δίνουμε στις μεταβλητές να είναι τέτοια ώστε να ξεχωρίζουμε από αυτά αν η μεταβλητή είναι ορισμένη ως «Για όλες τις μορφές (κοινή)» ή «μόνο για αυτή τη μορφή». Αυτό όμως, μπορούμε επίσης να το διακρίνουμε αν εμφανίσουμε στη σκηνή τις μεταβλητές. Αυτές που είναι μόνο για μία μορφή, εμφανίζουν μπροστά από το όνομα της μεταβλητής και το όνομα του αντικειμένου

Αγωνιστικό Τραμπολίνο
Ας θυμηθούμε στο σημείο αυτό το παράδειγμα του κεφαλαίου 7.1 με τη μπαλαρίνα που κάνει τραμπολίνο. Από την εκκίνηση του προγράμματος το αντικείμενο «μπαλαρίνα» κάθε φορά που αγγίζει το αντικείμενο «τραμπολίνο» (δηλαδή κάθε φορά που κινείται ομαλά προς τα κάτω και φτάνει στις συντεταγμένες του αντικειμένου αυτού) κάνει μία αναπήδηση (δηλαδή κινείται πάλι ομαλά προς τα πάνω). Αυτό γίνεται για πάντα μέχρι ο χρήστης να τερματίσει το πρόγραμμα. Όπως βλέπουμε και στον αντίστοιχο κώδικα του αντικειμένου «μπαλαρίνα» αυτό το πετυχαίνουμε με την εντολή «για πάντα» (βλέπε Εικόνα 14.8).

mpalarina_arxiko.JPG
Εικόνα 14.8


Από το 2004 όμως το τραμπολίνο είναι και Ολυμπιακό άθλημα! Σύμφωνα με τους κανονισμούς του ολυμπιακού πλέον αθλήματος, ο αθλητής πρέπει να κάνει 10 αναπηδήσεις, δηλαδή 10 φιγούρες, ώστε να θεωρηθεί ότι τερμάτισε επιτυχώς την προσπάθειά του! Πώς θα έπρεπε επομένως να αλλάξουμε τον κώδικα της μπαλαρίνας ώστε να κάνει 10 αναπηδήσεις και έπειτα να τερματίζει την προσπάθειά της; Θα χρειαστούμε μία μεταβλητή που θα παίξει το ρόλο του μετρητή των αναπηδήσεων που έχει κάνει η μπαλαρίνα. Έστω πως ονομάζουμε τη μεταβλητή αυτή «μετρητή». Τον «μετρητή» τον αλλάζει μόνο ο κώδικας του αντικειμένου «μπαλαρίνα», άρα κατά τη δημιουργία της μεταβλητής θα κάνουμε κλικ στην επιλογή «Μόνο για αυτή τη Μορφή». Στη μεταβλητή αυτή πρέπει να δώσουμε μία αρχική τιμή. Η κατάλληλη τιμή για αρχικοποίηση είναι το μηδέν, αφου η μπαλαρίνα δεν έχει κάνει καμία αναπήδηση. Αυτό θα το καταφέρουμε με την εντολή «όρισε το [μετρητή] σε [0]» (βλέπε Εικόνα 14.9).

mpalarina_metritis.JPG
Εικόνα 14.9


Ερώτηση: Πώς αλλιώς θα μπορούσαμε να ονομάσουμε τη μεταβλητή «μετρητής» ώστε να είναι φανερό από την ονομασία της ότι χρησιμοποιείται μόνο από το αντικείμενο «μπαλαρίνα»;


Σε κάθε αναπήδηση της μπαλαρίνας ο μετρητής θα αυξάνεται κατά ένα και όταν φτάσει το 10 η μπαλαρίνα θα έχει ολοκληρώσει τις 10 αναπηδήσεις και δε θα κάνει άλλη, οπότε το πρόγραμμα θα τερματίσει. Πρέπει λοιπόν να διαλέξουμε την κατάλληλη εντολή που θα μπει στη θέση της «για πάντα». Η εντολή αυτή είναι η «για πάντα εάν». Θέλουμε η συνθήκη της εντολής «για πάντα εάν» να είναι τέτοια ώστε όταν η μεταβλητή «μετρητής» έχει πάρει την τιμή 10 να τερματιστεί το πρόγραμμα, αφού για κάθε τιμή του «μετρητή» από 0 έως 9 θα έχει κάνει και μία αναπήδηση, άλλα σύνολό θα έχει κάνει δέκα αναπηδήσεις. Επομένως, θα χρησιμοποιήσουμε την εντολή «για πάντα εάν [μετρητής < 10]» (βλέπε Εικόνα 14.10). Τον τελεστή της συνθήκης [μετρητής < 10] θα τον βρούμε στην παλέτα «Τελεστές». Σε κάθε επανάληψη ο μετρητής θα αυξάνεται κατά 1. Αυτό μπορούμε να το πετύχουμε με την εντολή «άλλαξε [μετρητή] κατά [1]» (βλέπε Εικόνα 14.10) που βρίσκεται στην παλέτα «Μεταβλητές». Μόλις ο μετρητής πάρει την τιμή 10 δε θα εκτελεστεί ξανά ο κώδικας που βρίσκεται μέσα στην επανάληψη.

mpalarina_10.JPG
Εικόνα 14.10

Για διασκέδαση!! : Θα μπορούσαμε να αλλάξουμε κατάλληλα τον κώδικα της μπαλαρίνας ώστε σε κάθε επανάληψη να εκτελεί και μία διαφορετική φιγούρα! Οι φιγούρες μπορούν να γίνουν αλλάζοντας ενδυμασίες στη μπαλαρίνα αλλά και περιστρέφοντάς την γύρω από τον εαυτό της με εντολές που προσφέρει το Scratch. Βάλτε λοιπόν τη φαντασία σας και δημιουργήστε!


Όταν η γάτα κυνηγάει το ποντίκι!
Στη συνέχεια, θέλουμε να δημιουργήσουμε ένα παιχνίδι κατά το οποίο μία γάτα θα κυνηγάει ένα ποντίκι (βλέπε Εικόνα 14.11). Αρχικά το ποντίκι θα έχει έναν αριθμό ζωών, έστω 9. Κάθε φορά που η γάτα αγγίζει το ποντίκι τότε αυτό θα χάνει μία ζωή. Όταν οι ζωές του ποντικιού γίνουν μηδέν τότε έχουμε χάσει και το παιχνίδι τερματίζεται.

mario_mouse.JPG
Εικόνα 14.11

Για να το πετύχουμε αυτό θα χρειαστούμε δύο αντικείμενα. Το αντικείμενο «γάτα» και το αντικείμενο «ποντίκι». Το αντικείμενο «γάτα» θα εκτελεί συνέχεια την ίδια κίνηση, δηλαδή θα κινείται δεξιά και αριστερά στη σκηνή, χωρίς να μπορεί ο χρήστης να επηρεάσει την κίνησή του. Το αντικείμενο «ποντίκι» το κινεί ο χρήστης με τα βέλη του πληκτρολογίου ενώ επιπλέον μπορεί να κάνει άλμα με το πλήκτρο «κενό». Όποτε το αντικείμενο «γάτα» αγγίξει το αντικείμενο «ποντίκι», τότε το αντικείμενο «ποντίκι» θα πρέπει να χάνει μία ζωή. Άρα θα χρειαστεί να δημιουργήσουμε μία μεταβλητή στη οποία θα αποθηκεύουμε τις ζωές του ποντικιού. ΄Τη μεταβλητή αυτή τη μεταβάλλει μόνο το αντικείμενο «ποντίκι», οπότε κατά τη δημιουργία της θα κάνουμε κλικ στη επιλογή «μόνο για αυτή τη Μορφή». Έστω πως τη μεταβλητή αυτή την ονομάζουμε «ζωές». Η μεταβλητή αυτή θα πρέπει να έχει αρχικά την τιμή 9 καθώς το ποντίκι στην αρχή του παιχνιδιού έχει 9 ζωές. Αυτό το πετυχαίνουμε με την εντολή «όρισε το [ζωές] σε [9]» (βλέπε Εικόνα 14.12).

orise_zwes_se_9.jpg
Εικόνα 14.12


Κάθε φορά που η γάτα αγγίζει το ποντίκι η ζωή του ποντικιού μειώνεται κατά μία. Αυτό σημαίνει πως κάθε φορά που το αντικείμενο «γάτα» αγγίζει το αντικείμενο «ποντίκι» τότε η τιμή της μεταβλητής «ζωές» πρέπει να μειωθεί κατά 1. Για να αντιληφθούμε το πότε η γάτα αγγίζει το ποντίκι δρούμε με τον εξής τρόπο: Όταν το αντικείμενο «γάτα» αγγίξει το αντικείμενο «ποντίκι» τότε μεταδίδει ένα μήνυμα, έστω «άγγιγμα» (βλέπε Εικόνα 14.13). Το αντικείμενο «γάτα» όπως φαίνεται και στον κώδικα της εικόνας 14.13 κινείται αυτόνομα για πάντα, μέχρι τη στιγμή που θα αγγίξει το αντικείμενο «ποντίκι». Τότε θα μεταδώσει το μήνυμα «άγγιγμα» και θα περιμένει για δύο δευτερόλεπτα. Αυτά τα δύο δευτερόλεπτα δε θα κινείται καθόλου (θα εξηγήσουμε στη συνέχεια γιατί θέλουμε να συμβεί αυτό).

metedwse_aggigma.JPG
Εικόνα 14.13



Όταν το ποντίκι λάβει το μήνυμα αυτό τότε μειώνει την τιμή της μεταβλητής «ζωές» κατά ένα. Αυτό το πετυχαίνουμε με την εντολή «άλλαξε [ζωές] κατά [ ]», βάζοντας στο κουτάκι που ορίζουμε το κατά πόσο θα αλλάξει η τιμή της μεταβλητής, αρνητικό αριθμό. Συγκεκριμένα, αφού θέλουμε να μειώσουμε την τιμή της μεταβλητής «ζωές» κατά ένα θα χρησιμοποιήσουμε την εντολή «άλλαξε [ζωές] κατά [-1]» (βλέπε Εικόνα 14.14).


allakse_zwes.jpg
Εικόνα 14.14

Επιπλέον θέλουμε όποτε η γάτα αγγίζει το ποντίκι να εμφανίζεται στη σκηνή ο αριθμός των υπολειπόμενων ζωών για δύο δευτερόλεπτα. Για να εμφανίσουμε στη σκηνή τον αριθμό των υπολειπόμενων ζωών, θα πρέπει να εμφανίσουμε τη μεταβλητή «ζωές» (βλέπε Εικόνα 14.15).

mario_mouse_lives.JPG
Εικόνα 14.15


Επειδή όμως θέλουμε να εμφανιστεί σε συγκεκριμένη στιγμή κατά τη διάρκεια εκτέλεσης του κώδικα δε μπορούμε να χρησιμοποιήσουμε τα κουτάκια που υπάρχουν δίπλα από κάθε μεταβλητή στην παλέτα «Μεταβλητές». Για το λόγο αυτό θα χρησιμοποιήσουμε την εντολή «εμφάνισε τη μεταβλητή [ ]» και στο κουτάκι επιλογής της μεταβλητής που θέλουμε να εμφανιστεί, θα επιλέξουμε «ζωές». Οπότε, όταν το ποντίκι λάβει το μήνυμα «touch» θα μειώσει κατά ένα τις υπολειπόμενες ζωές, με την εντολή «άλλαξε [ζωές] κατά [-1]» και στη συνέχεια θα εμφανίσει στη σκηνή τη μεταβλητή «ζωές» και την τιμή της με την εντολή «εμφάνισε τη μεταβλητή [ζωές]» (βλέπε Εικόνα 14.16). Η μεταβλητή αυτή θέλουμε να φαίνεται για δύο δευτερόλεπτα στη σκηνή. Κατά τη διάρκεια των δύο αυτών δευτερολέπτων τα αντικείμενα δε θα μπορούν να κινούνται. Αυτό μπορούμε να το πετύχουμε με την εντολή «περίμενε [2] δευτερόλεπτα» (βλέπε Εικόνα 14.13 και Εικόνα 14.16).

emfanise_lives.JPG
Εικόνα 14.16


Έπειτα, θα συνεχιστεί κανονικά η εκτέλεση του κώδικα, ενώ εμείς θέλουμε να εξαφανιστεί από τη σκηνή η μεταβλητή «ζωές» ώστε να υπάρχουν σε αυτή και πάλι τα δύο αντικείμενα μόνο. Για να το πετύχουμε αυτό θα χρησιμοποιήσουμε την εντολή «απόκρυψη μεταβλητής [ ]» και θα επιλέξουμε «απόκρυψη μεταβλητής [ζωές]» (βλέπε Εικόνα 14.17). Αν η μεταβλητή «ζωές» γίνει ίση με μηδέν, σημαίνει ότι το ποντίκι δεν έχει πλέον άλλες ζωές, άρα έχουμε χάσει και το παιχνίδι τελειώνει.

apokripse_lives.JPG
Εικόνα 14.17



Αποθήκευση στη μνήμη
Τι συμβαίνει όμως στη μνήμη του υπολογιστή όταν δημιουργούμε μία μεταβλητή; Ας δούμε αρχικά πώς μοιάζει η μνήμη του υπολογιστή. Θα μπορούσαμε να την φανταστούμε ως το σύνολο των θυρίδων μιας τράπεζας. Σε κάθε μία από αυτές τις θυρίδες ας υποθέσουμε ότι μπορούμε να αποθηκεύσουμε ένα μόνο αντικείμενο. Για παράδειγμα ένα κόσμημα ή μία επιταγή χρημάτων. Έστω ένας καινούριος πελάτης της τράπεζας ο οποίος θέλει να αποκτήσει στην κατοχή του μία θυρίδα. Αφού ορίσει η τράπεζα σε ποιον ανήκει η συγκεκριμένη θυρίδα, τότε ο πελάτης θα είναι σε θέση να αποθηκεύσει σε αυτή το αντικείμενο που ποθεί. Φυσικά, το αντικείμενο που έχει αποθηκευμένο στη θυρίδα μπορεί να μην είναι για πάντα το ίδιο! Μπορεί αρχικά να είχε αποθηκευμένο ένα δαχτυλίδι, το οποίο όμως στη συνέχεια θέλησε να το χρησιμοποιήσει, οπότε το αφαίρεσε από τη θυρίδα! Ίσως όμως στη συνέχεια θελήσει να αποθηκεύσει κάτι άλλο όπως μία επιταγή, έναν πίνακα ή ακόμη και κάποιο έγγραφο. Αν κάποιος πελάτης θέλει να αποθηκεύσει στην τράπεζα δύο αντικείμενα, τότε είναι υποχρεωμένος να έχει στην κατοχή δύο θυρίδες, μία για το κάθε ένα. Επιπλέον, ένα αντικείμενο που κάποιος μπορεί να αποθηκεύσει σε μία θυρίδα είναι ένα ποσό χρημάτων. Το ποσό αυτό μπορεί να το αλλάξει ανά πάσα στιγμή αυξάνοντας ή μειώνοντάς το.
Αντίστοιχα, όταν δημιουργούμε μία μεταβλητή, δεσμεύεται ένας χώρος στη μνήμη όπου ο υπολογιστής αποθηκεύει την τιμή της μεταβλητής. Επειδή η μνήμη του υπολογιστή δεν είναι απεριόριστα μεγάλη, κάποιες θέσεις της μπορεί να έχουν ξαναχρησιμοποιηθεί από παλαιότερες μεταβλητές άλλων προγραμμάτων, άρα να εξακολουθούν να περιέχουν κάποια ανεπιθύμητη τιμή. Επομένως, αφού η θέση αυτή αρχικά δεν είναι απαραίτητα κενή πρέπει να ορίσουμε εμείς τι θέλουμε αρχικά να περιέχει (βλέπε Εικόνα 14.18). Όπως και στις θυρίδες, έτσι και στις θέσεις μνήμης, η τιμή τους μπορεί να αλλαχθεί είτε προσθέτοντας, είτε αφαιρώντας αλλά ακόμη και αντικαθιστώντας την τιμή αυτή με κάποια άλλη, η οποία μπορεί να έιναι ένα άλλο νούμερο ή ακόμη και κάποια λέξη ή λογική τιμή (αληθές/ψευδές).



thesi_mnimis.JPG
Εικόνα 14.18



Ιδέα! : Έστω ότι έχουμε δύο μεταβλητές Α και Β και θέλουμε στην Α να εκχωρήσουμε την τιμή της Β και στη Β την τιμή της Α. Για να το πετύχουμε αυτό θα χρειαστούμε μία ακόμη βοηθητική μεταβλητή. Αυτό γιατί κάθε μεταβλητή κρατάει μόνο την τελευταία τιμή που της έχουμε αποδώσει και όχι το ιστορικό των τιμών. Αν προτού εκχωρήσουμε στη μεταβλητή Α την τιμή της Β, εκχωρήσουμε και σε μία μεταβλητή TEMP την τιμή της Α, τότε θα έχουμε κάπου κρατημένη και την αρχική τιμή της Α, την οποία θα μπορέσουμε να αποδώσουμε στο τέλος στη μεταβλητή Β (βλέπε Εικόνα 14.19).


swstos_tropos.JPG
Εικόνα 14.19





Διαφοροποίηση από μαθηματικές μεταβλητές
Οι μεταβλητές που χρησιμοποιούμε στον προγραμματισμό έχουν διαφορετική έννοια από αυτές που χρησιμοποιούμε στα μαθηματικά.
Έτσι πρέπει να αντιληφθούμε ότι στον προγραμματισμό το περιεχόμενο μιας μεταβλητής αλλάζει σύμφωνα με τη σειρά εκτέλεσης των εντολών. Αυτό σημαίνει ότι η τιμή που θα είναι αποθηκευμένη στη μεταβλητή θα είναι η τελευταία τιμή την οποία εκχωρήσαμε σε αυτή. Αν για παράδειγμα έχουμε τις μεταβλητές «χ» και «y», και αρχικά αποθηκεύσουμε στη μεταβλητή «χ» το περιεχόμενο της μεταβλητής «y» και στη συνέχει αλλάξουμε την τιμή της μεταβλητής «y», αυτό δε σημαίνει ότι θα αλλάξει και η τιμή της μεταβλητής «χ». Αυτό θα συμβεί γιατί η τιμή της μεταβλητής «χ» εκχωρήθηκε πρωτύτερα σύμφωνα με τη ροή του κώδικα, άρα η τελευταία αλλαγή τιμής της μεταβλητής «y» δεν την επηρεάζει (βλέπε εικόνα 14.20).


paradeigma_1.JPG

Εικόνα 14.20


Επιπλέον, πρέπει να κατανοήσουμε ότι μία μεταβλητή στον προγραμματισμό χρησιμοποιείται για να εκχωρούμε σε μία θέση την τιμή μίας έκφρασης. Αυτό σημαίνει ότι πρώτα θα εκτελεστούν οι πράξεις στην έκφραση και έπειτα η τιμή της θα καταχωρηθεί στη μεταβλητή. Η έκφραση αυτή μπορεί να περιέχει μαθηματικές ή λογικές πράξεις ή ακόμη να αποτελεί την ένωση λέξεων. Έστω λοιπόν ότι έχουμε το επόμενο κομμάτι κώδικα (βλέπε Εικόνα 14.21):


senario1.JPG
Εικόνα 14.21


Η σειρά με την οποία θα εκτελεστούν οι πράξεις στον κώδικα αυτό θα είναι η εξής:
α) εκχωρούμε στη μεταβλητή χ την τιμή μηδέν
β) γίνεται ο υπολογισμός της τιμής της έκφρασης χ + 2. Αυτό δίνει αποτέλεσμα 2 (χ + 2 = 0 + 2 ).
γ) εκχωρούμε στη μεταβλητή χ την τιμή της έκφρασης. Άρα πλέον η μεταβλητή χ έχει την τιμή 2.



Τέλος, όπως φάνηκε και στο προηγούμενο παράδειγμα, αν σε μία μεταβλητή εκχωρήσουμε την τιμή μίας αριθμητικής έκφρασης, τότε στη μεταβλητή εκχωρείται το αποτέλεσμα της έκφρασης αυτής και όχι η ίδια η έκφραση. Για παράδειγμα, αν εκχωρήσουμε στη μεταβλητή a την τιμή 7, και έπειτα εκχωρήσουμε στη μεταβλητή b την τιμή της αριθμητικής έκφρασης «a + 8», τότε η τιμή της μεταβλητής b θα είναι 15 και όχι η ίδια η έκφραση «a + 8» (βλέπε Εικόνα 14.22)!

senario3.JPG
Εικόνα 14.22


Σημείωση: Αν και κατά τη διάρκεια του σεναρίου μπορεί να αλλάξει η χρησιμότητα μιας μεταβλητής, καλό θα ήταν μία μεταβλητή να χρησιμοποιείται από την αρχή έως το τέλος του σεναρίου για ένα σκοπό, π.χ. πάντα για απόδοση λογικών τιμών σε αυτή, ώστε να είναι όσο το δυνατόν πιο ευκολονόητος ο κώδικας.


Πίνακας διαθέσιμων εντολών για τις Μεταβλητές
x_se_0.jpg
Εκχωρεί στη μεταβλητή «χ» την τιμή «0».
x_kata_1.jpg
Αλλάζει την τιμή της μεταβλητής «χ» κατά μία μονάδα.
emfanise_x.jpg
Εμφανίζει την τιμή της μεταβλητής «χ» στη σκηνή.
apokrupsi_x.jpg
Αποκρύπτει από τη σκηνή την τιμή της μεταβλητής «χ».



3. Λίστες : Κατανόηση λίστας – Πότε χρησιμοποιείτε λίστα και πότε η μεταβλητή

Η έννοια της λίστας
Πολλές φορές στην καθημερινή μας ζωή, χωρίς να το συνειδητοποιούμε, χρησιμοποιούμε λίστες. Τέτοια παραδείγματα είναι η λίστα του super market η οποία είναι ένας κατάλογος αντικειμένων που θέλουμε να αγοράσουμε. Ένα άλλο παράδειγμα είναι ένας τηλεφωνικός κατάλογος, ο οποίος περιλαμβάνει το όνομα και το τηλέφωνο των κατοίκων μιας περιοχής. Θα μπορούσατε να σκεφτείτε άλλες περιπτώσεις που θα μας ήταν χρήσιμη μία λίστα; Θα μπορούσε να αποτελεί ένα τέτοιο παράδειγμα, η κατάσταση με τα ονόματα και τους βαθμούς που αναρτάται στο σχολείο μετά τις τελικές εξετάσεις της πληροφορικής; Μπορούμε λοιπόν να συμπεράνουμε ότι η λίστα είναι μία συλλογή αντικειμένων με κοινά χαρακτηριστικά ή κοινό σκοπό. Για παράδειγμα, ο κοινός σκοπός των αντικειμένων της λίστας του supermarket είναι να αγοράσουμε όλα τα υλικά που χρειαζόμαστε για μία συνταγή μαγειρικής. Όμοια, το κοινό χαρακτηριστικό της λίστας με τα ονόματα και τις βαθμολογίες των μαθητών είναι ότι αφορούν το ίδιο μάθημα, δηλαδή αυτό της πληροφορικής.
Αντίστοιχα και στον προγραμματισμό συναντάμε συχνά περιπτώσεις που οι λίστες μας είναι χρήσιμες για την υλοποίηση ενός προγράμματος. Σκεφτείτε για παράδειγμα να θέλαμε να δημιουργήσουμε μια εφαρμογή αγώνων ταχύτητας (Formula 1) και ο χρήστης να μπορούσε να διαλέξει πιο όχημα θα οδηγήσει μέσα από μια λίστα από 20 διαφορετικά μονοθέσια! Σίγουρα θα ήταν πολύ πιο ενδιαφέρον από το να οδηγάει πάντα το ίδιο μονοθέσιο. Αντίστοιχα αναλογιστείτε πόσο μεγάλο ενδιαφέρον θα είχε για το χρήστη να διαλέγει ακόμα και τις πίστες στις οποίες θέλει να αγωνιστεί οι οποίες θα βρίσκονται αποθηκευμένες σε μια δεύτερη λίστα παρόμοια με αυτή των μονοθέσιων. Το σίγουρο είναι ότι με χρήση των λιστών μπορούμε να δημιουργήσουμε πάρα πολλά παιχνίδια από πολύ απλά μέχρι αρκετά πολύπλοκα, παιχνίδια που συναντούμε στη καθημερινότητά μας και δεν φανταζόμασταν ποτέ ότι θα μπορούσαμε να γίνουμε οι ηλεκτρονικοί δημιουργοί τους!

Η λίστα στο Scratch
Πως θα μπορούσαμε όμως στο Scratch να δημιουργήσουμε μία λίστα; Παρατηρούμε ότι στην παλέτα «Μεταβλητές» υπάρχει η επιλογή «Δημιούργησε μια λίστα» (βλέπε Εικόνα 14.23).

Dhmiourgia_listas.jpg
Εικόνα 14.23

Πατώντας την επιλογή αυτή, ανοίγει ένα πλαίσιο που έχει την ίδια μορφή με αυτό που εμφανίζεται όταν δημιουργούμε μία μεταβλητή (βλέπε Εικόνα 14.24).

plaisio.jpg
Εικόνα 14.24

Στο πλαίσιο αυτό μπορούμε να ορίσουμε το όνομα που θέλουμε να δώσουμε στη λίστα και να καθορίσουμε αν η λίστα αυτή θα είναι κοινή για όλα τα αντικείμενα ή μόνο για κάποιο συγκεκριμένο, όπως ακριβώς και στις μεταβλητές. Αυτό μπορεί να πραγματοποιηθεί μέσω των επιλογών «Για όλες τις μορφές (κοινή)» και «Μόνο γι’ αυτή τη μορφή», αντίστοιχα. Το νόημα όμως των δύο αυτών επιλογών μπορεί να φανεί καλύτερα μέσα από μια πραγματική εφαρμογή του scratch. Σκεφτείτε για παράδειγμα μια εφαρμογή όπως το γνωστό σε όλους μας παιχνίδι του «scrabble». Έστω ότι η εφαρμογή παίζετε από τέσσερις χρήστες. Στο παιχνίδι υπάρχει μια λίστα που περιέχει όλα τα πιθανά γράμματα που μπορεί να τραβήξει κάθε παίχτης η οποία προφανώς είναι κοινή, δηλαδή έχει δημιουργηθεί με την επιλογή «Για όλες τις μορφές (κοινή)», αφού πρέπει όλοι οι χρήστες να μπορούν να επέμβουν πάνω της, δηλαδή να διαλέγουν γράμματα από αυτή. Ο κάθε παίχτης ξεχωριστά όμως πρέπει να κρατάει σε μια προσωπική του λίστα τα γράμματα που έχει επιλέξει σε κάθε γύρο. Επομένως είναι αναγκαία η δημιουργία τεσσάρων ακόμη λιστών οι οποίες θα δημιουργηθούν με την επιλογή «Μόνο γι’ αυτή τη μορφή» αφού θα αφορούν το κάθε χρήστη αποκλειστικά. Για να μπορούμε να διακρίνουμε αν μια λίστα είναι κοινή για όλα τα αντικείμενα ή μόνο για κάποιο από αυτά αρκεί να κοιτάξουμε το όνομα στο πάνω μέρος της αμέσως μετά τη δημιουργία της. Αν η λίστα φτιάχτηκε με την επιλογή «Για όλες τις μορφές (κοινή)» και με το όνομα «λίστα» τότε το αποτέλεσμα είναι αυτό της Εικόνας 14.25.

lista1.jpg
Εικόνα 14.25

Ενώ αν δημιουργήθηκε με το ίδιο όνομα «λίστα» αλλά με την επιλογή «Μόνο γι’ αυτή τη μορφή» τότε το αποτέλεσμα είναι αυτό της Εικόνας 14.26.
lista2.jpg
Εικόνα 14.26

Παρατηρούμε ότι μαζί με το όνομα της λίστας φαίνεται και το όνομα του αντικειμένου στο οποίο δημιουργήθηκε η λίστα και ουσιαστικά μόνο το αντικείμενο Μορφή μπορεί να πειράζει τη συγκεκριμένη λίστα.

Έστω ότι δημιουργούμε μία λίστα δίνοντας το όνομά της και όποια από τις δύο ιδιότητες «Για όλες τις μορφές (κοινή)» ή «Μόνο γι’ αυτή τη μορφή» θέλουμε. Παρατηρούμε ότι αμέσως μετά τη δημιουργία της λίστας, στην παλέτα «Μεταβλητές» εμφανίζονται διάφορες επιλογές οι οποίες αποτελούν και τις εντολές μέσω των οποίων μπορούμε να επέμβουμε στη λίστα μας (βλέπε Εικόνα 14.27).

entoles.jpg
Εικόνα 14.27

Ήρθε λοιπόν η ώρα να δούμε τη χρήση των εντολών της λίστας μέσα από πραγματικές εφαρμογές. Η πρώτη εντολή που φαίνεται είναι η «πρόσθεσε [αντικείμενο] στο [λίστα]». Όπως δηλώνει και το όνομά της με την εντολή αυτή μπορούμε να προσθέσουμε ένα αντικείμενο στη λίστα μας το οποίο βέβαια πάντα προστίθεται στην τελευταία θέση αυτής. Σκεφτείτε για παράδειγμα μια παραλλαγή της εφαρμογής «φιδάκι» όπου το φίδι μας δεν τρέφεται με τελίτσες αλλά με φρούτα! Έστω ότι θέλουμε να ξέρουμε κάθε στιγμή ποια φρούτα έχει ήδη φάει το φίδι κρατώντας τα σε μια λίστα. Τότε σε κάθε διαφορετικό φρούτο της εφαρμογής μας(φυσικά έχουμε δημιουργήσει τόσα αντικείμενα όσα είναι και τα φρούτα που θέλουμε στο παιχνίδι) πρέπει να ελέγχουμε αν αγγίζει το αντικείμενο φίδι και τότε να προστίθεται στη λίστα(την οποία ενδεικτικά μπορούμε να ονομάσουμε «Φρούτα»). Η παρακάτω εικόνα δείχνει την ομάδα των εντολών που προσθέτουν το αντικείμενο μήλο στη λίστα «Φρούτα» αν αυτό αγγίξει το αντικείμενο φίδι(βλέπε Εικόνα 14.28).

lista3.jpg
Εικόνα 14.28

Μετά την εκτέλεση της εντολής «πρόσθεσε [Μήλο] στο [Φρούτα]» η λίστα των φρούτων θα έχει τη μορφή της Εικόνας 14.29.

lista4.jpg
Εικόνα 14.29

Συνεχίζουμε με τη δεύτερη εντολή η οποία είναι ή «διέγραψε [1] από το [λίστα]». Με την εντολή αυτή μπορούμε να διαγράψουμε το πρώτο στοιχείο της λίστας μας. Παρατηρούμε όμως ότι στην επιλογή 1 υπάρχει ένα βελάκι το οποίο αν το πατήσουμε μας δίνει τρεις επιλογές σχετικά με το τι θέλουμε να διαγράψουμε από τη λίστα μας όπως φαίνεται και στην Εικόνα 14.30.

lista5.jpg
Εικόνα 14.30

Με τη επιλογή «1» όπως αναφέραμε και πριν διαγράφουμε το πρώτο στοιχείο της λίστας μας, με την επιλογή «τελευταίο» όπως είναι φανερό διαγράφουμε το τελευταίο στοιχείο της ενώ με την επιλογή «όλα» διαγράφουμε όλα τα αντικείμενά της. Μπορούμε επίσης κάνοντας κλικ στο «1» και όχι στο βελάκι να δώσουμε εμείς πιο αντικείμενο επιθυμούμε να διαγραφεί από τη λίστα(π.χ. μπορούμε να εκτελέσουμε την εντολή «διέγραψε [4] από το [λίστα]»). Σκεφτείτε για παράδειγμα την προηγούμενη εφαρμογή με το φιδάκι που τρώει φρούτα. Έστω ότι ο πρώτος χρήστης έχασε όλες τις ζωές του και είναι η σειρά μας να παίξουμε. Αν εκκινήσουμε το πρόγραμμά μας τότε η λίστα «Φρούτα» θα περιέχει αρχικά όλα τα φρούτα που ο προηγούμενος χρήστης είχε φάει πριν χάσει. Αυτό δεν το θέλουμε φυσικά αφού εμείς πρέπει να βλέπουμε τη λίστα με τα δικά μας φρούτα. Είναι λογικό λοιπόν στην αρχή του προγράμματος να διαγράφουμε όλα τα περιεχόμενα της λίστας όπως φαίνεται και στην Εικόνα 14.31.

lista6.jpg
Εικόνα 14.31

Σημείωση:Γενικά είναι μια καλή στρατηγική κάθε φορά που χρησιμοποιούμε λίστα στην εφαρμογή μας να μην ξεχνάμε να την αρχικοποιούμε δηλαδή να διαγράφουμε όλα τα στοιχεία της με το ξεκίνημα του προγράμματος.

Πάμε τώρα στη τρίτη κατά σειρά εντολή της λίστας που είναι η «παρέμβαλε το [αντικείμενο] στη θέση [1] του [λίστα]». Αυτή η εντολή ουσιαστικά μας δίνει τη δυνατότητα να προσθέσουμε ένα αντικείμενο στη λίστα μας σε όποια θέση επιθυμούμε και όχι αναγκαστικά στη τελευταία θέση όπως κάνει η εντολή «πρόσθεσε [αντικείμενο] στο [λίστα]». Η επιλογή της θέσης στην οποία θα τοποθετηθεί το αντικείμενο γίνετε κατά τον ίδιο τρόπο με την επιλογή της θέσης του αντικειμένου που θέλουμε να διαγράψουμε όπως εξηγήσαμε στη προηγούμενη εντολή. Η μόνη διαφορά είναι ότι εδώ στη θέση της επιλογής «όλα» που υπήρχε στη διαγραφή έχουμε την επιλογή οποιοδήποτε με την οποία το αντικείμενο προστίθεται τυχαία σε κάποια από τις θέσεις της λίστας. Οι επιλογές αυτής της εντολής φαίνονται στην Εικόνα 14.32.

lista7.jpg
Εικόνα 14.32

Έστω λοιπόν ότι θέλουμε να δημιουργήσουμε ένα παιχνίδι το οποίο όλοι γνωρίζουμε και δεν είναι άλλο από τη κρεμάλα! Προφανώς ο ένας χρήστης θα δίνει μια λέξη ανά γράμμα η οποία θα αποθηκεύεται σε μια λίστα που θα είναι κρυφή για τον δεύτερο παίχτη ο οποίος θα βλέπει μια δεύτερη λίστα όπου θα εμφανίζονται μόνο το πρώτο και το τελευταίο γράμμα της λέξης που έδωσε ο πρώτος χρήστης. Τα δύο γράμματα θα εμφανίζονται στη πρώτη και στη τελευταία θέση της φανερής λίστας αντίστοιχα. Ανάμεσα στα δύο γράμματα θέλουμε να παρεμβάλουμε τόσα κενά όσα είναι τα υπόλοιπα γράμματα της λέξης έτσι ώστε ο δεύτερος παίχτης να έχει μια αντίληψη της λέξης που ψάχνει. Ο κώδικας που κάνει αυτό που περιγράψαμε πιο πάνω είναι ο ακόλουθος όπου τα ονόματα των δύο λιστών είναι «φανερή» και «κρυφή» αντίστοιχα (βλέπε Εικόνα 14.33).

lista8.jpg
Εικόνα 14.33

Για να μπορέσουμε να γεμίσουμε τη φανερή λίστα μας με τον κατάλληλο αριθμό κενών χρησιμοποιούμε όπως βλέπουμε μια ακόμα εντολή των λιστών την «μήκος του [λίστα]». Αυτή η εντολή μας δίνει τη δυνατότητα να γνωρίζουμε πόσα στοιχεία είναι αποθηκευμένα στη λίστα μας κάθε στιγμή. Έτσι στο συγκεκριμένο παράδειγμα αφού θέλουμε να γεμίσουμε τη φανερή λίστα με τόσα κενά όσα το συνολικό μήκος της κρυφής μείον 2 αφού το πρώτο και το τελευταίο γράμμα της λέξης θα φαίνονται κανονικά χρησιμοποιούμε την εντολή «μήκος του [κρυφή]» με τον κατάλληλο τελεστή. Με αυτό τον τρόπο πετυχαίνουμε τις επιθυμητές επαναλήψεις.
Παρατηρείστε ότι παρεμβάλουμε τα κενά στη θέση 2 της φανερής λίστας δηλαδή ανάμεσα από το πρώτο και το τελευταίο γράμμα. Κάθε νέο κενό που προστίθεται σε κάθε επανάληψη μπαίνει στη δεύτερη θέση της λίστας «σπρώχνοντας» ουσιαστικά τα υπόλοιπα κενά και το τελευταίο γράμμα προς τα κάτω.

Η πέμπτη εντολή που συναντούμε στη παλέτα των μεταβλητών μας και έχει να κάνει με λίστες είναι η «αντικατέστησε στοιχείο [1] του [λίστα] με [αντικείμενο]». Με την εντολή αυτή μπορούμε να αντικαταστήσουμε ένα στοιχείο της λίστας μας με ένα άλλο αντικείμενο. Η χρήση της είναι παρόμοια με την εντολή «παρέμβαλε το [αντικείμενο] στη θέση [1] του [λίστα]» που είδαμε πριν, με τη διαφορά ότι εδώ το νέο μας αντικείμενο όχι μόνο μπαίνει σε κάποια θέση της λίστας αλλά αντικαθιστά το αντικείμενο που βρισκόταν σε αυτή τη θέση πριν από αυτό. Οι επιλογές που έχουμε για το ποιο στοιχείο θέλουμε να αντικαταστήσει το καινούριο αντικείμενο είναι ίδιες με πριν. Μπορούμε δηλαδή να αντικαταστήσουμε το πρώτο αντικείμενο της λίστας, το τελευταίο της ή ένα οποιοδήποτε άλλο. Με την επιλογή «οποιοδήποτε» η αντικατάσταση είναι τυχαία ενώ αν θέλουμε να αντικαταστήσουμε ένα συγκεκριμένο αντικείμενο αλλά όχι το πρώτο ή το τελευταίο αρκεί να κάνουμε κλικ στον αριθμό 1(όχι στο βελάκι) και να δώσουμε τον αριθμό της θέσης του στοιχείου προς αντικατάσταση. Για να καταλάβουμε τη λειτουργία όμως αυτής της εντολής ας σκεφτούμε ξανά το προηγούμενο παράδειγμα της κρεμάλας. Έστω ότι ήρθε η ώρα του δεύτερου χρήστη να παίξει μαντεύοντας γράμματα της λέξης που έβαλε ο πρώτος. Αν το γράμμα που πληκτρολογεί ο παίχτης ανήκει στη κρυφή λίστα που σημαίνει ότι είναι ένα από τα γράμματα που έβαλε ο πρώτος παίχτης τότε πρέπει αυτό το γράμμα να αντικαταστήσει το κενό στην αντίστοιχη θέση στη φανερή λίστα δείχνοντας στο χρήστη ότι η επιλογή του ήταν σωστή. Για να ελέγξουμε αν το γράμμα που έδωσε ο χρήστης ανήκει στη κρυφή λίστα αρκεί να χρησιμοποιήσουμε ακόμα μια εντολή των λιστών την «[λίστα] περιέχει [αντικείμενο]». Αυτή η εντολή πραγματοποιεί μια αναζήτηση ουσιαστικά στη λίστα μας και επιστρέφει «αληθές» αν το αντικείμενο υπάρχει ή «ψευδές» αν το αντικείμενο δεν υπάρχει σε αυτή. Επίσης αν τελικά το γράμμα ανήκει στη κρυφή λίστα πρέπει να δούμε σε ποια θέση ή θέσεις είναι ακριβώς έτσι ώστε να αντικαταστήσουμε τα κενά των συγκεκριμένων θέσεων της φανερής λίστας με το γράμμα το οποίο πληκτρολογήθηκε. Για να ελέγξουμε κάθε στοιχείο της κρυφής λίστας με το γράμμα το οποίο έδωσε ο χρήστης χρησιμοποιούμε άλλη μια εντολή των λιστών την «στοιχείο [1] του [λίστα]». Η εντολή αυτή επιστρέφει το αντικείμενο της λίστας στην θέση την οποία του δίνουμε. Αν δηλαδή εκτελέσουμε την εντολή ως «στοιχείο [1] του [λίστα]» τότε αυτή επιστρέφει το πρώτο αντικείμενο της λίστας μας. Ο κώδικας λοιπόν της κρεμάλας που πραγματοποιεί αυτά που αναφέραμε εμφανίζεται στην Εικόνα 14.34.

lista9.jpg
Εικόνα 14.34

Καταρχήν στο «απάντηση» βρίσκεται το γράμμα που προσπαθεί να μαντέψει ο χρήστης που παίζει κρεμάλα ενώ η μεταβλητή x είναι αυτή που μας βοηθάει να εξετάσουμε κάθε θέση της κρυφής λίστας και να δούμε σε ποια ακριβώς βρίσκεται το γράμμα αυτό. Βλέπουμε λοιπόν αρχικά ότι όλα εκτελούνται αν και μόνο αν η κρυφή λίστα περιέχει την απάντηση κάτι το οποίο ελέγχεται με την εντολή « εάν «[κρυφή] περιέχει [απάντηση]» ».
Στη συνέχεια ψάχνουμε όλα τα γράμματα της κρυφής λίστας άρα η επανάληψη πρέπει να εκτελεστεί τόσες φορές όσο είναι το μήκος της κρυφής μείον 2 αφού το πρώτο και το τελευταίο γράμμα δεν χρειάζεται να τα ελέγξουμε εφόσον είναι ήδη φανερά στο παίχτη. Έπειτα πρέπει να ελέγξουμε στοιχείο προς στοιχείο τη κρυφή λίστα και για κάθε ένα από αυτά να ελέγχουμε αν είναι ίσο με την απάντηση του χρήστη και στη συνέχεια να προχωρήσουμε στην αντικατάσταση. Επομένως η αντικατάσταση πραγματοποιείτε μόνο «εάν «στοιχείο [x] του [κρυφή]» = [απάντηση]». Αν τελικά σε κάποια θέση x της κρυφής λίστας βρούμε το γράμμα το οποίο μάντεψε ο παίχτης πρέπει στην αντίστοιχη θέση της φανερής λίστας να αντικαταστήσουμε το κενό με αυτό το γράμμα. Άρα πρέπει να εκτελέσουμε την εντολή : «αντικατέστησε στοιχείο [x] του [φανερή] με [απάντηση]».


Κατάλληλη χρήση μεταβλητής και λίστας
Ίσως ακόμη για κάποιους από εμάς να μην είναι ακόμη εντελώς ξεκάθαρο πότε πρέπει να χρησιμοποιούμε μεταβλητή και πότε λίστα. Από τις παραπάνω περιγραφές βλέπουμε ότι τα δύο αυτά στοιχεία έχουν αρκετές ομοιότητες μεταξύ τους. Παρατηρούμε ότι και τα δύο αποτελούν δομές αποθήκευσης. Παρ’ όλα αυτά, δεν πρέπει να συγχέουμε τη χρήση τους και το λόγο ύπαρξης του καθενός.
Αρχικά, πρέπει να έχουμε ξεκαθαρίσει στο μυαλό μας ότι οι μεταβλητές χρησιμοποιούνται για την απόδοση τιμής σε ένα χαρακτηριστικό ενός αντικειμένου, για παράδειγμα το «χρώμα_ματιών» του αντικειμένου «Κατερίνα». Ακόμη, οι μεταβλητές μπορούν να χρησιμοποιηθούν ως θέσεις προσωρινής αποθήκευσης για χαρακτηριστικά που η τιμή τους μπορεί να αλλάξει κατά την εκτέλεση ενός προγράμματος. Ένα τέτοιο παράδειγμα θα μπορούσε να είναι οι δύο μεταβλητές που κρατούν το σκορ του αγώνα για κάθε μία από τις δύο ομάδες αντίστοιχα ή η μεταβλητή που κρατάει τις ελεύθερες θέσεις σε ένα parking για να δούμε αν υπάρχει χώρος για άλλα αυτοκίνητα.
Από την άλλη πλευρά, η λίστα μπορεί να μας προσφέρει τη δυνατότητα της αποθήκευσης δεδομένων, χωρίς να απαιτείται να γνωρίζουμε εξ αρχής τον αριθμό των δεδομένων που θέλουμε να κρατήσουμε. Για παράδειγμα, σε έναν τηλεφωνικό κατάλογο δε γνωρίζουμε από την αρχή τον αριθμό των τηλεφώνων που θα καταχωρηθούν, οπότε για κάθε νέο αριθμό που καταχωρούμε στον κατάλογο προσθέτουμε και μία ακόμη θέση στη λίστα. Ακόμη μία ιδιότητα της λίστας που την καθιστά ιδιαίτερα χρήσιμη είναι ότι μπορεί να διαχειρίζεται μεγάλο πλήθος δεδομένων. Ας σκεφτούμε το προηγούμενο παράδειγμα όπου ο τηλεφωνικός κατάλογος μπορεί να είναι κάποιας μεγάλης πόλης, για την οποία ο αριθμός τηλεφώνων των κατοίκων της είναι από την αρχή γνωστός. Αν θέλαμε να κρατήσουμε το κάθε τηλέφωνο σε μία ξεχωριστή μεταβλητή θα ήταν πολύ δύσκολο να δημιουργήσουμε και να διαχειριστούμε τόσες πολλές μεταβλητές. Επιπλέον η λίστα μας προσφέρει τη δυνατότητα της ταξινόμησης των δεδομένων που έχουμε εισάγει σε αυτή αλλά και αυτή της αναζήτησης. Αυτές οι λειτουργίες θα ήταν χρήσιμες για παράδειγμα σε μία εφαρμογή που χρησιμοποιείται σε ένα κατάστημα ενοικίασης dvd ταινιών. Ο πωλητής θα μπορούσε να χειρίζεται το πρόγραμμα αυτό για να κάνει αναζήτηση στη λίστα των ταινιών που διαθέτει το κατάστημα έτσι ώστε να βρει αν υπάρχει η ταινία που ζήτησε κάποιος πελάτης. Ακόμη, θα έχει τη δυνατότητα να ταξινομεί τη λίστα με τις ταινίες με αλφαβητική σειρά.


Πίνακας διαθέσιμων εντολών για τις Μεταβλητές
prosthese_se_lista.JPG
Προσθέτει ένα αντικείμενο στη λίστα "συνταγή"
diegrapse_apo_lista.JPG
Διαφράφει ένα αντικείμενο από τη λίστα "συνταγή"
parembale_se_lista.JPG
Παρεμβάλει ένα αντικείμενο σε συγκεκριμένη θέση της λίστας "συνταγή", πηγαίνοντας τα υπόλοιπα αντικείμενα κατά μία θέση κάτω.
antikatestise_se_lista.JPG
Αντικαθιστά ένα στοιχείο μιας συκγεγριμένης θέσης της λίστας "συνταγή", με ένα άλλο.
stoieio_apo_lista.JPG
Δίνει το στοιχείο μίας θέσης της λίστας που του ορίζουμε.
mikos_listas.JPG
Δίνει το μήκος, δηλαδή το πλήθος αντικεινένων της λίστας "συνταγή".
lista_periexei.JPG
Επιστρέφει "Αλήθεια" αν η λίστα "συνταγή" περιέχει το αντικείμενο, αλλιώς επιστρέφει "Λάθος".

4. Παραδείγματα
( Να εφαρμόζουν τη χρήση της μεταβλητής και τη χρήση της λίστας σε παραδείγματα.
Να είναι σε θέση να εφαρμόσουν τελεστές και ελέγχους στις μεταβλητές )

Παραδείγματα με μεταβλητές
Στα προηγούμενα κεφάλαια έχουμε δει και έχουμε δημιουργήσει αρκετές εφαρμογές και παιχνίδια τα οποία θα αποκτούσαν μεγαλύτερο ενδιαφέρον αν μπορούσαμε να κρατήσουμε κάποιο σκορ έτσι ώστε να ελέγχουμε τις επιδόσεις μας. Για να πετύχουμε αυτό το στόχο θα χρειαστούμε τη βοήθεια των μεταβλητών. Ας δούμε λοιπόν πώς κατασκευάζουμε αρχικά ένα απλό παιχνίδι στο οποίο θα πρέπει να συγκεντρώσουμε όσους περισσότερους πόντους μπορούμε.

- Παράδειγμα 1 –
Bouncing Balls
Στη σκηνή υπάρχουν τρείς μπάλες και κάθε μία έχει διαφορετικό μέγεθος από τις άλλες. Όλες οι μπάλες χοροπηδούν ταυτόχρονα προς όλες τις κατευθύνσεις. Κάθε φορά που πετυχαίνεις μία μπάλα με το ποντίκι σου, το σκορ σου αυξάνεται. Όσο πιο μικρή η μπάλα, τόσο περισσότεροι και οι βαθμοί σου! Πόσο καλό στόχο έχεις;

Ας δημιουργήσουμε!

Αντικείμενα
Αρχικά πρέπει να ορίσουμε ποια θα είναι τα αντικείμενά μας. Παρατηρούμε ότι πρέπει να υπάρχουν τρεις μπάλες οι οποίες θα κινούνται συνεχώς. Εφόσον γίνεται αναφορά στο μέγεθος της μπάλας με στόχο τη συγκέντρωση περισσότερων βαθμών όταν αυτή είναι πιο μικρή, θα διαλέξουμε τις μπάλες έτσι ώστε να έχουν διαφορετικό μέγεθος μεταξύ τους. Έτσι, μπορούμε να χρησιμοποιήσουμε μία μπάλα θαλάσσης ως τη μεγαλύτερη, μία μπάλα του μπάσκετ ως μεσαίου μεγέθους μπάλα και μία μπάλα του τένις η οποία θα είναι και η μικρότερη
(βλέπε Εικόνα 14.35). Τα αντίστοιχα ονόματα των αντικειμένων είναι μπάλα_θαλάσσης, μπάλα_μπάσκετ και μπάλα_τένις. Την μπάλα του τένις μπορείτε να τη βρείτε στις εικόνες που δίνονται από το Scratch, ενώ οι συγκεκριμένες εικόνες για την μπάλα του μπάσκετ και την μπάλα θαλάσσης έχουν βρεθεί μέσω του Internet. Για το σκηνικό μπορούμε να επιλέξουμε ένα υπόβαθρο είτε από αυτά που διαθέτει το Scratch, είτε μπορούμε να δημιουργήσουμε εμείς κάποιο. Στη συγκεκριμένη περίπτωση, έχει επιλεγεί το υπόβαθρο brick-wall1 του Scratch.

14balls1.JPG
Εικόνα 14.35

Μπάλα του μπάσκετ
Κατά την έναρξη του παιχνιδιού όλες οι μπάλες πρέπει να κινούνται άτακτα πάνω στη σκηνή και η κίνησή τους να είναι συνεχής. Ας ασχοληθούμε προς το παρόν με την κίνηση της μπάλας του μπάσκετ.
Η μπάλα του μπάσκετ θα κινείται από την έναρξη του παιχνιδιού μέχρις ότου ο παίκτης να τερματίσει ο ίδιος το παιχνίδι. Επιπλέον, αφού η κίνηση της δε σταματάει, θα πρέπει να προβλέψουμε και το γεγονός που θα φτάσει στα όρια της σκηνής, έτσι ώστε μετά από τη στιγμή αυτή η μπάλα να συνεχίσει να κινείται αλλάζοντας πιθανώς κατεύθυνση. Μία ακόμη ιδιότητα που προσδίδεται στην μπάλα είναι ότι όταν ο παίκτης την ακουμπήσει με το ποντίκι του θα αυξάνονται οι πόντοι του. Με την τελευταία αυτή ιδιότητα θα ασχοληθούμε λίγο πιο κάτω. Μπορείτε να σκεφτείτε, όμως, ποιες είναι οι εντολές που θα βοηθήσουν το αντικείμενο αυτό να κινηθεί;
Για την κίνηση της μπάλας θα χρησιμοποιήσουμε την εντολή «κινήσου [10] βήματα». Όμως, εφόσον θέλουμε να μη σταματάει να κινείται, θα πρέπει η εντολή αυτή να συνδυαστεί με την εντολή «για πάντα». Επίσης, σχετικά με τη στιγμή που η μπάλα θα φτάσει στα όρια της σκηνής για να μπορεί να αναπηδήσει και έτσι να αλλάξει κατεύθυνση, πρέπει ακόμη να χρησιμοποιήσουμε την εντολή «εάν στα όρια, αναπήδησε». Άρα ο κώδικας που προκύπτει από τις εντολές αυτές εμφανίζεται στην Εικόνα
14.36.

Μπάλα του τένις και μπάλα θαλάσσης
Οι μπάλες αυτές θα πρέπει να κινούνται πάνω στη σκηνή με τον ίδιο τρόπο που κινείται και η μπάλα του μπάσκετ, δηλαδή πρέπει η κίνηση τους να έχει τα ίδια χαρακτηριστικά με την κίνηση της μπάλας του μπάσκετ που μόλις καθορίσαμε. Επίσης, όταν ο παίκτης πετύχει με το ποντίκι του κάποια από τις μπάλες αυτές θα πρέπει πάλι να αυξάνεται το σκορ του με τη διαφορά όμως ότι για την μπάλα του τένις οι πόντοι του θα είναι περισσότεροι αφού είναι και η πιο μικρή.
Επομένως, αφού όλες οι μπάλες κινούνται με πανομοιότυπο τρόπο, ο κώδικας της Εικόνας 14.13 είναι κοινός για όλες τις μπάλες
.
14balls2.JPG
Εικόνα 14.36

Ιδέα!
Μπορώ να κάνω τις μπάλες να ξεκινήσουν να κινούνται με διαφορετικές κατευθύνσεις! Για να το πετύχω θα στρίψω την μπλε γραμμή κατεύθυνσης που βρίσκεται πάνω στο κάθε αντικείμενο
(βλέπε Εικόνα 14.37).

14balls3.JPG
Εικόνα 14.37


Πόντοι που συλλέγει ο παίκτης!
Καθώς έχουμε ολοκληρώσει την κίνηση κάθε μπάλας, ήρθε η στιγμή να υλοποιήσουμε τον τρόπο με τον οποίο ο παίκτης θα συγκεντρώνει πόντους ακουμπώντας τις μπάλες. Οι πόντοι θα πρέπει να αποθηκεύονται σε μία μεταβλητή έτσι ώστε να μπορούν να αλλάζουν κατά τη διάρκεια του παιχνιδιού. Άρα, πρέπει να δημιουργήσουμε τη μεταβλητή αυτή. Δίνουμε στη μεταβλητή μας το όνομα «πόντοι» και επιλέγουμε να είναι «Κοινή για όλες τις μορφές» αφού θα πρέπει να μπορεί να τροποποιηθεί από όλες τις μπάλες, δηλαδή από όλα μας τα αντικείμενα.

Σημείωση
Κάθε φορά που ξεκινάει το πρόγραμμα η μεταβλητή πρέπει να είναι αρχικοποιημένη με μηδέν για να είναι αξιόπιστο το σκορ του παίκτη! Άρα στον κώδικα που έχουμε δημιουργήσει για κάθε μπάλα, πρέπει να προσθέσουμε την εντολή «όρισε το [score] σε [0]» (βλέπε Εικόνα 14.38).

14balls4.JPG
Εικόνα 14.38

Κάθε φορά που γίνει κλίκ πάνω σε μία μπάλα, οι πόντοι που συλλέγει ο παίκτης πρέπει να αυξάνονται. Ας υποθέσουμε ότι αν πετύχει την μπάλα θαλάσσης κερδίζει 1 πόντο, την μπάλα του μπάσκετ 2 και την μπάλα του τένις 4 πόντους. Επομένως, πρέπει να χρησιμοποιήσουμε την εντολή «όταν στο [αντικείμενο] γίνει κλίκ» για κάθε αντικείμενο αντίστοιχα, με στόχο να μπορούμε να αλλάζουμε την τιμή της μεταβλητής ανάλογα με το ποια μπάλα έχει πετύχει ο παίκτης. Για την αύξηση της τιμής της μεταβλητής θα χρειαστούμε την εντολή «άλλαξε [πόντοι] κατά [1]» , όπου ο αριθμός κατά τον οποίο αυξάνεται η μεταβλητή εξαρτάται από το είδος της μπάλας (1 για την μπάλα θαλάσσης, 2 για την μπάλα του μπάσκετ και 4 για την μπάλα του τένις). Άρα, για το συνολικό κώδικα που προκύπτει για κάθε μπάλα, βλέπε Εικόνα 14.39.

Μπάλα του μπάσκετ Μπάλα του τένις Μπάλα θαλάσσης
14balls5.JPG14balls6a.JPG 14balls7a.JPG
Εικόνα 14.39

Παρατηρούμε, όμως, ότι στους παραπάνω κώδικες η εντολή «όρισε το [πόντοι] σε [0]» υπάρχει σε όλα τα αντικείμενα κάτι που αποτελεί πλεονασμό. Θα ήταν προτιμότερο να εκτελεστεί η αρχικοποίηση της μεταβλητής μία μόνο φορά κατά την έναρξη του προγράμματος. Για να πραγματοποιηθεί αυτό αρκεί να τοποθετήσουμε την εντολή αυτή σε ένα μόνο αντικείμενο το οποίο μπορούμε να επιλέξουμε τυχαία ή να την τοποθετήσουμε στο σενάριο του σκηνικού απομακρύνοντας την από τα σενάρια των αντικειμένων. Αν επιλέξουμε να κάνουμε το δεύτερο, τότε το σενάριο του σκηνικού θα έχει τη μορφή που παρουσιάζεται στην Εικόνα 14.40 . Ενώ παράλληλα θα απομακρύνουμε την εντολή αυτή από τους κώδικες των τριών αντικειμένων.

14balls8.JPG
Εικόνα 14.40

Για διασκέδαση!!
Τι θα λέγατε να δυσκολεύαμε τον παίκτη λίγο περισσότερο να βρει το στόχο του; Αυτό μπορεί να γίνει εύκολα αυξάνοντας τα βήματα με τα οποία κινείται η μικρότερη μπάλα, δηλαδή η μπάλα του τένις. Επίσης, μπορούμε να μειώσουμε και την ταχύτητα, δηλαδή τα βήματα με τα οποία κινείται η μπάλα θαλάσσης, έτσι ώστε η κίνηση όλων των αντικειμένων να είναι πιο αληθοφανής.


Ο κώδικας του παραπάνω παραδείγματος είναι:

(Το παραπάνω παράδειγμα έχει στηριχθεί στο:
http://www.robodome.ca/scratch_taskcards/TASK%20CARDS%208.pdf)

Παραδείγματα με λίστες
Όπως οι μεταβλητές, έτσι και οι λίστες μπορούν να μας βοηθήσουν να δημιουργήσουμε πιο πρωτότυπα παιχνίδια και προγράμματα αλλά και να προσομοιώσουμε καταστάσεις της καθημερινής μας ζωής.


- Παράδειγμα 1 - Κρεμάλα
Τι θα λέγατε να παίξουμε μία κρεμάλα; Ας επαναλάβουμε τους κανόνες για να είμαστε σίγουροι ότι το παιχνίδι θα είναι δίκαιο! Στο παιχνίδι αυτό χρειαζόμαστε δύο παίκτες τουλάχιστον. Ο πρώτος παίκτης είναι αυτός που διαλέγει τη λέξη και φανερώνει μόνο το πρώτο και το τελευταίο γράμμα της καθώς και πόσες κενές θέσεις υπάρχουν για τα γράμματα που λείπουν. Ο δεύτερος παίκτης, μαζί με τους υπόλοιπους αν υπάρχουν, ψάχνει να βρει τη λέξη που έχει στο μυαλό του ο πρώτος προτείνοντας κάθε φόρα κάποιο πιθανό γράμμα. Όμως οι ευκαιρίες του δεν είναι απεριόριστες! Έτσι όταν τις εξαντλήσει, χάνει!

Ας δημιουργήσουμε!

Αντικείμενα και Σκηνικό
Στο συγκεκριμένο παιχνίδι παρατηρούμε ότι δε χρειαζόμαστε παραπάνω από ένα αντικείμενα. Ο μόνος λόγος για τον οποίο θα χρησιμοποιήσουμε το αντικείμενο είναι για να κάνουμε το παιχνίδι πιο διαδραστικό και να μπορούμε να προτρέπουμε τον παίκτη να ακολουθεί τις οδηγίες μας. Συγκεκριμένα, το αντικείμενο που θα χρησιμοποιήσουμε θα λειτουργεί σαν τον παρουσιαστή ενός τηλεπαιχνιδιού που ανακοινώνει στους παίκτες τους κανόνες. Στο σενάριο βέβαια του αντικειμένου αυτού θα πραγματοποιείται και η λειτουργικότητα του παιχνιδιού.
Μπορείτε να διαλέξετε όποια μορφή θέλετε είτε από τους χαρακτήρες που παρέχει το Scratch είτε από το Internet, αφού δεν παίζει κάποιο σημαντικό ρόλο. Όμως και ο ρόλος του σκηνικού δεν είναι σημαντικός. Έτσι στο παράδειγμα αυτό χρησιμοποιείται το αντικείμενο cat1-a από αυτά που παρέχει το Scratch, το οποίο έχουμε ονομάσει cat, και το σκηνικό είναι το αρχικό λευκό το οποίο εμφανίζεται με την έναρξη του Scratch (βλέπε
Εικόνα 14.41).

kremala1.JPG

Εικόνα 14.41

Υλοποίηση του παιχνιδιού
Όπως αναφέρεται και στην εκφώνηση, στο παιχνίδι αυτό πραγματοποιείται η εισαγωγή μίας λέξης από τον πρώτο παίκτη, η απόκρυψή της έτσι ώστε ο δεύτερος παίκτης να μην τη γνωρίζει, η εμφάνιση του αρχικού και του τελευταίου γράμματός της με ενδιάμεσα κενά για τα γράμματα που λείπουν, η εισαγωγή γραμμάτων από το δεύτερο παίκτη, η προσθήκη των γραμμάτων αυτών στις σωστές θέσεις της λέξης που εμφανίζεται με τα κενά, αν αυτά τα γράμματα υπάρχουν σε αυτή, και ο έλεγχος των ευκαιριών που έχει ακόμη ο δεύτερος παίκτης στη διάθεση του για να τη βρει. Αυτές λοιπόν είναι και οι λειτουργίες που πρέπει να υλοποιήσουμε. Ας ξεκινήσουμε.

Εισαγωγή λέξης από τον πρώτο παίκτη
Καθώς ο πρώτος παίκτης εισάγει τη λέξη, πρέπει τα γράμματα της λέξης αυτής να αποθηκεύονται ξεχωριστά έτσι ώστε στη συνέχεια κατά την εισαγωγή των γραμμάτων από το δεύτερο παίκτη να μπορεί να γίνεται ο έλεγχος ύπαρξης τους στη λέξη αυτή. Άρα, η εισαγωγή της λέξης πρέπει να γίνεται δίνοντας κάθε φορά το επόμενο γράμμα. Σε αυτό θα μας βοηθήσουν η εντολή «ρώτησε [ ] και περίμενε» και η μεταβλητή «απάντηση» από την παλέτα Αισθητήρες. Για να μπορέσουμε όμως να έχουμε τη λέξη που εισάγει ο παίκτης σχηματισμένη, δηλαδή να έχουμε τα γράμματα με τη σειρά για να προκύπτει η λέξη, πρέπει καθώς εισάγονται τα γράμματα να αποθηκεύονται ταυτόχρονα σε μία λίστα. Ας δημιουργήσουμε, λοιπόν, αυτή τη λίστα δίνοντάς της το όνομα «κρυφή» μέσω της επιλογής δημιουργίας λίστας της παλέτας Μεταβλητές. Η λίστα αυτή μπορεί να είναι είτε «Για όλες τις μορφές (κοινή)» είτε «Μόνο γι’ αυτή τη μορφή». Στο παράδειγμα αυτό έχει δημιουργηθεί ως κοινή για όλες τις μορφές. Μπορείτε να σκεφτείτε πώς θα γίνει η εισαγωγή και η προσθήκη των γραμμάτων στη λίστα με τη βοήθεια της εντολής και της μεταβλητής της παλέτας των Αισθητήρων;
Αρχικά, κατανοούμε ότι εφόσον ο παίκτης θα δίνει τα γράμματα ξεχωριστά, θα χρειαστούμε κάποια εντολή επανάληψης έτσι ώστε να επαναλαμβάνεται η διαδικασία εισαγωγής γράμματος. Η επανάληψη αυτή όμως πρέπει να τερματίζεται για να μπορέσει να συνεχιστεί το παιχνίδι. Επομένως, θα χρειαστούμε μία συνθήκη τερματισμού της επανάληψης. Ας κρατήσουμε αυτή τη σκέψη για λίγο στην άκρη και ας ασχοληθούμε με την εισαγωγή των γραμμάτων που θα πραγματοποιείται στο σώμα της επανάληψης. Επειδή χρειαζόμαστε επανάληψη με συνθήκη τερματισμού θα χρησιμοποιήσουμε την εντολή «επανέλαβε ώσπου { }» από την παλέτα Έλεγχος. Στο εσωτερικό της επανάληψης αυτής θα χρειαστούμε την εντολή «ρώτησε [ ] και περίμενε» και τη μεταβλητή «απάντηση» από την παλέτα Αισθητήρες που αναφέρθηκαν στην προηγούμενη παράγραφο. Όπως είπαμε, ταυτόχρονα με την εισαγωγή των γραμμάτων από τον παίκτη θα γίνεται και η εισαγωγή των γραμμάτων στη λίστα
word, γεγονός που θα γίνει μέσω της εντολής «πρόσθεσε [ ] στο [
κρυφή. Γνωρίζουμε ότι τα γράμματα που εισάγει ο χρήστης αποθηκεύονται στη μεταβλητή «απάντηση», άρα το περιεχόμενο της μεταβλητής αυτής θα εισάγουμε στη λίστα. Έτσι, η εντολή «πρόσθεσε [ ] στο [κρυφήθα γίνει «πρόσθεσε [απάντηση] στο [κρυφή. Με την εντολή «ρώτησε [ ] και περίμενε» το αντικείμενό μας δηλώνει στον παίκτη ότι η λέξη που έχει επιλέξει, θα εισαχθεί γράμμα-γράμμα. Για τον κώδικα που έχει προκύψει ως τώρα, βλέπε Εικόνα 14.42.

kremala2a.JPG

Εικόνα 14.42

Ήρθε όμως η στιγμή να αποφασίσουμε ποια θα είναι η συνθήκη τερματισμού της επανάληψης. Εφόσον χρησιμοποιούμε τη μεταβλητή «απάντηση» για την εισαγωγή γραμμάτων, μπορούμε να τη χρησιμοποιήσουμε και για τη λήξη αυτής της διαδικασίας επιλέγοντας ένα σύμβολο το οποίο όταν πατηθεί από τον παίκτη να αποτελεί το σήμα τερματισμού. Στο παράδειγμα μας έχουμε επιλέξει το κενό. Επομένως, η συνθήκη παίρνει τη μορφή «[απάντηση] = [ ]» με τη βοήθεια του τελεστή της ισότητας από την παλέτα Τελεστές. Όταν ο παίκτης πατήσει το κενό, όμως, αυτό θα προστεθεί στη λίστα, γεγονός που δεν είναι επιθυμητό. Τότε, λοιπόν, πρέπει να αφαιρέσουμε από τη λίστα το τελευταίο αντικείμενο που προστέθηκε. Για αυτόν το σκοπό θα χρειαστούμε την εντολή «διέγραψε [τελευταίο] από το [κρυφή. Όμως πρέπει να δηλώνεται στον παίκτη ότι για να τελειώσει η διαδικασία εισαγωγής της λέξης του πρέπει να πατήσει το κενό. Αυτό θα γίνει με τη βοήθεια της εντολής «πες [ ] για [2] δευτερόλεπτα» από την παλέτα Όψεις. Ο κώδικας που έχει σχηματιστεί παρουσιάζεται στην Εικόνα 14.43 .

kremala3a.JPG

Εικόνα 14.43

Η απόκρυψη της λέξης αυτής, δηλαδή της λίστας που περιέχει τη λέξη, από το δεύτερο παίκτη θα γίνει απενεργοποιώντας την εμφάνιση της στη σκηνή από την παλέτα Μεταβλητές.

Δημιουργία λέξης με κενά
Ήρθε η στιγμή να υλοποιήσουμε το παιχνίδι από την πλευρά του δεύτερου παίκτη. Αρχικά, πρέπει να δημιουργήσουμε τη λέξη που θα εμφανίζεται στον παίκτη αυτό η οποία θα έχει ένα γράμμα στην αρχή και ένα στο τέλος της και κενά στις ενδιάμεσες θέσεις. Τα γράμματα που εμφανίζονται πρέπει να είναι τα γράμματα που υπάρχουν στις αντίστοιχες θέσεις της λίστας «κρυφή». Σκεφτόμενοι όπως και πριν και αυτή η λέξη θα αποθηκευτεί σε μορφή λίστας έτσι ώστε να είμαστε σε θέση να αντικαταστήσουμε τα κενά της με τις επιλογές γραμμάτων του παίκτη. Θα δημιουργήσουμε λοιπόν μία λίστα. Στο παράδειγμα έχουμε ονομάσει τη λίστα αυτή «φανερή» και όπως και η «κρυφή» θα είναι κοινή για όλες τις μορφές.
Για την εισαγωγή στη λίστα «φανερή» του πρώτου και του τελευταίου στοιχείου της λίστας «κρυφή» θα χρειαστούμε τις εντολές «πρόσθεσε [] στο [φανερή
, «στοιχείο [τελευταίο] του [κρυφήκαι «στοιχείο [1] του [κρυφή(βλέπε Εικόνα 14.44). Τότε τα στοιχεία αυτά θα εισαχθούν στην πρώτη και δεύτερη θέση αντίστοιχα της λίστας letters, ενώ δε θα υπάρχουν κενά στοιχεία για τα γράμματα που λείπουν. Άρα πρέπει να εισάγουμε αυτά τα κενά. Το πλήθος των κενών που θα προσθέσουμε στη λίστα θα είναι ίσο με το πλήθος των στοιχείων της λίστας «κρυφή» μείον 2, αφού έχουμε ήδη εισάγει δύο από τα γράμματα της αρχικής λέξης. Το πλήθος της λίστας word θα το πάρουμε με την εντολή «μήκος του [κρυφή, ενώ η αφαίρεση θα πραγματοποιηθεί με τη βοήθεια του τελεστή αφαίρεσης «[] – []». Θα επαναλάβουμε δηλαδή τη διαδικασία της εισαγωγής κενών τόσες φορές όσες πρέπει να είναι και το πλήθος τους με τη βοήθεια της εντολής «επανέλαβε []». Για την εισαγωγή θα χρησιμοποιήσουμε την εντολή «παρέμβαλε το [ ] ση θέση [2] του [φανερή. Με την εντολή αυτή ουσιαστικά παρεμβάλουμε κάθε φορά στη θέση 2 της λίστας «φανερή» ένα κενό μετατοπίζοντας τα στοιχεία που βρίσκονται στις θέσεις κάτω από αυτή μία θέση προς τα κάτω δημιουργώντας έτσι τα απαραίτητα κενά (βλέπε Εικόνα 14.44).

kremala4a.JPG
Εικόνα 14.44

Η λίστα «φανερή» θέλουμε να είναι αυτή που θα εμφανίζεται στον παίκτη, οπότε πρέπει να επιλέξουμε την εμφάνιση της από την παλέτα Μεταβλητές.

Εισαγωγή γραμμάτων από το δεύτερο παίκτη
Εφόσον, πλέον, ο δεύτερος παίκτης μπορεί να δει τη λέξη με την οποία θα παίξει, πρέπει να μπορεί να εισάγει τα γράμματα που σκέφτεται ότι μπορεί να κρύβονται πίσω από τα κενά. Για να εισάγει ο παίκτης τα γράμματα θα χρησιμοποιήσουμε ξανά την εντολή «ρώτησε [ ] και περίμενε» σε συνδυασμό με τη μεταβλητή «απάντηση». Όταν ο παίκτης εισάγει το γράμμα που επιθυμεί πρέπει να ελέγχεται αν το γράμμα αυτό υπάρχει μέσα στη λέξη που βρίσκεται στη λίστα «κρυφή». Ο έλεγχος αυτός θα γίνει με τη βοήθεια της εντολής «εάν … » από την παλέτα Έλεγχος και την εντολή συνθήκης «[κρυφή
] περιέχει [απάντηση]», όπου απάντηση είναι η μεταβλητή «απάντηση» η οποία περιέχει την επιλογή του χρήστη. Εάν ο έλεγχος αυτός είναι αληθής, δηλαδή αν το γράμμα περιέχεται στη λέξη τότε θα πρέπει να βρούμε σε ποια θέση της λέξης βρίσκεται. Για να εξετάσουμε τα γράμματα της λίστας «κρυφή» ένα προς ένα θα χρειαστούμε επανάληψη. Από τα γράμματα που θέλουμε όμως να εξετάσουμε εξαιρούνται το πρώτο και το τελευταίο. Έτσι όπως και προηγουμένως η επανάληψη θα πραγματοποιηθεί ««μήκος του [κρυφή]» - [2]» φορές με τη χρήση της εντολής «επανέλαβε []». Όμως αφού θέλουμε να εξετάζουμε από το δεύτερο στοιχείο της λίστας word και κάτω θα χρειαστούμε έναν μετρητή ο οποίος θα μεγαλώνει καθώς αλλάζουμε θέση. Το ρόλο του μετρητή θα παίξει μία μεταβλητή την οποία έχουμε ονομάσει x και η οποία είναι κοινή για όλες τις μορφές. Η μεταβλητή αυτή θα πρέπει να αρχικοποιείται κάθε φορά που ο παίκτης εισάγει ένα νέο γράμμα για έλεγχο. Η αρχικοποίηση της θα γίνει με την εντολή «όρισε το [x] σε [2]», το 2 όπως εξηγήσαμε οφείλεται στο ότι με τη μεταβλητή αυτή εξετάζουμε από το δεύτερο στοιχείο της λίστας και μετά. Ο κώδικας που έχει σχηματιστεί είναι αυτός της Εικόνας 14.45.

kremala5a.JPG
Εικόνα 14.45

Αυτό που ουσιαστικά θέλουμε να εξετάσουμε είναι αν το γράμμα που επέλεξε ο δεύτερος παίκτης είναι ίδιο με το στοιχείο που βρίσκεται στη συγκεκριμένη θέση της λίστας «κρυφή». Για να το πετύχουμε αυτό θα χρησιμοποιήσουμε την εντολή ελέγχου «εάν … » σε συνδυασμό με τον τελεστή συνθήκης ισότητας από την παλέτα των Τελεστών. Η ισότητα που θα πρέπει να εξεταστεί είναι αν το στοιχείο που βρίσκεται στη θέση x της λίστας «κρυφή» είναι ίσο με αυτό που βρίσκεται στη μεταβλητή «απάντηση». Επομένως, η εντολή που χρειαζόμαστε είναι η «στοιχείο [x] του [κρυφή]». Ο έλεγχος αυτός παίρνει τη μορφή της Εικόνας 14.46.

kremala6a.JPG
Εικόνα 14.46

Αν η συνθήκη αυτή είναι αληθής, τότε στη θέση του κενού πρέπει να μπει το γράμμα που περιέχει η μεταβλητή «απάντηση». Αυτό θα γίνει με την εντολή «αντικατέστησε στοιχείο [x] του [φανερή] με [απάντηση]». Θυμηθείτε ότι η μεταβλητή x μας δίνει τη θέση της λίστας «κρυφή» στην οποία βρίσκεται το γράμμα που εισήγαγε ο παίκτης και κατ’ επέκταση τη θέση στη λίστα «φανερή» που θα γίνει η αντικατάσταση. Το γράμμα που έχει επιλέξει ο παίκτης , όμως, μπορεί να βρίσκεται σε περισσότερες από μία θέσεις, άρα ο έλεγχος πρέπει να συνεχιστεί για όλα τα στοιχεία που απομένουν. Αυτό επιτυγχάνεται αυξάνοντας τη μεταβλητή x έτσι ώστε να δείχνει στο επόμενο στοιχείο. Η αύξηση θα γίνει με την εντολή «άλλαξε [x] κατά [1]». Επομένως, το συγκεκριμένο τμήμα κώδικα που αφορά την είσοδο του γράμματος από τον παίκτη και την αντικατάσταση του στη λίστα είναι αυτό που παρουσιάζεται στην Εικόνα 14.47.

kremala7a.JPG
Εικόνα 14.47

Εάν όμως η συνθήκη της Εικόνας είναι ψευδής, δηλαδή αν το γράμμα που προτείνει ο παίκτης δεν υπάρχει μέσα στη λέξη που ψάχνει, τότε έχει κάνει λάθος. Αλλά πόσα λάθη θα επιτρέψουμε στον παίκτη να κάνει; Έστω ότι δίνουμε στον παίκτη επτά ευκαιρίες. Αυτός ο αριθμός θα πρέπει να μειώνεται κάθε φορά που ο παίκτης κάνει λάθος και όταν μηδενιστεί να τερματίζεται και το παιχνίδι. Για να μπορούν όμως να γίνονται οι ενέργειες αυτές πρέπει ο αριθμός των λαθών να αποθηκεύεται σε μία μεταβλητή. Δημιουργείστε, λοιπόν, τη μεταβλητή αυτή. Στο παράδειγμα αυτό της έχει δοθεί το όνομα «λάθη» και είναι κοινή για όλες τις μορφές.
Ας υλοποιήσουμε τη λειτουργικότητα της μεταβλητής «λάθη» με χρήση εντολών. Αρχικά, η μεταβλητή αυτή πρέπει να αρχικοποιηθεί με την τιμή 7, αφού τόσες είναι οι ευκαιρίες λαθών. Η αρχικοποίηση της θα γίνει με την εντολή «όρισε το [λάθη
] σε [7]» η οποία πρέπει να τοποθετηθεί στην αρχή του κώδικα (βλέπε Εικόνα 14.52). Επίσης, η διαδικασία εισαγωγής γραμμάτων από το δεύτερο παίκτη θα μπορεί να γίνεται μόνο αν η μεταβλητή «λάθη» δεν έχει μηδενιστεί. Για το λόγο αυτό θα χρειαστεί να εισάγουμε μία εντολή επανάληψης με έλεγχο έξω από όλο τον κώδικα που έχουμε δημιουργήσει στο στάδιο που παρουσιάζει η Εικόνα 14.48 . Η διαδικασία αυτή θα πρέπει να επαναλαμβάνεται για όσο η τιμή της μεταβλητής «λάθη» είναι θετική, δηλαδή διάφορη του μηδενός. Αυτή τη δυνατότητα μας τη δίνει η εντολή επανάληψης «για πάντα εάν …» από την παλέτα Έλεγχος σε συνδυασμό με τον τελεστή συνθήκης ανισότητας «[λάθη] > [0]». Επομένως, για τον κώδικα που προκύπτει, βλέπε Εικόνα 14.48 .

kremala8a.JPG
Εικόνα 14.48

Η μεταβλητή «λάθη», όπως είπαμε, πρέπει να μειώνεται κάθε φορά που ο παίκτης κάνει λάθος, δηλαδή κάθε φορά που επιλέγει γράμμα που δεν υπάρχει στη λέξη της λίστας «κρυφή». Αυτή η ενέργεια μπορεί να πραγματοποιηθεί κάνοντας έναν ακόμη έλεγχο. Στον έλεγχο αυτό θα εξετάζεται αν το γράμμα που βρίσκεται στη μεταβλητή «απάντηση» δεν περιέχεται στη λίστα «κρυφή». Την άρνηση αυτή στη συνθήκη ελέγχου μας την παρέχει ο λογικός τελεστής «όχι []» από την παλέτα Τελεστές. Σε αυτή την περίπτωση η τιμή της μεταβλητής «λάθη» θα μειώνεται κατά 1 με τη χρήση της εντολής «άλλαξε [λα΄θη] κατά [-1]». Ο έλεγχος αυτός παρουσιάζεται στην Εικόνα 14.49.

kremala9a.JPG
Εικόνα 14.49

Ο έλεγχος αυτός συμπεριλαμβάνεται στο σώμα της επανάληψης «για πάντα εάν …», έτσι ώστε να πραγματοποιείται κάθε φορά. Επειδή ο παίκτης είναι καλό να γνωρίζει πόσες ευκαιρίες του απομένουν, η μεταβλητή αυτή θα εμφανίζεται στη σκηνή κατά τη διάρκεια του παιχνιδιού. Αυτό μπορούμε να το εξασφαλίσουμε με την εντολή «εμφάνισε τη μεταβλητή [λάθη η οποία πρέπει να τοποθετηθεί στην αρχή του κώδικα (βλέπε Εικόνες 14.52 και 14.53).
Καλό, επίσης, θα είναι ο παίκτης να μπορεί να βλέπει και ποια γράμματα έχει πει έως τώρα είτε αυτά είναι λάθος είτε σωστά. Αυτό θα τον βοηθήσει να μη διαλέξει ξανά γράμματα που ήταν λανθασμένα χάνοντας έτσι κι άλλες ευκαιρίες. Αυτή η λειτουργικότητα μπορεί να υλοποιηθεί με τη βοήθεια μίας ακόμα λίστας που θα εμφανίζεται στη σκηνή. Τη λίστα αυτή την έχουμε ονομάσει «γράμματα», είναι κοινή για όλα τις μορφές, όπως και οι προηγούμενες, και σε αυτή εισάγεται κάθε φορά η επιλογή του παίκτη, δηλαδή η τιμή της μεταβλητής «απάντηση» μέσω της εντολής «πρόσθεσε [απάντηση] στο [γράμματα
η οποία θα τοποθετηθεί μέσα στην επανάληψη «για πάντα εάν …» πριν από τους ελέγχους (βλέπε Εικόνες 14.52 και 14.53).

Τερματισμός του παιχνιδιού
Ο τερματισμός του παιχνιδιού μπορεί να γίνει με δύο τρόπους. Είτε ο παίκτης να βρει τη λέξη, είτε να κάνει 7 λάθη και να μην καταφέρει να τη βρει. Στην πρώτη περίπτωση, στη λίστα «φανερή» όλα τα κενά θα έχουν αντικατασταθεί με γράμματα γεγονός που μας βοηθάει να υλοποιήσουμε τον έλεγχο που χρειαζόμαστε για να τερματιστεί το παιχνίδι. Εφόσον δε θα υπάρχουν πια κενά στη λίστα «φανερή», ο έλεγχος θα γίνει με τη βοήθεια του λογικού τελεστή άρνησης «όχι []» και της εντολής συνθήκης «[φανερή
] περιέχει [ ]». Όταν η συνθήκη αυτή γίνει αληθής, τότε θα πρέπει ο παρουσιαστής μας να δηλώνει στον παίκτη ότι κέρδισε και να τερματίζεται το παιχνίδι. Όλες αυτές οι εντολές εμφανίζονται στην Εικόνα 14.50.

kremala10a.JPG
Εικόνα 14.50

Στην περίπτωση, όμως, που ο παίκτης έχει εξαντλήσει όλες του τις ευκαιρίες, δηλαδή όταν η μεταβλητή «λάθη» έχει γίνει 0, το παιχνίδι πρέπει πάλι να τερματίζεται και να ανακοινώνεται στον παίκτη ότι δε βρήκε τη λέξη. Ο έλεγχος θα υλοποιηθεί με τη βοήθεια του τελεστή ισότητας «[λάθη
] = [0]». Τότε ο κώδικας που προκύπτει παρουσιάζεται στην Εικόνα 14.51 .

kremala11a.JPG
Εικόνα 14.51

Σημείωση
Τι θα γίνει με τις λίστες όμως αν οι παίκτες θέλουν να παίξουν ένα δεύτερο γύρο; Οι λίστες θα περιέχουν τις λέξεις και τα γράμματα από τον πρώτο γύρο, γεγονός που δεν είναι επιθυμητό. Για το λόγο αυτό πρέπει στην αρχή του κώδικα να διαγράφουμε όλα τα περιεχόμενα και των τριών λιστών. Αυτό θα πραγματοποιηθεί με την εντολή «διέγραψε [όλα] από το [φανερή
/κρυφή/γράμματα]» (βλέπε Εικόνες 14.52 και 14.53).

Κώδικας
Ο συνολικός κώδικας του παραδείγματος αυτού δίνεται στις Εικόνες
Εικόνα 14.52 και 14.53 .
kremala12a.JPG

Εικόνα 14.52
kremala13a.JPG
Εικόνα 14.53

(Ο κώδικας των Εικόνων 14.52 και 14.53 πρέπει να είναι ενωμένος)
Επίσης, η σκηνή όταν ξεκινάει το παιχνίδι πρέπει να έχει τη μορφή της Εικόνας 14.54.


kremala14a.JPG
Εικόνα 14.54


- Παράδειγμα 2 – Love chase
Τι θα λέγατε για ένα κυνηγητό; Όταν ακούμε κυνηγητό μας έρχονται στο μυαλό διάφορες ιστορίες όπως ένα περιπολικό να κυνηγάει το αυτοκίνητο των ληστών ή ακόμη και το παιδικό παιχνίδι όπου ένας παίκτης καλείται να πιάσει όλους τους υπόλοιπους. Εδώ θα δημιουργήσουμε ένα διαφορετικό είδος κυνηγητού. Πόσοι από εσάς δεν έχετε φανταστεί να σας κυνηγάει το αγόρι ή το κορίτσι των ονείρων σας; Αυτό όμως μερικές φορές μπορεί να καταλήξει ενοχλητικό. Στη δική μας ιστορία ο κύριος της «παρέας» δεν αντέχει άλλο το στενό μαρκάρισμα της θαυμάστριας του και τρέχει να γλιτώσει! Εκείνη όμως τον ακολουθεί κατά βήμα, αφού μπορεί και καταγράφει κάθε του κίνηση! Δημιουργήστε δύο φιγούρες της επιλογής σας, έτσι ώστε τη μία να την κινεί ο παίκτης και η δεύτερη να ακολουθεί την πορεία της πρώτης αφήνοντας την αρχικά να κινηθεί για ένα χρονικό διάστημα ελεύθερη.

Ας δημιουργήσουμε!

Αντικείμενα και Σκηνικό
Στο κυνηγητό που θα δημιουργήσουμε συμμετέχουν δύο χαρακτήρες οι οποίοι θα είναι και τα αντικείμενα μας. Το ένα αντικείμενο θα θέλαμε να μοιάζει με αγόρι ενώ το άλλο με κορίτσι. Μπορείτε να επιλέξετε ό, τι θέλετε. Στο συγκεκριμένο παράδειγμα θα χρησιμοποιηθούν από τις μορφές που παρέχει το Scratch στην κατηγορία Fantasy, οι φιγούρες fantasy10 και fantasy14. Στη μορφή fantasy14 έχουν γίνει τροποποιήσεις στο χρώμα με τη βοήθεια της ζωγραφικής (βλέπε Εικόνα ), ενώ και στις δύο μορφές έχει γίνει σμίκρυνση. Το σκηνικό επίσης δεν παίζει ιδιαίτερο ρόλο και για το λόγο αυτό χρησιμοποιούμε ένα απλό λευκό σκηνικό (βλέπε Εικόνα 14.55). Στα αντικείμενα μας έχουμε δώσει τα ονόματα Mr.Blue και Mrs.Pink.

love1.JPG
Εικόνα 14.55

Mr.Blue
Ας σκεφτούμε πιο αναλυτικά τι πρέπει να κάνει αρχικά το αντικείμενο Mr.Blue. Το αντικείμενο αυτό στην ιστορία μας είναι αυτός που τρέχει να ξεφύγει. Επομένως, θα πρέπει ο παίκτης να μπορεί να το μετακινήσει προς όλες τις κατευθύνσεις. Ο πιο εύκολος τρόπος να γίνει η μετακίνηση του είναι χρησιμοποιώντας τα βελάκια. Όμως, εφόσον η Mrs.Pink μπορεί και καταγράφει κάθε του κίνηση, σημαίνει ότι ο Mr.Blue αφήνει πίσω του ίχνη, το οποίο μπορεί να γίνει με τη βοήθεια της πένας. Αλλά είναι αυτό μόνο αρκετό για να τον εντοπίσει; Μάλλον όχι. Για να μπορεί η Mrs.Pink να τον ακολουθεί κατά βήμα πρέπει να γνωρίζει τις ακριβείς συντεταγμένες του κάθε στιγμή. Αυτό μπορεί να συμβεί μόνο αν ο Mr.Blue καταγράφει τη θέση του κάπου που να μπορεί να έχει πρόσβαση και η Mrs.Pink. Μπορείτε να σκεφτείτε που θα καταγράφονται οι συντεταγμένες του;

Mrs.Pink
Η Mrs.Pink, από την άλλη πλευρά, φροντίζει να ενημερώνεται για τη θέση στην οποία βρίσκεται ο Mr.Blue, διαβάζοντας τις καταχωρήσεις του και πηγαίνοντας προς αυτές ελπίζοντας ότι θα τον πετύχει. Όμως, ως φανατική θαυμάστρια που είναι, θέλει να σβήνει τα ίχνη του Mr.Blue έτσι ώστε καμία άλλη να μην μπορεί να τον εντοπίσει. Κάθε φορά που τον βρίσκει σβήνει και τις καταχωρήσεις του για να είναι σίγουρη ότι δε θα τους ακολουθήσει κανείς.

Υλοποίηση του παιχνιδιού

Κίνηση του Mr.Blue
Ας ξεκινήσουμε την υλοποίηση του παιχνιδιού δημιουργώντας την κίνηση του Mr.Blue από τον παίκτη. Για την κίνηση αυτή θα χρησιμοποιήσουμε τα βελάκια. Όταν πατηθεί κάποιο από αυτά ο Mr.Blue θα πρέπει να ανταποκρίνεται κάνοντας ανάλογη κίνηση. Έτσι, για να ελέγχουμε ποιο πλήκτρο έχει πατηθεί θα χρησιμοποιήσουμε την εντολή «όταν το πλήκτρο [] πατηθεί» από την παλέτα Έλεγχος. Για κάθε βελάκι ξεχωριστά πρέπει να δημιουργήσουμε την αντίστοιχη κίνηση.
Όταν πατηθεί, λοιπόν, το δεξί βέλος, τότε το αντικείμενο θα κινείται προς τα δεξιά, αλλάζοντας τη θέση του στον άξονα x. Για να μπορέσουμε να το κάνουμε αυτό θα αλλάζουμε τη μεταβλητή θέση x από την παλέτα Κίνηση κατά μία θετική ποσότητα. Η αλλαγή αυτή θα γίνει με τη βοήθεια της εντολής «άλλαξε x κατά []» από την παλέτα Κίνηση. Αντίστοιχα, όταν πατηθεί το αριστερό βέλος θα πρέπει η θέση x να αλλάζει κατά μία αρνητική ποσότητα.
Όταν, όμως, πατηθούν τα βελάκια πάνω και κάτω τότε η κίνηση του Mr.Blue πρέπει να επηρεάζει τη θέση του στον άξονα y. Έτσι, για τις κινήσεις αυτές θα χρησιμοποιήσουμε την εντολή «άλλαξε y κατά []» από την παλέτα Κίνηση. Στην περίπτωση που έχει πατηθεί το πάνω βέλος, η αλλαγή θα γίνεται κατά μία θετική ποσότητα ενώ στην περίπτωση του κάτω βέλους η αλλαγή θα γίνεται κατά μία αρνητική ποσότητα.
Δε νομίζετε ότι θα ήταν προτιμότερο η ποσότητα κατά την οποία αλλάζουν οι θέσεις του αντικειμένου να είναι ίδια για όλες τις κινήσεις; Σε αυτό θα μας βοηθήσει η χρήση μίας μεταβλητής η οποία θα περιέχει το βήμα με το οποίο θα κινείται ο Mr.Blue. Τη μεταβλητή αυτή την έχουμε ονομάσει «βήμα» και είναι «Μόνο γι’ αυτή τη μορφή». Με αυτό τον τρόπο θα μπορούμε να αλλάζουμε το βήμα με το οποίο κινείται το αντικείμενο προς όλες τις κατευθύνσεις αλλάζοντας μόνο την τιμή της μεταβλητής. Η μεταβλητή αυτή θα αρχικοποιείται μία φορά στον κώδικα μας και δεν αλλάζει κατά τη διάρκεια του παιχνιδιού. Η αρχικοποίηση της μπορεί να γίνει με την εντολή «όρισε το [βήμα] σε [30]» από την παλέτα Μεταβλητές, όπου 30 είναι το βήμα που έχουμε επιλέξει. Η αρνητική τιμή κατά την οποία θέλουμε να αλλάζουν οι θέσεις x και y όταν πατηθούν τα βέλη αριστερά και κάτω, αντίστοιχα, μπορεί να δοθεί με τη βοήθεια του τελεστή πολλαπλασιασμού «[] * []» από την παλέτα Τελεστές, όπου θα πολλαπλασιάζεται η μεταβλητή «βήμα» με το -1. Ο κώδικας που έχει προκύψει έως τώρα για την κίνηση του Mr.Blue εμφανίζεται στην Εικόνα 14.56.

love2.JPG
Εικόνα 14.56

Καταγραφή της κίνησης του Mr.Blue
Αρχικά, πρέπει να σκεφτούμε που θα καταγράφονται οι θέσεις του Mr.Blue. Από τη στιγμή που θέλουμε να έχουμε στη διάθεση μας όλες τις θέσεις από τις οποίες πέρασε το αντικείμενο αυτό μέχρι να τον συναντήσει η Mrs.Pink, χρειαζόμαστε λίστα. Μόνο μία λίστα όμως είναι αρκετή; Αν και οι δύο συντεταγμένες του Mr.Blue αποθηκεύονται σε μία θέση της λίστας θα μπορέσουμε να τις επεξεργαστούμε; Η απάντηση είναι πώς δεν μπορούμε να ξεχωρίσουμε αυτές τις τιμές όταν αποθηκεύονται στην ίδια θέση και για το λόγο αυτό θα πρέπει να δημιουργήσουμε δύο λίστες. Στη μία θα αποθηκεύονται οι θέσεις x του Mr.Blue και στην άλλη οι θέσεις y. Έτσι, ονομάσαμε τις λίστες αυτές «x» και «y» , αντίστοιχα. Η Mrs.Pink βέβαια μπορεί και ακολουθεί κατά βήμα τον Mr.Blue γιατί έχει πρόσβαση στις τιμές αυτές. Άρα, οι λίστες «x» και «y» πρέπει να είναι «Για όλες τις μορφές», δηλαδή κοινές.
Τώρα πρέπει να αποφασίσουμε πότε θα καταγράφονται οι τιμές των θέσεων στις οποίες βρίσκεται ο Mr.Blue. Για δική μας ευκολία οι θέσεις αυτές μπορούν να καταγράφονται κάθε φορά που ο παίκτης πατήσει κάποιο βελάκι. Τότε αφού το αντικείμενο μετατοπισθεί θα εισάγουμε στις λίστες τις συντεταγμένες του Mr.Blue εκέινη τη στιγμή. Αυτή η διαδικασία θα πραγματοποιηθεί με τις εντολές «πρόσθεσε [] στο [x]» και «πρόσθεσε [] στο [y]» από την παλέτα Μεταβλητές και τις μεταβλητές θέσης από την παλέτα Κίνηση. Η προσθήκη αυτή γίνεται σε κάθε ένα μπλοκ εντολών που αφορά το πλήκτρο που έχει πατηθεί (βλέπε Εικόνα 14.56). Όλα αυτά παρουσιάζονται στην Εικόνα 14.57.

love3.JPG
Εικόνα 14.57

Όμως, όπως είπαμε και στην περιγραφή του αντικειμένου Mr.Blue, ο χαρακτήρας αυτός όταν μετακινείται αφήνει πίσω του ίχνη. Για το λόγο αυτό θα χρησιμοποιήσουμε την πένα. Αρχικά, πρέπει να ορίσουμε το χρώμα και το μέγεθος της πένας. Οι ιδιότητες αυτές καλό είναι να καθοριστούν κατά την έναρξη του προγράμματος. Έτσι, οι εντολές «όρισε το χρώμα πένας σε []» και «όρισε το μέγεθος πένας σε [2]» από την παλέτα Πένα προσθέτονται στον κώδικα της Εικόνας 14.57 κάτω από την εντολή «όρισε το [βήμα] σε [30]». Επίσης, για να μπορέσει να αφήνει τα ίχνη του πρέπει το αντικείμενο αυτό να κατεβάσει την πένα με τη βοήθεια της εντολής «κατέβασε πένα» από την παλέτα Πένα. Αυτή η εντολή θα τοποθετηθεί όπως και οι προηγούμενες στο μπλοκ εντολών που αφορά την έναρξη του παιχνιδιού (βλέπε Εικόνα 14.58).

love4.JPG
Εικόνα 14.58

Τέλος, καλό θα ήταν όταν ξεκινάει το παιχνίδι οι λίστες με τις θέσεις από τις οποίες έχει περάσει ο Mr.Blue να είναι άδειες και να μην περιέχουν τιμές από προηγούμενο παιχνίδι. Για το λόγο αυτό κατά την έναρξη πρέπει να διαγράφονται όλα τα στοιχεία που πιθανόν να περιέχουν. Αυτό θα πραγματοποιηθεί με τις εντολές «διέγραψε [όλα] από το [x]» και «διέγραψε [όλα] από το [y]». Επιπλέον, πρέπει να καθαρίζεται και η σκηνή από τυχόν υπολειπόμενα ίχνη του Mr.Blue. Αυτό θα γίνει με την εντολή «καθάρισε» από την παλέτα Πένα. Ο ολοκληρωμένος πλέον κώδικας του Mr.Blue είναι αυτός της Εικόνας 14.59.

love5.JPG
Εικόνα 14.59

Κίνηση της Mrs.Pink
Τι θα λέγατε να βοηθήσουμε την Mrs.Pink να έρθει πιο κοντά στον Mr.Blue; Όπως έχουμε αναφέρει μέχρι τώρα, το αντικείμενο αυτό ακολουθεί κατά βήμα την κίνηση του Mr.Blue. Για να το πετύχουμε αυτό πρέπει να εκμεταλλευτούμε τις λίστες «x» και «y». Σκοπός της Mrs.Pink είναι να περάσει από όλες τις θέσεις από τις οποίες πέρασε και το άλλο αντικείμενο. Επομένως, για όσο υπάρχουν στοιχεία στις λίσετς αυτές τα οποία η Mrs.Pink δεν έχει επισκεφτεί, η κίνηση της δε σταματάει. Αυτή η συνεχής κίνηση επιτυγχάνεται με τη βοήθεια της επανάληψης «επανέλαβε ώσπου {}» από την παλέτα Έλεγχος.
Η επανάληψη αυτή θα συνεχίζεται μέχρις ότου να τελειώσουν τα στοιχεία των λιστών. Εφόσον και οι δύο λίστες έχουν το ίδιο μήκος, ο έλεγχος για τα στοιχεία που έχει επισκεφθεί η Mrs.Pink θα γίνεται με τη βοήθεια της μίας λίστας μόνο. Για να μπορέσει να πραγματοποιηθεί, όμως, αυτός ο έλεγχος είναι απαραίτητη η χρήση μίας μεταβλητής η οποία θα διατρέχει τις λίστες και θα μας βοηθάει επιπλέον και στη μετακίνηση του αντικειμένου αυτού. Τη μεταβλητή αυτή την έχουμε ονομάσει θέση και είναι «μόνο γι’ αυτή τη μορφή». Αρχικά η μεταβλητή αυτή αρχικοποιείται σε 0 και αλλάζει κατά ένα σε κάθε επανάληψη έτσι ώστε κάθε φορά να δείχνει στο επόμενο στοιχείο της λίστας x το οποίο η Mrs.Pink θα επισκεφθεί ελπίζοντας να συναντήσει τον Mr.Blue. Η κίνηση στο σημείο αυτό θα πραγματοποιηθεί με την εντολή «πήγαινε στο x: [ ] y:[ ]» από την παλέτα Κίνηση, όπου οι συντεταγμένες του σημείου θα είναι αυτές της συγκεκριμένης καταχώρησης του Mr.Blue στις λίσετς x και y, αντίστοιχα. Για να το καταφέρουμε αυτό θα χρησιμοποιήσουμε τις εντολές «στοιχείο [ ] του [x]» και «στοιχείο [ ] του [y]» σε συνδυασμό με τη μεταβλητή «θέση» .
Επιπλέον, η συνθήκη ελέγχου της επανάληψης πρέπει να εξετάζει αν η μεταβλητή «θέση» είναι μεγαλύτερη από το μήκος της λίστας «x» μείον 1. Η αφαίρεση μας βοηθάει να αποφύγουμε να προσπαθήσει η Mrs.Pink να κινηθεί χωρίς να έχει κινηθεί πρώτα ο Mr.Blue. Με τη βοήθεια όλων των παραπάνω εντολών και κάποιων ακόμη τελεστών, προκύπτει ο κώδικας της Εικόνας 14.60.


love6.JPG
Εικόνα 14.60

Όμως, ακόμη κι αν η Mrs.Pink φτάσει τον αγαπημένο της, το παιχνίδι δε σταματά αφού ο Mr.Blue μπορεί να ξεφύγει και να ξεκινήσει νέο κυνηγητό. Για το λόγο αυτό η διαδικασία της κίνησης της Mrs.Pink θα πρέπει να εκτελείται συνεχώς. Αυτο το εξασφαλίζει η εντολή «για πάντα...».
Ακόμη, όπως αναφέραμε, η Mrs.Pink επιθυμεί να σβήνει τα ίχνη του αγαπημένου της. Για το λόγο αυτό θα χρησιμοποιήσει πένα με χρώμα λευκό και πάχος ίσο με αυτό της πένας του Mr.Blue. Οι ιδιότητες της πένας θα ορίζονται κατά την έναρξη του προγράμματος όπως και το κατέβασμά της. Ίχνη βέβαια δεν αποτελούν μόνο τα αποτυπώματα που αφήνει η πένα του αλλά και οι συντεταγμένες των θέσεων από τις οποίες πέρασε. Για το λόγο αυτό η Mrs.Pink κάθε φορά που συναντά τον Mr.Blue διαγράφει τις λίστες «x» και «y». Αυτό στην πραγματικότητα βοηθάει στο να μην ξαναπερνάει το αντικείμενο μας από θέσεις που έχει ήδη επισκεφθεί και που ανήκουν στον προηγούμενο γύρο του κυνηγητού. Οι διαγραφές θα γίνουν με τη χρήση της εντολής «διέγραψε [όλα] από το [x/y]». Τέλος, όπως έχουμε αποφασίσει, επειδή η Mrs.Pink αφήνει τον Mr.Blue για λίγο ελεύθερο θα χρειαστούμε την εντολή «περίμενε [2] δευτερόλεπτα». Ο κώδικας επομένως της Mrs.Pink είναι αυτός της Εικόνας 14.61.

love7.JPG
Εικόνα 14.61

Για διασκέδαση!!
Τι θα λέγατε να προσθέταμε ένα ακόμη αντικείμενο το οποίο να έχει σχήμα καρδιάς και κάθε φορά που η Mrs.Pink φτάνει τον Mr.Blue να εμφανίζεται στη σκηνή; Για να γνωρίζει βέβαια αυτό το αντικείμενο πότε να εμφανισστεί , πρέπει η Mrs.Pink να μεταδίδει ένα μήνυμα. Ας υποθέσουμε ότι το μήνυμα αυτό το ονομάζουμε «καρδιά». Όταν λοιπόν το μήνυμα αυτό ληφθεί από το αντικείμενο Καρδιά, τότε αυτή θα εμφανίζεται στη σκηνή, θα μπορεί να αλλάζει ενδυμασίες έτσι ώστε να φαίνεται ότι μεγαλώνει και να δημιουργεί και κάποιον ήχο. Μία ενδεικτική υλοποίηση του αντικειμένου αυτού παρουσιάζεται στην
Εικόνα 14.62.

love8.JPG
Εικόνα 14.62

(Το παραπάνω παράδειγμα έχει στηριχθεί στην εφαρμογή: http://www.shallwelearn.com/scratchprogrammingforkidscategory/project-tutorial/176-love-chase-more-on-lists- )

5. Χρονόμετρο και επιπλέον παραδείγματα
Όλοι μας έχουμε παίξει παιχνίδια όπου το χαρακτηριστικό που θα κρίνει το νικητή είναι το ποιος θα καταφέρει να πετύχει το μικρότερο χρόνο. Έτσι και στο Scratch μπορούμε να δημιουργήσουμε πιο ενδιαφέροντα παιχνίδια έχοντας αντίπαλο το χρόνο. Για να το πετύχουμε αυτό χρειαζόμαστε το «χρονόμετρο», το οποίο βρίσκεται στην παλέτα «Αισθητήρες». Για να εμφανιστεί το χρονόμετρο πρέπει να επιλέξουμε την προβολή του χρονομέτρου στη σκηνή (βλέπε Εικόνα 14.63).
time1.JPG
Εικόνα 14.63

Το χρονόμετρο θα αρχίσει να μετράει από τη στιγμή που θα ανοίξουμε το Scratch! Αν θέλουμε λοιπόν να το χρησιμοποιήσουμε σε κάποιο πρόγραμμα, θα πρέπει αρχικά να το μηδενίσουμε (βλέπε Εικόνα 14.64).
time2.JPG
Εικόνα 14.64

Την εντολή «μηδένισε το χρονόμετρο» που φαίνεται στην παραπάνω εικόνα, μπορούμε να τη βρούμε στην παλέτα «Αισθητήρες».

Παραδείγμα με χρονόμετρο

Φυσικά στα παιχνίδια που παίζουμε αρκετές φορές χρειαζόμαστε την έννοια του χρόνου ως μέτρο σύγκρισης για την ανάδειξη του νικητή. Σκεφτείτε για παράδειγμα μια εφαρμογή με αγωνίσματα στίβου(όπως 100μ τρέξιμο ή σκυταλοδρομία 4x100) χωρίς την έννοια του χρόνου ή ακόμα μια εφαρμογή ποδοσφαιρικού αγώνα χωρίς χρονόμετρο. Θα ήταν δυνατό να φτιαχτούν τέτοιου είδους προγράμματα;

-Παράδειγμα 1 – Ship-Mines

Έστω ένα πλοίο που έχει μπλεχτεί σε ένα θαλάσσιο ναρκοπέδιο και προσπαθεί να φτάσει στη στεριά. Θα προσπαθήσουμε να το βοηθήσουμε να φτάσει όσο πιο γρήγορα μπορούμε. Όποιος κάνει το καλύτερο χρόνο αυτός είναι και ο νικητής. Φυσικά πολύ προσοχή στις νάρκες οι οποίες είναι έτοιμες να εκραγούν! Ας μην ξεχάσουμε ότι οι νάρκες δε μένουν σταθερές στη θέση τους αλλά κινούνται κάνοντας πιο δύσκολη την προσπάθεια του πλοίου να φτάσει στη στεριά. Αν το πλοίο ακουμπήσει σε μία από αυτές τις νάρκες, τότε αυτή θα εκραγεί και το πλοίο θα πάρει φωτιά οπότε και ο παίκτης θα χάσει.

Ας δημιουργήσουμε λοιπόν την εφαρμογή μας!

Αντικείμενα και Σκηνικό
Αρχικά, ας αποφασίσουμε ποιά θα είναι τα αντικείμενα που θα συμμετέχουν στο παιχνίδι! Σίγουρα χρειαζόμαστε ένα πλοίο οποιασδήποτε μορφής και μια νάρκη την οποία θα την αντιγράψουμε όσες φορές θέλουμε για να έχουμε πολλές νάρκες στο πρόγραμμά μας. Έστω λοιπόν το πλοίο και η νάρκη έχουν την μορφή που παρουσιάζεται στην Εικόνα 14.65. Το πλοίο υπάρχει στις εικόνες του Scratch ενώ τη νάρκη τη βρήκαμε στο Internet. Και τις δύο μορφές τις έχουμε επεξεργαστεί με τη ζωγραφική.

ploio.jpg mine.jpg
Εικόνα 14.65

Έπειτα, πρέπει να σκεφτούμε τι σκηνικό θα θέλαμε να χρησιμοποιήσουμε για μια τέτοιου είδους εφαρμογή. Έστω λοιπόν ότι σκεφτόμαστε ένα φόντο θάλασσας με μια στεριά σε κάποια γωνία. Ενδεικτικά λοιπόν το σκηνικό θα μπορούσε να ήταν αυτό της Εικόνας 14.66. Το συγκεκριμένο σκηνικό το έχουμε βρει στο Internet και το έχουμε επεξεργαστεί επίσης με τη ζωγραφική.

sea.jpg
Εικόνα 14.66


Πλοίο
Το πρώτο πράγμα που πρέπει να σκεφτούμε είναι ότι το πλοίο πρέπει να έχει και μια δεύτερη ενδυμασία (σε μορφή έκρηξης) έτσι ώστε σε περίπτωση που ακουμπήσει μια νάρκη να φανεί πιο ρεαλιστικό το αποτέλεσμα. Η ενδυμασία αυτή θα μπορούσε να ήταν αυτή που εμφανίζεται στην Εκόνα 14.67, την οποία επίσης έχουμε βρει στο Internet.

boom.jpg
Εικόνα 14.67

Εφόσον θέλουμε το καράβι να μπορεί να φτάσει στη στεριά και να αποφεύγει τις νάρκες, πρέπει να μπορούμε να το κινούμε προς όλες τις κατευθύνσεις. Αυτό μπορεί να γίνει εύκολα ελέγχοντας την κίνησή του με τα βελάκια. Εάν το πλοίο καταφέρει να φτάσει στη στεριά τότε το παιχνίδι μας θα έχει τερματιστεί με επιτυχία. Η άφιξη του πλοίου στη στεριά μπορεί να γίνει αντιληπτή μόλις το πλοίο ακουμπήσει το νησάκι που βρίσκεται στην κάτω αριστερή γωνία του σκηνικού. Στο παιχνίδι αυτό σημαντικό ρόλο παίζει και ο χρόνος άρα καθώς το αντικείμενο αυτό κινείται, η προσπάθειά του χρονομετρείται έτσι ώστε όταν το παιχνίδι τερματιστεί με επιτυχία, ο παίκτης να βλέπει το χρόνο του.

Νάρκες
Τωρά ας σκεφτούμε τα εμπόδια που θα υπάρχουν στο σκηνικό μας. Καλό θα ήταν να υπάρχουν αρκετές νάρκες έτσι ώστε να κάνουμε τη διαδρομή του πλοίου δυσκολότερη. Έστω λοιπον ότι έχουμε πέντε νάρκες οι οποίες θα επιπλέουν στη θάλασσά μας και θα είναι διασκορπισμένες σε όλη την επιφάνεια του νερού. Προφανώς οι νάρκες αυτές πρέπει να κινούνται για να γίνει και το παιχνίδι πιο ενδιαφέρον. Η κίνηση αυτή δεν είναι απαραίτητο να είναι η ίδια για όλες. Κάποιες από αυτές μπορούν να κινούνται κάθετα, άλλες οριζόντια και άλλες διαγώνια.

Υλοποίηση του παιχνιδιού

Κίνηση νάρκης
Ήρθε λοιπόν η ώρα να γράψουμε το κώδικα. Ας ξεκινήσουμε από τα αντικείμενα που θέλουν λιγότερη σκέψη και αυτά είναι οι νάρκες. Αφού έχουμα αποφασίσει ότι οι νάρκες που θα υπάρχουν στο παιχνίδι είναι πέντε, αντιγράφουμε το αντικείμενο νάρκη τέσσερις φορές έτσι ώστε να έχουμε πέντε πανομοιότυπα αντίγραφα. Στη συνέχεια σκεφτόμαστε τι ακριβώς θα κάνουν οι νάρκες στην εφαρμογή μας. Προφανώς θα κινούνται σε μια σταθερή πορεία (δεξιά - αριστερά ή πάνω – κάτω ή διαγώνια) η οποία φυσικά από νάρκη σε νάρκη θα διαφέρει έτσι ώστε να κάνει το πρόγραμμα αρκετά δύσκολο για το χρήστη. Ενδεικτικά λοιπόν θα δούμε το κώδικα για τη μια νάρκη αφού οι άλλες θα έχουν παραπλήσιο κώδικα με μόνη διαφορά τη διαφορετική θέση που θα έχει στην οθόνη η κάθε νάρκη.
Αρχικά, μετακίνουμε τις νάρκες σε διάφορες θέσεις πάνω στην επιφάνεια της θάλασσας. Τότε η σκηνή θα έχει τη μορφή που εμφανίζεται στην Εικόνα 14.68.

mines1.jpg
Εικόνα 14.68


Αφού, λοιπον, έχουμε αποφασίσει σε ποια θέση θέλουμε να βρίσκεται η κάθε νάρκη, πρέπει η νάρκη μας να τοποθετείτε σε αυτή τη συγκεκριμένη θέση κατά την έναρξη του παιχνιδιού. Αυτό μπορεί να γίνει με τη βοήθεια των εντολών «θέσε το x ίσο με []» και «θέσε το y ίσο με []» από την παλέτα Κίνηση. Επομένως, οι δύο πρώτες εντολές του κώδικα της νάρκης που θέλουμε να ξεκινάει από το σημείο (194 , -121) θα είναι οι εντολές της Εικόνας 14.69.

pict1.jpg
Εικόνα 14.69

Έπειτα σκεφτόμαστε ότι αφού θέλουμε η νάρκη να κινείται συνεχώς, τότε η κίνηση αυτή θα πρέπει να γίνεται από το σημείο από το οποίο ξεκινάει μέχρι ένα άλλο σημείο (έστω το (116 , -70)) και να γυρίζει πάλι πίσω. Αυτή η κίνηση είναι ουσιαστικά η μόνη που θέλουμε να κάνει η νάρκη μας. Για να πετύχουμε τη «συνεχή» κίνηση χρησιμοποιούμε την εντολή «για πάντα» από τη παλέτα Έλέγχος. Στο εσωτερικό της επανάληψης αυτής θέλουμε δύο ελέγχους έτσι ώστε αν είμαστε στη θέση (194 , -121) να κινούμαστε ομαλά μέχρι την (116 , -70), ενώ αν αντίθετα είμαστε στη θέση (116 , -70) να πηγαίνουμε ομαλά μέχρι την (194 , -121). Οι έλεγχοι αυτοί θα γίνουν με τη χρήση της εντολής «εάν ...» από την παλέτα Έλεγχος και του τελεστή ελέγχου ισότητας «[ ] = [ ]» από την παλέτα Τελεστές, όπου θα ελέγχουμε τη θέση x της νάρκης.

ΕΡΩΤΗΣΗ: Θα είχε διαφορά αν ελέγχαμε τη θέση y;

Αν λοιπόν το x της νάρκης είναι ίσο με την τιμή 194 τότε θα κινηθεί ομαλά για 2.5 δευτερόλεπτα μέχρι το σημείο (116 , -70), ενώ αν το x της νάρκης είναι 116 τότε θα κινηθεί ομαλά για 2.5 δευτερόλεπτα μέχρι το σημείο (194 , -121). (βλέπε Εικόνα 14.70).

mine_code.jpg
Εικόνα 14.70

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

ΙΔΕΑ: Αν πείραζα τα δευτερόλεπτα θα έκανα τη νάρκη να πηγαίνει πιο αργά ή πιο γρήγορα αντίστοιχα!

Κίνηση του πλοίου
Πάμε τώρα στο κώδικα του πλοίου που είναι και ο πιο απαιτητικός.
Όταν αρχίζει το πρόγραμμα πρέπει να φροντίσουμε το πλοίο να έχει την κατάλληλη ενδυμασία. Φυσικά, όπως και με τις νάρκες, τοποθετούμε το πλοίο σε κάποιες αρχικές συντεταγμένες της επιλογής μας. Δεν ξεχνάμε όμως και να μηδενίσουμε το χρονόμετρο καθώς το πλοίο ξεκινάει τη προσπάθειά του. Ο αρχικός κώδικας λοιπόν φαίνεται στην Εικόνα 14.71.

mines2.jpg
Εικόνα 14.71

Αφού ορίσαμε τα αρχικά δεδομένα του πλοίου μας θέλουμε τώρα να το κάνουμε να κινείται! Την κίνηση μπορούμε να την ορίσουμε να γίνεται με τα βέλη του πληκτρολογίου. Επειδή το πλοίο πρέπει να μπορεί να κινηθεί και προς τις τέσσερις κατευθύνσεις χρειαζόμαστε τέσσερα κομμάτια κώδικα που θα κάνουν πανομοιότυπα πράγματα με μόνη διαφορά ότι το ένα θα είναι για το πάνω βέλος, το άλλο για το κάτω, ένα για το δεξί βέλος και ένα για το αριστερό. Πάμε ενδεικτικά να δούμε για το πάνω βέλος. Όταν πατηθεί το πάνω βέλος θέλουμε το πλοίο να κινείται προς τα πάνω. Επομένως αλλάζουμε τη θέση y κατά 2. Αντίστοιχα για το αριστερό αλλάζουμε το x κατά -2, για το δεξί κατά +2, ενώ για το κάτω αλλάζουμε τη θέση y κατά -2. Για να πραγματοποιηθούν αυτά θα χρειαστούμε τις εντολές «όταν το πλήκτρο [ ] πατηθεί», «άλλαξε x κατά [ ]» και «άλλαξε y κατά [ ]» (βλέπε Εικόνες 14.74, 14.75, 14.76, 14.77).

Τερματισμός του παιχνιδιού
Έπειτα, θα ασχοληθούμε με τον τερματισμό του παιχνιδιού. Αυτός μπορεί να πραγματοποιηθεί με δύο τρόπους. Ο πρώτος αφορά την περίπτωση που το πλοίο ακουμπήσει μια νάρκη. Αυτό που θέλουμε να γίνεται είναι να αλλάζει η ενδυμασία του πλοίου σ' αυτή της έκρηξης και να σταματάνε τα πάντα στο πρόγραμμα. Για να το καταφέρουμε αυτό θα χρειαστούμε την εντολή ελέγχου «εάν ...» σε συνδυασμό με τη συνθήκη «αγγίζει το χρώμα [ ]» που μπορούμε να βρούμε στην παλέτα των Αισθητήρων για να ελέγξουμε αν το πλοίο αγγίζει το χρώμα γκρι της νάρκης (βλέπε Εικόνα 14.72).

pict4.jpg
Εικόνα 14.72

Ο δεύτερος τρόπος με τον οποίο μπορεί να λήξει το παιχνίδι είναι αν το πλοίο καταφέρει και φτάσει στο προορισμό του. Αν λοιπόν το πλοίο αγγίξει τη στεριά πρέπει αρχικά να εμφανίζεται στην οθόνη το χρονόμετρο για να βλέπουμε πόσο χρόνο κάναμε για να φτάσουμε στο νησί. Έπειτα πρέπει να σταματήσουμε κάθε κίνηση στο πρόγραμμά μας. Ο έλεγχος για τον αν το πλοίο αγγίζει τη στεριά θα γίνει με τις εντολές που έγινε και ο έλεγχος για το αν το πλοίο αγγίζει τη νάρκη. Ο κώδικας που πραγματοποιεί αυτές τις κινήσεις είναι αυτός της Εικόνας 14.73.

mines3.jpg
Εικόνα 14.73

Ο τελικός κώδικας λοιπόν για το πάνω βέλος παρουσιάζεται στην Εικόνα 14.74.

mines4.jpg
Εικόνα 14.74

Αντίστοιχα για τα άλλα βελάκια ο κώδικας εμφανίζεται στις Εικόνες 14.75, 14.76, 14.77.

mines5.jpg
Εικόνα 14.75

mines6.jpg
Εικόνα 14.76

mines7.jpg
Εικόνα 14.77

Παρατηρούμε ότι το μόνο που αλλάζει στους κώδικες, όπως αναφέραμε και πριν, είναι το πώς μεταβάλλονται οι θέσεις x και y.

Πίνακας διαθέσιμων εντολών για το Χρονόμετρο

time1.JPGexternal image C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.jpgexternal image C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.jpgexternal image C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.jpgexternal image C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image004.jpg
Εμφανίζει το χρονόμετρο στη σκηνή, όταν είναι επιλεγμένο (τικ στο κουτάκι).
time3.JPG
Μηδενίζει το χρονόμετρο.

6. Μαθηματικές εκφράσεις
Οι μαθηματικές εκφράσεις στο Scratch είναι απλά εξισώσεις όπως και στα μαθηματικά μας. Τις μαθηματικές εκφράσεις μπορούμε να τις συναντήσουμε μέσα στα παιχνίδια και μπορούν να τα κάνουν πιο ενδιαφέρονται και αρκετές φορές και πιο αληθοφανή! Στο Scratch τις συναντούμε με δύο τρόπους. Ο ένας είναι οι λογικές μαθηματικές εκφράσεις και ο δεύτερος είναι οι εξισώσεις.
Όταν παίζουμε ένα παιχνίδι πρέπει με κάποιο τρόπο να τερματίζεται. Θα μπορούσαμε να πούμε για παράδειγμα ότι σε ένα παιχνίδι στρατηγικής η συνθήκη τερματισμού είναι να μην υπάρχουν μονάδες του αντιπάλου. Οπότε οι μονάδες του αντιπάλου θα αποθηκεύονται σε μία μεταβλητή, άρα πρέπει να ελέγχουμε αν η τιμή της μεταβλητής αυτής είναι μηδέν και αν είναι τότε να τερματίζεται το παιχνίδι). Ένα άλλο παράδειγμα είναι να πρέπει να πετύχουμε ένα συγκεκριμένο σκορ έτσι ώστε να τερματιστεί.
Οι μαθηματικές εκφράσεις φυσικά δεν χρησιμοποιούνται μόνο στα παιχνίδια. Θα τις συναντήσουμε και σε διάφορες άλλες εφαρμογές όπως στη ζωγραφική. Πολλά σχέδια πλέον δεν σχεδιάζονται με το χέρι αλλά με τη βοήθεια υπολογιστή και σε αυτό φυσικά συνεισφέρουν οι μαθηματικές εκφράσεις.
Ας δούμε όμως κάποια παραδείγματα για καλύτερη κατανόηση.


6.1 Παραδείγματα μαθηματικών εκφράσεων

- Παράδειγμα 1 - Ηλιακό σύστημα

Υπάρχουν πολλές εφαρμογές οι οποίες πρέπει να υλοποιούνται με απόλυτη ακρίβεια κάτι που μας εξασφαλίζουν απλές ή και πιο σύνθετες μαθηματικές εκφράσεις. Στο παράδειγμα μας λοιπόν προσπαθούμε να μελετήσουμε την κίνηση ενός πλανήτη που διαγράφει τροχιά γύρω από έναν άλλο μεγαλύτερο πλανήτη ακολουθώντας κάποιους κανόνες της φυσικής. Με αυτό τον τρόπο μπορούμε πολύ εύκολα κάνοντας απλούς μικρούς πειραματισμούς να καταλάβουμε την σημασία που έχουν έννοιες όπως η μάζα, η βαρύτητα, η απόσταση μεταξύ 2 πλανητών και ο ρόλος που διαδραματίζουν στην τροχιά που διαγράφει ο κάθε πλανήτης. Συγκεκριμένα, στο παράδειγμα αυτό θα ασχοληθούμε με την κίνηση της γης γύρω από τον ήλιο. Βλέπουμε λοιπόν, ότι θα χρειαστούμε δύο αντικείμενα για το ρόλο των πλανητών. Ο ήλιος, όπως όλοι άλλωστε γνωρίζουμε, δεν κινείται ενώ η γη γυρίζει γύρω από τον ήλιο με τροχιά όχι ακριβώς κυκλική αλλά ελλειπτική (σαν πεπλατυσμένος κύκλος). Για την προσομοίωση της κίνησης της Γης θα πρέπει να υπολογίζουμε τη δύναμη που της ασκείται από τον Ήλιο και η οποία καθορίζει τη θέση στην οποία βρίσκεται κάθε στιγμή.


Για να κατανοήσουμε λίγο καλύτερα το παράδειγμα, καλό θα ήταν να αναφερθούμε σε κάποιους απλούς και βασικούς νόμους της φυσικής. Σύμφωνα λοιπόν με τη φυσική γνωρίζουμε ότι κάθε σώμα ασκεί δύναμη σε κάποιο άλλο με αποτέλεσμα να δημιουργούνται ελκτικές δυνάμεις. Ανάλογα λοιπόν με την μάζα που έχει το κάθε σώμα, ασκεί και μεγαλύτερη δύναμη. Σε περιπτώσεις που έχουμε 2 σώματα και το ένα είναι πολύ μεγαλύτερο από το άλλο υπερισχύουν οι δυνάμεις του μεγαλύτερου σώματος. Για παράδειγμα, μπορούμε να σκεφτούμε όλοι μας την γνωστή ιστορία με το μήλο του Νεύτωνα. Το μήλο που έχει πολύ μικρή μάζα σε σχέση με αυτή της γης, έλκεται από τη γη και πέφτει κάτω. Επίσης πρέπει να γνωρίζουμε πως όλες οι δυνάμεις που ασκούνται σε ένα σώμα από άλλα σώματα, μπορούν να αναλυθούν σε δύο συνιστώσες, την κάθετη και την οριζόντια.
Όπως βλέπουμε στο παρακάτω κομμάτι κώδικα (βλέπε Εικόνα 14.78) που αφορά το αντικείμενό γη, η πρώτη μαθηματική έκφραση που εμφανίζεται χρησιμοποιείται έτσι ώστε να υπολογίσουμε την δύναμη που ασκείται στην γη από τον ήλιο. Παρατηρούμε ότι αυτή η σχέση εξαρτάται από την μάζα του ήλιου, την απόσταση της γης από αυτόν, καθώς και την βαρύτητα(gravity) . Η μεταβλητή scale (κλίμακα), χρησιμοποιείται απλά για μεγέθυνση ή σμίκρυνση των αντικειμένων «γη» και «ήλιος» στη σκηνή. Βλέποντας αυτή την εξίσωση μπορεί εύκολα κάποιος να πανικοβληθεί. Γνωρίζοντας όμως τα μεγέθη που την απαρτίζουν και εισάγοντάς την στο Scratch, μπορεί να αποφύγει τους πολύπλοκους αυτούς υπολογισμούς. Στον παρακάτω κώδικα η δύναμη ανάμεσα στα δύο σώματα αποθηκεύεται στη μεταβλητή «force». Για την εισαγωγή λοιπόν της εξίσωσης που υπολογίζει τη δύναμη αυτή, χρησιμοποιούμε τις εντολές «όρισε το [force] σε []» από την παλέτα Μεταβλητές, καθώς και ένα συνδυασμό των τελεστών πολλαπλασιασμού «[] * []» και διαίρεσης «[] / []», που μπορούμε να τους βρούμε στην παλέτα Τελεστές.
Με τις δύο επόμενες γραμμές υπολογίζονται οι δύο συνιστώσες της δύναμης, δηλαδή η κάθετη και η οριζόντια. Αυτές λοιπόν τις συνιστώσες, x force και y force, τις χρησιμοποιούμε για να δώσουμε στην γη την επόμενη θέση της στο επίπεδο (x,y) σε σχέση με τον ήλιο. Όπως βλέπουμε και στον κώδικα, με την εντολή «πήγαινε στο x: [ ] y: [ ]» και με την βοήθεια των δύο μαθηματικών εκφράσεων, « [x] * «[scale] / [100]» » και « [y] * «[scale] / [100]» », πετυχαίνουμε το ζητούμενό μας, δηλαδή τη σωστή θέση της γης.

motion.jpg
motion.jpg

Εικόνα 14.78


Ένα στιγμιότυπο της εφαρμογής αυτής παρουσιάζεται στην παρακάτω εικόνα (βλέπε Εικόνα 14.79), όπου στο κέντρο εμφανίζεται ο Ήλιος και γύρω του περιστρέφεται η Γη.

shot.jpg
shot.jpg
Εικόνα 14.79

Ερωτήσεις Κατανόησης
1. Παρατηρώντας την εικόνα 3.1.1 να αναφέρετε ποιές θα είναι οι αλλαγές στον τρόπο που κινείτε η γη αν κάθε φορά ’’πειράζουμε’’ μια μεταβλητή της μαθηματικής έκφρασης δίνοντας μεγαλύτερες τιμές.


2. Αν η μάζα του ήλιου γινόταν πολύ μικρή σε σχέση με αυτή της γης τι τιμή θα έπαιρνε η μεταβλητή force και πως αυτή θα επηρέαζε την κίνηση της γης.


Το παράδειγμα που χρησιμοποιούμε με μερικές αλλαγές είναι από το:
http://scratch.mit.edu/projects/blob8108/191941



- Παράδειγμα 2 - Dinosaur Calculator
Ας δούμε ένα ακόμη πρόγραμμα το οποίο κάνει απλές μαθηματικές εκφράσεις χρησιμοποιώντας τους τελεστές της πρόσθεσης (+) και του πολλαπλασιασμού (*).
Σκοπός μας είναι να δημιουργήσουμε ένα πρόγραμμα το οποίο να μπορεί να υλοποιεί και να υπολογίζει το αποτέλεσμα των παρακάτω μαθηματικών εκφράσεων ανάλογα με την είσοδο που δίνει ο χρήστης.
Οι μαθηματικές εκφράσεις που θέλουμε να υπολογίζει το πρόγραμμα είναι οι εξής:
Εμβαδό ορθογωνίου = α * β, όπου α και β οι πλευρές του ορθογωνίου.
Περίμετρος ορθογωνίου = 2*α+2*β, όπου α και β οι πλευρές του ορθογωνίου.
Εμβαδό κύκλου = 3.14*α*α , όπου α η ακτίνα του κύκλου.
Περίμετρος κύκλου = 2*(3.14)*α, όπου α η ακτίνα του κύκλου.
Τις παραμέτρους α και β τις δίνει ο χρήστης ως είσοδο στο πρόγραμμα και έτσι ο κώδικας μπορεί να εκτελεστεί για πολλές διαφορετικές τιμές.
Ενδεικτικά, για τον υπολογισμό των παραπάνω μαθηματικών εκφράσεων θα μας βοηθήσει ένας μικρός δεινόσαυρος. Άρα το αντικείμενο που θα χρειαστούμε είναι ένας δεινόσαυρος στο σενάριο του οποίου θα εκτελούνται όλες οι εντολές. Το σκηνικό που έχουμε επιλέξει για το παράδειγμα αυτό, όπως και το αντικείμενο φαίνονται στην Εικόνα 14.80.

14dinosaur1.JPG

Εικόνα 14.80

Ο έξυπνος δεινόσαυρος μπορεί να υπολογίσει το εμβαδό ενός ορθογωνίου και κύκλου καθώς και την περίμετρο του ορθογωνίου και του κύκλου. Όπως αναφέραμε, ο χρήστης θα πρέπει να δίνει δύο αριθμούς για τους οποίους θα γίνονται οι υπολογισμοί. Για να μπορέσουμε να χρησιμοποιήσουμε τους αριθμούς αυτούς πολλές φορές και σε διαφορετικές εντολές, θα πρέπει να τους αποθηκεύσουμε κάπου. Για το λόγο αυτό θα χρειαστούμε τη βοήθεια των μεταβλητών. Η πρώτη τιμή που εισάγει ο χρήστης θα αποθηκευτεί στη μεταβλητή 1number, ενώ η δεύτερη στη 2number. Έπειτα, ο χρήστης καλείται να επιλέξει την πράξη που θέλει να εκτελεστεί. Αν επιλέξει τον αριθμό 1 πραγματοποιείται η πράξη του πολλαπλασιασμού για την εύρεση του εμβαδού ενός ορθογωνίου. Για τον υπολογισμό αυτό θα χρησιμοποιήσουμε τον τελεστή πολλαπλασιασμού «[ ] * [ ]» και θα εισάγουμε την εντολή «[1number] * [2number]». Για την εκφώνηση του αποτελέσματος από το δεινόσαυρο, χρησιμοποιούμε ακόμη μία εντολή της παλέτας των Τελεστών, την «ένωσε [ ] [ ]». Αν επιλέξει τον αριθμό 2 πραγματοποιείται ένας συνδυασμός πράξεων για την εύρεση της περιμέτρου του ορθογωνίου. Συγκεκριμένα χρησιμοποιούνται οι τελεστές του πολλαπλασιασμού και της πρόσθεσης με τον εξής τρόπο: ««[2] * [1number]» + «[2] * [2number]»». Επιλέγοντας τον αριθμό 3, ο δεινόσαυρος εκτελεί τον υπολογισμό του εμβαδού του κύκλου. Για την πράξη αυτή χρησιμοποιούμε δύο φορές τον τελεστή του πολλαπλασιασμού. Συγκεκριμένα, εκτελούμε τις πράξεις «[3.14] * «[1number] * [1number]»». Τέλος, επιλέγοντας τον αριθμό 4, εκτελείται η πράξη για την εύρεση της περιμέτρου του κύκλου. Συγκεκριμένα, χρησιμοποιούμε δύο φορές τον τελεστή του πολλαπλασιασμού για να προκύψει η επόμενη έκφραση: «[2] * «[3.14] * [1number]»».
Στην Εικόνα 14.81 βλέπουμε τον κώδικα που πραγματοποιεί το σενάριο που περιγράφηκε.

ari2.jpg
ari2.jpg

Εικόνα 14.81


Ο κώδικας του παραδείγματος είναι ο εξής:
external image octet-stream.png [[file/view/dinosaur calcultor.sb|dinosaur calcultor.sb]]

Το παράδειγμα που χρησιμοποιούμε με μερικές αλλαγές είναι από το:
http://scratch.mit.edu/projects/mrdinosaur/949988


Εφαρμογές προς υλοποίηση από το μαθητή
1) Δημιουργήστε μία εφαρμογή στην οποία θα υπάρχει μία φιγούρα της επιλογής σας, όπως ένα άτομο ή ένα ζώο, το οποίο θα προσπαθεί να συλλέξει τη μεγαλύτερη αξία σε κέρματα που μπορεί μέσα σε 15 δευτερόλεπτα. Τα κέρματα που θα εμφανίζονται στη σκηνή θα πρέπει να είναι τόσα ώστε να μην είναι εύκολο να τα μαζέψει όλα μέσα σε αυτό το χρονικό διάστημα. Ένας ικανοποιητικός αριθμός κερμάτων θα ήταν το 30. Επιπλέον, τα κέρματα θα πρέπει να έχουν διαφορετική αξία, π.χ. να υπάρχουν χρυσά και ασημένια τα οποία θα προσφέρουν διαφορετικούς πόντους στον παίκτη. Μία ενδεικτική τιμή θα ήταν οι 3 πόντοι για τα χρυσά και ο 1 πόντος για τα ασημένια. Επίσης, θα είχε ενδιαφέρον αν στη σκηνή βάζατε και κάποια εμπόδια που θα κάνουν δύσκολη την πρόσβασή του στα κέρματα και τα οποία ο παίκτης θα πρέπει να αποφεύγει. Το πλήθος, τη μορφή και τις θέσεις των εμποδίων μπορείτε να τις αποφασίσετε μόνοι σας. Τα εμπόδια θα μπορούσαν να έχουν για παράδειγμα τη μορφή βράχων. Σε περίπτωση που τα ακουμπήσει θα χάνει. Νικητής είναι αυτός που θα συγκεντρώσει τους περισσότερους πόντους μέσα στα 15 αυτά δευτερόλεπτα χωρίς να πέσει πάνω στα εμπόδια.

2) Δημιουργήστε ένα τυχερό παιχνίδι! Στο παιχνίδι αυτό θα υπάρχει μία λίστα όλων των ακεραίων αριθμών από το 1 έως το 40. Ο χρήστης αρχικά θα πληκτρολογεί έξι αριθμούς της επιλογής του. Στη συνέχεια, με τυχαίο τρόπο 34 από τους 40 αριθμούς της λίστας θα διαγράφονται. Ανάλογα με το πόσοι από τους έξι αριθμούς που θα μείνουν στη λίστα, είναι και στην αρχική επιλογή αριθμών που έκανε ο χρήστης, τόσο θα είναι και το ποσοστό της επιτυχίας του.
Υπόδειξη: Για την τυχαία διαγραφή των αριθμών μπορείτε να χρησιμοποιήσετε την εντολή «στοιχείο [οποιοδήποτε] του [λίστα]».

3)Δημιουργήστε μία εφαρμογή στην οποία θα υπάρχει ένα κανόνι που θα κινείται από το χρήστη. Η θέση του κανονιού θα παραμένει σταθερή στο κάτω μέρος της σκηνής, ενώ η κατεύθυνση του θα μπορεί να αλλάζει πατώντας ο χρήστης το δεξί και το αριστερό βέλος. Μπορείτε να επιλέξετε εσείς ποιο θα είναι το βήμα με το οποίο θα αλλάζει η κατεύθυνση του κανονιού, μία ενδεικτική τιμή είναι το 5. Το κανόνι θα ρίχνει σφαίρες στην κατεύθυνση στην οποία δείχνει, οι οποίες θα κινούνται μέχρι να συναντήσουν τα όρια της σκηνής. Με τις σφαίρες ο παίχτης θα προσπαθεί να πετύχει τις τέσσερις πάπιες που θα υπάρχουν στη σκηνή. Οι πάπιες αυτές θα κινούνται γύρω από τη θέση τους δεξιά και αριστερά. Τις αρχικές τους θέσεις μπορείτε να τις αποφασίσετε μόνοι σας. Άλλες μπορούν να είναι πιο κοντά στο κανόνι και άλλες πιο μακρυά από αυτό. Κάθε πάπια έχει τρεις ζωές. Κάθε φορά που μία σφαίρα πετύχει κάποια πάπια, η ζωή της μειώνεται κατά μία. Όταν οι ζωές κάποιας πάπιας τελειώσουν, τότε αυτή θα πρέπει να βγαίνει από το παιχνίδι. Για να τερματιστεί το παιχνίδι θα πρέπει όλες οι πάπιες να έχουν χάσει τις ζωές τους. Επιπλέον, θα μπορούσατε να χρησιμοποιήσετε ένα χρονόμετρο για να περιορίσετε το χρόνο που έχει ο παίκτης στη διάθεση του.


Περίληψη
Στο κεφάλαιο αυτό ασχοληθήκαμε με δύο ιδιαίτερα σημαντικές έννοιες τόσο του Scratch, όσο και του προγραμματισμού γενικότερα. Από τη μία πλευρά, λοιπόν, είναι οι Μεταβλητές, που είναι δομές προσωρινής αποθήκευσης τιμών που χρειάζεται μία εφαρμογή. Σε μία μεταβλητή στο Scratch μπορούμε να ορίσουμε μία αρχική τιμή αλλά και να αλλάξουμε την τιμή αυτή κατά τη διάρκεια εκτέλεσης ενός προγράμματος. Το περιεχόμενο της μπορεί να εμφανίζεται ή όχι στη σκηνή και συνεπώς στο χρήστη. Από την άλλη πλευρά, είναι οι λίστες στις οποίες μπορούν να αποθηκευτούν περισσότερες από μία τιμές χωρίς να χρειάζεται να γνωρίζουμε από την έναρξη του προγράμματος το πόσες ακριβώς θέλουμε να αποθηκεύσουμε. Σε μία λίστα μπορούμε να προσθέσουμε, να διαγράψουμε αλλά και να αντικαταστήσουμε κάποιο στοιχείο. Επιπλέον, το Scratch μας δίνει πολύ εύκολα τη δυνατότητα να εξετάσουμε το περιεχόμενο μιας λίστας αλλά και να γνωρίζουμε το μήκος αυτής. Επίσης, στο κεφάλαιο αυτό είδαμε τη λειτουργικότητα και τη χρησιμότητα του χρονομέτρου και πως αυτό μπορεί να μας βοηθήσει ώστε να κάνουμε πολλές εφαρμογές πιο ενδιαφέρουσες. Τέλος, πολλές φορές μέσα στα παραδείγματά μας είδαμε ότι η χρήση μαθηματικών εκφράσεων είναι απαραίτητη για την επίτευξη ενός προγράμματος . Οι εφαρμογές αυτές δεν περιορίζονται μόνο σε αληθοφανή και πολύπλοκα παιχνίδια αλλά μπορούν να είναι και εφαρμογές επιστημονικού ενδιαφέροντος.


Θεωρητικές Ερωτήσεις
1) Έστω ότι σε μία εφαρμογή έχουμε τη μεταβλητή «άθροισμα» την οποία αρχικοποιούμε με την τιμή 0. Ποια τιμή θα έχει η μεταβλητή μετά την εκτέλεση της εντολής «άλλαξε [άθροισμα] κατά [-2]»;
2) Στην παρακάτω εικόνα εμφανίζεται η λίστα «αριθμοί» με τα περιεχόμενά της.
bloomlista1.jpg

Ποια θα είναι η μορφή της λίστας μετά την εκτέλεση της εντολής «παρέμβαλλε το [4] στη θέση [2] του [αριθμοί]»;

3) Αν μία λίστα περιέχει 3 στοιχεία και εμείς εκτελέσουμε την εντολή «παρέμβαλλε το [αντικείμενο] στη θέση [οποιοδήποτε] του [λίστα]», σε πόσα σημεία είναι δυνατό να μπει το αντικείμενο;
4)Αν θέλετε κάθε στοιχείο που προσθέτετε σε μία λίστα να μπαίνει στην πρώτη και όχι στην τελευταία της θέση, ποια εντολή πρέπει να χρησιμοποιήσετε;
5)Στην παρακάτω εικόνα δίνεται ένας κώδικας επανάληψης. Πόσες φορές θα εκτελεστεί ο κώδικας που περιέχεται μέσα στην εντολή «για πάντα εάν …»;
bloomlista2.jpg

6)Δίνεται ο παρακάτω κώδικας. Με πόσους διαφορετικούς τρόπους μπορεί να τερματιστεί η επανάληψη;
bloomlista3.jpg

7)Δίνεται το παρακάτω κομμάτι κώδικα ο οποίος θέλουμε να υπολογίζει τη θέση ενός αυτοκινήτου που κινείται με ταχύτητα «ταχύτητα_αυτοκινήτου» μετά από χρόνο «χρόνος_κίνησης». Στον κώδικα αυτό λείπει ο τύπος για τον υπολογισμό της θέσης αυτής. Μπορείτε να τον συμπληρώσετε με τη βοήθεια των αριθμητικών τελεστών; Θυμίζουμε ότι ο τύπος για τη μετατόπιση ενός αντικειμένου που κινείται ομαλά είναι: x_τελικό = x_αρχικό + u * Δt .
14bloomtaxitita.jpg

8)Δημιουργείστε ένα πρόγραμμα το οποίο θα ζητάει από το χρήστη την είσοδο δύο αριθμών που θα αντιστοιχούν στο μήκος των δύο κάθετων πλευρών ενός ορθογωνίου τριγώνου και θα υπολογίζει το μήκος της υποτείνουσας με τη βοήθεια του Πυθαγορείου Θεωρήματος. Το Πυθαγόρειο Θεώρημα είναι το ακόλουθο: α2 = β2 + γ2.
9)Δημιουργείστε ένα πρόγραμμα στο οποίο ο χρήστης θα δίνει τυχαία αριθμούς τους οποίους αυτό θα πρέπει να αποθηκεύει σε μία λίστα αλλά πάντα με αριθμητική σειρά από το μικρότερο στο μεγαλύτερο.

10)Δημιουργήστε ένα πρόγραμμα που θα υλοποιεί την αντίστροφη μέτρηση. Στο πρόγραμμα αυτό, ο χρήστης θα δίνει τον αριθμό των δευτερολέπτων και έπειτα ο χρόνος θα μετράει αντίστροφα.






14. Κρατώντας το σκορ (Μεταβλητές-λίστες) και μετρώντας επιδόσεις__
Μαθησιακοί στόχοι
Να κατανοούν τη διαφορά των μεταβλητών του προγραμματισμού από τις μαθηματικές μεταβλητές.
Να κατανοούν τον τρόπο αποθήκευσης των μεταβλητών στη μνήμη και την ανάθεση τιμής σε μία μεταβλητή.
Να κατανοούν την έννοια της λίστας.
Να εφαρμόζουν τη χρήση της μεταβλητής και τη χρήση της λίστας σε παραδείγματα.
Να αξιολογούν πότε σε ένα πρόγραμμα χρειάζεται η μεταβλητή και πότε η λίστα.
Να είναι σε θέση να εφαρμόσουν τελεστές και ελέγχους στις μεταβλητές (Οι παλέτες Έλεγχος και Τελεστές έχουν αναλυθεί σε προηγούμενα κεφάλαια).
Να γνωρίζουν και να αξιοποιούν τη χρονομέτρηση από την παλέτα Αισθητήρες (εντολή "χρονόμετρο").
Χαρακτηριστικά
Μεταβλητές - λίστες από την παλέτα Μεταβλητές.
Προσπάθεια να εξηγήσουμε πως οι μεταβλητές είναι μια εντελώς διαφορετική έννοια από αυτή που ήδη γνωρίζουν από τα μαθηματικά!
Συνοπτική αναφορά για τον τρόπο αποθήκευσης των μεταβλητών στη μνήμη και τον τρόπο ανάθεσης τιμής στις μεταβλητές.
Δημιουργία μεταβλητών και χρήση αυτής στο πρόγραμμά μας, έλεγχοι και τελεστές με μεταβλητές. (Οι παλέτες Έλεγχος και Τελεστές έχουν αναλυθεί σε προηγούμενα κεφάλαια, εδώ απλά εισάγουμε και τις μεταβλητές).
Παραδείγματα
Φιδάκι (Φτιάχνουμε ένα φιδάκι το οποίο προχωράει, τρώει μήλα και μεγαλώνει το μήκος του. Το μήκος αποθηκεύεται σε μία μεταβλητή. Ο μαθητής κατανοεί την έννοια της μεταβλητής και τη συνδυάζει με παραδείγματα από προηγούμενα κεφάλαια.)