La vidéo XENO est vraiment intéressante, n'est-ce pas? J'écris habituellement des rails, mais de temps en temps, j'ai aussi pratiqué python et essayé d'implémenter le sujet XENO avec python.
Je voudrais l'utiliser comme matériel d'apprentissage automatique ou le publier sur youtube.
Si vous définissez mannual_flag sur True, vous pouvez jouer à la bataille CPU de Texto Logic.
Xeno.py
import random
class Xeno():
def __init__(self):
self.winner = "none"
class Player():
def __init__(self,teban):
self.hand = []
self.field = []
self.predict_flag = False
self.defence_flag = False
self.mannual_flag = False
if teban == 0:
self.teban="sente"
elif teban ==1:
self.teban="gote"
def set_deck(self):
card_list=[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,10]
random.shuffle(card_list)
self.deck = card_list
#Traitement des factures réincarné
self.reincarnation_card = self.deck.pop(-1)
#Dessinez-en un sur le pont
def draw_top_card(self):
if len(self.deck) > 0:
self.drawed_card=self.deck.pop(0)
return self.drawed_card
#Sage Execution Regardez 3 cartes du paquet, faites 1 pioche et mélangez le paquet
def do_predict(self):
if len(self.deck) > 2:
options = self.deck[0:3]
if self.player.mannual_flag ==True:
print("Activer l'effet du sage")
print(options)
print("Veuillez saisir la carte pour sélectionner")
ind = options.index(self.inputnumber())
else:
ind = options.index(options[1])
selected_card = self.deck.pop(ind)
random.shuffle(self.deck)
self.drawed_card = selected_card
return self.drawed_card
#Configuration du match
def match_initialize(self):
self.sente = self.Player(0)
self.gote = self.Player(1)
#Créez un deck et une carte réincarnée, et piochez-en un pour chaque joueur
self.set_deck()
self.sente.hand.append(self.draw_top_card())
self.gote.hand.append(self.draw_top_card())
#Séquence du tirage au sort à la fin du tour
def play_turn(self,_player):
if _player == self.sente:
self.player = self.sente
self.o_player = self.gote
else:
self.player = self.gote
self.o_player = self.sente
if self.player.predict_flag == True and len(self.deck) > 2:
self.drawed_card = self.do_predict()
self.player.predict_flag = False
else:
self.drawed_card = self.draw_top_card()
#Ajouter une carte de tirage à la main
self.player.hand.append(self.drawed_card)
if self.player.mannual_flag ==True:
print("drawed card:",self.drawed_card)
print(self.player.teban, self.player.hand)
#Mettez en jeu une carte de votre main
self.play_card = self.decide_play_card()
#Supprimer la carte de votre main
self.player.hand.remove(self.play_card)
#Ajouter pour jouer
self.player.field.append(self.play_card)
# print("player hand:", self.player.hand)
#Jouez l'effet de la carte émise
if self.o_player.defence_flag != True or self.play_card == 7 or self.play_card == 4:
self.play_effect()
#Si l'adversaire garde, seul le drapeau est réinitialisé
else:
self.o_player.defence_flag = False
print("player field:", self.player.field)
print("o_player field:", self.o_player.field)
#Si le deck est parti à la fin du tour, combat à la main
print("deck maisuu:", len(self.deck))
if len(self.deck) == 0:
self.battle()
#bataille finale
def battle(self):
print("battle!!!!!!!!!!!!!")
print("sente:", self.sente.hand[0])
print("gote:", self.gote.hand[0])
if self.sente.hand[0] > self.gote.hand[0]:
self.winner = self.sente.teban
elif self.gote.hand[0]>self.sente.hand[0]:
self.winner = self.gote.teban
else:
self.winner = "DRAW"
def decide_play_card(self):
if self.player.mannual_flag== True:
print("Veuillez entrer le numéro de la carte pour jouer")
return self.inputnumber()
else:
if self.player.hand.count(10) != 1:
# random.shuffle(self.player.hand)
self.player.hand.sort()
return self.player.hand[0]
else:
self.player.hand.sort()
return self.player.hand[0]
def play_effect(self):
pl = self.play_card
if pl == 1:
print("play:", pl)
self.revolution()
elif pl ==2:
print("play:", pl)
self.detect_number()
elif pl == 3:
print("play:", pl)
self.publicate()
elif pl ==4:
print("play:", pl)
self.skip_effect()
elif pl ==5:
print("play:", pl)
self.hide_draw_and_drop()
elif pl == 6:
print("play:", pl)
self.battle_novice()
elif pl == 7:
print("play:", pl)
self.predict()
elif pl == 8:
print("play:", pl)
self.exchange()
elif pl == 9:
print("play:", pl)
self.public_draw_and_drop()
def inputnumber(self):
if self.player.mannual_flag==True:
s = int(input())
return s
else:
return 1
#1 garçon
def revolution(self):
all_field = self.sente.field + self.gote.field
#Exécution publique uniquement si 1 est déjà sur le terrain
print(all_field)
if all_field.count(1) > 1:
self.public_draw_and_drop()
#2 soldats
def detect_number(self):
detection_number = 3
if self.player.mannual_flag == True:
print("Activer l'effet du soldat")
print("Veuillez saisir les prévisions de main de l'adversaire")
detection_number = self.inputnumber()
else:
detection_number = 5
if self.o_player.hand[0] == detection_number:
self.winner = self.player.teban
#3 Diseuse de bonne aventure
def publicate(self):
print(self.o_player.hand)
#4 Gardien
def skip_effect(self):
self.player.defence_flag = True
#5 Shinigami
def hide_draw_and_drop(self):
if len(self.deck)>0:
#L'adversaire pioche 1 carte et mélange la main
self.draw_card = self.draw_top_card()
self.o_player.hand.append(self.draw_card)
random.shuffle(self.o_player.hand)
if self.player.mannual_flag == True:
print("Veuillez sélectionner la position de la main à jeter 0:Gauche 1:droite")
inp = self.inputnumber()
else:
inp = 0
#Déposez la 0ème carte
drop_target_card = self.o_player.hand.pop(inp)
self.o_player.field.append(drop_target_card)
#Processus de réincarnation si la cible est de 10
if drop_target_card == 10:
self.reincarnate()
#6 aristocrates
def battle_novice(self):
self.battle()
#7 Sauge
def predict(self):
self.player.predict_flag = True
#8 Saint-Esprit
def exchange(self):
tmp = self.player.hand[0]
self.player.hand[0] = self.o_player.hand[0]
self.o_player.hand[0] = tmp
#9 Empereur
def public_draw_and_drop(self):
if len(self.deck) > 0:
self.o_player.hand.append(self.draw_top_card())
#Libération manuelle
if self.player.mannual_flag ==True:
print("Cliquez ici pour la main de l'adversaire")
print(self.o_player.hand)
#Sélection cible
print("select target number:")
drop_target = self.inputnumber()
ind = self.o_player.hand.index(drop_target)
else:
ind = 0
drop_target_card = self.o_player.hand.pop(ind)
self.o_player.field.append(drop_target_card)
#Carte de l'empereur(9)A été joué et la carte cible est un héros(10)Si oui, le joueur gagne
if drop_target_card == 10:
if self.play_card == 9:
self.winner = self.player.teban
elif self.play_card == 1:
self.reincarnate()
#10 héros
def reincarnate(self):
#Jetez votre main
self.o_player.field.append(self.o_player.hand.pop(0))
#Dessinez un projet de loi réincarné
self.o_player.hand.append(self.reincarnation_card)
def main():
winner_list = []
win_process =[]
for i in range(1,1000):
xeno = Xeno()
xeno.match_initialize()
xeno.sente.mannual_flag = False
xeno.gote.mannual_flag = False
while True:
print("=======================")
if xeno.winner == "none":
xeno.play_turn(xeno.sente)
else:
break
print("=======================")
if xeno.winner == "none":
xeno.play_turn(xeno.gote)
else:
break
print("winner :", xeno.winner)
winner_list.append(xeno.winner)
print("gote",winner_list.count("gote"))
print("sente",winner_list.count("sente"))
print("Draw",winner_list.count("DRAW"))
if __name__ == '__main__':
main()
Au fait, c'est Logic Texto, mais le résultat de 10000 jeux gote 4543 sente 4967 Draw 489
Puisqu'il existe une possibilité que la combinaison de 6 et 10 soit gagnée en premier, le premier coup est encore plus avantageux. Après cela, la carte de gardien est en fait synonyme de "laisser l'adversaire choisir une main et la défausser + le saut de tour de l'adversaire", donc je pense que c'est un attaquant assez fort.
Recommended Posts