begin process at 2010 07 29 15:47:43
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Math & Algorithmes

 > IA MORPION N X N

IA MORPION N X N


 Information sur la source

Note :
Aucune note
Catégorie :Math & Algorithmes Classé sous :IA, MORPION, MIN MAX, ALPHA BETA, POUET Niveau :Initié Date de création :21/04/2009 Vu / téléchargé :1 896 / 60

Auteur : Nyuki

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Ceci est un programme permettant à l'ordinateur de jouer sur un morpion NxN dans lequel il faut aligner K pions (K<=N).
L'IA implémenté est un MIN-MAX avec sa coupure ALPHA-BETA.

PS : pour l'utilisation les colonnes et les lignes commencent à 0

Cependant les commentaires sont peu nombreux car variables très explicites.

Source

  • def score(Jeu,x,y,k,n,car):
  • horz=0
  • vert=0
  • diagHD=0
  • diagHG=0
  • for i in range(max(0,y-k+1),min(n-1,y+k-1)-k+2):
  • res=1
  • for j in range(i,i+k):
  • if Jeu[x][j] == car:
  • res=res*0
  • if Jeu[x][j] != car and Jeu[x][j] != ' ':
  • res=res*n
  • if res>horz:
  • horz=res
  • for i in range(max(0,x-k+1),min(n-1,x+k-1)-k+2):
  • res=1
  • for j in range(i,i+k):
  • if Jeu[j][y] == car:
  • res = res*0
  • if Jeu[j][y] != ' ' and Jeu[j][y] != car:
  • res=res*n
  • if res>vert:
  • vert=res
  • if (min(min(n-1,y+k-1),y+min(n-1,x+k-1)-x)-max(max(0,y-k+1),y-(x-max(0,x-k+1)))>=(k-1)):
  • for i in range(max(max(0,y-k+1),y-(x-max(0,x-k+1))),min(min(n-1,y+k-1),y+min(n-1,x+k-1)-x)-k+2):
  • res=1
  • for j in range(i,i+k):
  • if Jeu[x-(y-j)][j] == car:
  • res = res*0
  • if Jeu[x-(y-j)][j] != car and Jeu[x-(y-j)][j] != ' ':
  • res = res*n
  • if res>diagHG:
  • diagHG=res
  • if (min(min(n-1,y+k-1),y+(x-max(0,x-k+1)))-max(max(0,y-k+1),y-(min(n-1,x+k-1)-x))>=(k-1)):
  • for i in range(max(max(0,y-k+1),y-(min(n-1,x+k-1)-x)),min(min(n-1,y+k-1),y+(x-max(0,x-k+1)))-k+2):
  • res=1
  • for j in range(i,i+k):
  • if Jeu[x+(y-j)][j] == car:
  • res = res*0
  • if Jeu[x+(y-j)][j] != car and Jeu[x+(y-j)][j] != ' ':
  • res = res*n
  • if res>diagHD:
  • diagHD = res
  • return max(vert,horz,diagHD,diagHG)
  • # la variable car indique ici le joueur qui joue !! (rappel : 'x' pour l'ordi et 'o' pour le joueur humain)
  • def choixCoup(Jeu,pro,car,k,n,val=0,deb=0,ref=0):
  • if car == 'x':
  • resultat=-100000
  • else:
  • resultat = 100000
  • if deb == 0:
  • Mligne=0
  • Mcolonne=0
  • res = 0
  • pouet=0
  • if pro>0:
  • liste = []
  • for q,i in enumerate(Jeu):
  • for s,j in enumerate(i):
  • if j == ' ':
  • Jeu[q][s] = car
  • if car=='x':
  • sc=score(Jeu,q,s,k,n,'o')
  • else:
  • sc=score(Jeu,q,s,k,n,'x')
  • liste.append([sc,q,s])
  • Jeu[q][s] = ' '
  • liste.sort()
  • liste.reverse()
  • for pouik in liste:
  • q=pouik[1]
  • s=pouik[2]
  • pouet=1
  • Jeu[q][s] = car
  • if car=='x':
  • sc=pro*pouik[0]
  • val = val+sc
  • res = choixCoup(Jeu,pro-1,'o',k,n,val,1,resultat)
  • val = val-sc
  • else :
  • sc=pro*pouik[0]
  • val = val-sc
  • res = choixCoup(Jeu,pro-1,'x',k,n,val,1,resultat)
  • val = val+sc
  • if deb==0:
  • print "x,y",q,s,res
  • if car == 'x':
  • if res>resultat:
  • resultat = res
  • if deb == 0:
  • Mligne = q
  • Mcolonne = s
  • else:
  • if (resultat>ref) :
  • Jeu[q][s] = ' '
  • return ref
  • else:
  • if res<resultat:
  • resultat=res
  • if (resultat<ref):
  • Jeu[q][s] = ' '
  • return ref
  • Jeu[q][s] = ' '
  • else:
  • resultat = val
  • if pouet ==0:
  • resultat = val
  • if deb == 0:
  • return resultat,Mligne,Mcolonne
  • else:
  • return resultat
  • def JeuFini(Jeu):
  • resultat=True
  • for i in Jeu:
  • if ' ' in i:
  • resultat =False
  • #print "pouet !!!!!"
  • return resultat
  • def pouik(Jeu):
  • resultat=0
  • for i in Jeu:
  • for j in i:
  • if j == ' ':
  • resultat +=1
  • return resultat
  • k=3
  • n=3
  • dif=3
  • deb=0
  • #Jeu=[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]
  • #pouet = choixCoup(Jeu,2,'x',k,n)
  • #pouet = score(Jeu,2,2,k,n,'o')
  • Jeu=[]
  • n=input("taille du jeu n:")
  • k=input("nbr de pion a aligner:")
  • dif= input("niveau du jeu (1 à 10):")
  • for i in range(0,n):
  • Jeu.append([])
  • for i in range(0,n):
  • for j in range(0,n):
  • Jeu[i].append(' ')
  • deb=0
  • print pouik(Jeu)
  • while (not(JeuFini(Jeu))):
  • print "le jeu:"
  • for i in Jeu:
  • print i
  • if deb!=0:
  • l=input("ligne:")
  • c=input("colonne:")
  • Jeu[l][c] = 'o'
  • deb=1
  • pouet = choixCoup(Jeu,min(pouik(Jeu),dif),'x',k,n)
  • Jeu[pouet[1]][pouet[2]]='x'
def score(Jeu,x,y,k,n,car):

	horz=0
	vert=0
	diagHD=0
	diagHG=0
	
	for i in range(max(0,y-k+1),min(n-1,y+k-1)-k+2):
		res=1
		for j in range(i,i+k):
			if Jeu[x][j] == car:
				res=res*0
			if Jeu[x][j] != car and Jeu[x][j] != ' ':
				res=res*n
		if res>horz:
			horz=res
	
	for i in range(max(0,x-k+1),min(n-1,x+k-1)-k+2):
		res=1
		for j in range(i,i+k):
			if Jeu[j][y] == car:
				res = res*0
			if Jeu[j][y] != ' ' and Jeu[j][y] != car:
				res=res*n
		if res>vert:
			vert=res
	
	
	if (min(min(n-1,y+k-1),y+min(n-1,x+k-1)-x)-max(max(0,y-k+1),y-(x-max(0,x-k+1)))>=(k-1)):
	
		for i in range(max(max(0,y-k+1),y-(x-max(0,x-k+1))),min(min(n-1,y+k-1),y+min(n-1,x+k-1)-x)-k+2):
			res=1
			for j in range(i,i+k):
				if Jeu[x-(y-j)][j] == car:
					res = res*0
				if Jeu[x-(y-j)][j] != car and Jeu[x-(y-j)][j] != ' ':
					res = res*n
			if res>diagHG:
				diagHG=res
		
	if (min(min(n-1,y+k-1),y+(x-max(0,x-k+1)))-max(max(0,y-k+1),y-(min(n-1,x+k-1)-x))>=(k-1)):
	
		for i in range(max(max(0,y-k+1),y-(min(n-1,x+k-1)-x)),min(min(n-1,y+k-1),y+(x-max(0,x-k+1)))-k+2):
			res=1
			for j in range(i,i+k):
				if Jeu[x+(y-j)][j] == car:
					res = res*0
				if Jeu[x+(y-j)][j] != car and Jeu[x+(y-j)][j] != ' ':
					res = res*n
			if res>diagHD:
				diagHD = res
			
	return max(vert,horz,diagHD,diagHG)
	
#  la variable car indique ici le joueur qui joue !! (rappel : 'x' pour l'ordi et 'o' pour le joueur humain)
def choixCoup(Jeu,pro,car,k,n,val=0,deb=0,ref=0):
	if car == 'x':
		resultat=-100000
	else:
		resultat = 100000
	if deb == 0:
		Mligne=0
		Mcolonne=0
	res = 0
	pouet=0
	if pro>0:
		liste = []
		for q,i in enumerate(Jeu):
			for s,j in enumerate(i):
				if j == ' ':
					Jeu[q][s] = car
					if car=='x':
						sc=score(Jeu,q,s,k,n,'o')
					else:
						sc=score(Jeu,q,s,k,n,'x')
					liste.append([sc,q,s])
					Jeu[q][s] = ' '
		liste.sort()
		liste.reverse()
		for pouik in liste:
			q=pouik[1]
			s=pouik[2]
			pouet=1
			Jeu[q][s] = car
			if car=='x':
				sc=pro*pouik[0]
				val = val+sc
				res = choixCoup(Jeu,pro-1,'o',k,n,val,1,resultat)
				val = val-sc
			else :
				sc=pro*pouik[0]
				val = val-sc
				res = choixCoup(Jeu,pro-1,'x',k,n,val,1,resultat)
				val = val+sc
			
			if deb==0:
				print "x,y",q,s,res
			
			if car == 'x':			
				if res>resultat:
					resultat = res
					if deb == 0:
						Mligne = q
						Mcolonne = s
					else:
						if (resultat>ref) :
							Jeu[q][s] = ' '
							return ref
							
			else:
				if res<resultat:
					resultat=res
					if (resultat<ref):
						Jeu[q][s] = ' '
						return ref
			Jeu[q][s] = ' '		
	else:
		resultat = val
	
	if pouet ==0:
		resultat = val
	if deb == 0:
		return resultat,Mligne,Mcolonne
	else:	
		return resultat	
					
				
def JeuFini(Jeu):
	resultat=True
	for i in Jeu:
		if ' ' in i:
			resultat =False
			#print "pouet !!!!!"
	return resultat			
def pouik(Jeu):
	resultat=0
	for i in Jeu:
		for j in i:
			if j == ' ':
				resultat +=1
	return resultat	
k=3
n=3
dif=3
deb=0
#Jeu=[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]
#pouet = choixCoup(Jeu,2,'x',k,n)
#pouet = score(Jeu,2,2,k,n,'o')

Jeu=[]
n=input("taille du jeu n:")
k=input("nbr de pion a aligner:")
dif= input("niveau du jeu (1 à 10):")
for i in range(0,n):
	Jeu.append([])
for i in range(0,n):
		for j in range(0,n):
			Jeu[i].append(' ')


deb=0
print pouik(Jeu)
while (not(JeuFini(Jeu))):
	print "le jeu:"
	for i in Jeu:
		print i

	if deb!=0:	
		l=input("ligne:")
		c=input("colonne:")
		Jeu[l][c] = 'o'
	deb=1	
	pouet = choixCoup(Jeu,min(pouik(Jeu),dif),'x',k,n)
	Jeu[pouet[1]][pouet[2]]='x'


 Conclusion

J'ai remarqué que pour tes tailles de 5 / 6 l'exécution est longue, Si vous avez des idées je suis ouvert au critiques !


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

CALCUL LIST DE NOMBRES PREMIERS par White541
TROUVER TOUT LES QUADRILATÉRES POSSIBLES AVEC N POINTS ALEAT... par Buenol
Source avec Zip GÉNÉRATION D'UN LABYRINTHE AVEC RECHERCHE DU CHEMIN LE PLUS ... par mehdicherti
Source avec Zip Source avec une capture DIVISIONS AVEC PRÉCISION RÉGLABLE par Clempython
Source avec Zip Source avec une capture LE CALCULATOR DE RAYGOLD VERSION 3.1 par raygold

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture TIC-TAC-TOE (THÉORIQUEMENT) IMBATTABLE par dustwind
Source avec Zip PETIT JEU DE MORPION par samurize
RECHERCHE DE CHEMIN OPTIMUM par Croqmort

Commentaires et avis

Commentaire de wanou95b le 22/04/2009 16:21:58

C'est bien, tu t'es fait plaisir, mais de mon point de vue, il y a très peu d'intérêt à publier ce genre de source !!

Commentaire de Nyuki le 22/04/2009 18:18:44

Désolé, mais ce script avait pour but d'intéresser les personnes qui recherchent des idées pour des IA, et plus particulièrement des IA de morpions ou puissance 4 (car le code est très facilement ré adaptable pour un puissance 4, il suffit de modifier les règles de Jeu...)

C'est donc pour ca que je ne me suis pas attaché à faire une interface graphique ni tous les tests de sécurité (on peut tres facilement faire planter mon programme...)

Ceci étant, je reste ouvert à toutes critiques constructives.

Commentaire de wanou95b le 24/04/2009 17:53:53

Comme je l'ai écrit c'était un point de vue personnel.
En tant que WebMaster et développeur PHP depuis quelques temps, je trouve simplement que cela n'apporte pas grand chose.
Maintenant si tu n'acceptes pas ce genre de commentaire (qui ne sont pas des critiques), cela me conforte dans l'idée que ta publication ne sert à rien !!

Commentaire de Nyuki le 26/04/2009 14:29:48

Je comprend qu'en tant que developpeur web, tu ne trouves pas d'utilité à mon script, cependant, ce code possède tout son interet dans la rubrique Math algo...

En effet, l'algorithme du min max implémenté ici peut etre (comme je l'ai deja dit) réutilisé. Il n'est pas dépendant du Morpion, puisqu'il suffit de modifier ma fonction d'évaluation pour l'adapter au nouveau problème. De plus, ce code a l'avantage d'innover par rapport au IA de morpion habituelle qui ne sont pas réexploitable pour d'autre problème (en générale ce sont juste une série de if...).

Donc voilà, je defends mon code et son utilité. Après libre à toi de le considérer inutile...
J'étais intéressé par d'autres commentaires plutot orientés sur d'autres méthodes pour resoudre des problème en IA.

Commentaire de amaury74 le 27/04/2009 10:55:21

Pourquoi toujours couper les programmeurs dans leurs élan en leur disant que leur sources n'ont aucun intéret?

Il serait plus constructif d'encourager les développeurs que de les casser...

Commentaire de wanou95b le 13/05/2009 15:55:53

Ce serait utile, Amaury74, de bien lire et interpreter mes phrases !! Je n'ai pas dit que la source n'avait pas d'interêt, j'ai dit qu'il n'y avait pas d'interêt à la publier ici. C'est pas franchement la même chose !! Par contre je suis d'accord sur le fait que j'ai pas été constructif, tu as raison.
Quand je recherche un script PHP, je recherche l'innovation et LE script "utile" que l'on n'a pas encore vu. C'est tout. D'ou mon commentaire.
Alors DSL pour toi NUYKI !!

Commentaire de aera group le 15/05/2010 22:43:53

Il y a bien que les "programmeur" web pour rien comprendre à l'algorithmique ...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Aide pour creer morpion [ par yan2bdx ] Bonjour,Je suis debutant en python. J'ai vraiment besoin de votre aide pour creer un morpion. Celui ci doit comporter 10cases par 10 cases, avec 2 jou modification de jeu morpion en python [ par apprenti2008 ] salut a tous ! SVP j'ai vraiment besoin d'aide , je suis en première année MASS , le prof nous a demander de créer un jeu morpion en python , le princ


Nos sponsors


Sondage...

CalendriCode

Juillet 2010
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales