Arduino Retro Gaming με οθόνη OLED

Αναρωτηθήκατε ποτέ πόση δουλειά χρειάζεστε για να γράψετε τα δικά σας ρετρό παιχνίδια; Πόσο εύκολο είναι το Pong να κωδικοποιήσει το Arduino;

Αναρωτηθήκατε ποτέ πόση δουλειά χρειάζεστε για να γράψετε τα δικά σας ρετρό παιχνίδια;  Πόσο εύκολο είναι το Pong να κωδικοποιήσει το Arduino;
Διαφήμιση

Αναρωτηθήκατε ποτέ πόση δουλειά χρειάζεστε για να γράψετε τα δικά σας ρετρό παιχνίδια; Πόσο εύκολο είναι το Pong να κωδικοποιήσει το Arduino; Συμμετάσχετε μαζί μου καθώς σας παρουσιάζω πώς να φτιάξετε μια κονσόλα παιχνιδιών μίνι ρετρό που να τροφοδοτείται με Arduino και πώς να κωδικοποιήσετε το Pong από το μηδέν. Εδώ είναι το τελικό αποτέλεσμα:

Δημιουργία σχεδίου

Αυτό είναι ένα αρκετά απλό κύκλωμα. Ένα ποτενσιόμετρο (pot) θα ελέγξει το παιχνίδι, και μια οθόνη OLED θα οδηγηθεί από το Arduino. Αυτό θα παραχθεί σε ένα breadboard, ωστόσο μπορεί να θέλετε να κάνετε αυτό ένα μόνιμο κύκλωμα και να το εγκαταστήσετε σε μια θήκη. Έχουμε γράψει για την αναδημιουργία Pong Πώς να αναδημιουργήσετε το παιχνίδι Classic Pong Χρησιμοποιώντας το Arduino Πώς να αναδημιουργήσετε το παιχνίδι Classic Pong Χρησιμοποιώντας το Arduino Pong ήταν το πρώτο videogame που φτάνει στη μαζική αγορά. Για πρώτη φορά στην ιστορία, η έννοια ενός «βιντεοπαιχνιδιού» εισήχθη στο σπίτι της οικογένειας χάρη στο Atari 2600 -... Διαβάστε Περισσότερα πριν, ωστόσο σήμερα θα σας δείξω πώς να γράψετε τον κώδικα από το μηδέν, και να σπάσει κάθε μέρος.

Ο, τι χρειάζεσαι

Ρετρό Αρντίνο Ρύθμιση

Εδώ είναι αυτό που χρειάζεστε:

  • 1 x Arduino (οποιοδήποτε μοντέλο)
  • 1 x 10k Ποτενσιόμετρο
  • 1 x Οθόνη OLED I2C 0, 96 "
  • 1 x Breadboard
  • Ποικίλα αρσενικά> αρσενικά συρματόσχοινα

Diymall 0.96 "ίντσα I2c IIC σειριακό 128x64 Oled LCD LED λευκό οθόνη ενότητα για Arduino 51 Msp420 Stim32 SCR Diymall 0.96" ίντσα I2c IIC σειριακό 128x64 Oled LCD LED λευκό οθόνη ενότητα για Arduino 51 Msp420 Stim32 SCR Αγοράστε τώρα στο Amazon $ 9.99

Οποιοσδήποτε Arduino θα πρέπει να δουλέψει, οπότε κοιτάξτε τον οδηγό αγοράς μας Arduino Οδηγός Αγοράς: Ποιο Συμβούλιο θα έπρεπε να πάρετε; Arduino Οδηγός αγοράς: Ποιο συμβούλιο πρέπει να πάρετε; Υπάρχουν τόσα πολλά διαφορετικά είδη σανίδων Arduino εκεί έξω, θα συγχωρεθήκατε για σύγχυση. Ποια θα πρέπει να αγοράσετε για το έργο σας; Ας βοηθήσουμε, με αυτόν τον οδηγό αγοράς Arduino! Διαβάστε περισσότερα αν δεν είστε σίγουροι ποιο μοντέλο θα αγοράσετε.

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

