Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 27-03-2017 22:17:24

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Puissance_4

Bonsoir,
J'ai essayé de programmer un puissance 4, voila le résultat si ca vous intéresse :
(il est possible qu'il arrive un problème mais il arrive rarement et je ne sais pas trop comment l'arranger simplement.)


from matplotlib import*
from matplotlib.pyplot import*
from numpy import*
from time import*
from random import*
taille = (8,8)
fig=figure(figsize=taille)
ax = fig.add_subplot(111)

axis('off')

grille=array([[0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0]])


for i in arange(-0.5,7.5,1):
    plot([-0.5,6.5],[i,i],'k')
    plot([i,i],[-0.5,6.5],'k')

   
def gagnant():
    #ligne :
    for x in range(0,4):
        for y in range(0,7):
            if grille[x,y]==grille[x+1,y]==grille[x+2,y]==grille[x+3,y]==1 :
                return 1
    #colonne :
    for x in range(0,7):
        for y in range(0,4):
            if grille[x,y]==grille[x,y+1]==grille[x,y+2]==grille[x,y+3]==1 :
                return 1
    #diagonale1 :
    for x in range(0,4):
        for y in range(0,4):
            if grille[x,y]==grille[x+1,y+1]==grille[x+2,y+2]==grille[x+3,y+3]==1 :
                return 1
    #diagonale2 :
    for x in range(0,4):
        for y in range(3,7):
            if grille[x,y]==grille[x+1,y-1]==grille[x+2,y-2]==grille[x+3,y-3]==1 :  
                return 1
               
    #ligne :
    for x in range(0,4):
        for y in range(0,7):
            if grille[x,y]==grille[x+1,y]==grille[x+2,y]==grille[x+3,y]==-1 :
                return -1
    #colonne :
    for x in range(0,7):
        for y in range(0,4):
            if grille[x,y]==grille[x,y+1]==grille[x,y+2]==grille[x,y+3]==-1 :
                return -1
    #diagonale1 :
    for x in range(0,4):
        for y in range(0,4):
            if grille[x,y]==grille[x+1,y+1]==grille[x+2,y+2]==grille[x+3,y+3]==-1 :
                return -1
    #diagonale2 :
    for x in range(0,4):
        for y in range(3,7):
            if grille[x,y]==grille[x+1,y-1]==grille[x+2,y-2]==grille[x+3,y-3]==-1 :
                return -1
    return 0


def ag():
    for k in range(0,7):
        print(grille[k,0],grille[k,1],grille[k,2],grille[k,3],grille[k,4],grille[k,5],grille[k,6])

def IA():
    #print(xposs)
    for x in range(0,7):
        v=0
        y=gravitéo(x)
        if y!=10:
            grille[x,y]=-1
   
            for i in range(0,4):
                for j in range(0,7):
                    if grille[i,j]==grille[i+1,j]==grille[i+2,j]==grille[i+3,j]==-1 :
                        v=1
            for i in range(0,7):
                for j in range(0,4):
                    if grille[i,j]==grille[i,j+1]==grille[i,j+2]==grille[i,j+3]==-1 :
                        v=1
            for i in range(0,4):
                for j in range(0,4):
                    if grille[i,j]==grille[i+1,j+1]==grille[i+2,j+2]==grille[i+3,j+3]==-1 :
                        v=1
            for i in range(0,4):
                for j in range(3,7):
                    if grille[i,j]==grille[i+1,j-1]==grille[i+2,j-2]==grille[i+3,j-3]==-1 :
                        v=1
           
            grille[x,y]=0
            if v==1 :
                #print('--------------------ordi gg')
                return x
         
            v=0        
            grille[x,y]=1  
            for i in range(0,4):
                for j in range(0,7):
                    if grille[i,j]==grille[i+1,j]==grille[i+2,j]==grille[i+3,j]==1 :
                        v=1
            for i in range(0,7):
                for j in range(0,4):
                    if grille[i,j]==grille[i,j+1]==grille[i,j+2]==grille[i,j+3]==1 :
                        v=1
            for i in range(0,4):
                for j in range(0,4):
                    if grille[i,j]==grille[i+1,j+1]==grille[i+2,j+2]==grille[i+3,j+3]==1 :
                        v=1
            for i in range(0,4):
                for j in range(3,7):
                    if grille[i,j]==grille[i+1,j-1]==grille[i+2,j-2]==grille[i+3,j-3]==1 :
                        v=1
   
            grille[x,y]=0            
            if v==1 :
                #print('--------------------block joueur')
                return x
 

    for i in range(1,5):
        j=0
        if grille[i-1,j]==0 and grille[i,j]==1 and grille[i+1,j]==1 and grille[i+2,j]==0:
            #print('gauche ou droite')
            return randrange(i-1,i+3,3)
        for j in range(1,7):
            if grille[i-1,j]==0 and grille[i,j]==1 and grille[i+1,j]==1 and grille[i+2,j]==0:
                if abs(grille[i-1,j-1])==1 or abs(grille[i+2,j-1])==1 :
                    #print('gauche ou droite')
                    return randrange(i-1,i+3,3)
           

    #print('random')
    shuffle(xposs)
    for x in range(0,len(xposs)):
         v=0
         x=xposs[x]
         y1=gravitéo(x)
         grille[x,y1]=-1
         for k in range(0,len(xposs)):
             k=xposs[k]
             y2=gravitéo(k)
             try :
                 grille[k,y2]=1
             except : break
             for i in range(0,4):
                for j in range(0,7):
                    if grille[i,j]==grille[i+1,j]==grille[i+2,j]==grille[i+3,j]==1 :
                        v=1
             for i in range(0,7):
                for j in range(0,4):
                    if grille[i,j]==grille[i,j+1]==grille[i,j+2]==grille[i,j+3]==1 :
                        v=1
             for i in range(0,4):
                for j in range(0,4):
                    if grille[i,j]==grille[i+1,j+1]==grille[i+2,j+2]==grille[i+3,j+3]==1 :
                        v=1
             for i in range(0,4):
                for j in range(3,7):
                    if grille[i,j]==grille[i+1,j-1]==grille[i+2,j-2]==grille[i+3,j-3]==1 :
                        v=1
             grille[k,y2]=0
         grille[x,y1]=0
         if v==0 :
             #print('--------------------Logique',x)
             return x      
         #else :
             #print('--------------------PAS Logique',x)
   
    h=randint(0,len(xposs)-1)
    return xposs[h]


def gravitéj(x):
    for y in range(0,7):
        if grille[x,y]==0 :
            return y

    print('cette colonne est déjà pleine !')
    return 0

def gravitéo(x):
    for y in range(0,7):
        if grille[x,y]==0 :
            return y
    try:
        xposs.remove(x)
    except ValueError : pass
    return 10


xposs=[0,1,2,3,4,5,6]

def jeu(event):
    x=int(event.xdata+0.5)
    y=gravitéj(x)
    grille[x,y]=1
    plot(x,y,'ro',markersize=50)
    gg=gagnant()
    if gg==0 :
        pass
    elif gg==1 :
        ax.set_title("Le joueur gagne",size=40,color='red')
    elif gg==-1 :
        ax.set_title("La machine gagne",size=40,color='blue')        
    draw()
    x=IA()
    y=gravitéo(x)
    grille[x,y]=-1
    plot(x,y,'bo',markersize=50)
    gg=gagnant()
    if gg==0 :
        pass
    elif gg==1 :
        ax.set_title("Le joueur gagne",size=40,color='red')
    elif gg==-1 :
        ax.set_title("La machine gagne",size=40,color='blue')        
    draw()
   

cid = fig.canvas.mpl_connect('button_press_event', jeu)
 


La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.

Hors ligne

#2 31-03-2017 23:47:03

Terces
Membre
Inscription : 16-07-2015
Messages : 466

Re : Puissance_4

Re,

Je me suis un peu renseigné sur les IA et le "deep learning", est-ce que vous pensez que c'est possible de creer un programme (pour commencer un puissance 4) qui joue au départ aléatoirement et on le laisse jouer contre lui même pendant une heure pour qu'il comprenne comment gagner ?

Le faire jouer contre lui même pendant une heure c'est pas compliqué mais pour qu'il s'améliore, je ne vois pas comment faire à première vue.


La somme des inverses de la suite de Sylvester converge vers 1 plus vite que toute autre série somme infinie d'inverses d'entiers convergeant vers 1.

Hors ligne

Pied de page des forums