Κεφάλαιο+12

=Το ολοκληρωμένο βιβλίο για το Microsoft Kodu βρίσκεται στη διεύθυνση http://www.koduplay.gr=

Ομάδα 9 Πασσάς Βιργίλιος Παπαχαρισίου Κωνσταντίνος

include component="comments" page="Κεφάλαιο 12" limit="10"

[|Δημιουργία Παιχνιδιού στο Kodu 1 Video] [|Δημιουργία Παιχνιδιού στο Kodu 2 Video] [|Δημιουργία Παιχνιδιού στο Kodu 3 Video] [|Δημιουργία Παιχνιδιού στο kodu 4 Video] (20/3) [|full game part 1] [|full game part 2] [|full game part 3] [|full game part 4] [|Sample Game 1 Video] [|Sample Game 2 Video] (20/3) [|Sample Game 3 Video] (20/3) (τέλειο :P) [|Sample Game 4 Video] (20/3) [|Sample Game 5 Video] (20/3) [|Sample Game 5 Video] (20/3) [|Sample Game 6 Video] (20/3)
 * SOS -> στο Kodu αν ενεργοποιήσετε την επιλογή "Show Community on Main Menu" από το Configure Kodu Game Lab θα σας εμφανιστεί στο main menu του Kodu η επιλογή Community, αν την επιλέξετε θα δείτε ότι έχει ΠΑΡΑ ΠΟΛΛΑ έτοιμα παιχνίδια που μπορείτε να κατεβάσετε και από τα οποία ****να πάρετε ιδέες! (29/3) **

LAST_UPDATE: 11/5/11 ---





ΚΕΦΑΛΑΙΟ 12 : Ώρα για παιχνίδι II

Στο κεφάλαιο αυτό θα περιέχονται 2 σύνθετα παιχνίδια στα οποία θα εφαρμόζονται όλα όσα έχουν μάθει τα παιδιά παραπάνω.

Καλείστε λοιπόν να παράξετε τα παιχνίδια αυτά !


 * Game1- save_kodula!! **

Πιάσανε τη φίλη του kodu!! Στο παιχνίδι που θα σχεδιάσουμε πρέπει να κάνουμε τον kodu να περάσει από μια σειρά δοκιμασίες για να σώσει τη φίλη του kodula!

Έστω ότι βρισκόμαστε σε έναν κόσμο που αρχικά περιέχει **μία πίστα για αγώνα δρόμου**, **ένα κλουβί** στο οποίο μπορούμε να κρύψουμε αντικείμενα, **ένα βουνό**, **μία λιμνούλα** πίσω από το βουνό και το μέρος όπου είναι φυλακισμένη η kodula. Έχουμε στο μυαλό μας την πίστα που θα σχεδιάσουμε, κάπως έτσι:




 * Στόχος** του χρήστη θα είναι να σώσει την kodula ελέγχοντας τον kodu και περνώντας από διάφορα εμπόδια και στάδια δυσκολίας.

__Η πρώτη πρόκληση αφορά αγώνα ταχύτητας:__ Πώς θα σας φαίνονταν αν αρχικά ο kodu έκανε έναν αγώνα με τη μηχανή του? Θα σκεφτείτε αμέσως... μα ο kodu δεν έχει μηχανή! Σωστά, αλλά θα υπάρχει κάποιος τρόπος για να αποκτήσει! Υπάρχει ακόμη ένα όμως πρόβλημα για τον kodu! Ο μαύρος μηχανόβιος **είναι πιο γρήγορος**! Γι αυτό κατά τη διάρκεια του αγώνα ο χρήστης θα πρέπει να μαζεύει υγρό το οποίο **θα του δίνει επιτάχυνση** όταν πατηθεί το κατάλληλο πλήκτρο!
 * Ο χρήστης** λοιπόν αφού αποκτήσει τον έλεγχο του μηχανόβιου, θα πρέπει να τρέξει **3 γύρους** στην πίστα και να τερματίσει πρώτος με αντίπαλο τον μαύρο μηχανόβιο, που έχει ακριβώς τον ίδιο στόχο.
 * Ο χρήστης** πρέπει να κάνει τους γύρους στην πίστα **αριστερόστροφα** (αντίθετα των δεικτών του ρολογιού). Αν κάποιος προσπαθήσει να **κλέψει** κάνοντας ανάποδα γύρους και περνώντας πάνω από τη γραμμή τερματισμού, θα πρέπει να τιμωρείται εγκαταλείποντας το παιχνίδι. Στην πίστα θα υπάρχουν 3 ** πιατάκια **σε σταθερά σημεία τα οποία θα πυροβολούν τον kodu όταν τον βλέπουν και θα **μειώνουν την ενέργειά** του. Όταν όμως ο kodu ακουμπά μία **κόκκινη καρδιά** ανακτά μέρος της χαμένης του ενέργειας! Χαμός! Φυσικά, αν η ενέργεια μηδενιστεί, τότε ο παίκτης χάνει.

__Βασικά χαρακτηριστικά πίστας αγώνα:__ __Μάχη για την μπάλα:__ Αν ο χρήστης ξεφύγει από τον μαύρο μηχανόβιο στον αγώνα, τότε θα πρέπει **να πάρει την μπάλα από το κλουβί** και να την πετάξει στο κάστρο μπροστά από την kodula για να την ελευθερώσει. Για να μπει στο κλουβί ο kodu θα αφήσει το μηχανάκι και θα πάρει το αεροπλάνο (τζετ)! Τύφλα να χει ο πράκτορας 007! Άρα μόλις βγει από την πίστα αγώνα ο kodu και **μετατραπεί** σε τζετ (αυτόματα) **αρχίζει το δεύτερο μέρος του παιχνιδιού**. Δεν θα είναι όμως τόσο εύκολα τα πράγματα, καθώς θα πρέπει να αποφύγει τους εχθρικούς **δορυφόρους**, που εμφανίζονται και εξαφανίζονται σε **τυχαία χρονικά διαστήματα** πυροβολώντας τον kodu. Κρατήστε αυτό το χαρακτηριστικό της τυχαιότητας, θα μας απασχολήσει ιδιαίτερα στον προγραμματισμό του παιχνιδιού. Τι λέτε; Θα αφήσουμε μόνο του το τζετ να παλεύει με τόσους δορυφόρους; Όχι φυσικά! Ο παίκτης θα μπορεί να ανεβάσει τους πόντους ζωής του πηγαίνοντας κοντά σε ένα φιλικό αερόστατο που προσφέρει δωρεάν ενέργεια! Επίσης θα μπορεί να τους πυροβολεί και να τους σκοτώνει για να ξεμπερδεύει μια και καλή! Αφού φύγουν οι δορυφόροι από τη μέση ο δρόμος είναι ελεύθερος για να κουβαλήσουμε με το τζετ την μεγάλη μπάλα που θα ρίξει το κάστρο! Το παιχνίδι **τελειώνει** μόλις πέσει το κάστρο και ελευθερωθεί η Κodula!
 * 3 γύροι
 * μόνο αριστερόστροφα
 * επιτάχυνση στον kodu
 * γρηγορότερος ο μαύρος μηχανάκιας
 * αποφυγή πυραύλων
 * τιμωρία σε όποιον κλέψει
 * πιατάκια που ρίχνουν πυραύλους στον Kodu
 * καρδιές που δίνουν ενέργεια στον Kodu
 * νικάει όποιος τερματίσει πρώτος
 * χάνει όποιος του τελειώσει η ενέργεια

__Βασικά χαρακτηριστικά υπόλοιπου παιχνιδιού:__
 * χειρισμός Τζετ
 * τυχαία εμφάνιση και εξαφάνιση δορυφόρων
 * γέμισμα ενέργειας του Τζετ από το Αερόστατο
 * απογείωση - προσγείωση Τζετ και κουβάλημα μπάλας
 * νίκη παιχνιδιού αν πέσει το Κάστρο
 * ήττα αν τελειώσει η ενέργεια


 * __ Αντικείμενα και συμπεριφορές __**

Ποια θα είναι τα αντικείμενα στο παιχνίδι μας;

Ας προσθέσουμε αρχικά τους δύο βασικούς μας ήρωες την Κodula (γι' αυτήν γίνονται όλα)

και τον Κodu! (μάλλον δεν του αρέσει η δημοσιότητα :) ) Ο kodu θα μετακινείται με τα βελάκια του πληκτρολογίου. Θα πρέπει μόλις ακουμπήσει το πρώτο εργοστάσιο να μετατρέπεται σε κόκκινο μηχανόβιο. Ουσιαστικά δηλαδή δεν θα τον χρειαστούμε και για πολύ στο παιχνίδι μας. Απλά θα βοηθήσει στην αλυσιδωτή αντίδραση των μετατροπών kodu-> κόκκινος μηχανάκιας-> τζετ.

ο κόκκινος μηχανόβιος (ο kodu με κόκκινη μηχανή και κράνος),

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

το κόκκινο τζετ, θα το χειριζόμαστε από το πληκτρολόγιο και θα μπορεί να απογειώνεται και να προσγειώνεται με τα πλήκτρα αριστερό shift και αριστερό ctrl αντίστοιχα. Όταν ακουμπά την μπάλα θα την κουβαλά και όταν πατάμε space θα την αφήνει. Όταν πλησιάζει το αερόστατο θα παίρνει +100 πόντους ζωής. Θα πυροβολεί και αυτό με το πλήκτρο Z.

οι καρδιές, θα είναι τυχαία διατεταγμένες στην διαδρομή της πίστας αγώνα, θα δίνουν +10 πόντους ζωής στον κόκκινο μηχανόβιο και μετά θα εξαφανίζονται

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

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

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

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

__**Δημιουργώντας την πίστα**__

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

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

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

Τώρα, μέσα στην πίστα πρέπει να προσθέσουμε το υγρό που μας δίνει πόντους επιτάχυνσης. Σε ποιο σημείο θα δημιουργούσατε τη λιμνούλα εσείς: Θα την βάζατε σε μία στροφή της πίστας; Μάλλον όχι, γιατί έτσι θα δυσκολεύαμε αρκετά τον χρήστη. Ας την προσθέσουμε σε μία ευθεία της πίστας. Το ίδιο πρόβλημα υπάρχει και μετά πιατάκια. Αν τα βάλουμε στον δρόμο της πίστας θα χάνει πολύ εύκολα ενέργεια ο χρήστης άρα σχεδιάζουμε την πίστα έτσι ώστε να υπάρχει κενός χώρος στη μέση για να τοποθετήσουμε εκεί τα πιατάκια.

Ο υπόλοιπος κόσμος μας περιέχει τα κλειδιά για να καταφέρουμε να ανοίξουμε το κάστρο και να σώσουμε την kodula. Άρα έξω από την πίστα αγώνα σχεδιάζουμε ένα μέρος όπου ο kodu μπορεί να πάει μόνο από αέρος (ναι! θα τον κάνουμε να πετάξει!) και το κλείνουμε με κοφτερές κορυφές.

Προσθέτουμε και το βουνό που βλέπετε στο βάθος της προηγούμενης εικόνας με τέτοιον τρόπο ώστε από πίσω να κάνουμε μία λίμνη όπου θα μπορούμε να κρύψουμε στοιχεία που θα χρειαστεί ο kodu για την απελευθέρωση!

τη θέση της kodula (απομονωμένη με μοναδική είσοδο/έξοδο μπροστά από το κάστρο):

Θαυμάστε τον τελικό κόσμο μας και φύγαμε για προγραμματισμό!!!


 * Συμπεριφορές αντικειμένων και ανάλυση εντολών**

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

Μπορούμε να προσθέσουμε όλες τις εντολές σε μία σελίδα; Γιατί είναι λάθος; Πώς νομίζετε ότι θα συμπεριφερθεί ο παραπάνω κώδικας; Στο κεφάλαιο 9 είδαμε ότι οι διαφορετικές σελίδες αλλάζουν την συμπεριφορά του χαρακτήρα μας. Αυτό ακριβώς το χαρακτηριστικό χρησιμοποιούμε εδώ! Αν δεν χρησιμοποιήσουμε διαφορετικές σελίδες και κρατήσουμε την παραπάνω υλοποίηση ο kodu δεν θα προλάβει να εξαφανιστεί μόλις ακουμπήσει το εργοστάσιο γιατί πρώτα θα εκτελεστεί η εντολή 2 και η εντολή 3 δεν θα εκτελεστεί ποτέ! Άρα για τον προγραμματισμό του στην πρώτη σελίδα χρειαζόμαστε την εντολή κίνησης και την εντολή μετάβασης στη δεύτερη σελίδα, όπου θα του αλλάξουμε συμπεριφορά. Έπειτα στη δεύτερη σελίδα πρώτα δημιουργούμε τον κόκκινο μηχανάκια και έπειτα εξαφανίζουμε τον kodu. Για να δώσουμε στον παίκτη να καταλάβει ότι για να μετατραπεί ο kodu σε μηχανόβιο πρέπει να ακουμπήσει στο εργοστάσιο προσθέτουμε κατάλληλο μήνυμα που αναβοσβήνει κάθε δύο δευτερόλεπτα. Επομένως μία σωστή λύση είναι η εξής:

Στη δεύτερη σελίδα δημιουργούμε τον μηχανόβιο (αφού τον μαρκάραμε ως creatable) και εξαφανίζουμε τον kodu.

Όπως είδαμε πριν ο κόκκινος μηχανόβιος είναι ένα πρότυπο αντικείμενο. Για να χρησιμοποιήσουμε αυτό το αντικείμενο όπως μάθαμε στο κεφάλαιο 9 το μαρκάρουμε ως κλώνο (creatable). Από την αρχική περιγραφή του προβλήματος συμπεραίνουμε ότι στον κόκκινο μηχανόβιο θα χρειαστεί να υλοποιήσουμε αρκετές ενέργειες και συμπεριφορές τις οποίες μπορούμε να οργανώσουμε ως εξής:
 * - κόκκινος μηχανόβιος, σ υμπεριφορά και ανάλυση εντολών:**
 * Σελίδα 1: κυρίως πρόγραμμα, βασικές ενέργειες, μεταβάσεις προς τις άλλες σελίδες
 * Σελίδα 2: μετρητής γύρων
 * Σελίδα 3: μετρητής πόντων επιτάχυνσης
 * Σελίδα 4: τιμωρία σε κλέψιμο γύρων
 * Σελίδα 5: μετατροπή σε τζετ
 * Σελίδα 6: χρήση επιτάχυνσης με shift

Αρχικά, για να μπορεί να κινείται με τα βελάκια και να πυροβολεί με το Ζ:

Όχι! Μπορεί κάποιος χρήστης να κλέψει, αυξάνοντας τον μετρητή κάνοντας μπρος πίσω ή να περιμένει πάνω στην άσπρη γραμμή ή ακόμα και να κάνει τους γύρους ανάποδα!
 * Θέλουμε κάθε φορά που περνάει ο χαρακτήρας την γραμμή τερματισμού να αυξάνουμε την τιμή της μεταβλητής του σκορ κατά ένα**. Πώς θα καταφέρουμε να υλοποιήσουμε έναν **σωστό** μετρητή γύρων? Είναι σωστό να βάλουμε απλά μία άσπρη γραμμή και να προγραμματίσουμε τους μηχανόβιους με τη συμπεριφορά: **//ΟΤΑΝ (WHEN)// //περάσεις από την άσπρη γραμμή//** **//,// ΤΟΤΕ //αύξησε την τιμή του σκορ κατά ένα;//**

Φυσικά πρέπει να χρησιμοποιήσουμε pages για να αλλάξουμε συμπεριφορά στον χαρακτήρα μας. Πώς θα μπορούσαμε να τα εκμεταλλευτούμε? Ένας τρόπος είναι να βάλουμε μία δικλείδα ασφαλείας ζωγραφίζοντας μία κόκκινη γραμμή μετά την άσπρη έτσι ώστε αν ο χρήστης προσπαθήσει να κάνει ανάποδα τον γύρο να αναγκαστεί να περάσει πρώτα από την κόκκινη γραμμή. Αυτό το χαρακτηριστικό θα το εκμεταλλευτούμε σε ένα page εισάγοντας τις κατάλληλες εντολές!

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

Στο παραπάνω σκεπτικό βοηθά η εικόνα της πίστας στο σημείο τερματισμού: (π αρατηρήστε τα διαφορετικά είδη εδαφών: άσπρο, γκρι, μαύρο)

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

Σκεφτείτε τι πρόβλημα θα είχαμε αν αφήναμε μόνο την πρώτη εντολή εντολή. Όταν η ροή εκτέλεσης περάσει στη σελίδα 2 το σκορ θα αυξηθεί κατά ένα αλλά ο χρήστης θα μπορεί να ελέγχει τον μηχανόβιο? Η απάντηση είναι όχι! Το μόνο που θα ήξερε ξέρει ο μηχανόβιος είναι να αυξάνει το σκορ κατά ένα! Δεν θα είχε προγραμματιστεί για κάτι διαφορετικό.

Τώρα πρέπει να **αποτρέψουμε τον χρήστη από το να κλέβει γύρους**. Είχαμε βρει έναν τρόπο βάζοντας μία κόκκινη γραμμή μετά την άσπρη. Πώς θα **προγραμματίσουμε τον μηχανόβιο έτσι ώστε αν περάσει πρώτα την κόκκινη γραμμή χωρίς να έχει περάσει την άσπρη** (προσπάθεια να μας ξεγελάσει) να **τιμωρείται ο παίκτης**; Θα τον ακινητοποιήσουμε! Δηλαδή κάθε φορά που θα πατάει την κόκκινη γραμμή θα τον στέλνουμε στη σελίδα 4 όπου θα χάνει τον έλεγχο, εκτός κι αν αμέσως μετά πατήσει σε έδαφος της πίστας (μαύρο). Τι κερδίσαμε; Δείτε το σενάριο όπου ο χρήστης προσπαθεί να κλέψει κάνοντας ανάποδα τους γύρους: Πατάει την κόκκινη γραμμή, άρα πάει στη σελίδα 4 και αμέσως μετά πατάει σε γκρι έδαφος ανάμεσα στην κόκκινη και άσπρη γραμμή. Μένει για πάντα στη σελίδα 4 όπου δεν μπορεί να κουνηθεί! Δεν επιστρέφει ποτέ! Τον τιμωρήσαμε γιατί πήγε να παραβιάσει τους κανόνες του παιχνιδιού! Προσθέτουμε στο κυρίως πρόγραμμα (σελίδα 1) μία μετάβαση για την σελίδα 4 μόνο " ΟΤΑΝ (WHEN) //**είσαι σε έδαφος <τύπος κόκκινο>** ΤΟΤΕ// //(DO)// **//μετάβαση σε σελίδα 4//**" και από τη σελίδα 4 " ΟΤΑΝ (WHEN) //**είσαι σε έδαφος <τύπος μαύρο>** ΤΟΤΕ (DO) **μετάβαση σε σελίδα 1**//"

Σκεφτείτε το λίγο, κάτι τόσο απλό και δουλεύει! Μας λύνει ένα αρχικά δύσκολο πρόβλημα!

Η **επόμενη ενέργεια** που θα προγραμματίσουμε για τον μηχανόβιο είναι **να παίρνει πόντους επιτάχυνσης όταν περνάει πάνω απο το νερό της πίστας**. Πρέπει να **αποθηκεύουμε** κάπου αυτούς τους πόντους. Θα χρειαστούμε μία **μεταβλητή** (έστω το πράσινο σκορ) η οποία **θα αυξάνει τιμή μόλις ο τύπος του υγρού είναι ίδιος με αυτόν που έχουμε ορίσει για την επιτάχυνση**. Επίσης θα δώσουμε **αρχικά 100 μονάδες επιτάχυνσης** στον χρήστη. Όπως και στα προηγούμενα παραδείγματα πρέπει να **αλλάξουμε συμπεριφορά** στο χαρακτήρα μας, άρα θα χρησιμοποιήσουμε μία **νέα σελίδα**. Παρατηρήστε ότι κατά τη χρονική διάρκεια (εδώ 3 δευτερόλεπτα) στην οποία αυξάνουμε το μετρητή δεν μπορούμε να επιταχύνουμε με το shift. Αυτή ακριβώς τη συμπεριφορά περιμέναμε καθώς δεν υπάρχει κάπου αντίστοιχη εντολή για τη μείωση των πόντων επιτάχυνσης στη σελίδα.

Στην πρώτη σελίδα βάζουμε μία μετάβαση για την τρίτη.

και όταν περάσουν τα 3 δευτερόλεπτα πίσω στο κυρίως πρόβλημα

Επίσης, οι πόντοι επιτάχυνσης **πρέπει να μειώνονται όταν ο χρήστης πατάει το shift**. Θα σκεφτείτε... εύκολο αυτό ας βάλουμε στην αρχική σελίδα μία εντολή **//ΟΤΑΝ (WHEN)// πατηθεί στο //πληκτρολόγιο (keyboard)// το shift, ΤΟΤΕ //μείωσε (subtract) το πράσινο σκορ κατα ένα//**. Φυσικά αυτός ο τρόπος δεν μας επιτρέπει να κινούμαστε γρηγορότερα! Για να λύσουμε το πρόβλημα θα χρησιμοποιήσουμε μία νέα σελίδα στην οποία θα υλοποιήσουμε την επιτάχυνση και πρέπει να προσέξουμε το πότε επιστρέφουμε στην σελίδα 1 και την κανονική ροή εκτέλεσης. Σκεφτείτε: επιστρέφουμε στην σελίδα 1 όταν δεν πατάμε το shift ή όταν οι πόντοι πέσουν κάτω από το μηδέν. Στην πρώτη περίπτωση είναι απαίτηση του χρήστη να μην χρησιμοποιήσει τους πόντους του, ενώ στην δεύτερη δεν έχει δικαίωμα. Σε αυτό το σημείο μπορεί κάποιος να αναρωτηθεί, τι θα γίνει αν ο χρήστης έχει συνεχώς πατημένο το shift ενώ οι πόντοι επιτάχυνσης είναι μηδέν; Θα μεταπηδάμε συνεχώς από την πρώτη σελίδα στην τρίτη με αποτέλεσμα να μειώνονται οι πόντοι και κάτω από το μηδέν!



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



Τέλος δύο ακόμα χαρακτηριστικά που είχαμε βάλει στην περιγραφή είναι η **αύξηση ζωής όταν παίρνει μία καρδια** και το **stun** στον μαύρο μηχανόβιο όταν τον πυροβολούμε.

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

Ένα ζήτημα που δεν έχουμε ασχοληθεί μέχρι τώρα είναι το που βάζουμε τον κώδικα για την ενέργεια από τις καρδιές. Αν το βάλουμε στις καρδιές θα το γράψουμε μια φορά ενώ αλλιώς θα έπρεπε να το επαναλαμβάνουμε σε κάθε σελίδα κατά τον προγραμματισμό του κόκκινου μηχανάκια. Επομένως: 
 * - καρδιές, σ ****υμπεριφορά και ανάλυση εντολών**:


 * - δορυφόρος,** ** σ ****υμπεριφορά και ανάλυση εντολών**:

Τώρα πρέπει να σκεφτούμε πώς θα **προγραμματίσουμε τον δορυφόρο** έτσι ώστε **να εμφανίζεται και να εξαφανίζεται σε τυχαία χρονικά διαστήματα πυροβολώντας τον kodu**. Σίγουρα θα χρειαστούμε τις εντολές **timer, random και boom (ή vanish)**. Aν όμως κάνουμε τον χαρακτήρα μας να εξαφανίζεται **πώς θα τον επαναφέρουμε στην ζωή** και σε **τυχαίο** μάλιστα χρονικό διάστημα?

Η λύση ακούει στο όνομα... **Creatables**! **Δημιουργούμε δύο χαρακτήρες** (π.χ. ένα νόμισμα και τον δορυφόρο μας) σε μορφή creatable και τους προγραμματίζουμε έτσι ώστε **ο ένας να δημιουργεί τον άλλο** και ταυτόχρονα να καταστρέφει τον εαυτό του!

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

Για παράδειγμα έστω ότι δημιουργεί ένα αόρατο νόμισμα (γράφουμε εκεί τις εντολές προς εκτέλεση!):


 * - νόμισμα (σε συνδυασμό με τον δορυφόρο), συμπεριφορά και ανάλυση κώδικα:**

Αυτό θα κάνουμε και εμείς. Όσο ο δορυφόρος είναι εξαφανισμένος (άρα εκτελείται ο κώδικας του νομίσματος) και με καθυστέρηση τυχαία ανάμεσα σε ένα χρονικό διάστημα (εδώ 0.25 και 2 δευτερόλεπτα), το νόμισμα θα δημιουργεί τον δορυφόρο:
 * Στο νόμισμα πρέπει να εισάγουμε την τυχαιότητα**. Σίγουρα θα σας έχει τύχει παίζοντας διάφορα παιχνίδια "να μην ξέρετε απο που σας έρχονται"! Και όχι μόνο αυτό αλλά κάθε φορά που παίζεται την ίδια ακριβώς πίστα στο ίδιο ακριβώς σημείο "οι εχθροί" είναι σε διαφορετικές θέσεις! Τυχαία!

Παρατηρείτε κάποια έλλειψη? Στον προγραμματισμό πάντα ένα σημαντικό κομμάτι είναι η **αρχικοποίηση**. Εδώ ποιο αντικείμενο θα τρέξει πρώτο? Ο δορυφόρος ή το νόμισμα?

Αφού και τα δύο είναι creatables και δεν υπάρχουν στο παιχνίδι, **πρέπει κάποιος να τα δημιουργήσει**. Γιαυτό το σκοπό δημιουργούμε άλλο ένα αντικείμενο (έστω άλλο ένα φανερό νόμισμα) το οποίο θα κάνει την αρχή της αλυσιδωτής μας αντίδρασης με το που πλησιάσει το τζετ κοντά του.


 * -Ν ομίσμα (για την αρχικοποίηση), συμπεριφορά και ανάλυση κώδικα:**

Επιτέλους και ένα αντικείμενο που δεν θα μας ταλαιπωρήσει αρκετά! Οι ενέργειες του τζετ είναι σχετικά απλές. Το τζετ πρέπει να μετακινείται με τα βελάκια του πληκτρολογίου και να ανεβοκατεβαίνει όποτε το επιθυμεί ο χρήστης (επίσης με το πληκτρολόγιο). Το ιδιαίτερο χαρακτηριστικό του είναι ότι **μπορεί να κουβαλήσει την μπάλα και να την πετάξει όταν του ζητηθεί**!
 * -Τ ζετ, συμπεριφορά και ανάλυση κώδικα:**



