Implémenter XENO avec python

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

Implémenter XENO avec python
Mettre en œuvre des recommandations en Python
Implémenter sum en Python
Implémenter Traceroute dans Python 3
Implémenter d'anciens chiffrements en python
Implémenter Redis Mutex en Python
Implémenter l'extension en Python
Mettre en œuvre un RPC rapide en Python
Implémenter l'algorithme de Dijkstra en python
Implémenter le bot de discussion Slack en Python
Mettre en œuvre l'apprentissage de l'empilement en Python [Kaggle]
Implémenter la fonction power.prop.test de R en python
Implémenter le modèle Singleton en Python
Implémentez rapidement l'API REST en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
J'ai essayé d'implémenter PLSA en Python
Implémenter __eq__ etc. de manière générique dans la classe Python