Το κύκλωμα

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

Εδώ είναι:

Pong Breadboard

Κοιτάζοντας το μπροστινό μέρος του δοχείου, συνδέστε τον αριστερό πείρο σε + 5V και τον δεξιό πείρο στη γείωση . Συνδέστε τον μεσαίο ακροδέκτη στην αναλογική ακίδα 0 (A0).

Η οθόνη OLED είναι συνδεδεμένη χρησιμοποιώντας το πρωτόκολλο I2C. Συνδέστε τα VCC και GND με το Arduino + 5V και τη γείωση . Συνδέστε το SCL στο αναλογικό πέντε ( A5 ). Συνδέστε το SDA στο αναλογικό 4 ( A4 ). Ο λόγος που αυτό συνδέεται με τους αναλογικούς ακροδέκτες είναι απλός. αυτές οι ακίδες περιέχουν το κύκλωμα που απαιτείται για το πρωτόκολλο I2C. Βεβαιωθείτε ότι έχουν συνδεθεί σωστά και ότι δεν έχουν διασταυρωθεί. Οι ακριβείς ακίδες θα διαφέρουν ανάλογα με το μοντέλο, αλλά τα A4 και A5 χρησιμοποιούνται στα Nano και Uno. Ελέγξτε την τεκμηρίωση της βιβλιοθήκης καλωδίων για το μοντέλο σας εάν δεν χρησιμοποιείτε ένα Arduino ή ένα Nano.

Δοκιμή Δοχείου

Καταχωρίστε αυτόν τον κώδικα δοκιμής (βεβαιωθείτε ότι έχετε επιλέξει τη σωστή πλακέτα και τη θύρα από τα εργαλεία > Διοικητικό Συμβούλιο και Εργαλεία > Μενού Θύρας ):

void setup() { // put your setup code here, to run once: Serial.begin(9600); // setup serial } void loop() { // put your main code here, to run repeatedly: Serial.println(analogRead(A0)); // print the value from the pot delay(500); } 

Τώρα ανοίξτε τη σειριακή οθόνη ( Top Right > Serial Monitor ) και γυρίστε το δοχείο. Θα πρέπει να δείτε την τιμή που εμφανίζεται στη σειριακή οθόνη. Σε πλήρη αντίθετη φορά των δεικτών του ρολογιού θα πρέπει να είναι μηδέν, και πλήρως δεξιόστροφα θα πρέπει να είναι 1023 :

Pong σειριακή οθόνη

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

OLED Test

Γραφικά OLED

Η οθόνη OLED είναι λίγο πιο πολύπλοκη για να διαμορφώσει. Θα χρειαστεί να εγκαταστήσετε δύο βιβλιοθήκες για να οδηγήσετε πρώτα την οθόνη. Κατεβάστε τις βιβλιοθήκες Adafruit_SSD1306 και Adafruit-GFX από την Github. Αντιγράψτε τα αρχεία στον φάκελο βιβλιοθηκών σας. Αυτό διαφέρει ανάλογα με το λειτουργικό σας σύστημα:

  • Mac OS: / Χρήστες / Όνομα χρήστη / Έγγραφα / Arduino / βιβλιοθήκες
  • Linux: / home / Username / Sketchbook
  • Windows: / Users / Arduino / βιβλιοθήκες

Τώρα, ανεβάστε ένα δοκιμαστικό σκίτσο. Μεταβείτε στην επιλογή Αρχείο > Παραδείγματα > Adafruit SSD1306 > ssd1306_128x64_i2c . Αυτό θα σας δώσει ένα μεγάλο σκίτσο που περιέχει πολλά γραφικά:

Γραφικά OLED

Αν δεν γίνει τίποτα μετά τη μεταφόρτωση, αποσυνδέστε και ελέγξτε διπλά τις συνδέσεις σας. Εάν τα παραδείγματα δεν βρίσκονται στα μενού, μπορεί να χρειαστεί να κάνετε επανεκκίνηση του IDE του Arduino.

Ο κώδικας

Τώρα ήρθε η ώρα για τον κώδικα. Θα εξηγήσω κάθε βήμα, οπότε παραλείψτε το τέλος, εάν θέλετε απλώς να το τρέξετε. Αυτό είναι ένα δίκαιο ποσό του κώδικα, οπότε αν δεν αισθάνεστε σίγουροι, ελέγξτε έξω αυτές τις 10 δωρεάν πηγές Μάθετε να Κωδικός: 10 Δωρεάν και φανταστική online πηγές για να ακονίσετε τις ικανότητές σας Μάθετε να Κωδικοποίηση: 10 δωρεάν και φανταστική σε απευθείας σύνδεση πόρους για να σας Hone Κωδικοποίηση δεξιοτήτων. Ένα θέμα που αποφεύγεται από πολλούς. Υπάρχει αφθονία δωρεάν πόρων και εργαλείων, τα οποία είναι διαθέσιμα στο διαδίκτυο. Σίγουρα θα μπορούσατε να πάρετε κάποια μαθήματα σχετικά με το θέμα σε μια κοντινή ... Διαβάστε περισσότερα για να μάθουν να κωδικοποιήσει.

Ξεκινήστε με τη συμπερίληψη των απαραίτητων βιβλιοθηκών:

 #include #include #include #include 

Το SPI και το WIRE είναι δύο βιβλιοθήκες Arduino για τη διαχείριση της επικοινωνίας I2C. Τα Adafruit_GFX και Adafruit_SSD1306 είναι οι βιβλιοθήκες που έχετε εγκαταστήσει προηγουμένως.

Στη συνέχεια, διαμορφώστε την οθόνη:

 Adafruit_SSD1306 display(4); 

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

 int resolution[2] = {128, 64}, ball[2] = {20, (resolution[1] / 2)}; const int PIXEL_SIZE = 8, WALL_WIDTH = 4, PADDLE_WIDTH = 4, BALL_SIZE = 4, SPEED = 3; int playerScore = 0, aiScore = 0, playerPos = 0, aiPos = 0; char ballDirectionHori = 'R', ballDirectionVerti = 'S'; boolean inProgress = true; 

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

Η ανάλυση οθόνης και η θέση μπάλας αποθηκεύονται σε συστοιχίες . Οι πίνακες είναι συλλογές παρόμοιων πραγμάτων, και για την μπάλα, αποθηκεύστε τις συντεταγμένες ( X και Y ). Η πρόσβαση σε στοιχεία σε συστοιχίες είναι εύκολη (μην συμπεριλάβετε αυτόν τον κώδικα στο αρχείο σας):

 resolution[1]; 

Καθώς οι πίνακες αρχίζουν από το μηδέν, αυτό θα επιστρέψει το δεύτερο στοιχείο στη διάταξη ανάλυσης ( 64 ). Τα στοιχεία ενημέρωσης είναι ακόμα πιο εύκολα (και πάλι, μην συμπεριλάβετε αυτόν τον κώδικα):

 ball[1] = 15; 

Μέσα στην κενή ρύθμιση (), διαμορφώστε την οθόνη:

 void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); } 

Η πρώτη γραμμή λέει στη βιβλιοθήκη Adafruit ποιες διαστάσεις και πρωτόκολλο επικοινωνίας χρησιμοποιεί η οθόνη σας (στην περίπτωση αυτή 128 x 64 και I2C ). Η δεύτερη γραμμή ( display.display () ) δείχνει στην οθόνη να δείχνει ό, τι αποθηκεύεται στο buffer (που δεν είναι τίποτα).

Δημιουργήστε δύο μεθόδους που ονομάζονται drawBall και eraseBall :

 void drawBall(int x, int y) { display.drawCircle(x, y, BALL_SIZE, WHITE); } void eraseBall(int x, int y) { display.drawCircle(x, y, BALL_SIZE, BLACK); } 

Αυτά παίρνουν τις συντεταγμένες x και y της μπάλας και την σχεδιάζουν στην οθόνη χρησιμοποιώντας τη μέθοδο drawCircle από τις βιβλιοθήκες απεικόνισης. Αυτό χρησιμοποιεί το σταθερό BALL_SIZE που ορίστηκε νωρίτερα. Δοκιμάστε να αλλάξετε αυτό και να δείτε τι συμβαίνει. Αυτή η μέθοδος drawCircle δέχεται ένα χρώμα pixel - ΜΑΥΡΟ ή ΛΕΥΚΟ . Δεδομένου ότι πρόκειται για μονοχρωματική απεικόνιση (ένα χρώμα), το λευκό αντιστοιχεί σε ένα εικονοστοιχείο και το μαύρο σβήνει το εικονοστοιχείο.

Τώρα δημιουργήστε μια μέθοδο που ονομάζεται moveAi :

 void moveAi() { eraseAiPaddle(aiPos); if (ball[1]>aiPos) { ++aiPos; } else if (ball[1]< aiPos) { --aiPos; } drawAiPaddle(aiPos); } 

Αυτή η μέθοδος χειρίζεται τη μετακίνηση του τεχνητού νοήματος ή του παίκτη AI . Αυτός είναι ένας απλός αντίπαλος στον υπολογιστή - Εάν η μπάλα είναι πάνω από το κουπί, ανεβαίνετε. Είναι κάτω από το κουπί, κινούνται προς τα κάτω. Αρκετά απλό, αλλά λειτουργεί καλά. Χρησιμοποιούνται τα σύμβολα αύξησης και μείωσης ( ++ aiPos και -aiPos ) για να προσθέσετε ή να αφαιρέσετε ένα από το aiPosition. Θα μπορούσατε να προσθέσετε ή να αφαιρέσετε έναν μεγαλύτερο αριθμό για να κάνετε το AI να κινείται γρηγορότερα και επομένως να είναι πιο δύσκολο να νικήσετε. Δείτε πώς θα το κάνετε αυτό:

 aiPos += 2; 

Και:

 aiPos -= 2; 

Τα σύμβολα Plus Equals και Minus Equals είναι στενοχώρια για την προσθήκη ή την αφαίρεση δύο από την τρέχουσα τιμή του aiPos. Ακολουθεί ένας άλλος τρόπος για να γίνει αυτό:

 aiPos = aiPos + 2; 

και

 aiPos = aiPos - 1; 

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

Η μέθοδος drawNet χρησιμοποιεί δύο βρόχους για να σχεδιάσει το δίχτυ:

 void drawNet() { for (int i = 0; i< (resolution[1] / WALL_WIDTH); ++i) { drawPixel(((resolution[0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH); } } 

Αυτό χρησιμοποιεί τις μεταβλητές WALL_WIDTH για να καθορίσει το μέγεθος του.

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

 void drawPixel(int posX, int posY, int dimensions) { for (int x = 0; x< dimensions; ++x) { for (int y = 0; y< dimensions; ++y) { display.drawPixel((posX + x), (posY + y), WHITE); } } } void erasePixel(int posX, int posY, int dimensions) { for (int x = 0; x< dimensions; ++x) { for (int y = 0; y< dimensions; ++y) { display.drawPixel((posX + x), (posY + y), BLACK); } } } 

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

Η μέθοδος drawScore χρησιμοποιεί τα χαρακτηριστικά κειμένου της βιβλιοθήκης για να γράψει τη συσκευή αναπαραγωγής και το σκορ AI στην οθόνη. Αυτά αποθηκεύονται στο playerScore και το aiScore :

 void drawScore() { display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(45, 0); display.println(playerScore); display.setCursor(75, 0); display.println(aiScore); } 

Αυτή η μέθοδος έχει επίσης ένα αντίστοιχο στοιχείο eraseScore, το οποίο θέτει τα εικονοστοιχεία σε μαύρο ή σβηστό.

Οι τέσσερις τελευταίες μέθοδοι είναι πολύ παρόμοιες. Σχεδιάζουν και διαγράφουν τον παίκτη και τα πεδία AI:

 void erasePlayerPaddle(int row) { erasePixel(0, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); erasePixel(0, row - PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(0, row, PADDLE_WIDTH); erasePixel(0, row + PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(0, row + (PADDLE_WIDTH + 2), PADDLE_WIDTH); } 

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

Υπάρχει λίγο περισσότερη λογική στον κύριο βρόχο. Εδώ είναι ολόκληρος ο κώδικας:

 #include #include #include #include Adafruit_SSD1306 display(4); int resolution[2] = {128, 64}, ball[2] = {20, (resolution[1] / 2)}; const int PIXEL_SIZE = 8, WALL_WIDTH = 4, PADDLE_WIDTH = 4, BALL_SIZE = 4, SPEED = 3; int playerScore = 0, aiScore = 0, playerPos = 0, aiPos = 0; char ballDirectionHori = 'R', ballDirectionVerti = 'S'; boolean inProgress = true; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); } void loop() { if (aiScore>9 || playerScore>9) { // check game state inProgress = false; } if (inProgress) { eraseScore(); eraseBall(ball[0], ball[1]); if (ballDirectionVerti == 'U') { // move ball up diagonally ball[1] = ball[1] - SPEED; } if (ballDirectionVerti == 'D') { // move ball down diagonally ball[1] = ball[1] + SPEED; } if (ball[1] = resolution[1]) { // bounce the ball off the bottom ballDirectionVerti = 'U'; } if (ballDirectionHori == 'R') { ball[0] = ball[0] + SPEED; // move ball if (ball[0]>= (resolution[0] - 6)) { // ball is at the AI edge of the screen if ((aiPos + 12)>= ball[1] && (aiPos - 12) (aiPos + 4)) { // deflect ball down ballDirectionVerti = 'D'; } else if (ball[1]< (aiPos - 4)) { // deflect ball up ballDirectionVerti = 'U'; } else { // deflect ball straight ballDirectionVerti = 'S'; } // change ball direction ballDirectionHori = 'L'; } else { // GOAL! ball[0] = 6; // move ball to other side of screen ballDirectionVerti = 'S'; // reset ball to straight travel ball[1] = resolution[1] / 2; // move ball to middle of screen ++playerScore; // increase player score } } } if (ballDirectionHori == 'L') { ball[0] = ball[0] - SPEED; // move ball if (ball[0] = ball[1] && (playerPos - 12) (playerPos + 4)) { // deflect ball down ballDirectionVerti = 'D'; } else if (ball[1]<(playerPos - 4)) { // deflect ball up ballDirectionVerti = 'U'; } else { // deflect ball straight ballDirectionVerti = 'S'; } // change ball direction ballDirectionHori = 'R'; } else { ball[0] = resolution[0] - 6; // move ball to other side of screen ballDirectionVerti = 'S'; // reset ball to straight travel ball[1] = resolution[1] / 2; // move ball to middle of screen ++aiScore; // increase AI score } } } drawBall(ball[0], ball[1]); erasePlayerPaddle(playerPos); playerPos = analogRead(A2); // read player potentiometer playerPos = map(playerPos, 0, 1023, 8, 54); // convert value from 0 - 1023 to 8 - 54 drawPlayerPaddle(playerPos); moveAi(); drawNet(); drawScore(); } else { // somebody has won display.clearDisplay(); display.setTextSize(4); display.setTextColor(WHITE); display.setCursor(0, 0); // figure out who if (aiScore>playerScore) { display.println("YOU LOSE!"); } else if (playerScore>aiScore) { display.println("YOU WIN!"); } } display.display(); } void moveAi() { // move the AI paddle eraseAiPaddle(aiPos); if (ball[1]>aiPos) { ++aiPos; } else if (ball[1]< aiPos) { --aiPos; } drawAiPaddle(aiPos); } void drawScore() { // draw AI and player scores display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(45, 0); display.println(playerScore); display.setCursor(75, 0); display.println(aiScore); } void eraseScore() { // erase AI and player scores display.setTextSize(2); display.setTextColor(BLACK); display.setCursor(45, 0); display.println(playerScore); display.setCursor(75, 0); display.println(aiScore); } void drawNet() { for (int i = 0; i< (resolution[1] / WALL_WIDTH); ++i) { drawPixel(((resolution[0] / 2) - 1), i * (WALL_WIDTH) + (WALL_WIDTH * i), WALL_WIDTH); } } void drawPixel(int posX, int posY, int dimensions) { // draw group of pixels for (int x = 0; x< dimensions; ++x) { for (int y = 0; y< dimensions; ++y) { display.drawPixel((posX + x), (posY + y), WHITE); } } } void erasePixel(int posX, int posY, int dimensions) { // erase group of pixels for (int x = 0; x< dimensions; ++x) { for (int y = 0; y< dimensions; ++y) { display.drawPixel((posX + x), (posY + y), BLACK); } } } void erasePlayerPaddle(int row) { erasePixel(0, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); erasePixel(0, row - PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(0, row, PADDLE_WIDTH); erasePixel(0, row + PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(0, row + (PADDLE_WIDTH + 2), PADDLE_WIDTH); } void drawPlayerPaddle(int row) { drawPixel(0, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); drawPixel(0, row - PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(0, row, PADDLE_WIDTH); drawPixel(0, row + PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(0, row + (PADDLE_WIDTH + 2), PADDLE_WIDTH); } void drawAiPaddle(int row) { int column = resolution[0] - PADDLE_WIDTH; drawPixel(column, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); drawPixel(column, row - PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(column, row, PADDLE_WIDTH); drawPixel(column, row + PADDLE_WIDTH, PADDLE_WIDTH); drawPixel(column, row + (PADDLE_WIDTH * 2), PADDLE_WIDTH); } void eraseAiPaddle(int row) { int column = resolution[0] - PADDLE_WIDTH; erasePixel(column, row - (PADDLE_WIDTH * 2), PADDLE_WIDTH); erasePixel(column, row - PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(column, row, PADDLE_WIDTH); erasePixel(column, row + PADDLE_WIDTH, PADDLE_WIDTH); erasePixel(column, row + (PADDLE_WIDTH * 2), PADDLE_WIDTH); } void drawBall(int x, int y) { display.drawCircle(x, y, BALL_SIZE, WHITE); } void eraseBall(int x, int y) { display.drawCircle(x, y, BALL_SIZE, BLACK); } 

Ακολουθεί αυτό που καταλήγετε:

OLED Pong

Μόλις είστε βέβαιοι με τον κώδικα, υπάρχουν πολλές τροποποιήσεις που μπορείτε να κάνετε:

  • Προσθέστε ένα μενού για επίπεδα δυσκολίας (αλλαγή ταχύτητας AI και ταχύτητας μπάλας).
  • Προσθέστε κάποια τυχαία κίνηση στην μπάλα ή στο AI.
  • Προσθέστε ένα άλλο δοχείο για δύο παίκτες.
  • Προσθέστε ένα κουμπί παύσης.

Τώρα, ρίξτε μια ματιά σε αυτά τα ρετρό τυχερά παιχνίδια Pi Zero έργα 5 Ρετρό Gaming Έργα με το Raspberry Pi Zero 5 Ρετρό Gaming έργα με το Ras Zberry Pi Zero Το Raspberry Pi Zero έχει πάρει το DIY και homebrew κόσμο από καταιγίδα, καθιστώντας δυνατή την αναθεώρηση παλαιών έργων και να εμπνέει τους νεοφερμένους, ειδικά στα μυαλά των ορχηστρών των οπαδών ρετρό τυχερών παιχνιδιών. Διαβάστε περισσότερα .

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

In this article