J'ai acheté "Pourquoi ne pouvez-vous pas faire de développement orienté objet avec Java" pour un réapprentissage orienté objet, mais uniquement avec Java / Ruby [exemple officiel](http://gihyo.jp/book/2005/4- 7741-2222-X / support) n'était pas là, donc je l'ai créé en Python. (Veuillez l'utiliser comme référence uniquement. Je suis également un débutant.)
object_janken.py
from judge import *
from player import *
from tactics import *
#Génération d'instance d'arbitre (M. Saito)
saito = Judge()
#Génération du joueur 1 (M. Murata)
murata_tactics = RandomTactics()
murata = Player("M. Murata",murata_tactics)
#Génération du joueur 2 (M. Yamada)
yamada_tactics = StoneOnlyTactics()
yamada = Player("M. Yamada",yamada_tactics)
# yamada = Player_STONE("M. Yamada")
#Commencez Janken avec M. Murata et M. Yamada comme joueurs
saito.start_janken(murata, yamada)
player.py
class Player:
#Constante représentant la main de Janken
STONE = 0 #Goo
SCISSORS = 1 #Choki
PAPER = 2 #Par
def __init__(self, name, tactics):
self.name = name
self.win_count = 0
self.tactics = tactics
#Éteignez la main de Janken.
def show_hand(self):
hand = self.tactics.read_tactics()
return hand
#Écoutez la victoire ou la défaite de l'arbitre. S'il gagne, le résultat de l'argument est vrai
def notify_result(self,result):
if (result):
self.win_count += 1
#Répondez au nombre de fois que vous avez gagné.
def get_win_count(self):
return self.win_count
#Répondez à votre nom.
def get_name(self):
return self.name
#Hériter de la création de classe enfant
class Player_STONE(Player):
def show_hand(self):
return self.STONE
judge.py
class Judge:
#Démarrez Janken.
def start_janken(self, player1, player2):
#Déclarer le début de Janken
print("[Démarrage de Janken]\n")
#Jouez à Janken 3 fois
for cnt in range(3):
#Montre combien de tours
print("【", (cnt + 1), "Rond]")
#Regardez la main du joueur pour déterminer laquelle gagne.
winner = self.judge_janken(player1, player2)
if (winner != None):
#Gagnant du spectacle
print("\n", winner.get_name(), "A gagné!\n")
#Communiquez les résultats aux joueurs gagnants
winner.notify_result(True)
else:
#En cas d'égalité
print("\n C'est un tirage au sort!\n")
#Déclarez la fin de Janken
print("[Fin de Janken]\n")
#Déterminez le vainqueur final
final_winner = self.judge_final_winner(player1, player2)
print(player1.get_win_count(), "contre", player2.get_win_count(), "alors")
if (final_winner != None):
print(final_winner.get_name(), "Est le gagnant!\n")
else:
print("C'est un tirage au sort!\n")
#Regardez la main du joueur pour déterminer laquelle gagne.
def judge_janken(self,player1, player2):
winner = None
hand_dict = {0: "STONE",
1: "SCISSORS",
2: "PAPER"}
#Sortez la main du joueur
player1hand = player1.show_hand()
player2hand = player2.show_hand()
player1hand_name = hand_dict[player1hand]
player2hand_name = hand_dict[player2hand]
#Montrez chaque main
print(f"{player1hand_name} vs. {player2hand_name} \n")
#Quand le joueur 1 gagne
if (player1hand_name == "STONE" and player2hand_name == "SCISSORS") or \
(player1hand_name == "SCISSORS" and player2hand_name == "PAPER") or \
(player1hand_name == "PAPER" and player2hand_name == "STONE") :
winner = player1
#Quand le joueur 2 gagne
if (player1hand_name == "STONE" and player2hand_name == "PAPER") or \
(player1hand_name == "SCISSORS" and player2hand_name == "STONE") or \
(player1hand_name == "PAPER" and player2hand_name == "SCISSORS") :
winner = player2
#Dessiner si ni l'un ni l'autre(Renvoie nul)
return winner
#Déterminez le vainqueur final.
def judge_final_winner(self,player1, player2):
final_winner = None
#Écoutez le nombre de victoires
player1_win_count = player1.get_win_count()
player2_win_count = player2.get_win_count()
#Déterminez le gagnant
if (player1_win_count > player2_win_count):
final_winner = player1
elif(player1_win_count < player2_win_count):
final_winner = player2
else:
final_winner = None
return final_winner
tactics.py
class RandomTactics():
def read_tactics(self):
# 0.0 ou plus 3.Obtenez des nombres aléatoires sous forme de fractions inférieures à 0
random_num = rm.random()* 3.0
if (random_num < 1.0):
hand = Player.STONE
elif (random_num < 2.0):
hand = Player.SCISSORS
elif (random_num < 3.0):
hand = Player.PAPER
#Renvoie la main déterminée comme valeur de retour
return hand
#==J'adore Goo! »Classe de stratégie.
class StoneOnlyTactics():
def read_tactics(self):
#Assurez-vous de sortir un goo
return Player.STONE
card.py
class Card():
#Une constante représentant un joker
JOKER = 0
#Constante représentant la bêche
SUIT_SPADE = 1
#Constante représentant un diamant
SUIT_DIAMOND = 2
#Constante représentant le club
SUIT_CLUB = 3
#Constante représentant le cœur
SUIT_HEART = 4
def __init__(self,suit,number):
self.suit = suit
self.number = number
def getNumber(self):
return self.number
#Remplacer la fonction toString
def toString(self):
#Dans le cas de JOKER
if self.suit == 0:
card_code = "JK"
#Cartes autres que JOKER
else:
suit_dict = {"SUIT_SPADE":"S", "SUIT_DIAMOND":"D",
"SUIT_CLUB":"C","SUIT_HEART":"H"}
number_dict = {1:"A", 2:"2", 3:"3", 4:"4", 5:"5",
6:"6", 7:"7", 8:"8", 9:"9", 10:"T", 11:"J", 12:"Q", 13:"K"}
card_code = suit_dict[self.suit] + number_dict[self.number]
return card_code
hand.py
import random as rm
class Hand():
#Conservez la classe de cartes sous forme de liste
def __init__(self,list):
self.hand = list
#Ajouter une carte
def add_card(self,card):
self.hand.append(card)
#Piochez une carte (en haut)
def pick_card(self):
picked_card = self.hand.pop(0)
return picked_card
#Rendre le nombre de biens
def getNumberOfCard(self):
return len(self.hand)
#Mélangez votre main
def shuffle(self):
#Retirez les cartes au hasard et répétez le dernier ajout
number = self.getNumberOfCard()
for i in range(number):
pos = int(rm.random() * number)
picked_card = self.hand.pop(pos)
self.hand.append(picked_card)
#Trouvez le même nombre de cartes et remettez-les dans le tableau
def find_same_number_card(self):
same_cards = None
#Obtenez le numéro de la dernière carte ajoutée
last_added_card = self.hand[-1]
last_added_card_num = last_added_card.number
for index in range(len(self.hand)-1):
card = self.hand[index]
if card.number == last_added_card_num:
#Si la même carte que la dernière carte ajoutée est trouvée
#Stockez la combinaison trouvée dans sameCards et quittez la boucle
same_cards = [self.hand.pop(-1),self.hand.pop(index)]
break
return same_cards
#Exprimez les cartes de votre main sous forme de chaîne de caractères.
def toString(self):
hand_cards = ""
for card in self.hand:
hand_cards += card.toString() + " "
return hand_cards
table.py
class Table():
def __init__(self):
self.disposed_cards = []
#Jetez la carte.
def dispose_card(self,dispose_list):
for card in dispose_list:
print(f"{card.toString()}Abandonné")
self.disposed_cards.append(card)
#Exprimez la carte abandonnée sous forme de chaîne de caractères.
def toString(self):
disposed_cards = ""
for card in self.disposed_cards:
disposed_cards += card.toString() + " "
return disposed_cards
player.py
class Player():
def __init__(self,name,hand,master,table):
self.hand = hand
self.name = name
self.master = master
self.table = table
#Désignez votre tour (votre tour)
def play(self,next_player):
#Demandez au joueur suivant de retirer sa main
next_hand = next_player.show_hand()
#Piochez une carte de la main de votre adversaire
picked_card = next_hand.pick_card()
#Afficher le résultat de la soustraction
print(self.name, ":", next_player.name, "De", picked_card.toString(),"J'ai tiré\n")
#Ajoutez les cartes piochées à votre main et défaussez le même nombre de cartes
self.deal_card(picked_card)
#Découvrez si votre main est nulle
if self.hand.getNumberOfCard() == 0:
#Déclarez la montée au facilitateur
self.master.declare_win(self)
else:
#Montrez votre main actuelle
print(self.name, ": La main restante",self.hand.getNumberOfCard(), "est\n")
#Mélangez votre main pour montrer
def show_hand(self):
if self.hand.getNumberOfCard() == 1:
self.master.declare_win(self)
self.hand.shuffle()
return self.hand
#Recevoir la carte
def receive_card(self,card):
self.deal_card(card)
#Si vous avez la même carte, jetez-la
def deal_card(self,card):
#Ajoutez une carte à votre main
self.hand.add_card(card)
#Trouvez la même carte que vous venez d'ajouter
same_cards = self.hand.find_same_number_card()
#Si la même combinaison de cartes existe
if (same_cards != None):
#Jeter la carte sur la table
self.table.dispose_card(same_cards)
#Renvoie le nom du joueur
def toString(self):
return self.name
master.py
class Master():
def __init__(self,player_list):
self.player_list = player_list
def prepare_game(self,hand):
print("[Distribuer les cartes]\n")
#Mélanger les cartes à jouer
hand.shuffle()
#Obtenez le nombre de cartes à jouer
number_of_cards = hand.getNumberOfCard()
#Obtenez le nombre de joueurs
number_of_players = len(self.player_list)
for index in range(number_of_cards):
#Tirez-en un sur la carte
card = hand.pick_card()
#Distribuez les cartes à chaque joueur à tour de rôle
player = self.player_list[index % number_of_players]
player.receive_card(card)
#Commencer le jeu.
def start_game(self):
print("\n [Commencer à retirer le molleton]\n")
#Obtenez le nombre de joueurs
count = 0
while len(self.player_list) > 1:
player_index = count % len(self.player_list)
next_player_index = (count + 1) % len(self.player_list)
#Acquérir un joueur désigné
player = self.player_list[player_index]
#Obtenez le prochain joueur
next_player = self.player_list[next_player_index]
#Nommer un joueur
print("\n", player.name, "C'est ton tour--- ({})".format(count), "\n")
player.play(next_player)
count += 1
#Quittez la boucle lorsque le lecteur monte et qu'il n'en reste qu'un
print("[Terminé la suppression]\n")
#Déclarez la montée.
def declare_win(self,winner):
#Joueur qui est monté
print(winner.name, "Je me suis levé!\n")
#Retirer le joueur soulevé de la liste
self.player_list.remove(winner)
#Afficher le perdant lorsqu'il ne reste qu'un seul joueur
if len(self.player_list) == 1:
loser = self.player_list[0]
print(loser.name, "Est vaincu!\n")
#Enregistrez les joueurs qui participeront au jeu.
def register_player(self,player):
self.player_list.append(player)
old_maid.py
from card import *
from hand import *
from master import *
from player import *
from table import *
#Un programme ridicule.
#Générez 53 cartes à jouer.
def create_trump():
trump = Hand([])
#Génère 13 cartes pour chaque suie
for i in range(13):
number = i + 1
trump.add_card(Card("SUIT_CLUB", number))
trump.add_card(Card("SUIT_DIAMOND", number))
trump.add_card(Card("SUIT_HEART", number))
trump.add_card(Card("SUIT_SPADE", number))
#Créer un joker
trump.add_card(Card(0, 0))
return trump
#Générer des facilitateurs
master = Master([])
#Génération de champ
field = Table()
#Génération de joueurs
murata = Player("Murata", Hand([]), master, field)
yamada = Player("Yamada", Hand([]), master, field)
saito = Player("Saito", Hand([]),master, field)
#Enregistrer le joueur comme facilitateur
master.register_player(murata)
master.register_player(yamada)
master.register_player(saito)
#Générer des cartes à jouer
trump = create_trump()
#Préparez-vous pour le jeu
master.prepare_game(trump)
#Commencer le jeu
master.start_game()
・ Comme il a été ignoré, il est omis. Il y a deux points à prendre en compte:
-Lors de la création d'une classe abstraite avec python, il est nécessaire d'importer ABC (Abstract Base Classes) et d'hériter de la classe abstraite. → Référence: ABC in Python-Abstract Classes and Duck Typing
· Doit être passé par valeur lorsque la classe de table renvoie des informations de table
table.py
class FantanTable(Table):
#Table créée avec numpy
matrix = np.full((4,13),"..")
def getCard(self):
return self.matrix.copy()
Recommended Posts