Redonnons à César ce qui à César, le code originel n’est pas de moi mais trouvé sur Internet ...

Le but de cette expérimentation est de réaliser un programme similaire à un portable exécutable donc qui ne contient au mieux qu’un seul EXE. Pour se faire nous allons intégrer les images dans le code.

Ce programme utilise les librairies Python suivantes :

  • PyGame
  • NumPy
    Et le programme :
  • PyInstaller

Quelques difficultés

Lors de l’installation de Python 3.10, j’avais des erreurs lors de l’installation de pygame, ces dernières ont été résolues par la commande :

pip3.9 install pygame

Pygame indique d’utiliser Python 3.7.7 ou supérieur (https://www.pygame.org/wiki/GettingStarted)

Principe du jeu de taquin

Le taquin est composé de 15 petits carreaux numérotés de 1 à 15 qui glissent dans un cadre prévu pour 16. Il consiste à remettre dans l’ordre les 15 carreaux à partir d’une configuration initiale quelconque. (Wikipédia)

Dans le cadre de cette expérimentation, nous utiliserons une image découpée en lieu et place des petits carreaux.

Taquin - Sous Linux

Principe de développement

Le code doit fonctionner sous Windows comme sous Linux, une machine virtuelle et un partage va donc permettre d’utiliser la puissance des outils de Linux et de compiler sous Windows pour avoir le résultat escompté.

Nous allons créer un répertoire "ressources" dans lequel seront stockés tous les éléments de travail (images et son).

Image de fond

L’image de fond qui sera ensuite découpée est une image de taille 240x240 pixels que je choisis au format png.

Nous nommerons cette image fond_taquin.png

fond_taquin.png

Découpage en carreaux

Il nous faut maintenant découper cette image en 16 carrés de taille 60x60 pixels.

convert -crop 25%x25% fond_taquin.png morceau.png

Cette commande nous permet d’avoir 16 morceaux de taille identique nommés morceau-0.png à morceau-15.png.

Morceau

Un carreau noir

Le 16ème carré doit être noir, il symbolise le vide permettant le déplacement des éléments du taquin.

convert -size 60x60 xc:black morceau-15.png 
Carré noir

Icône de pygame

L’icône que met pygame est une image de type bitmap de taille maximale 32x32. Nous allons utiliser une nouvelle fois convert pour obtenir notre icône

convert -size 32x32 fond_taquin.png pygame.ico

Icône Windows

Pour obtenir une icône windows qui soit redimensionnable en fonction des paramètres d’affichage, il faut réaliser une icône à partir d’un fichier .svg (vectoriel).
Pour se faire importer l’image dans InkScape puis enregistrer là au format .svg. Enfin la convertir en icône à l’aide de ImageMagick

convert fond_taquin.svg -scale 256 windows_taquin.ico
Image SVG et icône résultante

 Base64

Afin d’intégrer nos images et notre musique de victoire dans notre code, pas d’autre choix que de tout passer en base64.

Mais avant toute chose, nous avons besoin d’une image finale (elle peut être celle de départ) et d’une musique.

Voici l’image de fin :

fond_final.png

Pour ma part, j’utilise des fichiers musicaux de type ".ogg" convertis à l’aide de Audacity.

Musique Finale - Beep-Beep

La conversion des fichiers en base64 se fait avec la commande du même nom : base64. Reste la problématique de l’inclusion de cet élément dans Python, pour cela, il faut utiliser l’opérateur """ pour indiquer un bloc texte.

Afin d’aller au plus rapide, un petit script permet de réaliser l’ensemble :

#!/usr/bin/bash

pyfile="taquin_img.py"

# Suppression du fichier existant
> $pyfile

# Insertion de l'icone
echo "Traitement de l'icône"

echo 'taquin_icon="""' >> $pyfile
base64 pygame.ico >> $pyfile
echo '"""' >> $pyfile
echo >> $pyfile
echo >> $pyfile

# Insertion des morceaux
for fichier in morceau-*.png 
do
    # Suppression du préfixe
    tmp=${fichier#*-}
    
    # Suppression du suffixe
    numero=${tmp%.*}
    
    echo "Traitement du carré " $numero
    
    echo "t"${numero}'="""' >> $pyfile
    base64 morceau-${numero}.png >> $pyfile
    echo '"""' >> $pyfile
    echo >> $pyfile
done

echo >> $pyfile

# Insertion de l'image finale
echo "Traitement de l'image finale"

echo 'taquin_final="""' >> $pyfile
base64 fond_final.png >> $pyfile
echo '"""' >> $pyfile
echo >> $pyfile

On effectuera la même chose pour la musique mais dans un fichier à part pour ne pas tout mélanger ...

#!/usr/bin/bash

# Suppression du fichier existant
> taquin_snd.py

# Insertion de l'icone
echo 'taquin_snd="""' >> taquin_snd.py
base64 son_final.ogg >> taquin_snd.py
echo '"""' >> taquin_snd.py

Retrouvez ces 2 scripts dans le fichier ci-dessous :

Scripts Shell

Le programme - Enfin !

Tous nos éléments sont maintenant prêts ... reste à les joindre au programme.

Dans un premier temps on isole nos éléments nécessaires i.e. les 2 fichiers Python contenant les images et le son ainsi que l’icône Windows. Afin de séparer l’ensemble des éléments je crée un répertoire programme dans le répertoire parent.

mkdir ../programme
cp *.py ../programme/
cp windows_taquin.ico ../programme/

Le programme - Enfin !

Programme Python - Taquin

La partie la plus importante du programme est la prise en charge des éléments en Base64 par Python :

# Renvoie une image compatible pour PyGame
def convert_base64_to_io (base64_image):
        return (io.BytesIO(base64.b64decode(base64_image)))

Une petite astuce aussi pour tester que la musique s’enclenche quand on gagne ...

pour_solution = [
        [0,4,8,12],
        [1,5,9,13],
        [2,6,10,14],
        [3,7,15,11]
]
et
tableau=pour_solution

Et bien sûr pour un code bien propre :

black taquin.py

Concernant Windows, nous utiliseront le petit Batch suivant :

pyinstaller --noconfirm --onefile --windowed --icon "C:/Taquin/programme/taquin.ico"  "C:/Taquin/programme/taquin.py"

Le résultat :

Taquin sous Windows

L’exécutable :
https://ericberthomier.fr/ressources/taquin_coyote.exe

Accueil > Notes Techniques > Python > [Python] PyGame - Jeu de Taquin