The Python Game Book

code games. learn Python.

User Tools

Site Tools


Sidebar

Navigation

indexmenu_n_9999 Start
msort nsort navbar

fr:python:goblins:etape001

Étape 001 - Duel au dé de gobelin

Il y a plusieurs tutoriaux excellents sur la toile pour apprendre les bases de la programmation python. À commencer par Le tutoriel officiel Python ou Byte of Python. Vous pouvez aussi jeter un oeil à la section ressources - livres de ce wiki.

Si la majorité de ces tutoriaux vous conduiront à travers les commandes de base du langage python, vous ne serez généralement pas capable de créer un jeu informatique après avoir terminé un tutoriel. Ce qui ne signifie pas que vous devriez les ignorer. Au contraire, vous pourriez avoir besoin de ces tutoriaux pour une meilleure compréhension des sujets en rapport à ce wiki.

Imaginons deux gobelins pas-très-brillants, Stinky et Grunty, jouant à un duel au dé de gobelin. Les règles sont très simples et expliquées dans le code source ci-dessous.

Analysons le code étape-par-étape. Vous n'êtes pas obligé de réécrire le code, vous pouvez le copier directement depuis le site de Github (voir plus bas). Cependant vous ne deviendrez pas un programmeur à moins de comprendre ce qui est important et ce que vous pouvez ignorer en tout sécurité. Et la meilleure façon est de réécrire cet exemple dans votre éditeur de texte, et de le lancer.

diagramme

diagramme pour 001_goblindice. Cliquez pour zoomer

Le diagramme sert à visualiser le programme. À gauche, vous pouvez voir un diagramme pour le code source github ci-dessous. Cliquez sur le diagramme pour l'agrandir ou téléchargez-le en tant que PDF.

Discussion autour du code

commentaires

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#       Copyright 2011 Horst JENS <horst.jens@spielend-programmieren.at>
#       part of http://ThePythonGameBook.com
#       licence: gpl, see http://www.gnu.org/licenses/gpl-3.0.txt


import random 

# voici un programme très simple, démontrant l'utilisation de 
# random.randint, une boucle, et une mécanique de combat
# primitive """

Chaque ligne commençant par un dièse <key>#</key> est un commentaire. Les commentaires sont généralement ignorés par Python et sont là pour rendre le code compréhensible par un humain. Excepté les deux premières lignes:

La première est importante pour les systèmes Linux et permet de démarrer le programme par un double-clic1) La seconde ligne -nécessaire uniquement pour les versions 2.x de Python- est une information d'encodage et permet l'utilisation de caractères non-ASCII dans les chaînes de texte.

importer des modules

