Créer un jeu du genre “trouver l’intrus” à l’aide de Python est une idée qui m’est venue alors que je voulais en créer un. Il y a beaucoup de tels jeux sur les réseaux sociaux, et plutôt que de m’embêter à en faire un manuellement, je me suis demandé comment automatiser la tâche avec Python.

“trouver l’intrus” à l’aide de Python: les prémices

Il y a plusieurs alternatives graphiques, mais il m’a semblé plus simple d’utiliser la bibliothèque PIL (pillow). Fort heureusement pour moi, la page https://info.blaisepascal.fr/pillow m’a un peu aider car la documentation du module n’est pas du tout pratique (c’est le cas de beaucoup de tuto américains…).

L’idée est de créer une fonction planche (pourquoi pas ?) qui admet pour arguments:

  • l’image à répéter (image)
  • l’image avec une différence (image2)
  • le nombre de fois que l’on souhaite répéter l’image horizontalement (nx)
  • celui que l’on souhaite répéter verticalement (ny)
  • la colonne où l’on souhaite mettre l’image différente (px)
  • la ligne où l’on souhaite mettre l’image différente (py).

La fonction sera donc de la forme:

planche( image , image2 , nx , ny , px , py)

Si l’on souhaite créer une planche avec 25 images, on pourra faire appel à :

>>> image = Image.open("NewTux.png")
>>> image2 = Image.open("NewTux2.png")

>>> planche(image,image2,5,5,3,2)

Ici, j’ai mis l’image différente en colonne 3, ligne 2 (n’oublions pas que tout part du haut de l’image, à gauche).

J’obtiens alors:

jeu intrus Python

le code

from PIL import Image, ImageFilter

def planche( image , image2 , nx , ny , px , py):
    width, height = image.size
    new_width = nx * (width + 10) - 10
    new_height = ny * (height + 10) - 10
    
    new_image = Image.new(image.mode, (new_width, new_height))
    
    ppx , ppy = 0,0
    
    for y in range(0 , ny*height , height+10):
        for x in range(0 , nx*width , width+10):
            if x//width+1 == px and y//height+1 == py:
                new_image.paste( image2 , (x , y , x+width , y+height) )
            else:
                new_image.paste( image , (x , y , x+width , y+height) )
    
    new_image.save('result.png' , 'PNG')

Le code n’est pas si long que ça, comme vous pouvez le constater.

Il suffit de créer une image de la bonne dimension (en prenant en compte les espaces entre chaque image) et de mettre l’image autant de fois que nécessaire, en insérant au bon endroit l’image différente.

Comme vous pouvez aussi vous en rendre compte dans le code, les images doivent être de mêmes dimensions; cela dit, ce serait absurde d’imaginer deux images de dimensions différentes… non ?

On peut compléter ce script en y insérant par exemple un texte:

from PIL import Image, ImageFilter, ImageDraw, ImageFont

def planche( image , image2 , nx , ny , px , py , txt = None):
    width, height = image.size
    new_width = nx * (width + 10) - 10
    new_height = ny * (height + 10) - 10
    if txt != None:
        new_height += 100
    
    new_image = Image.new(image.mode, (new_width, new_height))
    
    ppx , ppy = 0,0
    
    for y in range(0 , ny*height , height+10):
        for x in range(0 , nx*width , width+10):
            if x//width+1 == px and y//height+1 == py:
                new_image.paste( image2 , (x , y , x+width , y+height) )
            else:
                new_image.paste( image , (x , y , x+width , y+height) )
    
    
    if txt != None:
        tmp = ImageDraw.Draw(new_image)
        myFont = ImageFont.truetype('Roboto-ThinItalic.ttf', 40) 
        tmp.text( (0,new_height-50) , txt , fill = (0,0,0) , font = myFont )
        
    new_image.save('result.png' , 'PNG')

Il est ici nécessaire de préciser la fonte utilisée (personnellement, j’ai mis la fonte dans le répertoire courant pour ne pas à avoir à insérer le chemin complet… mais c’est parce que je suis un peu flemmard…).

Catégories : Python

0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x