|
| 1 | +#31 1/18 |
| 2 | +''' απλοποιημένη έκδοση του 31. Παίζουν 2-8 παίκτες, ο καθένας τραβάει διαδοχικά 'φύλλα'. Στόχος είναι |
| 3 | +να πετύχει όσο το δυνατόν υψηλότερο συνολικό σκορ. Αν το συνολικό του σκορ περάσει όμως το 31 καίγεται. |
| 4 | +Κερδίζει ο παίκτης ή οι παίκτες που έχουν το υψηλότερο σκορ σε κάθε γύρο |
| 5 | +''' |
| 6 | +import random |
| 7 | +import PlayingCards as pc |
| 8 | + |
| 9 | +class Player(): |
| 10 | + '''κλάση που υλοποιεί τη συμπεριφορά του παίκτη του 31''' |
| 11 | + def __init__(self, name, deck): |
| 12 | + self.name = name |
| 13 | + self.deck = deck |
| 14 | + self.myscore = 0 |
| 15 | + def plays(self): |
| 16 | + card = self.deck.draw() |
| 17 | + print('Ο παίκτης {} τράβηξε: {}'.format(self.name, card.detailed_info())) |
| 18 | + card_value = self._calculate_value(card) |
| 19 | + self.myscore += card_value |
| 20 | + self._check_if_exceeded() |
| 21 | + if self.myscore != -1: |
| 22 | + reply = input('Το σκόρ είναι: {}. Θέλεις να ξαναπαίξεις (ν/ο);'.format(self.myscore)) |
| 23 | + if not reply or reply.lower() not in "οo": |
| 24 | + self.plays() # η συνάρτηση καλεί ξανά τον εαυτό της αν επιτρέπεται και ο παίκτης επιθυμεί να συνεχίσει |
| 25 | + else : |
| 26 | + print(self) |
| 27 | + else: |
| 28 | + print(self) |
| 29 | + def _check_if_exceeded(self): |
| 30 | + if self.myscore > 31: |
| 31 | + print('Δυστυχώς κάηκε ο {} :-('.format(self.name)) |
| 32 | + self.myscore = -1 |
| 33 | + def _calculate_value(self, card): |
| 34 | + if card.value.isdigit(): return int(card.value) |
| 35 | + elif card.value == 'A': return 1 # TODO να χειρίζεται τον άσσο με ιδιαίτερο τρόπο |
| 36 | + else: return 10 # αφορά τις τιμές T,J,Q,K |
| 37 | + def __str__(self): |
| 38 | + return 'Ο Παίκτης '+self.name+' έχει:'+str(self.myscore)+' πόντους' |
| 39 | + |
| 40 | +class ComputerPlayer(Player): |
| 41 | + '''παίκτης που τραβάει μόνος του φύλλα, έχει στρατηγική''' |
| 42 | + def plays(self): |
| 43 | + card = self.deck.draw() # ο παίκτης τραβάει φύλλο |
| 44 | + print('Ο υπολογιστής ({}) τράβηξε: {}'.format(self.name, card.detailed_info())) |
| 45 | + card_value = self._calculate_value(card) |
| 46 | + self.myscore += card_value |
| 47 | + self._check_if_exceeded() |
| 48 | + if self._computer_strategy(): self.plays() |
| 49 | + else: |
| 50 | + print('ΥΠΟΛΟΓΙΣΤΗΣ:', self) |
| 51 | + def _computer_strategy(self): |
| 52 | + return False if self.myscore >= 25 or self.myscore == -1 else True |
| 53 | + |
| 54 | +class Game(): |
| 55 | + '''κλάση που ξεκινάει το παιχνίδι, καλεί τους παίκτες να παίξουν και ανακηρύσσει το νικητή''' |
| 56 | + def __init__(self): |
| 57 | + print("Παίζουμε τριάντα-μία") |
| 58 | + self.n_players = self.number_of_players() # αποφάσισε πόσοι παίκτες παίζουν |
| 59 | + self.players = [] #λίστα με παίκτες |
| 60 | + self.d = pc.Deck() |
| 61 | + self.d.shuffle() |
| 62 | + char = ord('Α') |
| 63 | + for i in range(char, char+self.n_players): |
| 64 | + if chr(i) == 'Α': self.players.append(ComputerPlayer(chr(i), self.d)) # ο υπολογιστής είναι ο Α |
| 65 | + else: self.players.append(Player(chr(i), self.d))# οι παίκτες έχουν ονόματα Β,Γ .. |
| 66 | + self.show_players() # τύπωσε τους παίκτες |
| 67 | + self.play_game() |
| 68 | + def number_of_players(self): #ζητάει από τον χρήστη τον αριθμό παικτών |
| 69 | + num = 0 |
| 70 | + while num<2 or num>8 : |
| 71 | + reply = input('Αριθμός παικτών (2-8)') |
| 72 | + if reply.isdigit() and 2 <= int(reply) <= 8 : |
| 73 | + return int(reply) |
| 74 | + def play_game(self): # καλεί διαδοχικά τους παίκτες να παίξουν και αποφασίζει ποιος νίκησε |
| 75 | + for p in self.players: |
| 76 | + print(50*'*','\nΠαίζει ο παίκτης...', p.name) |
| 77 | + p.plays() |
| 78 | + self.show_winner() |
| 79 | + def show_winner(self):# αποφασίζει ποιος είναι ο νικητής |
| 80 | + max_score = max(x.myscore for x in self.players) |
| 81 | + if max_score == -1: print("Δεν υπάρχει νικητής") |
| 82 | + else: |
| 83 | + winners = [x for x in self.players if x.myscore == max_score] |
| 84 | + print(50*'*',"\nΝικητής είναι : ") |
| 85 | + for player in winners: |
| 86 | + print( player) |
| 87 | + def show_players(self): # μας τυπώνει τους παίκτες |
| 88 | + print('Παίκτες: [', end ='') |
| 89 | + for player in sorted(self.players, key=lambda x: x.name): |
| 90 | + print(player.name, end = ',') |
| 91 | + print(']') |
| 92 | +#--- |
| 93 | +if __name__ == '__main__': Game() |
0 commit comments