programmer minecraft en python sur raspberry pi

Comment Programmer Minecraft avec Python sur Raspberry Pi ?

Comme vous l’avez probablement remarqué, Raspberry Pi OS (version Desktop) est livré avec Minecraft installé.
Et ce n’est pas (uniquement) pour jouer.
Si vous ne le saviez pas, l’objectif principal de la Fondation Raspberry Pi est d’aider les jeunes à apprendre comment programmer.
Ils ont livré Minecraft Pi installé pour aider les enfants à atteindre cet objectif tout en s’amusant.

Sur Raspberry Pi OS, démarrez Minecraft Pi d’un côté de votre écran et démarrez une nouvelle partie. Ouvrez un éditeur Python à côté de cette fenêtre et importez la bibliothèque Minecraft pour déverrouiller les fonctions Minecraft.

Au fait, si vous avez un Raspberry Pi 4, ce sera plus facile pour vous, car vous pouvez travailler sur deux écrans : l’un avec Minecraft et l’autre avec votre éditeur Python. Voilà ! Vous possédez tout ce dont vous avez besoin pour jouer différemment à Minecraft : en le programmant. Voyons ensemble comment faire.

Au passage, si vous vous sentez dépassé dès que Python est nécessaire pour un projet, je vous conseille de télécharger mon e-book « Maîtrisez Python on Raspberry Pi« . Il vous guidera pas à pas pour apprendre les concepts essentiels (et uniquement ceux-là) pour réaliser n’importe quel projet à l’avenir. Un Raspberry Pi sans Python, c’est comme une voiture sans moteur, vous ratez le plus intéressant ;-).
Profitez de 10 % de réduction en le téléchargeant dès aujourd’hui !

Présentation des outils

Minecraft

Si vous avez vécu dans une grotte ces dix dernières années, voici une brève introduction à Minecraft 🙂

Minecraft est un jeu type « bac à sable » où le monde entier est construit avec des blocs de la même taille.
Le joueur apparaît dans cet environnement et doit survivre en ayant la possibilité de faire quasiment tout ce qu’il veut. Le jeu comprend un mélange d’exploration, de construction, d’artisanat et de combat.
Oui, vous pouvez également vous battre avec des créatures passives ou hostiles (comme des zombies ou des vaches).

Voici à quoi ressemble le jeu lorsque vous commencer une partie sur un Raspberry Pi :

Au bas de l’écran, vous apercevez une barre de raccourcis permettant de sélectionner différents blocs.
Sur la droite, vous pouvez voir le bloc, l’outil ou l’arme actuellement sélectionné que vous tenez dans votre main.

Python

Python est un langage de programmation souvent utilisé sur Raspberry Pi, mais aussi dans de nombreux autres systèmes (Google utilise fréquemment Python dans ses projets).
Le langage Python propose une syntaxe simple et nous permet d’ajouter des bibliothèques (comme la bibliothèque Minecraft que nous utiliserons dans cet article).

L’histoire de Python et des Raspberry Pi sont intimement imbriquées. Il est courant d’essayer d’abord votre projet en Python sur un Raspberry Pi. C’est également l’une des solution pour coder des choses dans Minecraft Pi 🙂

Thonny

Comme je l’ai dit dans l’introduction, Raspberry Pi OS propose plusieurs éditeurs Python déjà inclus dans l’OS.
Pour ce tutoriel, nous utiliserons « Thonny ».
Vous pouvez également suivre cet article en utilisant votre éditeur préféré. Personnellement, j’aime garder chaque exercice dans des fichiers séparés, sauvegardés sur mon disque, plutôt que de taper chaque ligne dans le Shell Python et perdre et perdre mon code.

Voici à quoi ressemble l’interface:

Espace de travail confortable

Avez-vous un bon espace de travail ? Comme un clavier, une souris, un bureau et un écran classique ?
Sinon, je recommande de commencer par ceci.

Dans mon cas, je n’ai qu’un mini-clavier Bluetooth avec un pavé tactile
Ce n’est pas le moyen le plus facile de coder.

