Le calendrier de l'Avent était ouvert, je vais donc l'écrire à nouveau. Cette fois, comme le titre l'indique, j'ai fait un blackjack.
Cliquez ici pour l'article précédent → J'ai fait une loterie avec Python.
Ubuntu18.04LTS Python3.6.9 vim
play_bj.py
from random import shuffle
class Deck:
"""
Classe représentant le deck
"""
def __init__(self):
"""
Initialisez le deck et mélangez-le.
"""
suits = ['bêche', 'club', 'diamant', 'cœur']
values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']
self.deck = []
for i in suits:
for j in values:
self.deck.append((i, j))
shuffle(self.deck)
def draw(self):
"""
Piochez une carte du paquet et renvoyez la carte piochée.
"""
return self.deck.pop(0)
class Person:
"""
Classe représentant le joueur
"""
def __init__(self):
"""
Initialisez votre main.
"""
self.hands = []
self.point = 0
def add(self, card):
"""
Ajoutez une carte à votre main.
"""
self.hands.append(card)
def point_sum(self):
"""
Trouvez le score total de Trump.
"""
self.point = 0
for i in self.hands:
if i[1] in ['J', 'Q', 'K']:
self.point += 10
else:
self.point += i[1]
return self.point
def BJ():
"""
Traitement principal
"""
print('Bienvenue au Blackjack!')
d = Deck()
p = Person()
c = Person()
drawing(d, p, 'tu')
drawing(d, p, 'tu')
drawing(d, c, 'CPU')
card = d.draw()
c.add(card)
player_point = p.point_sum()
cpu_point = c.point_sum()
if player_point == cpu_point == 21:
print('C'est un tirage au sort.')
return
elif player_point == 21:
print('Vous gagnez!')
return
elif cpu_point == 21:
print('Tu as perdu.')
return
#Ici, A ne devient pas 11, donc la branche conditionnelle ci-dessus n'est pas vraiment nécessaire.
while True:
choice = input('"Hit"Ou"Stand"Entrez s'il vous plait.: ')
while True:
if choice.lower() == 'hit' or choice.lower() == 'stand':
break
else:
choice = input('"Hit"Ou"Stand"Entrez s'il vous plait.: ')
if choice.lower() == 'hit':
drawing(d, p, 'tu')
player_point = p.point_sum()
if player_point >= 22:
print('Tu as perdu.')
return
elif choice.lower() == 'stand':
break
else:
print('error')
return
print('Une autre carte du CPU{}de{}est.'.format(c.hands[1][0], c.hands[1][1]))
while True:
cpu_point = c.point_sum()
if cpu_point < 17:
drawing(d, c, 'CPU')
cpu_point = c.point_sum()
if cpu_point >= 22:
print('Vous gagnez!')
return
else:
break
if player_point == cpu_point:
print('C'est un tirage au sort.')
return
elif player_point > cpu_point:
print('Vous gagnez!')
return
elif player_point < cpu_point:
print('Tu as perdu.')
return
def drawing(class1, class2, name):
"""
Ajoutez 1 carte du jeu à votre main.
Après cela, les informations de la carte ajoutée sont affichées.
"""
card = class1.draw()
class2.add(card)
print('{}La carte dessinée par{}de{}est.'.format(name, card[0], card[1]))
if __name__ == '__main__':
BJ()
C'était une bonne étude des fonctions et des classes. Ensuite, rendons A compatible avec 11 également. Je l'ajouterai dès qu'un meilleur sera fait.
J'ai organisé le code en utilisant l'héritage de classe et ainsi de suite. De plus, 11 peut être pris en charge pour A. (12/09) Ajout de la gestion des erreurs et de l'argparse. (12/16) Ajout de la journalisation. (01/04)
import argparse
import logging
from logging import getLogger, StreamHandler, FileHandler, Formatter
import sys
from random import shuffle
logger = getLogger(__file__)
logger.setLevel(logging.DEBUG)
stream_handler = StreamHandler()
file_handler = FileHandler('debug.log')
stream_handler.setLevel(logging.DEBUG)
file_handler.setLevel(logging.DEBUG)
stream_format = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_format = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(stream_format)
file_handler.setFormatter(file_format)
logger.addHandler(stream_handler)
logger.addHandler(file_handler)
class Card:
SUITS = 'bêche', 'club', 'diamant', 'cœur'
RANKS = 'A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K'
def __init__(self, suit, rank):
self.suit = suit
self.rank = rank
self.number = self.RANKS.index(rank) + 1
class Deck:
def __init__(self):
self.deck = [Card(suit, rank)
for suit in Card.SUITS
for rank in Card.RANKS]
shuffle(self.deck)
def draw(self):
return self.deck.pop()
class Participant:
def __init__(self, name):
self.name = name
self.hands = []
self.point = []
def drawing(self, card, display=True):
self.hands.append(card)
self.point.append(min(card.number, 10))
if display:
print('{}La carte dessinée par{}de{}est.'
.format(self.name, card.suit, card.rank))
class Player(Participant):
def choose_a_first(self):
in_a = any(card.rank == 'A' for card in self.hands)
while in_a and sum(self.point) <= 11:
try:
choice_point = input('Voulez-vous que A soit 1 ou 11?: ')
except (KeyboardInterrupt, EOFError):
print()
print('J'ai fini le blackjack.')
sys.exit()
else:
if choice_point == '11':
self.point.append(10)
break
if choice_point == '1':
break
print('{}Le score total de{}est.'.format(self.name, sum(self.point)))
def choose_a(self):
while self.hands[-1].rank == 'A' and sum(self.point) <= 11:
try:
choice_point = input('Voulez-vous que A soit 1 ou 11?: ')
except (KeyboardInterrupt, EOFError):
print()
print('J'ai fini le blackjack.')
sys.exit()
else:
if choice_point == '11':
self.point.append(10)
break
if choice_point == '1':
break
print('{}Le score total de{}est.'.format(self.name, sum(self.point)))
def is_continue(self):
while True:
try:
choice = input('Entrez Hit ou Stand.: ').lower()
except (KeyboardInterrupt, EOFError):
print()
print('J'ai fini le blackjack.')
sys.exit()
else:
print()
if choice == 'hit':
return True
if choice == 'stand':
return False
class Dealer(Participant):
def choose_a_first(self):
in_a = any(card.rank == 'A' for card in self.hands)
if in_a and sum(self.point) <= 11:
self.point.append(10)
def choose_a(self):
if self.hands[-1].rank == 'A' and sum(self.point) <= 11:
self.point.append(10)
print('{}Le score total de{}est.'.format(self.name, sum(self.point)))
def show_card(self):
print('{}Une autre carte de{}de{}est.'
.format(self.name, self.hands[1].suit, self.hands[1].rank))
print('{}Le score total de{}est.'.format(self.name, sum(self.point)))
print()
def is_continue(self):
if sum(self.point) < 17:
return True
else:
return False
class BlackJack:
def __init__(self):
try:
name = input('S'il vous plaît entrez votre nom.: ')
except (KeyboardInterrupt, EOFError):
print()
print('J'ai fini le blackjack.')
sys.exit()
else:
self.deck = Deck()
self.player = Player(name)
self.dealer = Dealer('Marchand')
def play(self):
print()
self.player.drawing(self.deck.draw())
self.player.drawing(self.deck.draw())
self.player.choose_a_first()
print()
self.dealer.drawing(self.deck.draw())
self.dealer.drawing(self.deck.draw(), False)
self.dealer.choose_a_first()
print()
j_21 = self.judje_21(sum(self.player.point), sum(self.dealer.point))
if j_21:
logger.info('Naturel 21')
return
while self.player.is_continue():
self.player.drawing(self.deck.draw())
self.player.choose_a()
print()
if sum(self.player.point) >= 22:
print('{}Est vaincu.'.format(self.player.name))
logger.info('Buste de joueur')
return
self.dealer.show_card()
while self.dealer.is_continue():
self.dealer.drawing(self.deck.draw())
self.dealer.choose_a()
print()
self.judje(sum(self.player.point), sum(self.dealer.point))
def judje_21(self, player_point, dealer_point):
if player_point == dealer_point == 21:
print('{}Est également naturel 21.'.format(self.dealer.name))
print('C'est un tirage au sort.')
return True
elif player_point == 21:
print('{}Est le gagnant.'.format(self.player.name))
return True
elif dealer_point == 21:
print('{}Est naturel 21.'.format(self.dealer.name))
print('{}Est vaincu.'.format(self.player.name))
return True
def judje(self, player_point, dealer_point):
if player_point == dealer_point:
print('C'est un tirage au sort.')
elif player_point > dealer_point or dealer_point >= 22:
print('{}Est le gagnant.'.format(self.player.name))
elif player_point < dealer_point:
print('{}Est vaincu.'.format(self.player.name))
def get_parser():
parser = argparse.ArgumentParser(description='Vous pouvez blackjack sur le terminal.')
parser.add_argument('-q', '--qiita', action='store_true', help='Lien Qiita avec le code source')
parser.add_argument('-r', '--rules', action='store_true', help='Expliquez les règles du blackjack')
args = parser.parse_args()
return args
def main():
args = get_parser()
if args.qiita:
print('https://qiita.com/yoshige/items/d06382f2a8b76ce6cd79')
return
if args.rules:
print('Cliquez ici pour les règles du Blackjack')
print('https://ja.wikipedia.org/wiki/Jack noir')
return
logger.info('start')
print('Bienvenue au Blackjack!')
bj = BlackJack()
bj.play()
logger.info('end')
if __name__ == '__main__':
main()
Recommended Posts