[Python] PyGame - Jeu de Taquin
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 pygamePygame 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.
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
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.pngCette commande nous permet d’avoir 16 morceaux de taille identique nommés morceau-0.png à morceau-15.png.
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
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.icoIcô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.icoBase64
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 :
Pour ma part, j’utilise des fichiers musicaux de type ".ogg" convertis à l’aide de Audacity.
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 >> $pyfileOn 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.pyRetrouvez ces 2 scripts dans le fichier ci-dessous :
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 !
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_solutionEt bien sûr pour un code bien propre :
black taquin.pyConcernant 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 :
L’exécutable :
https://ericberthomier.fr/ressources/taquin_coyote.exe
Accueil > Notes Techniques > Python > [Python] PyGame - Jeu de Taquin