Μπλάκτζακ

Μπλάκτζακ

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

Εισαγωγή

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

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

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

value = 1
case value
when 1
  "One"
when 2
  "Two"
else
  "Other"
end

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

Ο τελεστής ισότητας case (===)

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

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

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

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

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

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

Case με εύρη

Τα cases μπορούν επίσης να ελέγχουν αν μια τιμή βρίσκεται μέσα σε ένα εύρος. Αυτό γίνεται έχοντας ένα εύρος ως έκφραση 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
  "One is equal to one"
when 1 > 2
  "One is greater than two"
else
  "Other"
end

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

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

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

Case με τύπους

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

case var
when Integer
  "Integer"
when String
  "String"
else
  "Other"
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. Υλοποίησε τη λογική απόφασης για την πρώτη κίνηση.

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

  • Σταμάτα (S)
  • Τράβα φύλλο (H)
  • Χώρισε (P)
  • Αυτόματη νίκη (W)

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

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

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

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

Έτοιμος να ξεκινήσεις την άσκηση Μπλάκτζακ;

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