J’ai essayé l’accès à distance pour créer ce tutoriel à partir de mon ordinateur, mais la fenêtre de Minecraft ne s’affiche que sur le Raspberry Pi, je n’ai que la console sur le logiciel d’accès à distance.
Cela peut aider à taper le code, mais ce n’est pas plus pratique.

Donc, si possible, placez votre Raspberry Pi sur un bureau avec un clavier, une souris et un écran.
Cette configuration va rendre toutes les étapes suivantes plus faciles.

J’ai également essayé de travailler dans une machine virtuelle, mais il n’y a aucun moyen d’obtenir Minecraft Pi.
Cela ne fonctionne qu’avec un processeur ARM, et je n’ai aucune solution pour émuler cette architecture.

Premiers pas

Dans cette partie, nous commencerons par les notions de base et des commandes simples  en python.

Premiers pas dans Minecraft

Créez un nouveau monde

La première chose à faire est de démarrer le jeu et de créer un nouveau monde

  • Démarrez le jeu (Start Menu > Games > Minecraft Pi).
    La fenêtre est un peu buguée. Il est normal si vous pouvez voir la console en arrière-plan.
  • Essayez de mettre le jeu sur un côté de votre écran. Par la suite, vous aurez besoin d’espace pour l’éditeur Python
    Pour déplacer la fenêtre, cliquez sur la barre bleue de la console avec le petit curseur (oui vous en avez deux…)
  • Cliquez ensuite sur « Start Game »
  • Vous êtes maintenant dans le menu « Select world ». Cliquez sur « Create New » pour créer votre monde.
    Attendez quelques secondes que le monde se génère

Vous pouvez maintenant contrôler le joueur à l’aide de la souris pour voir le monde qui vous entoure.
Je vais vous expliquer toutes les contrôles plus tard.

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Introduction au jeu Minecraft

Minecraft existe dans plusieurs modes de jeu:

  • Survie (Survival): vous devez rassembler des blocs et des ressources, fabriquer des objets et survivre pendant la nuit
  • Créatif (Creative): vous possédez tous les blocs existant que vous pouvez placer n’importe où et ne pouvez pas mourir
  • Aventure (Adventure): pour les créateurs, vous ne pouvez pas casser des blocs mais vous pouvez utiliser des leviers et des boutons
  • Spectateur (Spectator): pas d’interaction, vous vous déplacer en mode « libre » et pouvez traverser les blocs

Sur Minecraft Pi, comme il s’agit principalement d’un jeu éducatif, vous êtes en mode créatif.
Vous obtenez de base une épée et des blocs dans la barre de raccourcis en bas de l’écran. Il est possible d’obtenir plus de blocs (voir le paragraphe suivant), il fait toujours beau temps et vous ne pouvez pas mourir.

En mode créatif, il est possible de casser des blocs en un seul coup. En mode survie, cela dépend des outils que vous utilisez (les outils en bois sont plus lents que les outils en diamants par exemple).

Contrôles

Voici toutes les commandes que vous devez connaître :

  • Vue de la caméra : déplacez la souris
  • Casser un bloc : Bouton gauche de la souris
  • Placer un bloc : Bouton droit de la souris
  • Déplacement : Z, Q, S, D (W, S, A, D sur un clavier QWERTY)
  • Sauter : Touche « Espace » du clavier
    Le saut automatique est activé lorsque vous vous déplacez
    Deux appuis brefs sur la touche espace active le mode de déplacement libre, déplacez-vous pour gagner de l’altitude
  • Accéder à l’inventaire : Touche « E » du clavier
  • Menu Pause / Quitter : Touche « Echap » du clavier

Essayez de vous déplacer un peu dans votre monde pour être à l’aise avec les mouvements.

Hello world!

Commençons la partie codage.

Démarrer Thonny

Gardez Minecraft ouvert d’un côté de l’écran et démarrez Thonny.
Ouvrez le menu principal > Programmation > Thonny Python IDE.
Ensuite, gardez la nouvelle fenêtre ouverte de Minecraft.

