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