Skip to content

Commit 3de764e

Browse files
committed
31 game
1 parent 948ab8c commit 3de764e

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

code/Week 2/PlayingCards.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import random
2+
class Card:
3+
'''κλάση φύλλων τράπουλας'''
4+
gr_names = {'s': 'Σπαθί ♣', 'c': 'Μπαστουνι ♠', 'h': 'Κούπα ♥', 'd': 'Καρό ♦',
5+
'A': 'Άσσος', '2': 'Δύο', '3':'Τρία', '4':'Τέσσερα', '5':'Πέντε', '6':'Έξι', '7':'Επτά', '8':'Οκτώ',
6+
'9': 'Εννιά', 'T': 'Δέκα', 'J': 'Βαλές', 'Q':'Ντάμα', 'K': 'Ρήγας'}
7+
the_cards = []
8+
def __init__(self, value, symbol):
9+
self.value = value.upper().strip()
10+
self.symbol = symbol.lower().strip()
11+
Card.the_cards.append(self)
12+
def __str__(self):
13+
return self.value+self.symbol
14+
def detailed_info(self):
15+
if self.value in Card.gr_names and self.symbol in Card.gr_names:
16+
return Card.gr_names[self.value]+ ' ' + Card.gr_names[self.symbol]
17+
else: return ''
18+
19+
class Deck():
20+
'''κλάση που υλοποιεί τράπουλα για παιχνίδια με χαρτιά'''
21+
symbols = "shcd" # οι κατηγορίες από φύλλα, spade,heart,club,diamonds
22+
values = "A23456789TJQK" # οι αξίες που μπορεί να έχουν τα φύλλα
23+
def __init__(self):
24+
self.content = [] # χαρτιά που βρίσκονται στην τράπουλα
25+
self.pile = [] # χαρτιά που έχουν μοιραστεί
26+
for s in Deck.symbols:
27+
for v in Deck.values:
28+
self.content.append(Card(v,s))
29+
def shuffle(self):
30+
random.shuffle(self.content)
31+
def draw(self):
32+
if len(self.content)< 1 : return 'empty deck'
33+
drawn_card = self.content.pop(0)
34+
self.pile.append(drawn_card)
35+
return drawn_card
36+
def collect(self):
37+
self.content += self.pile
38+
self.pile = []
39+
def __str__(self):
40+
s = ''
41+
cnt = 0 # μετρητής φύλλων για εκτύπωση, τυπώνουμε φύλλα σε σειρές των 13
42+
for i in self.content:
43+
s=s+str(i)+' '
44+
cnt += 1
45+
if cnt%13 == 0: s=s+'\n'
46+
if s[-1] != '\n': s += '\n'
47+
return s

code/Week 2/thirtyone.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
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

Comments
 (0)