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

Προγραμματίστε το δικό σας παιχνίδι 2048 W/Java!: 8 βήματα
Προγραμματίστε το δικό σας παιχνίδι 2048 W/Java!: 8 βήματα

Βίντεο: Προγραμματίστε το δικό σας παιχνίδι 2048 W/Java!: 8 βήματα

Βίντεο: Προγραμματίστε το δικό σας παιχνίδι 2048 W/Java!: 8 βήματα
Βίντεο: Πως να δημιουργισετε ενα δικο σας παιχνιδι στο ROBLOX STUDIO 2024, Ιούλιος
Anonim

Από PranP1My (Μη πλήρης) SiteFollow Περισσότερα από τον συγγραφέα:

Arduino CNC Machine From Salvaged PC Parts
Arduino CNC Machine From Salvaged PC Parts
Arduino CNC Machine From Salvaged PC Parts
Arduino CNC Machine From Salvaged PC Parts
DIY Μοντέρνα ξύλινα παγκάκια
DIY Μοντέρνα ξύλινα παγκάκια
DIY Μοντέρνα ξύλινα παγκάκια
DIY Μοντέρνα ξύλινα παγκάκια
Επαφές ανοιχτής πόρτας χωρίς επαφή (vSTEM)
Επαφές ανοιχτής πόρτας χωρίς επαφή (vSTEM)
Επαφές ανοιχτής πόρτας χωρίς επαφή (vSTEM)
Επαφές ανοιχτής πόρτας χωρίς επαφή (vSTEM)

Λατρεύω το παιχνίδι 2048. Και έτσι αποφάσισα να προγραμματίσω τη δική μου έκδοση.

Είναι πολύ παρόμοιο με το πραγματικό παιχνίδι, αλλά ο προγραμματισμός του μου δίνει την ελευθερία να αλλάξω ό, τι θέλω όποτε θέλω. Εάν θέλω ένα παιχνίδι 5x5 αντί για το τυπικό 4x4, μια απλή αλλαγή χρησιμοποιώντας τον κατασκευαστή "Board" θα μου το επιτρέψει. Πείτε ότι θέλω να κάνω το παιχνίδι πιο δύσκολο, προσθέτοντας κομμάτια σε θέσεις που θα το κάνουν πιο πολύπλοκο για τον παίκτη παρά τυχαία. Χρησιμοποιώντας έναν απλό αλγόριθμο, μπορώ να κάνω ακριβώς αυτό. Παρόλο που δεν θα καλύψω όλες αυτές τις τροποποιήσεις σε αυτό το Instructable, σκοπεύω να προσθέσω περισσότερες όσο προχωρώ.

Προς το παρόν, ωστόσο, θα προγραμματίσουμε το τυπικό σας παιχνίδι του 2048.

Ας αρχίσουμε!

(Μια δευτερεύουσα σημείωση: Αυτό το Instructable απαιτεί μέτρια γνώση προγραμματισμού - συγκεκριμένα με Java)

Βήμα 1: Υλικά

Υλικά
Υλικά

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

Υλικά:

  • ΦΟΡΗΤΟΣ ΥΠΟΛΟΓΙΣΤΗΣ
  • Eclipse (ή οποιοδήποτε IDE της επιλογής σας)

Ναι. Αυτό είναι.

Βήμα 2: Γνωρίστε το Πρόγραμμα - Πίνακας

Ανέβασα όλο τον κωδικό μου στο GitHub - ελέγξτε τον εδώ:

Χώρισα το παιχνίδι σε 3 κατηγορίες: Επιτραπέζιο, Πλακάκι και Παιχνίδι.

Σανίδα:

Περιγραφή: Η τάξη Board ασχολείται με τον πίνακα παιχνιδιών, δημιουργώντας μια σειρά από στοιχεία "Tile", παίρνοντας την τρέχουσα βαθμολογία και το υψηλότερο κεραμίδι και βάζοντας τον πίνακα σε μια συμβολοσειρά (που θα χρησιμοποιηθεί αργότερα στο "Game"). Το μεγαλύτερο μέρος της λογικής είναι επίσης εδώ, η τάξη παρέχει μεθόδους για την αναπαραγωγή 2 και 4 σε τυχαίες τοποθεσίες, μετακίνηση πάνω, κάτω, αριστερά και δεξιά και ενημέρωση των παικτών όταν τελειώσει το παιχνίδι.

Κατασκευαστές:

/ * Προεπιλεγμένος κατασκευαστής για τον πίνακα - ρυθμίζει έναν πίνακα 4x4 */

δημόσιο συμβούλιο () {…}

/ * Κατασκευαστής για τον πίνακα - δημιουργεί μια μήτρα με καθορισμένο μέγεθος πλέγματος */

δημόσιος πίνακας (int grids) {…}

Μέθοδοι:

/ * Μέθοδος Getter που επιστρέφει τον πίνακα */

δημόσιο πλακάκι getBoard () {…}

/ * Μέθοδος Getter που επιστρέφει τη βαθμολογία */

public int getScore () {…}

/ * Βρίσκει το υψηλότερο πλακίδιο στον πίνακα και το επιστρέφει */

public int getHighTile () {…}

/ * Εκτυπώνει την πλακέτα στην κονσόλα - για σκοπούς δοκιμής */

δημόσια κενή εκτύπωση () {…}

/ * Επιστρέφει τον πίνακα ως συμβολοσειρά - χρησιμοποιείται στο GUI */

public String toString () {…}

/ * Αναπαράγει 2 (ή 4) σε κενό χώρο πολύ γρήγορα γίνεται μια κίνηση */

public void spawn () {…}

/ * Ελέγχει εάν ο πίνακας έχει μαυρίσει εντελώς και αν είναι, θα ωθήσει τους παίκτες να κάνουν επανεκκίνηση */

δημόσιο boolean blackOut () {…}

/ * Ελέγχει αν το παιχνίδι έχει τελειώσει - όταν ο πίνακας έχει μαυρίσει και κανένα από τα πλακίδια δεν μπορεί να συνδυαστεί */

δημόσιο boolean gameOver () {…}

/ * Καλείται όταν πατηθεί το "w" ή το επάνω βέλος - καλεί "verticalMove" για κάθε πλακίδιο στον πίνακα με την παράμετρο "up" */

public void up () {…}

/ * Καλείται όταν πατηθεί το 's' ή το κάτω βέλος - καλεί 'verticalMove' για κάθε πλακίδιο στον πίνακα με την παράμετρο 'down' */public void down () {…}

/ * Καλείται όταν πατηθεί το «d» ή το δεξί βέλος - καλεί το «horizontalMove» για κάθε πλακίδιο στον πίνακα με την παράμετρο «δεξιά» */public void right () {…}

/ * Καλείται όταν πιέζεται το "a" ή το αριστερό βέλος - καλεί "horizontalMove" για κάθε πλακίδιο στον πίνακα με την παράμετρο "αριστερά" */

δημόσιο κενό αριστερά () {…}

/* Συγκρίνει τιμές δύο πλακιδίων μαζί και αν είναι ίδιες ή αν μία είναι ίση με 0 (απλό κεραμίδι) - προστίθενται οι τιμές τους (με την προϋπόθεση ότι τα πλακίδια που συγκρίνουμε είναι δύο διαφορετικά πλακίδια και κινούνται προς την κατάλληλη κατεύθυνση) - αναδρομικά κινείται στη σειρά */

public void horizontalMove (int row, int col, String direction) {…}

/* Συγκρίνει τιμές δύο πλακιδίων μαζί και αν είναι ίδιες ή αν μία είναι ίση με 0 (απλό κεραμίδι) - προστίθενται οι τιμές τους (με την προϋπόθεση ότι τα πλακίδια που συγκρίνουμε είναι δύο διαφορετικά πλακίδια και κινούνται προς την κατάλληλη κατεύθυνση) - κινείται αναδρομικά μέσα από τη στήλη */

public void verticalMove (int row, int col, String direction) {…}

Ναι, αυτές είναι πολλές μέθοδοι - αλλά μην ανησυχείτε, οι περισσότερες είναι εξαιρετικά εύκολες στην κατανόηση. Επιπλέον, η τάξη "Board" είναι η πιο περίπλοκη, οπότε όλα μετά από αυτό θα είναι σχετικά απλά.

Βήμα 3: Γνωρίστε το Πρόγραμμα - Πλακάκι

Πλακάκι:

Περιγραφή: Η κλάση Tile ασχολείται με τα μεμονωμένα πλακίδια και είναι η μικρότερη από όλες τις κλάσεις. Κάθε κεραμίδι έχει μια ακέραια τιμή και ένα χρώμα. Διαθέτει δύο κατασκευαστές που δημιουργούν πλακίδια με τιμή 0 (προεπιλογή) ή τιμή #. Οι μέθοδοι είναι ως επί το πλείστον αυτονόητες, με τις μεθόδους «getter» και «setter» να αποτελούν το μεγαλύτερο μέρος του συνόλου.

Κατασκευαστές:

/ * Κατασκευάζει ένα βασικό πλακίδιο με τιμή 0 */

δημόσιο πλακάκι () {…}

/ * Κατασκευάζει ένα πλακίδιο με τιμή αριθμού */

δημόσιο πλακάκι (αριθμός int) {…}

Μέθοδοι:

/ * Παίρνει την τιμή του κεραμιδιού */

public int getValue () {…}

/ * Ορίζει την τιμή του κεραμιδιού - χρησιμοποιείται όταν προσθέτετε δύο πλακίδια μαζί */

public void setValue (int value) {…}

/ * Αντιπροσωπεύει το κεραμίδι ως συμβολοσειρά - χρησιμοποιείται στο GUI */

public String toString () {…}

/ * Ορίζει το χρώμα του κεραμιδιού με βάση την τιμή του */

public void setColor () {…}

/ * Παίρνει το χρώμα του κεραμιδιού */

public void getColor () {…}

Βήμα 4: Γνωρίστε το Πρόγραμμα - Παιχνίδι

Παιχνίδι

Περιγραφή: Το Game Class περιλαμβάνει την κύρια μέθοδο, τις περισσότερες από τις μεθόδους GUI και τις βασικές αλληλεπιδράσεις. Παίρνει και τις τάξεις Tile και Board και τους επιτρέπει να συνεργάζονται.

Κατασκευαστές:

Κανένας

Μέθοδοι:

/ * ρυθμίζει το GUI με τα κατάλληλα μεγέθη και προσθέτει ένα Key Listener */

δημόσιο στατικό κενό setUpGUI () {…}

/ * Ελέγχει για να διαπιστωθεί εάν πατούν τα πλήκτρα wasd ή βέλους και εκτελεί τις κατάλληλες ενέργειες - ενημερώνει το JFrame με κάθε κίνηση */

public void keyPressed (KeyEvent e) {…}

/ * Ζωγραφίζει το GUI με μια σειρά από χορδές, τον πίνακα, τα πλακάκια και εξασφαλίζει ότι ξαναβαφτούν όταν τελειώσει το παιχνίδι */

δημόσιο κενό χρώμα (Γραφικά g) {…}

/ * σχεδιάζει ένα μεμονωμένο κεραμίδι - καλείται από τη μέθοδο βαφής */

public void drawTiles (Graphics g, Tile tile, int x, int y) {…}

/ * Κύρια μέθοδος - ρυθμίζει το GUI και ξεκινά το παιχνίδι */

δημόσιο στατικό κενό κεντρικό (String args) {…}

Βήμα 5: Σημαντικές μέθοδοι - Κίνηση

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

ιδιωτικό κενό verticalMove (int row, int col, String direction)

{Αρχικό κεραμίδι = σανίδα [περίγραμμα] [κολ]; Σύγκριση πλακιδίων = σανίδα [σειρά] [κολ]; εάν (αρχικό.getValue () == 0 || αρχικό.getValue () == compare.getValue ()) {αν (σειρά> περίγραμμα || (κατεύθυνση. ισούται ("κάτω") && (σειρά <περίγραμμα))) {int addScore = initial.getValue () + compare.getValue (); if (initial.getValue ()! = 0) {score += addScore; } initial.setValue (addScore); compare.setValue (0); }} else {if (direction.equals ("down")) {border--; } else {border ++; } verticalMove (σειρά, κολόνα, κατεύθυνση); }}

Η παραπάνω μέθοδος, verticalMove, καλείται με τις μεθόδους "πάνω" και "κάτω". Ας ρίξουμε μια ματιά στη μέθοδο «επάνω».

δημόσιο κενό ()

{for (int i = 0; i <grids; i ++) {border = 0; για (int j = 0; j <grids; j ++) {if (board [j] .getValue ()! = 0) {if (border <= j) {verticalMove (j, i, "up") ? }}}}}

Αυτή η μέθοδος περνάει από ολόκληρο τον πίνακα και καλεί το verticalMove για κάθε πλακίδιο με την παράμετρο "επάνω". Το verticalMove συγκρίνει το πλακίδιο στη θέση «j» και «i» με το πλακίδιο στη θέση «περίγραμμα» και «i». Αν τα δύο είναι ίσα, συνδυάζονται. Εάν δεν είναι, το πλακίδιο περιγράμματος αυξάνεται κατά 1 (καθώς η παράμετρος στη θέση του είναι "επάνω") και το verticalMove καλείται ξανά.

Συνιστάται: