Διαδρομές
/
Crystal
Crystal
/
Ασκήσεις
/
Παρτίδα σκακιού
Παρτίδα σκακιού

Παρτίδα σκακιού

Άσκηση εκμάθησης

Εισαγωγή

Τα εύρη αντιπροσωπεύουν ένα διάστημα ανάμεσα σε δύο τιμές. Οι πιο συνηθισμένοι τύποι που υποστηρίζουν εύρη είναι οι Int, Char και String. Μπορούν να χρησιμοποιηθούν για πολλά πράγματα, όπως για να δημιουργήσεις γρήγορα μια συλλογή, για να κόψεις συμβολοσειρές, για να ελέγξεις αν μια τιμή βρίσκεται μέσα σε ένα εύρος και για επανάληψη. Δημιουργούνται με τον τελεστή εύρους .. ή ... (συμπεριληπτικό και αποκλειστικό, αντίστοιχα).

1..5  # A range containing 1, 2, 3, 4, 5
1...5 # A range containing 1, 2, 3, 4

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

Τα εύρη μπορούν επίσης να δημιουργηθούν χρησιμοποιώντας τον αρχικοποιητή Range.

Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Note

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

(1..5).size # => 5
1..5.size # => Error: undefined method 'size' for Int32

Λήψη υποσυμβολοσειρών

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

"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"

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

"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"

Μέθοδοι των ευρών

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

Μέθοδος Περιγραφή Παράδειγμα
sum Επιστρέφει το άθροισμα όλων των τιμών του εύρους (1..5).sum # => 15
size Επιστρέφει το μέγεθος του εύρους (1..5).size # => 5
includes? Επιστρέφει true αν το εύρος περιλαμβάνει τη δεδομένη τιμή, αλλιώς false (1..5).includes?(3) # => true

Εύρη χωρίς τέλος και χωρίς αρχή

Ένα εύρος μπορεί να μην έχει τέλος ή να μην έχει αρχή. Το εύρος χωρίς τέλος ή χωρίς αρχή έχει ως τιμή αρχής ή τέλους το nil, αλλά το nil μπορεί να παραλειφθεί όταν ορίζεις το εύρος.

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

"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello"
Caution

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

Εύρη Char

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

'a'..'z' # A range containing ['a', 'b', 'c', ..., 'z']

Εύρη String

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

("aa".."az") # A range containing ["aa", "ab", "ac", ..., "az"]

Οδηγίες

Ως λάτρης του σκακιού, θέλεις να γράψεις τη δική σου εκδοχή του παιχνιδιού. Ναι, υπάρχουν ήδη πολλές υλοποιήσεις σκακιού διαθέσιμες στο διαδίκτυο, αλλά η δική σου θα είναι μοναδική!

Ξεκινάς υλοποιώντας ένα βασικό σύστημα κίνησης για τα κομμάτια.

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

1. Όρισε το εύρος των γραμμών και των στηλών

Το παιχνίδι θα πρέπει να αποθηκεύει τις γραμμές της σκακιέρας. Οι γραμμές είναι οι οριζόντιες σειρές της σκακιέρας και αριθμούνται από το 1 έως το 8.

Το παιχνίδι θα πρέπει επίσης να αποθηκεύει τις στήλες της σκακιέρας. Οι στήλες είναι οι κάθετες σειρές της σκακιέρας και προσδιορίζονται από τα γράμματα A έως H.

Όρισε τις σταθερές Chess::RANKS και Chess::FILES που αποθηκεύουν αντίστοιχα το εύρος των γραμμών και των στηλών.

Chess::RANKS
# => 1..8

Chess::FILES
# => 'A'..'H'

2. Έλεγξε αν το τετράγωνο είναι έγκυρο

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

Όρισε τη μέθοδο Chess.valid_square? που δέχεται τα ορίσματα rank, που περιέχει έναν ακέραιο με τη γραμμή, και file, που περιέχει έναν χαρακτήρα με τη στήλη. Η μέθοδος θα πρέπει να επιστρέφει true αν η γραμμή και η στήλη βρίσκονται μέσα στο εύρος των γραμμών και των στηλών, και false διαφορετικά.

Chess.valid_square?(1, 'A')
# => true

3. Πάρε το ψευδώνυμο του παίκτη

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

Όρισε τη μέθοδο Chess.nickname που δέχεται τα ορίσματα first_name, που περιέχει μια συμβολοσειρά με το μικρό όνομα του παίκτη, και last_name, που περιέχει μια συμβολοσειρά με το επώνυμο του παίκτη. Η μέθοδος θα πρέπει να επιστρέφει το ψευδώνυμο του παίκτη ως συμβολοσειρά με κεφαλαία γράμματα.

Chess.nickname("John", "Doe")
# => "JOOE"

4. Δημιούργησε το μήνυμα κίνησης

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

Αν η κίνηση είναι έγκυρη, το μήνυμα θα πρέπει να είναι: "{nickname} moved to {square}" Αν η κίνηση δεν είναι έγκυρη, το μήνυμα θα πρέπει να είναι: "{nickname} attempted to move to {square}, but that is not a valid square"

Όρισε τη μέθοδο Chess.move_message που δέχεται τα ορίσματα first_name, που περιέχει μια συμβολοσειρά με το first_name του παίκτη, last_name, που περιέχει μια συμβολοσειρά με το last_name του παίκτη, και square, που περιέχει μια συμβολοσειρά με το τετράγωνο στο οποίο μετακινήθηκε ο παίκτης. Η μέθοδος θα πρέπει να επιστρέφει το μήνυμα για την κίνηση ως συμβολοσειρά.

Chess.move_message("John", "Doe", "A1")
# => "JOOE moved to A1"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Crystal Exercism

Έτοιμος να ξεκινήσεις την άσκηση Παρτίδα σκακιού;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.