Πώς έφτιαξα το έργο μου για ένα άτομο: Μια μηχανή σκακιού για έναν δημοφιλή κινητήρα παιχνιδιών

Πρόσφατα ολοκλήρωσα ένα από τα καλοκαιρινά μου έργα: μια μηχανή GUI σκακιού που κατασκευάστηκε χρησιμοποιώντας τη μηχανή ανάπτυξης παιχνιδιών Ren'Py Visual Novel και τη βιβλιοθήκη σκακιού.

Αυτός ο κινητήρας θα ενσωματωθεί σε ένα κινητικό μυθιστόρημα παιχνίδι, The Wind at Dawn , μετά την ολοκλήρωση αυτού του παιχνιδιού.

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

Εκτιμήστε την αξία της επανεγγραφής του παλιού κώδικα

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

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

Αυτή η μηχανή σκακιού βασίζεται σε μια μηχανή σκακιού που δημιούργησα στο Ren'Py και τη βανίλια Python, ενώ δίδασκα τον εαυτό μου στην Python κατά τη διάρκεια των πρώτων καλοκαιρινών μου διακοπών στο κολέγιο.

Αυτός ο παλιός κινητήρας σκακιού, με τη σειρά του, βασίζεται σε ένα έργο στην τάξη Intro to CS του κολλεγίου μου (ένα παιχνίδι GUI σκακιού γραμμένο στο Racket, μια λειτουργική γλώσσα προγραμματισμού). Δηλαδή, έχω ξαναγράψει τον κωδικό μου δύο φορές για να δημιουργήσω αυτήν την τελική μηχανή σκακιού.

Για την πρώτη μου επανεγγραφή, απλώς «μετέφρασα» τη λογική του σκακιού (για να προσδιορίσω εάν μια κίνηση είναι νόμιμη, συνθήκες τελικού παιχνιδιού κ.ο.κ.) από το Racket στο Python. Πειραματίστηκα επίσης με τον Αντικειμενοστρεφή Προγραμματισμό, έγραψα ένα ελάχιστο AI σκάκι μετά από διαδικτυακά σεμινάρια και εφάρμοσα το GUI στο Ren'Py.

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

Για να αντιμετωπίσω αυτό το ζήτημα στη δεύτερη επανεγγραφή μου, ερεύνησα βιβλιοθήκες Python ανοιχτού κώδικα και βρήκα το python-chess, μια βιβλιοθήκη με πλήρη υποστήριξη για κινήσεις σκακιού και συνθήκες τελικού παιχνιδιού, όπως αξίωση κλήρωσης όταν συμβαίνει τριπλή επανάληψη.

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

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

Διαβάστε την τεκμηρίωση και διατηρήστε τη συμβατότητα στο μυαλό

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

Αυτό το ζήτημα Ren'Py GitHub επισημαίνει το γεγονός ότι το Ren'Py χρησιμοποιεί το Python 2 και δεν έχει μεταφερθεί ακόμη στο Python 3. Έτσι, αναγνώρισα ότι χρειαζόμουν μια έκδοση του σκακιού python που υποστηρίζει το Python 2, ως την τελευταία έκδοση μόνο υποστηρίζει Python 3.7+.

Ευτυχώς, η έκδοση 0.23.10 υποστηρίζει τόσο το Python 2.7 όσο και το Python 3.4+. Τελικά εγκαταστάθηκα στην έκδοση 0.23.11 καθώς είναι η τελευταία έκδοση που εξακολουθεί να υποστηρίζει το Python 2.7.

Έχοντας διευθετήσει θέματα εξάρτησης και συμβατότητας, ήμουν έτοιμος να προχωρήσω στο σχεδιασμό και την κωδικοποίηση.

Ακολουθήστε τις Βέλτιστες Πρακτικές Μηχανικής Λογισμικού

Σημείωση: Πολλοί όροι που αναφέρονται σε αυτήν την ενότητα προέρχονται από το Agile / Scrum.

Συγκεντρώστε Απαιτήσεις Χαρακτηριστικών για Σχεδιασμό Έργου

Ενώ είναι δελεαστικό να μεταβείτε κατευθείαν στην κωδικοποίηση, δεν μπορώ να τονίσω αρκετά τη σημασία του σχεδιασμού.

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

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

Για τη μηχανή σκακιού μου, εντόπισα τις ακόλουθες επανεγγραφές / πρόσθετα χαρακτηριστικά:

  • Ενσωματώστε τη λογική του σκακιού από το σκάκι python
  • Στον κωδικό Ren'Py GUI, αντικαταστήστε τη λογική του σκακιού και το σκάκι AI που έγραψα με τη λογική του σκακιού και τα API Stockfish από το python-chess
  • Υποστήριξη διαφόρων τρόπων παιχνιδιού: Παίκτης εναντίον Παίκτης, Παίκτης εναντίον Υπολογιστή (όπου ο Παίκτης μπορεί να επιλέξει να παίξει ως μαύρο ή άσπρο), ρυθμιζόμενη ισχύς του AI σκακιού μέσω προσαρμογών στις παραμέτρους διαμόρφωσης της Stockfish
  • Αναπτύξτε ένα Ren'Py GUI για προώθηση πιόνι
  • Αναπτύξτε ένα Ren'Py GUI για αξίωση ισοπαλίας σε περίπτωση τριπλής επανάληψης ή του κανόνα πενήντα κινήσεων

Αναπτύξτε ένα πρωτότυπο απόδειξης έννοιας

Ένα πρωτότυπο Proof of Concept (POC) με βοηθά να μετρήσω τον χρόνο και την προσπάθεια που απαιτείται για την εφαρμογή των απαιτούμενων χαρακτηριστικών.

Για το σκάκι μου POC, ενσωμάτωσα το python-σκάκι με τον αρχικό μου κωδικό Ren'Py GUI. Διαβεβαίωσα ότι το σύνολο των χαρακτηριστικών του ήταν ελάχιστο αλλά εύκολα επεκτάσιμο:

  • Ένωσα το python-chess με τον αρχικό μου κωδικό Ren'Py GUI και μπόρεσα να μετακινήσω κομμάτια
  • Εφαρμόστηκα μόνο Player εναντίον Player για να αναβάλω την ενσωμάτωση Stockfish για σκάκι AI
  • Επέτρεψα μόνο κινήσεις μη προώθησης, ώστε να αναβάλω την ανάπτυξη του γραφικού περιβάλλοντος για την προώθηση ενεχυροδανειστήρων

Προσδιορίστε τον ορισμό του Έργου και τον ορισμό του Έγινε

Ο ορισμός του Έτοιμου (DoR) του έργου μου προκύπτει φυσικά από την αρχική μου έρευνα σχετικά με τη συμβατότητα της έκδοσης της βιβλιοθήκης και το POC μου.

Παράλληλα, ο ορισμός του Done (DoD) του έργου μου προκύπτει από τις απαιτήσεις χαρακτηριστικών που έχω εντοπίσει από τη φάση σχεδιασμού μου.

Παραδώστε ένα ελάχιστο βιώσιμο προϊόν, ή καλύτερα ακόμα, ένα ελάχιστο αξιαγάπητο προϊόν

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

Επομένως, ήταν σημαντικό για μένα να εφαρμόσω το πολύ βασικό σύνολο απαιτούμενων δυνατοτήτων, να παραδώσω ένα ελάχιστο βιώσιμο προϊόν (MVP) και να συγκεντρώσω σχόλια για να το επαναλάβω.

Ακόμα καλύτερα, θα ήθελα να παραδώσω ένα ελάχιστο αξιαγάπητο προϊόν (MLP) στην πρώτη μου επανάληψη. Η ελάχιστη διαφορά είναι ότι ενώ ένα MVP δεν απαιτεί τίποτα περισσότερο από λειτουργικά χαρακτηριστικά, ένα MLP έχει μια αξιαγάπητη εμπειρία χρήστη από τη σχεδίαση.

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

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

Γίνετε ο δικός σας διαχειριστής έργου

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

Βρήκα το Trello να είναι ένα καταπληκτικό εργαλείο τόσο για έργα ενός ατόμου όσο και για έργα μεγάλης ομάδας.

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

Έχετε τέσσερις λίστες: Backlog (για δυνατότητες που θα δοκιμαστούν), TODO , Doing και Done.

Έχετε ετικέτες με χρωματική κωδικοποίηση:

  • Έτοιμος για QA: Μια κόκκινη ετικέτα για να τραβήξει την προσοχή των συμπαίκτων μου
  • Αποτέλεσμα: χαμηλό (κίτρινο) έναντι υψηλό (πορτοκαλί), καθοριζόμενο από το μέγεθος της επίδρασης που θα δημιουργήσει μια λειτουργία ή μια διόρθωση σφαλμάτων. Για παράδειγμα, ένα ελαφρώς μη ευθυγραμμισμένο πλαίσιο UI έχει χαμηλή πρόσκρουση, όπου ένα σφάλμα που έχει καθοριστεί με σφάλμα είναι υψηλό.
  • Εκτίμηση του χρόνου που απαιτείται για την εφαρμογή: ασήμαντο (<1 ώρα, κιρκίρι), μεσαίο (1-2 ώρες, ανοιχτό μπλε) και δύσκολο (2–4 ώρες, σκούρο μπλε).

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

  • Το χρώμα χρησιμεύει ως μια εξαιρετική οπτική ένδειξη: Αντιμετωπίζω πάντα κάρτες με ετικέτες πορτοκαλί και κιρκίρι (υψηλή πρόσκρουση και δέσμευση χαμηλού χρόνου) πριν αντιμετωπίσω αυτές με κίτρινες και δύσκολες ετικέτες (χαμηλή πρόσκρουση αλλά δέσμευση υψηλού χρόνου)

Γράψτε τεκμηρίωση και προβληματιστείτε για τη μάθησή σας

Έχοντας ωθήσει κάθε μεμονωμένη κάρτα Trello από το TODO στο Doing to Done και διόρθωσε κάθε δυσάρεστο σφάλμα, είναι επιτέλους ώρα να καλέσετε ένα έργο που έχει γίνει; Ναι και ΟΧΙ.

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

  1. Γράψτε ένα σαφές, συνοπτικό README στο αποθετήριο του έργου GitHub. Αυτό βοηθά άλλους προγραμματιστές να κατανοήσουν και να ενδιαφερθούν για το έργο.
  2. Γράψτε μια ανάρτηση ιστολογίου (όπως αυτή που γράφω τώρα) σχετικά με πτυχές υψηλότερου επιπέδου, για παράδειγμα, επισκόπηση αρχιτεκτονικής, σχεδιασμός χαρακτηριστικών, προκλήσεις και λύσεις κ.ο.κ.

Συντελεστές & Σύνδεσμοι

Ευχαριστώ πολύ τον Tim Min που με ώθησε να εργαστώ σε αυτό το έργο, για τις συνεισφορές του (νέες ιδέες για λειτουργίες + QA) στον πίνακα Trello και για τη λογοδοσία μου. Ο Tim είναι ο συγγραφέας του κινητικού μυθιστορήματος, The Wind at Dawn .

  • Το αποθετήριο GitHub της μηχανής σκακιού μου
  • Ο δημόσιος πίνακας Trello για αυτό το έργο σκακιού
  • Ren'Py: μια μηχανή ανάπτυξης παιχνιδιών Visual Novel
  • python-chess: μια καθαρή βιβλιοθήκη σκακιού Python

Ας κρατήσουμε επαφή! Συνδεθείτε μαζί μου στο LinkedIn, GitHub, Medium ή ελέγξτε τον προσωπικό μου ιστότοπο.