Πίνακας περιεχομένων:

Network Rivalry: a Low-Latency Game for the BBC Micro: bit: 10 Steps (with Pictures)
Network Rivalry: a Low-Latency Game for the BBC Micro: bit: 10 Steps (with Pictures)

Βίντεο: Network Rivalry: a Low-Latency Game for the BBC Micro: bit: 10 Steps (with Pictures)

Βίντεο: Network Rivalry: a Low-Latency Game for the BBC Micro: bit: 10 Steps (with Pictures)
Βίντεο: Elite: "The game that couldn't be written" 2024, Νοέμβριος
Anonim
Network Rivalry: a Low-Latency Game for the BBC Micro: bit
Network Rivalry: a Low-Latency Game for the BBC Micro: bit
Network Rivalry: a Low-Latency Game for the BBC Micro: bit
Network Rivalry: a Low-Latency Game for the BBC Micro: bit

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

  • Μια απλή διεπαφή
  • Χαμηλή καθυστέρηση μεταξύ πατήματος κουμπιών και ενημερώσεων οθόνης
  • Ευέλικτος αριθμός συμμετεχόντων
  • Εύκολος έλεγχος του παιχνιδιού χρησιμοποιώντας μια κύρια απομακρυσμένη συσκευή ("root")

Το παιχνίδι είναι ουσιαστικά μια προσομοίωση της πολιτικής. Όλοι οι παίκτες ξεκινούν χωρίς ανάθεση σε οποιαδήποτε ομάδα, εκτός από δύο παίκτες. Ένας από αυτούς τους παίκτες ανατίθεται στην ομάδα Α και ο άλλος στην ομάδα Β.

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

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

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

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

Το παραπάνω διάγραμμα καθορίζει τις ακόλουθες καταστάσεις:

  • Χωρίς ανάθεση
  • Ακούστε τον Α
  • Ακούστε τον Β
  • Ομάδα Α
  • Ομάδα Β

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

Σε όλο τον οδηγό θα υποθέσω ότι χρησιμοποιείτε το πρόγραμμα επεξεργασίας MakeCode της Microsoft, το οποίο μπορείτε να βρείτε στη διεύθυνση:

Μπορείτε να βρείτε την πλήρη εφαρμογή του παιχνιδιού εδώ:

makecode.microbit.org/_CvRMtheLbRR3 ("microbit-demo-user" είναι το όνομα του έργου)

Και την εφαρμογή του βασικού ελεγκτή δικτύου ("root") μπορείτε να βρείτε εδώ:

makecode.microbit.org/_1kKE6TRc9TgE ("microbit-demo-root" είναι το όνομα του έργου)

Θα αναφερθώ σε αυτά τα παραδείγματα σε όλο το σεμινάριό μου.

Βήμα 1: Σχεδιασμός μεγάλων εικόνων

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

  1. Θέλουμε να ελέγξουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της
  2. Θέλουμε η συσκευή να αντιδρά στην είσοδο του χρήστη
  3. Μπορεί να θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 x 5
  4. Θέλουμε να αρχικοποιήσουμε τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει
  5. Θέλουμε να μεταδίδουμε δεδομένα ασύρματα χρησιμοποιώντας το ραδιόφωνο της συσκευής
  6. Θέλουμε να ακούμε και να λαμβάνουμε δεδομένα μέσω του ραδιοφώνου της συσκευής και να τα επεξεργαζόμαστε ανάλογα

Επιτρέψτε μου να αναφερθώ σε περισσότερες λεπτομέρειες για το καθένα.

1. Θέλουμε να ελέγξουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της

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

2. Θέλουμε η συσκευή να αντιδρά στην είσοδο του χρήστη

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

3. Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 x 5

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

4. Θέλουμε να αρχικοποιήσουμε τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει

Πριν κάνει κάτι η συσκευή μας, η εφαρμογή πρέπει να φορτώσει τα δεδομένα της στη μνήμη. Αυτό περιλαμβάνει σταθερές μεταβλητές που ονομάζονται για την αναγνωσιμότητα του κώδικα, μεταβλητές που περιέχουν εικόνες, οι οποίες ενδέχεται να αποτελούν μέρος μιας κινούμενης εικόνας και μετρητές που πρέπει να ξεκινούν από το 0 για να λειτουργήσουν σωστά. Θα καταλήξουμε σε μια μεγάλη λίστα με ονόματα μεταβλητών και τις τιμές που έχουν εκχωρηθεί πρόσφατα. Ως προσωπική επιλογή στυλ, θα υποδηλώσω σταθερές τιμές, δηλαδή τιμές που δεν θα χρειαστεί ποτέ να αλλάξω, χρησιμοποιώντας ALL_CAPS. Θα προθέσω επίσης αναγνωριστικά κύριας μεταβλητής με όνομα κατηγορίας που αναφέρεται σε ένα είδος αντικειμένου ή τύπου στον οποίο εμπίπτει το αναγνωριστικό. Αυτό προσπαθεί να κάνει τον κώδικα πιο εύκολο να ακολουθηθεί. Δεν θα χρησιμοποιήσω ποτέ ένα όνομα μεταβλητής όπως "στοιχείο" ή "x" λόγω της ασάφειας που προκύπτει κατά την προσπάθεια αποκρυπτογράφησης του κώδικα.

5. Θέλουμε να μεταδώσουμε δεδομένα ασύρματα χρησιμοποιώντας το ραδιόφωνο της συσκευής

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

6. Θέλουμε να ακούμε και να λαμβάνουμε δεδομένα μέσω του ραδιοφώνου της συσκευής και να τα επεξεργαζόμαστε ανάλογα

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

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

  1. Θέλουμε να μπορούμε να επιλέξουμε ένα σήμα
  2. Θέλουμε να είμαστε σε θέση να μεταδώσουμε ένα σήμα

-

1. Θέλουμε να μπορούμε να επιλέξουμε ένα σήμα

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

2. Θέλουμε να είμαστε σε θέση να μεταδώσουμε ένα σήμα

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

Θα μιλήσω περισσότερο για το απλό πρωτόκολλο σήματος στην επόμενη ενότητα.

Βήμα 2: Το πρωτόκολλο σήματος: μια απλή γλώσσα για επικοινωνία δικτύου

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

0. Επαναφορά

  • Αναγνωριστικό στον κωδικό: SIG-R
  • Ακέραιος αριθμός: 0
  • Σκοπός: Πείτε σε όλες τις συσκευές που βρίσκονται εντός εμβέλειας να εγκαταλείψουν αυτό που κάνουν και να λειτουργούν σαν να έχουν μόλις ξεκινήσει. Εάν αυτό το σήμα φτάσει σε όλες τις συσκευές του δικτύου, θα επαναφερθεί ολόκληρο το δίκτυο και οι χρήστες θα μπορούν να ξεκινήσουν ένα νέο παιχνίδι. Αυτό το σήμα μπορεί να μεταδοθεί μόνο από μια ριζική συσκευή.

1. Μετατροπή Α

  • Αναγνωριστικό στον κωδικό: SIG-A
  • Ακέραιος αριθμός: 1
  • Σκοπός: Πείτε σε οποιαδήποτε συσκευή βρίσκεται σε κατάσταση LISTEN_A, μόλις λάβουν το σήμα μετατροπής, να μεταβούν στην κατάσταση TEAM_A.

2. Μετατροπή Β

  1. Αναγνωριστικό στον κωδικό: SIG-B
  2. Ακέραιος αριθμός: 2
  3. Σκοπός: Πείτε σε οποιαδήποτε συσκευή βρίσκεται σε κατάσταση LISTEN_B, μόλις λάβουν το σήμα μετατροπής, να μεταβεί στην κατάσταση TEAM_B.

Βήμα 3: Θέλουμε να ελέγξουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της

Θέλουμε να ελέγχουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της
Θέλουμε να ελέγχουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της
Θέλουμε να ελέγχουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της
Θέλουμε να ελέγχουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της
Θέλουμε να ελέγχουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της
Θέλουμε να ελέγχουμε τις ενέργειες της συσκευής με βάση την τρέχουσα κατάστασή της

Επιτέλους, μπορούμε να αρχίσουμε να γράφουμε κώδικα.

Αρχικά, ανοίξτε ένα νέο έργο στο Make Code

  • Δημιουργήστε μια νέα συνάρτηση. Κάλεσα το δικό μου βρόχο επειδή αυτός είναι ο κύριος βρόχος της εφαρμογής
  • Προσθέστε ένα μπλοκ βρόχου που θα επαναλαμβάνεται επ 'αόριστον. Χρησιμοποίησα ενώ (αληθές) επειδή μια κυριολεκτική αλήθεια δεν θα είναι ποτέ ψευδής, επομένως η ροή ελέγχου της εφαρμογής δεν θα βγει ποτέ από τον βρόχο
  • Προσθέστε αρκετά μπλοκ αν-else για να ελέγξετε εάν η συσκευή βρίσκεται σε οποιαδήποτε από τις πέντε πιθανές καταστάσεις της
  • Δημιουργήστε μια μεταβλητή για να διατηρήσετε την τρέχουσα κατάσταση συσκευής
  • Δημιουργήστε μεταβλητές που αντιπροσωπεύουν κάθε μία από τις πέντε πιθανές καταστάσεις

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

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

Σημείωση: Μην ανησυχείτε για τα γκρι μπλοκ στην τρίτη εικόνα. Θα φτάσω σε αυτά αργότερα.

Βήμα 4: Θέλουμε να αντιδράσουμε στην είσοδο χρήστη

Θέλουμε να αντιδράσουμε στην εισαγωγή χρήστη
Θέλουμε να αντιδράσουμε στην εισαγωγή χρήστη
Θέλουμε να αντιδράσουμε στην εισαγωγή χρήστη
Θέλουμε να αντιδράσουμε στην εισαγωγή χρήστη

Τώρα, θέλουμε να πούμε στη συσκευή πώς να χειρίζεται το πάτημα κουμπιών. Η πρώτη σκέψη μπορεί να είναι η απλή χρήση των μπλοκ "Όταν πατιέται το κουμπί" στην κατηγορία εισαγωγής, αλλά θα θέλαμε πιο λεπτομερή έλεγχο από αυτό. Θα χρησιμοποιήσουμε το μπλοκ "on event from (X) with value (Y)" από την κατηγορία ελέγχου κάτω από την προηγμένη ενότητα, επειδή είμαστε προχωρημένοι σε αυτό το σεμινάριο.

  • Δημιουργήστε τέσσερα μπλοκ "σε εκδήλωση από …".

    • Δύο από αυτά θα πρέπει να ελέγξουν την πηγή συμβάντος "MICROBIT_ID_BUTTON_A"
    • Δύο από αυτά θα πρέπει να ελέγξουν την πηγή συμβάντος "MICROBIT_ID_BUTTON_B"
    • Από τα δύο συμβάντα που στοχεύουν σε κάθε κουμπί:

      • Κάποιος πρέπει να ελέγξει για το συμβάν τύπου "MICROBIT_BUTTON_EVT_UP"
      • Πρέπει να ελέγξετε για το συμβάν τύπου "MICROBIT_BUTTON_EVT_DOWN"
    • Σημείωση: Αυτές οι επιλογές με όλα τα κεφαλαία γράμματα είναι ετικέτες που χρησιμοποιούνται στον κώδικα micro: bit χαμηλότερου επιπέδου. Είναι απλά σύμβολα κράτησης θέσης που αργότερα αντικαθίστανται από ακέραιους αριθμούς όταν ο κώδικας μεταγλωττιστεί σε εκτελέσιμο δυαδικό αρχείο. Είναι ευκολότερο για τους ανθρώπους να χρησιμοποιούν αυτές τις ετικέτες παρά να ψάχνουν ποιο ακέραιο να βάλουν, αν και τα δύο θα λειτουργούσαν με τον ίδιο τρόπο.
  • Επέλεξα, ως θέμα στυλ, να υπάρχει κάθε κλήση μπλοκ "σε εκδήλωση από …" μια λειτουργία που περιγράφει το αυξημένο συμβάν. Αν και δεν είναι απολύτως απαραίτητο, κατά τη γνώμη μου αυτό βελτιώνει την αναγνωσιμότητα. Εάν κάποιος το επιθυμεί, μπορεί να βάλει τον κώδικα διαχείρισης συμβάντων στο ίδιο το μπλοκ "on event from…".

    Σημείωση: Το μπλοκ κώδικα που χειρίζεται την απάντηση της συσκευής σε ένα συμβάν ονομάζεται διαισθητικά "χειριστής συμβάντων"

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

    • Γνωρίζουμε ότι όταν η συσκευή είναι σε κατάσταση ΑΔΙΑΔΙΟΡΙΣΜΕΝΗ, η συσκευή θα πρέπει να αντιδράσει στο κουμπί Α που πιέζεται από μια μετάβαση στην κατάσταση LISTEN_A και στο κουμπί Β που πατάται από μια μετάβαση στην κατάσταση LISTEN_B
    • Γνωρίζουμε επίσης ότι όταν η συσκευή βρίσκεται σε κατάσταση LISTEN_A ή LISTEN_B, η συσκευή θα πρέπει να αντιδράσει στο κουμπί Α που απελευθερώνεται και στο κουμπί Β που απελευθερώνεται, αντίστοιχα, μεταβαίνοντας πίσω στην κατάσταση ΑΔΙΑΔΟΣΗ.
    • Τέλος, γνωρίζουμε ότι όταν η συσκευή βρίσκεται σε κατάσταση TEAM_A ή TEAM_B, η συσκευή θα πρέπει να αντιδράσει στο κουμπί A πατημένο και στο κουμπί B πατημένο με εκπομπή SIG_A και με μετάδοση SIG_B αντίστοιχα.

      Δεν είναι απαραίτητο σε αυτό το σημείο να συμπληρώσετε τα στοιχεία των σημάτων μετάδοσης. Θα φτάσουμε σε αυτό αργότερα. Αυτό που είναι σημαντικό είναι να δώσουμε οδηγίες σε αυτές τις λειτουργίες να χρησιμοποιούν τον κώδικα που θα γράψουμε δίνοντας ένα όνομα σε αυτό το μπλοκ ενεργειών, όπως το broadcastSignalSIG_A, το οποίο περιγράφει τι πρέπει να γίνει σε εκείνο το σημείο

Βήμα 5: Θέλουμε να αρχικοποιήσουμε τις τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει

Θέλουμε να αρχικοποιήσουμε τις τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει
Θέλουμε να αρχικοποιήσουμε τις τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει
Θέλουμε να αρχικοποιήσουμε τις τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει
Θέλουμε να αρχικοποιήσουμε τις τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει
Θέλουμε να αρχικοποιήσουμε τις τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει
Θέλουμε να αρχικοποιήσουμε τις τιμές δεδομένων στη μνήμη των συσκευών όταν η συσκευή εκκινήσει

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

Αυτές είναι οι τιμές που πρέπει να αρχικοποιήσουμε:

  • Σταθερές σήματος, σύμφωνα με το πρωτόκολλο σήματος. Οι τιμές ΠΡΕΠΕΙ να είναι:

    • SIG_R = 0
    • SIG_A = 1
    • SIG_B = 2
    • Σημείωση: Πρόθεσα αυτές τις σταθερές με "EnumSignals" για να δηλώσω ότι αυτές οι μεταβλητές θα συμπεριφέρονται σαν να αποτελούν μέρος ενός απαριθμημένου τύπου που ονομάζεται Σήματα. Έτσι μπορούν να εφαρμοστούν αυτές οι μεταβλητές σε άλλες γλώσσες προγραμματισμού. Ο ορισμός και η εξήγηση των απαριθμημένων τύπων είναι πέρα από το πεδίο του σεμιναρίου μου. Κάποιος μπορεί να το ψάξει στο Google αν το επιθυμεί. Αυτά τα προθέματα είναι απλά στιλιστικές επιλογές και δεν είναι καθόλου απαραίτητα για τη σωστή λειτουργία του προγράμματος.
  • Σταθερές κατάστασης, οι οποίες μπορούν να είναι αυθαίρετες αρκεί να έχουν μια τιμή. Έκανα μια επιλογή στυλ για να χρησιμοποιήσω απλώς ακέραιους αριθμούς που αυξάνονται από το 0, όπως έτσι:

    • ΑΔΙΑΔΟΧΗ = 0
    • LISTEN_A = 1
    • LISTEN_B = 2
    • TEAM_A = 3
    • TEAM_B = 4
    • Σημείωση: Πήρα την ίδια απόφαση στυλ όσον αφορά τα προθέματα και για αυτές τις μεταβλητές. Επιπλέον, θα αναφέρω ότι όλα σχετικά με αυτές τις αναθέσεις, τις τιμές και τη σειρά, είναι εντελώς αυθαίρετα. Δεν έχει καν σημασία ότι αυτές οι τιμές είναι συνεπείς από συσκευή σε συσκευή, επειδή χρησιμοποιούνται μόνο εσωτερικά και όχι για επικοινωνία μέσω του δικτύου. Το μόνο που έχει σημασία είναι ότι οι μεταβλητές έχουν μια τιμή και ότι μπορούν να συγκριθούν μεταξύ τους για να διαπιστωθεί εάν είναι ισοδύναμες ή όχι.
  • Για αναγνωσιμότητα, μια σταθερά που ονομάζεται BOOT_STATE και ορίστε την στο UNASSIGNED. Αυτό καθιστά το γεγονός ότι επαναφέρουμε την κατάσταση εκκίνησης, αντί για μια πιο αυθαίρετη κατάσταση, πιο σαφές όταν η συσκευή λάβει ένα σήμα επαναφοράς, το οποίο θα εφαρμόσουμε αργότερα.
  • Σταθερές κινούμενων εικόνων, που χρησιμοποιούνται στο επόμενο βήμα για τη δημιουργία κινούμενων εικόνων που επιτρέπουν διακοπή εξαιρετικά χαμηλής καθυστέρησης μέσω εισαγωγής χρήστη. Δεν τα έχουμε χρησιμοποιήσει μέχρι τώρα, αλλά σίγουρα θα εξηγηθούν και θα χρησιμοποιηθούν στην επόμενη ενότητα. Η σημασία ορισμένων από αυτά θα πρέπει να είναι διαισθητική λόγω των ονομάτων τους.

    • TICKS_PER_FRAME_LOADING_ANIMATION = 50
    • MS_PER_DEVICE_TICK = 10
    • MS_PER_FRAME_BROADCAST_ANIMATION = 500
    • MICROSECONDS_PER_MILLISECOND = 1000
    • NUMBER_OF_FRAMES_IN_LOADING_ANIMATION = 4
  • Μια άλλη μεταβλητή για κινούμενα σχέδια, αυτή τη φορά ένας μετρητής που σίγουρα δεν είναι σταθερός. Όπως και οι περισσότεροι μετρητές, το αρχικοποιούμε στο 0

    iTickLoadingAnimation = 0

  • Δημιουργήστε δύο σειρές μεταβλητών για να συγκρατήσετε πλαίσια κινούμενων σχεδίων. Η πρώτη, την οποία ονομάζω "φόρτωση κινούμενων σχεδίων", θα πρέπει να έχει τέσσερις εικόνες (τις οποίες ίσως μαντέψατε με την τελευταία σταθερή προετοιμασία) και τη δεύτερη, την οποία ονομάζω "μετάδοση κινούμενων εικόνων", η οποία θα πρέπει να έχει τρεις εικόνες. Προτείνω να ονομάσετε τις μεταβλητές ώστε να αντιστοιχούν σε πλαίσια της κινούμενης εικόνας, π.χ. δαχτυλίδιAnimation0, ringAnimation1…

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

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

Βήμα 6: Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 X 5

Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 X 5
Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 X 5
Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 X 5
Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 X 5
Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 X 5
Θέλουμε να εμφανίζουμε κινούμενα σχέδια και γραφικά χρησιμοποιώντας την οθόνη LED 5 X 5

Και τώρα για κάτι εντελώς διαφορετικό.

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

  • Δημιουργήστε μια συνάρτηση για κάθε εικόνα. Αυτό θα επιτρέψει σε κάποιον να χρησιμοποιήσει ένα μόνο μπλοκ για να εμφανίσει την εικόνα αντί να επεξεργάζεται javascript κάθε φορά. Σε αυτό το συγκεκριμένο πρόγραμμα, καμία εικόνα δεν χρησιμοποιείται περισσότερες από μία φορές, αλλά εξακολουθώ να πιστεύω ότι αυτό το στυλ διευκολύνει την ανάγνωση του κώδικα.
  • Προσθέστε, σε κάθε νέα συνάρτηση, ένα μπλοκ "εμφάνιση εικόνας (Χ) σε μετατόπιση 0" με το αντίστοιχο όνομα μεταβλητής εικόνας να αντικαθιστά (Χ)
  • Προσθέστε, στον κύριο βρόχο κατάστασης. Τα μπλοκ "Εμφάνιση συμβολοσειράς (Χ)" σε κάθε μπλοκ εκτός από αυτό που χειρίζεται την κατάσταση ΑΔΙΑΔΟΤΗΣΗ. Προσθέστε έναν χαρακτήρα για να εμφανιστεί η συσκευή για να υποδείξει τις διαφορετικές καταστάσεις της. Ιδού τι έκανα:

    • LISTEN_A: 'a'
    • LISTEN_B: 'b'
    • TEAM_A: 'A'
    • TEAM_B: 'B'

      Για κατάσταση ΑΝΑΡΤΗΜΕΝΗ, πραγματοποιήστε μια κλήση σε μια λειτουργία που θα ενημερώσει το κινούμενο σχέδιο φόρτωσης. Θα συμπληρώσουμε τα στοιχεία αυτής της συνάρτησης παρακάτω

  • Μετάβαση στη λειτουργία javascript.
  • Βρείτε κάθε κλήση στο X.showImage (0) και στο Basic.showString (X)
  • Αλλάξτε το κάθε ένα σε X.showImage (0, 0) ή basic.showString (X, 0)

    • Η προσθήκη αυτού του επιπλέον ορίσματος θα ορίσει την καθυστέρηση μετά την ενέργεια στο 0. Από προεπιλογή, αυτό παραλείπεται και η συσκευή θα κάνει παύση για 400 ms μετά την εκτέλεση καθενός από αυτά τα μπλοκ.
    • Τώρα, έχουμε έναν σχεδόν μη καθυστερημένο μηχανισμό για την εμφάνιση των εικόνων μας στα μπλοκ κινούμενων σχεδίων μας, τον οποίο μπορούμε τώρα να δημιουργήσουμε

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

  • Δημιουργήστε μια λειτουργία που θα εμφανίζει κινούμενα σχέδια μετάδοσης.
  • Μέσα σε αυτό το μπλοκ, προσθέστε τρεις κλήσεις λειτουργιών, μία σε κάθε καρέ της κινούμενης εικόνας, με τη σειρά που πρέπει να εμφανίζονται
  • Προσθέστε ένα μπλοκ "wait (us) (X)" μετά από κάθε κλήση σε μια λειτουργία εμφάνισης εικόνας.

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

  • Αντικατάσταση (X) με (MS_PER_FRAME_BROADCAST_ANIMATION x MICROSECONDS_PER_MILLISECOND)
  • Η κίνηση θα πρέπει τώρα να λειτουργεί σωστά

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

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

    Εάν η συνθήκη είναι αληθής, επαναφέρετε το iTickLoadingAnimation στο 0

  • Προσθέστε ένα μπλοκ συνθηκών if-else. Αυτά θα καθορίσουν ποιο πλαίσιο της κίνησης θα εμφανιστεί.

    Για κάθε καρέ της κινούμενης εικόνας, εάν ο μετρητής τσιμπούρι είναι μικρότερος από τον αριθμό των κρότωνων σε κάθε κινούμενη εικόνα πολλαπλασιασμένος με τον αριθμό πλαισίου της κινούμενης εικόνας (ξεκινώντας από το 1), στη συνέχεια εμφανίστε αυτό το πλαίσιο, αλλιώς ελέγξτε αν το επόμενο πλαίσιο είναι αυτό να εμφανίζονται

  • Στο κάτω μέρος του μπλοκ, αυξήστε το iTickLoadingAnimation
  • Η κίνηση θα πρέπει τώρα να λειτουργεί σωστά

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

Βήμα 7: Θέλουμε να μεταδώσουμε δεδομένα ασύρματα χρησιμοποιώντας το ραδιόφωνο της συσκευής

Θέλουμε να μεταδίδουμε δεδομένα ασύρματα χρησιμοποιώντας το ραδιόφωνο της συσκευής
Θέλουμε να μεταδίδουμε δεδομένα ασύρματα χρησιμοποιώντας το ραδιόφωνο της συσκευής

Αυτό το βήμα είναι πολύ μικρότερο από το προηγούμενο. Στην πραγματικότητα, είναι ίσως το συντομότερο βήμα σε ολόκληρο αυτό το σεμινάριο.

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

  • Πατημένο το κουμπί Α:

    • Εάν η συσκευή είναι σε κατάσταση TEAM_A:

      Σήμα μετάδοσης SIG_A

  • Πατημένο το κουμπί Β:

    • Εάν η συσκευή βρίσκεται σε κατάσταση TEAM_B

      Σήμα μετάδοσης SIG_B

Δημιουργήστε αυτές τις συναρτήσεις αν δεν υπάρχουν ήδη.

Σε κάθε συνάρτηση:

  • Καλέστε τη λειτουργία κίνησης μετάδοσης. Αυτό θα αποκλείσει οτιδήποτε άλλο να συμβεί μέχρι να ολοκληρωθεί, το οποίο θα είναι σε MS_PER_FRAME_BROADCAST_ANIMATION * 3 = 1,5 δευτερόλεπτα. Η σταθερά πολλαπλασιάζεται με τρία επειδή υπάρχουν τρία καρέ στο κινούμενο σχέδιο. Αυτό είναι αυθαίρετο και μπορούν να προστεθούν περισσότερα αν η αισθητική αναβάθμιση είναι αρκετά μεγάλη. Ένας δεύτερος σκοπός αυτής της κινούμενης εικόνας είναι να αποτρέψει έναν χρήστη από την ανεπιθύμητη αλληλογραφία στη λειτουργία μετάδοσης.
  • Προσθέστε ένα μπλοκ "αριθμός αποστολής ραδιοφώνου (Χ)", όπου είναι η σταθερά σήματος που αναφέρεται στο όνομα της συνάρτησης

Αυτό είναι το μόνο που χρειάζεται κάποιος για να μεταδώσει μέσω του ραδιοφώνου.

Βήμα 8: Θέλουμε να ακούμε και να λαμβάνουμε δεδομένα μέσω του ραδιοφώνου της συσκευής και να τα επεξεργαζόμαστε ανάλογα

Θέλουμε να ακούμε και να λαμβάνουμε δεδομένα μέσω του ραδιοφώνου της συσκευής και να τα επεξεργαζόμαστε ανάλογα
Θέλουμε να ακούμε και να λαμβάνουμε δεδομένα μέσω του ραδιοφώνου της συσκευής και να τα επεξεργαζόμαστε ανάλογα
Θέλουμε να ακούμε και να λαμβάνουμε δεδομένα μέσω του ραδιοφώνου της συσκευής και να τα επεξεργαζόμαστε ανάλογα
Θέλουμε να ακούμε και να λαμβάνουμε δεδομένα μέσω του ραδιοφώνου της συσκευής και να τα επεξεργαζόμαστε ανάλογα

Αυτό είναι το τελευταίο βήμα για τη δημιουργία της κύριας εφαρμογής.

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

Πρώτα:

  1. Δημιουργήστε ένα μπλοκ κώδικα ξεκινώντας από ένα μπλοκ "σε ραδιοφωνική λήψη (Χ)".
  2. Προαιρετικά, εκχωρήστε την τιμή που λάβατε σε μια άλλη μεταβλητή με πιο περιγραφικό όνομα.
  3. Καλέστε μια συνάρτηση που θα επεξεργαστεί το σήμα

Δεύτερον, στη λειτουργία επεξεργασίας σήματος:

  1. Δημιουργήστε ένα μπλοκ προτάσεων if-else που ο κλάδος ελέγχει τη ροή με βάση την τιμή του σήματος.
  2. Αν το σήμα ήταν SIG_R

    Ορίστε την κατάσταση της συσκευής σε BOOT_STATE (αυτός είναι ο λόγος που δημιουργήσαμε αυτήν τη σταθερά νωρίτερα)

  3. Εάν το σήμα ήταν SIG_A και αν η τρέχουσα κατάσταση είναι LISTEN_A

    Ορίστε την κατάσταση της συσκευής σε TEAM_A

  4. Εάν το σήμα ήταν SIG_B και εάν η τρέχουσα κατάσταση είναι LISTEN_B

    Ορίστε την κατάσταση της συσκευής σε TEAM_B

Αυτό είναι. Η εφαρμογή ολοκληρώθηκε.

Βήμα 9: Συσκευή ρίζας: Θέλουμε να είμαστε σε θέση να επιλέξουμε ένα σήμα

Root Device: Θέλουμε να είμαστε σε θέση να επιλέξουμε ένα σήμα
Root Device: Θέλουμε να είμαστε σε θέση να επιλέξουμε ένα σήμα

Τώρα, θα γράψουμε μια απλή εφαρμογή για μια συσκευή "root", δηλαδή μια συσκευή που θα ελέγχει το δίκτυο.

Αυτή η συσκευή θα πρέπει να εκτελέσει δύο λειτουργίες:

  • Θέλουμε να επιτρέψουμε στον χρήστη να επιλέξει ένα από τα σήματά μας
  • Θέλουμε να επιτρέψουμε στον χρήστη να μεταδώσει το σήμα

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

Για να επιτρέψετε στον χρήστη να επιλέξει ένα σήμα:

  1. Αρχικοποιήστε 5 μεταβλητές σε ένα μπλοκ "κατά την εκκίνηση":

    1. Τα τρία σήματα (0, 1, 2)
    2. Ο αριθμός των σημάτων (3)
    3. Μια μεταβλητή για να κρατήσει το τρέχον επιλεγμένο σήμα (αρχικά ρυθμισμένο στο πρώτο σήμα, 0)
  2. Χειριστείτε ένα πάτημα του κουμπιού Α:

    1. Αυξήστε το επιλεγμένο σήμα
    2. Ελέγξτε εάν το επιλεγμένο σήμα είναι μεγαλύτερο ή ίσο με τον αριθμό των σημάτων

      Εάν ναι, ορίστε το επιλεγμένο σήμα στο 0

  3. Μετά το μπλοκ έναρξης, εκτελέστε έναν βρόχο "για πάντα" που εμφανίζει την τρέχουσα επιλεγμένη τιμή σήματος χωρίς καθυστέρηση

Για να επιτρέπεται στον χρήστη να εκπέμπει ένα σήμα

  1. Ρυθμίστε την ομάδα ραδιοφώνου στο 0 στο μπλοκ "κατά την εκκίνηση"
  2. Χειριστείτε ένα πάτημα του κουμπιού B:

    Μεταδώστε το επιλεγμένο σήμα χρησιμοποιώντας ένα μπλοκ "αριθμός αποστολής ραδιοφώνου (Χ)"

Αυτό είναι. Η εφαρμογή του βασικού κόμβου είναι εξαιρετικά απλή.

Βήμα 10: Τελειώσαμε

Τελειώσαμε
Τελειώσαμε

Πάνω είναι μια εικόνα των συσκευών που εκτελούν την εφαρμογή. Οι δύο στα δεξιά εκτελούν την κύρια εφαρμογή "χρήστη" και αυτή στα αριστερά εκτελεί την εφαρμογή "root".

Έδειξα αυτό το παιχνίδι στο CS Connections 2018, ένα καλοκαιρινό συνέδριο διάρκειας μιας εβδομάδας για καθηγητές γυμνασίου και λυκείου σχετικά με την εκπαίδευση στην επιστήμη των υπολογιστών. Έδωσα περίπου 40 συσκευές στους καθηγητές και εξήγησα τους κανόνες. Οι περισσότεροι βρήκαν το παιχνίδι διασκεδαστικό και πολλοί το βρήκαν μπερδεμένο μέχρι να καταλάβουν πώς να παίξουν. Η επίδειξη ήταν σύντομη, αλλά διαπιστώσαμε ότι το παιχνίδι ήταν απολαυστικό σε ένα αρκετά διαφορετικό πλήθος.

Περισσότερες πληροφορίες σχετικά με τις CS Connections 2018 μπορείτε να βρείτε εδώ.

Συνιστάται: