Ia morpion n x n

Soyez le premier à donner votre avis sur cette source.

Vue 7 708 fois - Téléchargée 243 fois

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 / Exemple :


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 !

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
15
On peut critiquer une source si cela est justifier.
Par exemple un mec qui nous montre une source MA CALCULETTE où il met juste un imput et un eval et hop le tour est joué. Là on peut le dire la source ne sert à rien ...

Ici, ce n'est pas le cas, il y a un gros travail d'algorithmique sur une IA d'où le fait que cette source sert bel et bien à quelque chose.

Voila, maintenant je suis un habitué des commentaires du genre peu mieux faire,déja vu et mal codé, mais généralement c'est justifier (cf mes messages dans les sources). Je pense que si la source est HS ou carrément nul, il faut bien le dire, et faire en sorte que l'auteur s'améliore ...
Messages postés
1
Date d'inscription
jeudi 10 mars 2005
Statut
Membre
Dernière intervention
2 août 2010

De toute façon a chaque poste il y a toujours un abruti qui critique de manière non constructive sur ce site.
Faut voir il y a presque pas un post favorable !

voici ce qu'on retrouve toujours :

- c'est sans aucun intérêt
- c'est illisible
- peux mieux faire
- déjà vu
- c'est mal codé
- peu d'interet
- etc

Bref toujours à rabaisser les autres, c'est ca le monde du développement ?

Je suis content pour lui qu'il ai réussi à arriver au bout de son projet même si il n'est pas parfait.

En plus le mec à le culot de parler de php sur un forum python ...

Bref ca spoil pas assez sur ce forum
Messages postés
382
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
15
Il y a bien que les "programmeur" web pour rien comprendre à l'algorithmique ...
Messages postés
23
Date d'inscription
lundi 31 mars 2008
Statut
Membre
Dernière intervention
5 juin 2009

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 !!
Messages postés
24
Date d'inscription
vendredi 10 août 2007
Statut
Membre
Dernière intervention
10 mai 2009

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...
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.