Blackjack

Blackjack

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

Εισαγωγή

case (συχνά αναφέρεται ως switch σε άλλες γλώσσες) είναι μια μορφή έκφρασης ελέγχου, όπως το if-else. Το case επιτρέπει την αλυσιδωτή σύνδεση πολλαπλών εντολών if-else-if, μπορεί να είναι πιο ευανάγνωστο και επιτρέπει ισχυρές κατασκευές.

Ένα case ορίζεται από τη λέξη-κλειδί case, που ακολουθείται από μια προαιρετική έκφραση. Στη συνέχεια, για κάθε περίπτωση, χρησιμοποιείται η λέξη-κλειδί when, που ακολουθείται από μια έκφραση η οποία συγκρίνεται με την έκφραση του case. Η λέξη-κλειδί when δεν πρέπει να έχει εσοχή σε σχέση με τη λέξη-κλειδί case. Μετά τη λέξη-κλειδί when βρίσκεται ο κώδικας που πρέπει να εκτελεστεί αν η έκφραση του case ταιριάζει με την έκφραση του when. Το case επιτρέπει μια προαιρετική εντολή else, η οποία εκτελείται αν δεν ταιριάζει καμία άλλη περίπτωση.

Η έκφραση του case αξιολογείται και στη συνέχεια συγκρίνεται με κάθε έκφραση του when. Η σύγκριση γίνεται με τον τελεστή υπαγωγής περιπτώσεων (===).

case 1
when 1
  puts "One"
when 2
  puts "Two"
else
  puts "Other"
end
# => One

# This is the same as:
tmp = 1
if 1 === tmp
  puts "One"
elsif 2 === tmp
  puts "Two"
else
  puts "Other"
end

Ο τελεστής υπαγωγής περιπτώσεων (===)

Ο τελεστής υπαγωγής περιπτώσεων (===) είναι λίγο διαφορετικός από τον τελεστή ισότητας (==). Ο τελεστής ελέγχει αν η δεξιά πλευρά είναι μέλος του συνόλου που περιγράφει η αριστερή πλευρά. Αυτό σημαίνει ότι έχει σημασία πού τοποθετείται κάθε τελεστέος. Το πώς λειτουργεί αυτό εξαρτάται από τον τύπο της αριστερής πλευράς· για παράδειγμα, ένα Range θα ελέγξει αν η δεξιά πλευρά βρίσκεται μέσα στο εύρος, ή ένα Object θα ελέγξει αν η δεξιά πλευρά είναι στιγμιότυπο του Object.

(1..3) == 1  # => false
(1..3) === 1 # => true

String == "foo"  # => false
String === "foo" # => true

case με πολλαπλές εκφράσεις

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

case 1
when 1, 2
  puts "One or two"
else
  puts "Other"
end

case με εύρη

Το case μπορεί επίσης να ελέγξει αν μια τιμή βρίσκεται μέσα σε ένα εύρος. Αυτό γίνεται χρησιμοποιώντας ένα εύρος ως έκφραση του when.

case var
when 1..3
  puts "One to three"
else
  puts "Other"
end

case χωρίς έκφραση case

Όταν δεν χρειάζεται έκφραση case, μπορείς να την παραλείψεις. Με αυτόν τον τρόπο, κάθε έκφραση του when αξιολογείται ως προς την αλήθεια της. Και τις κάνει να συμπεριφέρονται σαν εντολές if-else-if.

case
when 1 == 1
  puts "One is equal to one"
when 1 > 2
  puts "One is greater than two"
else
  puts "Other"
end

when σε μία γραμμή

Η Crystal επιτρέπει εντολές case σε μία γραμμή. Αυτό μπορεί να χρησιμοποιηθεί όταν έχεις μια απλή εντολή μίας γραμμής. Το when σε μία γραμμή γράφεται ως when <expression> then <statement>. Και όταν χρησιμοποιείται στην εντολή else, γράφεται ως else <statement>.

case var
when 1 then puts "One"
when 2 then puts "Two"
else puts "Other"
end

case με τύπους

Το case επιτρέπει το ταίριασμα με τύπους. Η σύγκριση θα χρησιμοποιήσει τον τελεστή is_a? για να ελέγξει τον τύπο της μεταβλητής. Για παράδειγμα, αυτό επιτρέπει έναν κλάδο για κάθε τύπο σε έναν τύπο ένωσης.

case var
when Int32
  puts "Int32"
when String
  puts "String"
else
  puts "Other"
end

Σιωπηρό αντικείμενο

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

case 1
when .odd?
  puts "Odd"
when .even?
  puts "Even"
end

Οδηγίες

Σε αυτή την άσκηση θα προσομοιώσουμε την πρώτη σειρά ενός παιχνιδιού Blackjack.

1. Υπολόγισε την τιμή οποιουδήποτε φύλλου.

Θα λάβεις δύο φύλλα και θα μπορείς να δεις το ανοιχτό φύλλο του ντίλερ. Όλα τα φύλλα αναπαρίστανται με μια συμβολοσειρά, όπως "ace", "king", "three", "two" κ.λπ. Οι τιμές κάθε φύλλου είναι:

φύλλο τιμή φύλλο τιμή
ace 11 eight 8
two 2 nine 9
three 3 ten 10
four 4 jack 10
five 5 queen 10
six 6 king 10
seven 7 other 0
Note

Συνήθως, οι άσσοι μπορούν να πάρουν την τιμή 1 ή 11, αλλά για απλότητα θα υποθέσουμε ότι μπορούν να πάρουν μόνο την τιμή 11.

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

Blackjack.parse_card("ace")
# => 11

2. Ονόμασε εύρη τιμών.

Η βαθμολογία του παίκτη πρέπει να κατηγοριοποιηθεί σε εύρη τιμών. Οι βαθμολογίες των παικτών υπολογίζονται αθροίζοντας τις τιμές των δύο φύλλων του παίκτη. Τα εύρη που χρησιμοποιούνται είναι:

εύρος τιμή
low [4, 11]
mid [12, 16]
high [17, 20]
blackjack [21]

Υλοποίησε τη μέθοδο Blackjack.card_range, η οποία δέχεται δύο φύλλα ως συμβολοσειρές ως ορίσματα. Η μέθοδος θα πρέπει να επιστρέφει το όνομα του εύρους τιμών στο οποίο εμπίπτουν τα δύο φύλλα.

Blackjack.card_range("ten", "king")
# => "high"

3. Υλοποίησε τη λογική απόφασης για την πρώτη σειρά.

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

  • Stand (S)
  • Hit (H)
  • Split (P)
  • Automatically win (W)

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

  • Αν έχεις ένα ζευγάρι άσσους, πρέπει πάντα να τους χωρίζεις.
  • Αν έχεις Blackjack (δύο φύλλα που αθροίζουν σε τιμή 21) και ο ντίλερ δεν έχει άσσο, φιγούρα ή δεκάρι, τότε κερδίζεις αυτόματα. Αν ο ντίλερ έχει κάποιο από αυτά τα φύλλα, τότε θα πρέπει να μείνεις και να περιμένεις να αποκαλυφθεί το άλλο φύλλο.
  • Αν τα φύλλα σου αθροίζουν σε μια τιμή εντός του εύρους [17, 20], θα πρέπει πάντα να μείνεις.
  • Αν τα φύλλα σου αθροίζουν σε μια τιμή εντός του εύρους [12, 16], θα πρέπει πάντα να μείνεις, εκτός αν ο ντίλερ έχει 7 ή υψηλότερο, οπότε θα πρέπει πάντα να τραβήξεις φύλλο.
  • Αν τα φύλλα σου αθροίζουν σε 11 ή λιγότερο, θα πρέπει πάντα να τραβήξεις φύλλο.

Υλοποίησε τη μέθοδο Blackjack.first_turn, η οποία δέχεται τρία φύλλα ως συμβολοσειρές ως ορίσματα. Η μέθοδος θα πρέπει να επιστρέφει την απόφαση που πρέπει να πάρεις ως συμβολοσειρά.

Blackjack.first_turn("ace", "ace", "two")
# => "P"
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Crystal Exercism

Έτοιμος να ξεκινήσεις την άσκηση Blackjack;

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