Sous le menu, la grande zone vide est pour votre code (c’est comme un éditeur de texte)
Et en dessous, vous pouvez voir le résultat de ce qui se passe lorsque vous exécutez ou déboguez le code à l’aide de Python Shell.

Vos premières lignes de code

Dans chaque nouveau langage, la première chose à apprendre est de coder le fameux « Hello World! »
C’est parti !

Pour commencer, tapez ces lignes de code dans Thonny :

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.postToChat("Hello world")

  • Cliquez sur « Save » dans le menu supérieur
    Enregistrez le fichier où vous le souhaitez (ex: /home/pi/minecraft1.py)
  • Revenez sur Minecraft
    Appuyez sur la touche « TAB » du clavier pour libérer le pointeur de la souris
  • Dans le menu principal de Thonny, cliquez sur « Run »

Vérifiez ce qui se passe dans la fenêtre Minecraft :

Explications

Voyons ce que nous venons de faire ligne par ligne.

Première ligne :
from mcpi.minecraft import Minecraft

Sur cette ligne, nous incluons la bibliothèque Minecraft pour Python.
Python sait maintenant comment communiquer avec Minecraft.
Vous devez ajouter cette ligne au début de votre code dès que vous souhaitez utiliser Minecraft.

Deuxième ligne:
mc = Minecraft.create()

Sur celle ligne, nous initialisons la variable mc.
Cette variable est la représentation de la bibliothèque dans notre code.
Nous allons utiliser cette variable pour exécuter des fonctions/méthodes et effectuer des choses dans Minecraft.

Troisième ligne :
mc.postToChat("Hello world")

Et la dernière est l’action d’envoyer un message dans le chat de Minecraft.
Nous utilisons la variable mc définie précédemment et appelons la fonction postToChat comprise dans la bibliothèque Minecraft. Cette fonction nous permet d’envoyer le message entre parenthèses.
Bien joué ! Vous savez comment envoyer un message dans Minecraft à partir de votre script Python.

Modifier un bloc

Maintenant, nous pouvons essayer quelque chose de plus amusant
Nous pouvons modifier un bloc, mais je dois d’abord vous expliquer quelques notions importantes de Minecraft.

Les coordonnées dans Minecraft

Minecraft utilise un système de coordonnées pour connaître la position de chaque joueur et de chaque bloc.
La position du joueur est visible en haut à gauche de la fenêtre Minecraft :

Essayez de vous déplacer et observez comment elle évolue.
Chaque fois que vous vous éloignez d’un bloc, l’une de ces valeurs change de 1. Ainsi, la position du joueur est définie par trois valeurs :

  • X: 4.6 – C’est ma position est/ouest
  • Y: 0.0 – C’est mon altitude
  • Z: -0,7 – C’est ma position nord/sud

Cette image devrait vous aider à comprendre:

Essayez à nouveau de déplacer votre joueur dans le jeu et observez comment la position évolue.
À tout moment, nous connaissons la position du joueur et nous pouvons l’utiliser pour faire des tas de choses.

ID des blocs Minecraft

La deuxième chose que vous devez savoir est comment définir un type de bloc dans Minecraft.

Lorsque vous ouvrez l’inventaire (E), vous pouvez voir que Minecraft a beaucoup de blocs différents :

Fondamentalement, chaque bloc du jeu a un identifiant unique.
1 pour la pierre, 2 pour l’herbe, 3 pour la terre, etc…

Donc, si nous voulons définir un bloc spécifique, il nous suffit de connaître son identifiant.
Il existe un site Web que vous pouvez utiliser pour obtenir la liste complète des identifiants des blocs de Minecraft.

Espérons que ce sont les mêmes identifiants dans Minecraft et Minecraft Pi, car ce site est pour la version PC.
Nous allons essayer ceci : Choisissez un bloc de la liste et notez l’ID, vous en aurez besoin juste après.

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Changer un bloc sous le joueur

Vous allez maintenant taper ce code dans Thonny pour définir le type d’un bloc à une position spécifique :

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.setBlock(0, 0, 0, 56)