Στο πρώτο μέρος μετατρέψαμε τον kodu σε μηχανόβιο αλληλεπιδρώντας με τον χρήστη (πρέπει να τον πάει στο εργοστάσιο). Μπορούμε να κάνουμε την ίδια μετατροπή χωρίς την παρέμβαση του χρήστη? Για παράδειγμα μόλις συμβεί ένα εσωτερικό γεγονός στο παιχνίδι (χτύπος ενός ρολογιού) μπορούμε να κάνουμε την ίδια μετατροπή. Επίσης παρατηρήσατε ότι αφήσαμε ανεκμετάλλευτο το κομμάτι της πίστας με τη μαύρη λιμνούλα πίσω από το βουνό. Μπορείτε να σκεφτείτε μόνοι σας αρκετά πράγματα για να εξελίξετε το παιχνίδι! Για παράδειγμα αν υποθέσουμε ότι το μαύρο υγρό της λιμνούλας είναι πετρέλαιο και ο kodu μπορεί να πάρει πόντους ζωής από αυτό, δοκιμάστε να προσθέσετε ένα πλοίο και βάλτε το να εμποδίσει τον kodu από το να κάνει ανεφοδιασμό πάνω από την πηγή.
 * Παραλλαγές παιχνιδιού: **

Στο παιχνίδι μας προγραμματίσαμε τον κόκκινο Μηχανάκια να μετατρέπεται σε Τζετ όταν ακουμπά την καλύβα και αφού έχει νικήσει στον αγώνα ταχύτητας. Όμως υπάρχει ένα σενάριο εκτέλεσης όπου ο κώδικας δεν συμπεριφέρεται σύμφωνα με τις προδιαγραφές που έχουμε θέσει. Στον προγραμματισμό αυτή η περίπτωση αποτελεί ένα **σφάλμα λογισμικού (software bug)** του προγράμματος. Συγκεκριμένα στην παραπάνω υλοποίηση του παιχνιδιού υπάρχει ένα σενάριο εκτέλεσης του προγράμματος όπου ο κόκκινος μηχανάκιας καταφέρνει να βγει εκτός πίστας αγώνα χωρίς να μετατραπεί σε Τζετ. Καλείστε λοιπόν να βρείτε αυτό το σενάριο, να εξηγήσετε γιατί συμβαίνει και να το διορθώσετε.
 * Άσκηση:**
 * 1) Αποσφαλμάτωση (debugging) του κώδικα!**

---

**Game2- The Clash Of The Titans-Kodu [Episode: Kodu VS Darth Koduer] **
Κατακτητές στο <span style="font-family: Arial,Helvetica,sans-serif;">**<span style="font-family: arial,helvetica,sans-serif; font-weight: normal;">Kodulion ** (χωριό του <span style="font-family: Arial,Helvetica,sans-serif;">**<span style="font-family: arial,helvetica,sans-serif; font-weight: normal;">Kodu). Ο **<span style="font-family: arial,helvetica,sans-serif;">Kodu καλείται να βγάλει το φίδι από την τρύπα. Να εξολοθρεύσει τους φρουρούς και να σκοτώσει τον αρχηγό τους, τον τρομερό και φοβερό **<span style="font-family: arial,helvetica,sans-serif; font-weight: normal;">Darth Koduer **...

Α) ΠΡΟΒΛΗΜΑ Έχουμε ένα κόσμο που αποτελείται από μια περιοχή με δέντρα, λόφους, μικρά αναχώματα, κλουβιά με τους αιχμαλώτους χωρικούς και ένα Κολοσσαίο.  Σκοπός μας είναι να καθοδηγήσουμε τον <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">Kodu έτσι ώστε να περάσει από την πρώτη περιοχή και να κατορθώσει να μπει στο Κολοσσαίο με απώτερο σκοπό να ελευθερώσει τους συγχωριανούς του.

Θα πείτε τώρα ότι είναι εύκολο να διασχίσει μια περιοχή και να φτάσει στο Κολοσσαίο αλλά θα σας φαινόταν το ίδιο εύκολο αν σας έδινα τις εξής συμπληρωματικές πληροφορίες: Στους λόφους μπορούμε να τοποθετήσουμε σκοπευτές/πολυβόλα Στα μικρά αναχώματα μπορούμε να κρύψουμε φρουρούς Στα δέντρα μπορούμε να τοποθετήσουμε μήλα κτλ Στα κλουβιά μπορούμε να τοποθετήσουμε απ’ έξω από ένα φρουρό Στο Κολοσσαίο μπορούμε να τοποθετήσουμε τον αρχηγό των κατακτητών, Darth Koduer

Γενικά, αυτά που ισχύουν σε όλο τον κόσμο είναι τα εξής: v Με κάθε μήλο που παίρνεις/τρως έχεις σφαίρες για 8 <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">sec v Με 3 αστέρια που παίρνεις έχεις πυραύλους για 10 <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">sec v Αν χάσεις μια ζωή μειώνονται κατά μια οι ζωές σου v Αν οι ζωές σου γίνουν μηδέν χάνεις το παιχνίδι

Ας δούμε τώρα όμως τα βασικά χαρακτηριστικά της πρώτης περιοχής: v Περνάς στο Κολοσσαίο αν νικήσεις όλους τους φρουρούς v Αν νικήσεις όλους τους φρουρούς θα σταματήσουν να σε πυροβολούν οι σκοπευτές/πολυβόλα

Στο Κολοσσαίο τώρα τα βασικά χαρακτηριστικά είναι τα εξής: v Κάθε 30 sec πύραυλοι εδάφους-αέρος θα κατευθύνονται προς τα εσένα. v Κάθε 50-55 sec θα εμφανίζεται ένα punk και θα πυροβολεί προς πάσα κατεύθυνση τραυματίζοντας όποιον πετύχει ακόμα και τον Darth Koduer v Ο Darth Koduer κάθε 15-25 sec θα κερδίζει πίσω πόντους ή health.

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

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

Β) ΑΝΤΙΚΕΙΜΕΝΑ & ΣΥΜΠΕΡΙΦΟΡΕΣ Ας ξεκινήσουμε να αναφέρουμε τους χαρακτήρες και τα αντικείμενα που θα χρειαστούμε για την δημιουργία του παιχνιδιού μας.  Φυσικά θα ξεκινήσουμε από τους πρωταγωνιστές του παιχνιδιού μας που δεν είναι άλλοι από τους <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">Kodu 0101 και τον Darth Koduer <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">[image-Kodu0101]  [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image - Darth Koduer]

Οι αιχμάλωτοι θα είναι κάπως έτσι και θα περιμένουν να τους ελευθερώσει ο ήρωας μας [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image- αιχμάλωτοι]

Οι φρουροί θα έχουν αυτή την μορφή: [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image- φρουροί]

Τα μήλα [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image -μήλα] που θα σε αφήνουν να έχεις σφαίρες για 8 <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">sec

Τα αστέρια [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image -αστέρια] που αν έχεις μαζέψει 3 θα σε αφήνουν να έχεις πυραύλους για 10 <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">sec

Ο δίσκος χόκεϋ [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image - <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">punk ] που θα πυροβολεί προς πάσα κατεύθυνση ανά 50-55 <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">sec

Σύννεφα [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image- σύννεφα] διακοσμητικός ο ρόλος τους (ή και όχι;;;)

Δέντρα [ <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">image- δέντρα] διακοσμητικός ο ρόλος τους (ή και όχι;;;)

Γ) ΑΝΑΛΥΤΙΚΗ ΠΕΡΙΓΡΑΦΗ ΑΝΤΙΚΕΙΜΕΝΩΝ

<span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;"> Kodu0101: Ο χαρακτήρας μας θα κινείται μέσα στον κόσμο εκτελώντας δικές μας εντολές οπότε θα πρέπει να τον προγραμματίσουμε έτσι ώστε να μας υπακούει. Θα χρησιμοποιήσουμε επομένως την εντολή **<span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">WHEN //keyboard WASD// DO //move// ** <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">Επίσης όταν ακουμπάει [bump] κάποια αντικείμενα θα αλληλεπιδρά μαζί τους οπότε θα πρέπει να καταγράψουμε αυτές τις περιπτώσεις, μετά να τις μεταφέρουμε σε κώδικα και να δούμε πως θα τις συνδέσουμε και θα τις προσθέσουμε στην συμπεριφορά του Kodu0101.
 * 1) <span style="font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">Μήλο **WHEN //timer 5 seconds 3 seconds// DO //switch page 1//**
 * <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">WHEN //mouse left// DO //shoot blip forward// **
 * <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;"> WHEN //keyboard WASD// DO //move// **
 * 1) <span style="font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">Αστέρι **WHEN //timer 5 seconds 3 seconds// DO //switch page 1//**
 * <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;">WHEN //mouse left// DO //shoot missile forward// **
 * <span style="color: black; font-family: Arial,sans-serif; font-size: 10pt; line-height: 115%;"> WHEN //keyboard WASD// DO //move// **