Les 3 lignes suivantes sont des commentaires utiles uniquement pour les humains. Jetons un oeil sur la “vraie” première ligne de code Python: la déclaration import random. Cette ligne importe le module “random” (qui gère l'aléa, module fourni avec Python) et permet de créer des nombres aléatoires avec la fonction random.randint(). Pour connaître le contenu du module random, vous pouvez vous rendre sur la bibliothèque standard de Python: http://docs.python.org/library/index.html et y chercher (utilisez <key>CTRL</key>+<key>f</key> dans votre navigateur) le module random. Ou vous pouvez taper pydoc random dans un terminal.

<note tip>Sur internet et dans les livres, vous trouverez souvent des lignes de code telles que

import random as r
ou
from random import *

Ces lignes permettent de rendre le travail d'écriture de code plus confortable, car il y aura moins de mots-clés à taper, cependant, ce n'est pas pratique pour le lecteur, c'est pourquoi il n'en sera pas fait usage dans ce wiki. Cf. http://docs.python.org/reference/simple_stmts.html#the-import-statement les informations officielles de Python à ce sujet.</note>

les chaînes multi-lignes

intro = """
---- Introduction -------
Deux gobelins, Grunty et Stinky, jouent au jeu traditionnel
du Duel au Dé Gobelin

Les règles sont très simples. Chaque gobelin lance un dé, et est
autorisé à frapper l'autre gobelin sur la tête avec un gourdin
autant de fois que le nombre de points sur son dé l'indique. Ça
s'appelle un dégât.

Chaque gobelin ayant un nombre de points de vie (combien de dégats il
peut assumer) le dernier gobelin debout sera le vainqueur.

Notez qu'un dé dans une grotte de gobelin est fabriqué en os, et n'a
six faces comme le dé que vous pourriez connaître.
Chaque dé a une valeur minimale (nombre de points) et maximale.

Ce jeu n'est jamais vraiment devenu populaire en dehors des sociétés dans
les grottes gobelines, il se pourrait même que ce soit la raison principale
de l'extinction des gobelins."""

Voilà ce que l'on appelle une chaîne multi-ligne, et il s'agît là d'une partie du code du jeu.

Python permet de créer de très longues chaînes de caractères, fins de lignes incluses, si vous les entourez des guillemets triples.

Cette chaîne multi-ligne est stockée dans la variable intro pour une utilisation prochaine. Si vous prêtez bien attention, vous noterez qu'en réalité nous n'utiliserons pas la variable intro dans cet exemple, alors, bon. Ça ne sert pas encore à grand chose… Il est possible d'écrire une chaîne multi-ligne sans l'assigner à une variable, au tout début d'un programme ou d'une fonction. C'est ce que l'on appelle une docstring et s'avère être très pratique pour le système de documentation PyDoc (cf. quelques étapes plus loin).

variables

# définition de Grunty et Stinky. Notez que les variables sont en minuscules
stinky_hitpoints = 50 # Stinky est faible mais plus intelligent
grunty_hitpoints = 60 # Srunty est fort mais plus bête

stinky_min_damage = 3 # Stinky fait de meilleures dégâts au minimum
stinky_max_damage = 5 # mais pas beaucoup de dégâts au maximum.

grunty_min_damage = 1 # Grunty fait très peu de dég$ats au minimum
grunty_max_damage = 6 # mais plus de dégâts au maximum

combatround = 0 # le mot "round" est un mot-clé réservé au Python

Voilà une poignée de variables qui seront utiles. Vous pouvez écrire des commentaires après le dièse <key>#</key> sur la même ligne que le code, mais vous ne pourrez pas écrire de code après un commentaire sur une même ligne. Le mot round est une fonction embarquée du langage python, nous ne pouvons pas l'utiliser comme une variable.

boucle while, and, if, print, break

while stinky_hitpoints > 0 and grunty_hitpoints > 0:
        combatround += 1 # incrémente le compteur de round
        print " ----- combat round {0} -------".format(combatround)
        
        # Stinky est plus intelligent et attaque toujours le premier
        damage = random.randint(stinky_min_damage, stinky_max_damage)
        grunty_hitpoints -= damage # Stinky frappe Grunty
        print "Stinky hits Grunty for {0} damage. Grunty has {1} hp left".format(
               damage, grunty_hitpoints)
        
        if grunty_hitpoints <= 0:
                break # sort de la boucle while si Grunty a perdu
        
        # Grunty attaque en retour s'il est toujours dans le jeu
        damage = random.randint(grunty_min_damage, grunty_max_damage)
        stinky_hitpoints -= damage # Grunty attaque Stinky
        print "Grunty hits Stinky for {0} damage. Stinky has {1} hp left".format(
              damage, stinky_hitpoints)
#----- fin de la boucle ----

La déclaration while se termine par deux points <key>:</key> et toutes les lignes indentées suivantes se répètent ou se bouclent jusqu'à ce que la condition de la déclaration while devienne False (fausse)

Ce qui signifie que le combat continue jusqu'à ce que Grunty ou Stibnky n'ait plus de points de vie. En d'autres termes while (tant que) Stinky et Grunty ont des points de vie, le combat continue. C'est exactement la signification de ligne de code “while”. L'ordinateur calcule la condition, et si la condition est True (vraie), il passe à la ligne de code indentée suivant les deux points. Si la condition est False (fausse) il continue avec la prochaine ligne de code qui n'est pas indentée. Vous pouvez regarder le diagramme ci-dessus pour visualiser cette boucle while. <note tip>Vous verrez souvent des boucles infinies comme:

while True:
   # fait des trucs
Cette condition ne deviendra jamais False et il faudra, pour sortir de cette boucle, déclarer un break (voir ci-dessous)</note>

incrémenter une valeur

<note tip> Au lieu de la déclaration

combatround = combatround + 1
la version courte
combatround += 1
est utilisée. </note>

mélanger les variables et les chaînes

La déclaration print est une commande des plus utiles dans tous les langages de programmation. Elle affiche simplement quelque chose, généralement dans la console. Pour insérer correctement le round de combat dans la chaîne de texte, vous avez plusieurs possibilités:

  • print "--- combat round " , i, " ---" 
  • print "--- combat round " + str(combatround) + " ---"
  • print "--- combat round %i ---" % combatround
  • print "--- combat round {0} ---".format(combatround)

Dans la dernière version (recommandée), le {0} dans les accolades prend la place de la première variable (python compte toujours depuis zéro), indiquant que vous insérez une variable à cette position. Après la châine, vous écrivez .format() et le nom de la variable dans les parenthèses. Si vous avez plus d'une variable, séparez-les par des virgules.

<note tip>Rendez-vous sur http://docs.python.org/library/string.html pour plus d'informations à ce sujet.

notez également que dans python 3.x, print() n'est plus une déclaration mais une fonction et nécessite une paire de parenthèses.</note>

python et les lignes multiples

Vous pouvez démarrer une nouvelle ligne physique si vous n'avez pas fermé les parenthèses. L'interpréteur python est assez intelligent pour comprendre que vous avez écrit une seule ligne en plusieurs, parce qu'il compte le nombre de parenthèses ouvertes et fermés.

random.randint()

La fonction random.randint() est ma fonction favorite de tout le module random. Elle renvoie une valeur entière aléatoire comprise entre (et incluant) les paramètres min_value et max_value (valeur minimale et valeur maximale). Ces deux paramètres correspondent aux dégâts des dés de Stinky et Grunty. Le dégât obtenu est assigné à la variable damage

sortir de la boucle while avec if et break

Comme dit précédemment, il est possible de casser (break) la boucle while. Vous aurez besoin d'une déclaration if (si) en combinaison avec une déclaration break pour ça. La commande if est identique dans quasiment tous les langages de programmation: elle nécessite une condition et si l'ordinateur voit que la condition est True (vraie), il continue avec les lignes indentées qui suivent les deux-points <key>:</key>.

Notre if est lui-même déjà indenté parce qu'il se situe dans la boucle while, c'est pourquoi les lignes de la condition if sont indentées à un niveau supérieur.

La commande break permet simplement de sortir de la boucle while (ou for) en cours. Dans ce cas, si Grunty n'a plus de points de vie, le code continue à la ligne non-indentée, avec le commentaire #—– end of loop —-.

après la boucle, if, else

print "=================================="
#print "The combat ends after %i rounds" % combatround
print "Stinky has {0} hitpoints left".format(stinky_hitpoints)
print "Grunty has {0} hitpoints left".format(grunty_hitpoints)
if grunty_hitpoints > 0:
	print "Grunty is the winner !"
else:
	print "Stinky is the winner !"
	      

Cette partie du code n'est évaluée que si Stinky ou Grunty n'a plus de points de vie, c'est le message “Game Over”. Pour connaître qui a gagné, on utilise un bloc if else. L'ordinateur teste la condition après la déclaration if et continue avec les lignes indentées si la condition est True (vraie). Si la condition est False (fausse), il continue avec les lignes de code indentées après la ligne else:.

Pour plus d'informations: http://docs.python.org/reference/compound_stmts.html#the-if-statement

idées

Si on regarde les variables de plus près (avant la boucle while), on s'aperçoit que Stinky a moins de points de vie que Grunty, mais fait plus de dégâts au minimum. Stinky est également le premier à attaquer, ce qui lui donne un avantage supplémentaire sur Grunty.

Grunty, de son côté, peut encaisser plus de dégâts (plus de points de vie) et peut cause plus de dégâts au maximum. Parieriez-vous sur le vainqueur d'un duel avant la partie ? Faites quelques changements aux variables et lancez le jeu plusieurs fois pour vous rendre compte de l'équilibre des valeurs. Plus d'infos à ce propos dans l'étape suivante.

Le code source sur Github

Pour démarrer cet exemple, vous aurez besoin de:

fichier dans le dossier téléchargement commentaire
001_goblindice.py python Télécharger l'archive entière avec tous les fichiers depuis Github:
https://github.com/horstjens/ThePythonGameBook/archives/master
version pour python2.x


python 2.x

Voir/Modifier/Télécharger le fichier directement dans Github: https://github.com/horstjens/ThePythonGameBook/blob/master/python/001_goblindice.py

cliquez sur actualiser dans votre navigateur si vous ne voyez pas le code ici:

Commentez cette page

~~DISQUS~~

1)
il faudra toutefois activer le flag exécutable
fr/python/goblins/etape001.txt · Last modified: 2020/05/03 21:35 by horst