C’est presque le même code qu’avant.
La seule différence est que nous utilisons la fonction setBlock de la bibliothèque.
Les paramètres sont la position sur trois coordonnées (format x, y, z) et l’identifiant du bloc.

Je choisis le bloc de minerai de diamant (ID 56) et la position 0/0/0 (près de ma position).
Vous pouvez choisir ce que vous voulez , mais essayez de définir une position proche du joueur, c’est plus pratique.

Voici le résultat dans Minecraft :
Lorsque j’ai exécuté le code, j’ai vu un bloc de diamant apparaître près de moi.

C’est bien, mais j’ai dit « sous le joueur », comment faire ?
Voici le code complet avec une modification mineure:

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
x, y, z = mc.player.getPos()
mc.setBlock(x, y-1, z, 56)

Et voilà, j’ai un bloc de diamant sous mes pieds 🙂
J’ai utilisé la fonction player.getPos() pour obtenir les coordonnées du joueur en temps réel.
Ensuite, je l’utilise pour placer le bloc exactement sous le joueur ( avec y = -1 pour placer ce bloc en dessous de vous).

Maintenant que vous connaissez les bases, nous pouvons donc passer à des concepts plus complexes !

Découverte de l’API

Dans cette partie, je vais vous expliquer toutes les possibilités dont vous disposez pour créer des scripts pour Minecraft. Je vais vous donner la liste des fonctions que vous pouvez utiliser. 

Je n’ai pas trouvé de documentation officielle de l’API. Je ne sais pas si Mojang l’a caché quelque part, mais je ne l’ai pas vu !
La seule page que j’ai trouvée est le site Web lié au livre « Adventures in Minecraft » (lien sur Amazon, c’est un excellent livre si vous aimez ce genre de tutoriel).

Ce site Web vous donne toutes les fonctions, paramètres et explique ce qu’ils font.
Cliquez ici pour voir cette page.

Téléporter le joueur

Une autre expérience que je veux que vous essayiez est de téléporter le joueur à un autre endroit.
Si vous êtes proche de 0/0, vous pouvez aller aux coordonnées 1000/1000 grâce au code Python.

Si vous vous sentez prêt, essayez d’écrire ce code vous-même avant de vérifier la réponse.

Questions

Quelles fonctions de l’API utiliseriez-vous pour le faire?
De quoi avez-vous besoin ?

Essayez de répondre à ces questions sans vérifier la partie réponse.

Réponse

C’est facile, en fait nous n’avons besoin que d’une fonction:

Cette fonction fait exactement ce dont nous avons besoin: téléporte le joueur quelque part. Voici mon code :

from mcpi.minecraft import Minecraft
mc = Minecraft.create()
mc.player.setPos(100,50,100)

Si vous êtes dans le noir, essayez d’autres coordonnées.
J’ai mis 50 pour l’altitude, car des montagnes élevées peuvent être présentes, et je ne veux pas me téléporter dans le sol. Peut-être que vous chuterez si vous choisissez 50 parce que ces coordonnées sont dans l’air, mais vous êtes dans en mode création, vous ne pouvez pas mourir des dégâts de chute.

Aller plus loin

Essayez maintenant d’utiliser vos nouvelles connaissances Python pour améliorer ce script
Disons que nous voulons renvoyer le joueur à sa position initiale 10 secondes après la téléportation.

Nous savons déjà comment obtenir la position du joueur et comment se téléporter.
Donc, la seule chose que j’ai besoin de vous apprendre, c’est comment attendre 10 secondes.

Voici le code complet :

from mcpi.minecraft import Minecraft
from time import sleep

mc = Minecraft.create()
x,y,z = mc.player.getPos()
mc.player.setPos(100,50,100)
sleep(10)
mc.player.setPos(x,y,z)

Cliquez sur « Run » et essayez-le.
Il doit se passer exactement ce que je décrivais plus tôt , téléportation , puis 10 secondes plus tard, retour à la position initiale. Dans ce code, nous importons la fonction « sleep » de  la bibliothèque ‘time » (bibliothèque standard en Python). Nous utilisons toutes les fonctions déjà vues et utilisons sleep(10) pour attendre 10 secondes entre les deux téléportations.

Bon travail, passez à l’exercice suivant!

Construire une maison

Ok, dans cette partie, nous voulons construire une maison autour du joueur en ne plaçant aucun bloc nous-mêmes.
Vous savez déjà comment obtenir la position du joueur et comment placer des blocs près de lui. Donc, c’est assez simple !

Les fondations de la maison

Pour commencer, nous allons simplement construire le sol.
Disons, par exemple, une zone de 5×5 en bois.

Si vous voulez essayer tout seul, c’est parti !
Sinon, voici la réponse :

from mcpi.minecraft import Minecraft

mc = Minecraft.create()
x, y, z = mc.player.getPos()
mc.setBlocks(x-2, y-1, z-2, x+2, y-1, z+2, 5)

Trouvez un endroit plat et exécutez le code !
Oui, j’ai triché 🙂
Vous pouvez utiliser setBlock 25 fois si vous le souhaitez. Mais setBlocks (avec un « s ») nous permet de définir une zone à remplir directement avec un type de bloc, comme ceci :

Nous devons remplir une zone allant de x-2/y-1/z-2 à x+2/y-1/z+2 correspondants aux 25 blocs des fondations de notre maison.

Après avoir exécuté le code, vous devriez obtenir le sol de votre maison. Essayez de construire les murs et le toit tout seul, c’est exactement le même principe. Si c’est trop facile, essayez d’ ajouter des fenêtres 🙂

La maison entière

Voici la petite maison que j’ai construite avec mon script :
Oui, je sais… je suis bon en code mais je ne suis pas le meilleur constructeur de Minecraft 🙂

Le code correspondant est le suivant :

from mcpi.minecraft import Minecraft

mc = Minecraft.create()
x,y,z = mc.player.getPos()

mc.setBlocks(x-2,y-1,z-2,x+2,y-1,z+2,5) #sol
mc.setBlocks(x-2,y,z-2,x-2,y+2,z+2,5) #mur1
mc.setBlocks(x-2,y,z-2,x+2,y+2,z-2,5) #mur2
mc.setBlocks(x+2,y,z-2,x+2,y+2,z+2,5) #mur3
mc.setBlocks(x-2,y,z+2,x+2,y+2,z+2,5) #mur4

mc.setBlocks(x-2,y+3,z-2,x+2,y+3,z+2,17) #toit

mc.setBlock(x-2,y+1,z,20) #fenetre 1
mc.setBlock(x,y+1,z-2,20) #fenetre 2
mc.setBlock(x+2,y+1,z,20) #fenetre 3

mc.setBlock(x,y+1,z+2,0) #porte 1
mc.setBlock(x,y,z+2,0) #porte 2

Id des blocs Minecraft: 5 = bois, 17 = planche de chêne, 20 = verre et 0 = air (vide).

J’utilise setBlocks pour créer le sol, les murs et le toit.
Ensuite, j’utilise setBlock (sans le « s ») pour créer les petites fenêtres et la porte.

Une fois que vous avez compris la logique derrière ce script, vous devriez pouvoir créer tout ce que vous voulez en Python.

Interaction avec les blocs

La dernière chose que je veux vous montrer, ce sont les interactions de bloc.
Il existe un moyen de détecter l’interaction des joueurs grâce à l’utilisation des évènements. 

Ce code est difficile à écrire pour un débutant, je vais donc le donner directement et expliquer chaque ligne.
Voici le code que j’ai écrit à ce propos :

from mcpi.minecraft import Minecraft
from time import sleep

mc = Minecraft.create()

try:
    while True:
        blockEvents = mc.events.pollBlockHits()
        if blockEvents:
            for blockEvent in blockEvents:
                mc.postToChat("Hit detected")
                x,y,z = blockEvent.pos
                mc.setBlock(x,y,z,56)
        sleep(1)
except KeyboardInterrupt:
    print("Stopped")

Quelques explications :

  • Ce code transforme chaque bloc que vous touchez dans le jeu (avec un clic droit de la souris) en minerai de diamant.
  • pollBlockHits est la fonction principale que nous utilisons dans ce code.
    Vous connaissez déjà les autres fonctions de Minecraft.
  • Comme nous ne savons pas quand le joueur touchera un bloc, nous devons créer une boucle infinie: while True.
    La syntaxe try/except est obligatoire lorsque vous créez une boucle sous fin, pour permettre d’en sortir (ici c’est CTRL+C). 
  • Nous ajoutons un timer dans cette boucle pour ne pas surcharger le Raspberry Pi : sleep(1)
  • Au début de la boucle, nous appelons pollBlockHits pour obtenir tous les blocs touchés par le joueur.
  • S’il y a un résultat, nous créons une autre boucle (for) pour parcourir le tableau de résultats (pour parcourir chaque blockEvent).
  • Enfin, pour chaque événement, nous postons un message dans Minecraft (postToChat).
    Et transformons le bloc (setBlock).

Copiez ce code dans Thonny et exécutez-le.
Essayez de le modifier pour être sûr que vous comprenez mon code. Si vous n’êtes pas familier avec la programmation, cela peut être difficile. Il existe des notions indépendantes de l’API Minecraft qui ne sont pas expliquées dans cet article. Pour aller plus loin, vous aurez besoin d’apprendre les bases de l’algorithmique et de Python.

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Vous voulez discuter avec d'autres passionnés de Raspberry Pi ? Rejoignez la communauté, partagez vos projets en cours et posez vos questions sur le forum (en anglais).

Questions liées

Existe-t-il un moyen de faire du multijoueur ? Je n’ai pas testé, mais cela semble possible de rejoindre un jeu en réseau dans le menu principal. Cela ouvre des possibilités de jeu amusantes. Par exemple, je pense à un jeu du type « Splatoon » utilisant le code « Interaction de bloc » que nous avons vu auparavant (chaque joueur définit un bloc différent, et le but est d’avoir le plus de blocs de votre couleur dans une zone définie).

Comment obtenir les touches pressées par le joueur ? Il n’y a pas de fonction pour ça dans l’API Minecraft. Mais vous pouvez l’obtenir du système. Je pense que la bibliothèque Pygame peut vous aider.
Et plus généralement , avant d’aller plus loin avec vos scripts Minecraft, vous devez apprendre comment coder en Python sans l’API Minecraft (conditions, boucles, et principales bibliothèques comme GPIO). 

Quelles sont les limitations de Minecraft Pi ? Minecraft est un jeu payant. Sur Raspberry Pi, vous obtenez une édition gratuite, mais c’est une version alpha. Si vous avez l’habitude de jouer à la version PC, vous verrez beaucoup de différences. Il n’y a pas de menu de configuration, pas de montres et moins de blocs disponibles. Vous ne pouvez pas rejoindre un serveur ou ajouter un pack de textures. C’est bien pour le codage, mais c’est tout. Si vous voulez plus de fonctions, vous devriez acheter la version standard (disponible pour Linux, afin qu’elle puisse fonctionner sur Raspberry Pi).

Téléchargez mon antisèche !
Format PDF pratique, avec les 74 commandes à retenir pour maîtriser son Raspberry Pi.
Télécharger maintenant

Conclusion

Si vous avez suivi tout ce tutoriel, vous devez connaître une bonne partie de l’API Minecraft.
Et je l’espère, vous savez comment utiliser la documentation de l’API. Avec cette méthode vous allez être en mesure de créer tout ce que vous voulez.

Comme je l’ai mentionné précédemment, si vous voulez en savoir plus et avancer avec Minecraft sur Raspberry Pi, il existe un excellent livre sur ce sujet: Adventures in Minecraft.
Si vous aimez Minecraft et la programmation, c’est un livre indispensable dans votre collection. Je l’ai même mis dans mon top 20 livres pour Raspberry Pi.


Ce tutoriel ne marche plus à 100%? Prévenez-moi pour que je le mette à jour!

A lire également

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *