Author: Adam Y.

Projets

Faites une partie de chasse au trésor sur la…

Partez à l’aventure et déterrez le trésor caché tout en prenant garde aux pièges dissimulés aux alentours ! Personnalisez également votre expérience grâce à trois seuils de difficulté et des cartes générées aléatoirement. Aurez-vous l’audace de vous mesurer à ce jeu de logique inspiré du démineur ?

Cliquez sur ce lien afin d’accéder aux règles du jeu.

Un projet sous couche graphique

Bien avant que le projet libre soit annoncé, j’avais créé un jeu de chasse au trésor sur Python, sous couche textuelle. La console de mon IDE affichait les différentes cases grâce à un print() et l’utilisateur devait entrer les coordonnées de la case à retourner.

Cette façon de procéder, bien qu’utile afin de tester un concept de jeu, demeure tout de même lente et peu accessible. Un jeu comme celui du démineur doit fournir un moyen rapide d’interagir avec lui. C’est la raison pour laquelle j’ai décidé de rénover ce jeu sous couche graphique, c’est-à-dire avec des sprites au lieu de chaînes de caractères.

Les bibliothèques Python

Tout au long du code sont exploitées deux bibliothèques Python : kandinsky et ion.

La bibliothèque kandisky propose deux fonctions utiles afin d’afficher des sprites et du texte : fill_rect(), qui trace un rectangle, et draw_string(), qui affiche du texte.

La bibliothèque ion, quant à elle, permet de détecter les touches poussées sur la calculatrice.

Le bout de code suivant importe les fonctions utiles de ces bibliothèques et crée des diminutifs afin de les appeler, en l’occurrence « fr » pour « fill_rect » et « ds » pour « draw_string » :

from kandinsky import fill_rect as fr
from kandinsky import draw_string as ds
from ion import keydown

Afin d’avoir un aperçu de mon code sur la calculatrice, j’ai installé sur mon IDE les plugins ion-numworks et kandinsky grâce à ce tutoriel.

La logique du jeu

Afin de bien coder ce jeu, il fallait que je comprenne la logique derrière celui-ci.

En effet, le jeu est divisé en deux plateaux : le plateau visible et le plateau caché.

En effet, le plateau visible est une grille de dimensions 5 x 5 remplie de chiffres. Le plateau caché, grille de mêmes dimensions, contient quant à lui le trésor, les piques et les couleurs. Les deux plateaux interagissent entre eux.

Le plateau caché serait initialisé en premier. Il recevrait le trésor et on placerait les couleurs en fonction de l’emplacement du trésor. Enfin, on positionnerait les piques et on changerait trois couleurs afin de brouiller les pistes.

Ensuite, on initialiserait le plateau visible et placerait les nombres en fonction de l’emplacement des piques. De ce fait, à chaque fois que le joueur retournera une case, une couleur, un pique ou le trésor sera affiché.

L’initialisation des plateaux

La réalisation du programme a commencé par la fonction init_plateau() qui, comme son nom l’indique, initialise les plateaux. Le plateau caché, dans le script, est représenté par la variable plateau_inf qui est une liste composée de cinq listes elles-mêmes composées de cinq éléments :

plateau_inf = [["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"],
               ["V", "V", "V", "V", "V"]]

Ici, les listes sont remplies par la lettre « V » afin de ne pas avoir à placer la couleur verte. En effet, après avoir placé le trésor, les piques, les cases rouges et les cases orange, il ne reste plus que les cases vertes qui n’ont pas été touchées.

Ensuite, on place le trésor. Pour cela, j’utilise le module random et en particulier sa fonction randint() afin de choisir aléatoirement les coordonnées de la case :

def init_plateau():
    # -------------------- plateau inférieur
    # placement du trésor
    tresor_x, tresor_y = randint(0, 4), randint(0, 4)    
    plateau_inf[tresor_x][tresor_y] = "X"

Puis, on positionne les couleurs. Puisque la variable plateau_inf est remplie de « V », il nous suffit de placer des « R » et des « O » (pour rouge et orange).

Le bout de code suivant peut être plutôt hermétique. Ce dernier vérifie si les huit cases autour du trésor sont bien à l’intérieur de la grille, et si c’est le cas, on y place un « R ». Le même processus est adopté pour les seize cases autour des cases rouges afin d’y ajouter un « O » :

def init_plateau():
    # -------------------- plateau inférieur
    # placement du trésor
    # [...]
    # placement des cases rouges et orange
    for i in range(tresor_x - 2, tresor_x + 3):
        for j in range(tresor_y - 2, tresor_y + 3):
            if 0 <= i <= 4 and 0 <= j <= 4 and (i, j) != (tresor_x, tresor_y):
                if abs(tresor_x - i) <= 1 and abs(tresor_y - j) <= 1:
                    plateau_inf[i][j] = "R"
                elif abs(tresor_x - i) <= 2 and abs(tresor_y - j) <= 2:
                    plateau_inf[i][j] = "O"

Ensuite, on place les piques en prêtant bien attention à ce qu’un pique ne tombe pas sur le trésor et que deux piques ne soient pas sur la même case. On utilise la variable global nb_piques qui pourra être modifiée en fonction de la difficulté choisie :

nb_piques = [11]

def init_plateau():
    # -------------------- plateau inférieur
    # placement du trésor
    # [...]
    # placement des cases rouges et orange
    # [...]
    # placement des piques
    for _ in range(nb_piques[0]):
        while True:
            pique_x = randint(0, 4)
            pique_y = randint(0, 4)
            if plateau_inf[pique_x][pique_y] != "S" and plateau_inf[pique_x][pique_y] != "X":
                plateau_inf[pique_x][pique_y] = "S"
                break

Enfin, on met en place les fausses couleurs. Ce bout de code s’appuie sur beaucoup de conditions : il faut que la case choisie au hasard soit une case de couleur, et non un pique ou le trésor, et que cette case ne soit pas déjà une case colorée par une fausse couleur. Si ces conditions sont remplies, on peut changer la couleur de la case choisie :

def init_plateau():
    # -------------------- plateau inférieur
    # placement du trésor
    # [...]
    # placement des cases rouges et orange
    # [...]
    # placement des piques
    # [...]
    # placement des fausses couleurs
    for _ in range(nb_fausses[0]):
        fausses_originales = []
        while True:
            fausse_x, fausse_y = randint(0, 4), randint(0, 4)
            if plateau_inf[fausse_x][fausse_y] != "S" and plateau_inf[fausse_x][fausse_y] != "X":
                if (fausse_x, fausse_y) not in fausses_originales:
                    fausses_originales.append((fausse_x, fausse_y))
                    while True:
                        espace_nouv = randint(0, 2)
                        if espace_nouv == 0 and plateau_inf[fausse_x][fausse_y] != "V":
                            plateau_inf[fausse_x][fausse_y] = "V"
                            break
                        elif espace_nouv == 1 and plateau_inf[fausse_x][fausse_y] != "O":
                            plateau_inf[fausse_x][fausse_y] = "O"
                            break
                        elif espace_nouv == 2 and plateau_inf[fausse_x][fausse_y] != "R":
                            plateau_inf[fausse_x][fausse_y] = "R"
                            break
                    break

Et voilà ! Nous avons fini d’initialiser le plateau caché. Il ne reste plus que le plateau visible. Pas d’inquiétudes : celui-ci prend moins de temps à programmer. Il suffit de parcourir le plateau caché, et, lorsque l’on rencontre un pique, on ajoute 1 aux cases adjacentes du plateau visible (si elles se trouvent dans la grille) :

plateau_sup = [[0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0],
               [0, 0, 0, 0, 0]]

def init_plateau():
    # -------------------- plateau inférieur
    # placement du trésor
    # [...]
    # placement des cases rouges et orange
    # [...]
    # placement des piques
    # [...]
    # placement des fausses couleurs
    # [...]
	# -------------------- plateau supérieur
    for ligne in range(0, 5):
        for colonne in range(0, 5):
            if plateau_inf[ligne][colonne] == "S":
                if ligne < 4: plateau_sup[ligne + 1][colonne] += 1
                if colonne < 4: plateau_sup[ligne][colonne + 1] += 1
                if ligne > 0: plateau_sup[ligne - 1][colonne] += 1
                if colonne > 0: plateau_sup[ligne][colonne - 1] += 1

La programmation du gameplay

À présent que les plateaux sont programmés, il faut permettre au jouer d’interagir avec eux. Cela se fait grâce à la fonction jeu().

Cette fonction peut être décomposée en deux parties : l’initialisation et la boucle.

Commençons par l’initialisation. Celle-ci permet de tracer la grille et afficher les chiffres et couleurs à l’écran :

def jeu():
    x, y = 0, 0
    reset()
    init_plateau()
    fr(0, 0, 320, 240, 'white')
    grille()

La fonction jeu() commence par instancier les coordonnées du curseur déplaçable. Ensuite, elle réinitialise les plateaux et autres variables grâce à la fonction reset(), appelle la fonction init_plateau() vue précédemment et trace une grille grâce à la fonction grille() (tirée de ce script).

def reset():
    for x in range(5):
        for y in range(5):
            plateau_sup[x][y] = 0
            plateau_inf[x][y] = 'G'
    cases_retournees.clear()
    cases_marquees.clear()
    vies[0] = 3

def grille():
    for i in range(6):
        if i < 6:
            fr(70, 31 + 35 * i, 176, 1, 'black')
        fr(70 + 35 * i, 31, 1, 176, 'black')

Souvenez-vous : « fr » est le diminutif de la fonction fill_rect() du module kandinsky. En vérité, on trace une multitude de rectangles très fins qui se croisent afin de créer la grille.

Les variables cases_retournees, cases_marquees et vies présentes dans la fonction reset() seront expliquées juste après.

Nous voilà à présent dans la boucle de la fonction. Cette boucle non-bornée se répète continuellement grâce aux mots-clefs « while True » :

vies = [3]

def jeu():
    # [...]
    while True:
        fr(100, 10, 130, 15, 'white')
        ds("<3\t" * vies[0], 88, 8, 'black')
        affiche()

Ici, le nombre de vies est affiché grâce à la variable globale vies. Entre autres, la fonction affiche() est appelée :

rouge = (249, 65, 68)
orange = (243, 114, 44)
vert = (144, 190, 109)

cases_retournees = []
cases_marquees = []

def affiche():
    for coord1 in cases_marquees:
        fr(71 + 35 * coord1[0], 32 + 35 * coord1[1], 35, 2, rouge)
        fr(71 + 35 * coord1[0], 32 + 35 * coord1[1], 2, 35, rouge)
        fr(71 + 35 * coord1[0], 64 + 35 * coord1[1], 35, 2, rouge)
        fr(103 + 35 * coord1[0], 32 + 35 * coord1[1], 2, 35, rouge)
    for coord2 in cases_retournees:
        if plateau_inf[coord2[0]][coord2[1]] == 'G':
            couleur = vert
        elif plateau_inf[coord2[0]][coord2[1]] == 'O':
            couleur = orange
        elif plateau_inf[coord2[0]][coord2[1]] == 'R':
            couleur = rouge
        elif plateau_inf[coord2[0]][coord2[1]] == 'S':
            couleur = 'grey'
        fr(71 + 35 * coord2[0], 32 + 35 * coord2[1], 34, 34, couleur)

Cette fonction, en premier lieu, parcourt la liste cases_marquees et ajoute un contour rouge à chaque case dont les coordonnées sont présentes dedans. Ce contour est composé de quatre rectangles fins qui forment un carré.

affiche() parcourt également la liste cases_retournees qui retient les cases dont il faut afficher la couleur si elles ne cachent pas un pique. En fonction du contenu du plateau caché, la fonction attribue une couleur différente à chaque case.

Cette première partie de la boucle se termine par l’affichage des nombres sur la grille. Cependant, la tâche n’est pas aussi aisée qu’en apparence. En effet, lorsqu’une ligne de texte est affichée grâce à la fonction draw_string() (représentée ici par « ds »), son fond est blanc par défaut.

Seulement, si une case est retournée et est donc colorée, afficher un chiffre sur fond blanc dessus est peu esthétique :

Il faut donc changer le fond de la ligne de texte affichée en fonction de la case sur laquelle elle se trouve :

def jeu():
    # [...]	
		for a in range(0, 5):
            for b in range(0, 5):
                couleur = 'white'
                if (a, b) in cases_retournees:
                    if plateau_inf[a][b] == 'G':
                        couleur = vert
                    elif plateau_inf[a][b] == 'O':
                        couleur = orange
                    elif plateau_inf[a][b] == 'R':
                        couleur = rouge
                    elif plateau_inf[a][b] == 'S':
                        couleur = 'grey'
                ds(str(plateau_sup[a][b]), 83 + 35 * a, 41 + 35 * b, 'black', couleur)

Les boucles bornées imbriquées l’une dans l’autre génèrent toutes les coordonnées possibles sur une grille de dimensions 5 x 5. Ensuite, on observe lesquelles de ces coordonnées correspondent à des cases retournées, et on colorie le fond du texte en fonction de la case.

Enfin, passons au cœur de la boucle. Il y a beaucoup d’éléments à analyser.

def jeu():
    # [...]	
		while True:
            curseur(x, y, jaune)
            x_bis, y_bis = x, y
            touche = attente([0, 1, 2, 3, 4, 52, 17])

La boucle infinie commence par afficher le curseur du joueur aux bonnes cordonnées grâce à la fonction curseur() :

def curseur(x, y, c):
    fr(70 + 35 * x, 31 + 35 * y, 35, 1, c)
    fr(70 + 35 * x, 31 + 35 * y, 1, 35, c)
    fr(70 + 35 * x, 66 + 35 * y, 35, 1, c)
    fr(105 + 35 * x, 31 + 35 * y, 1, 35, c)

Ce curseur est formé de quatre rectangles fins.

Ensuite, la boucle utilise la fonction attente() (tirée de ce script) afin d’enregistrer les touches poussées par le joueur :

def attente(touches):
    while True:
        for nb in touches:
            if keydown(nb):
                while keydown(nb):
                    True
                return nb

Pourquoi ne pas simplement utiliser la fonction keydown() fournie par le module ion ? C’est tout bonnement simple : on veut détecter la touche poussée par l’utilisateur lorsque celui-ci relâche la touche. En effet, en utilisant keydown(), si le joueur reste appuyé sur une touche, alors, avec la boucle non-bornée, le mouvement serait répété plusieurs fois. Cela rendrait l’expérience de jeu ingérable puisque le curseur se déplacerait sur la longueur ou largeur de la grille au moindre appui de touche. Il nous faut donc attendre que l’utilisateur relâche la touche, et c’est ce que nous permet la fonction attente().

En ce qui concerne le reste de la fonction jeu(), selon la touche poussée, on effectue différentes actions.

def jeu():
    # [...]	
			if touche == 4 or touche == 52:
                if (x, y) not in cases_retournees:
                    cases_retournees.append((x, y))
                    verif(x, y)
                    break

Dans le cas ou le joueur appuie sur la touche [OK], on s’assure que la case sur laquelle il se trouve n’est pas déjà retournée, et, dans ce cas, on la retourne. Enfin, on appelle la fonction verif() qui vérifie l’état de la partie, c’est-à-dire si le joueur a gagné, perdu, ou s’il continue de jouer :

def verif(x, y):
    if plateau_inf[x][y] == 'X':
        fr(80, 60, 160, 100, 'black')
        ds("Bien joué !", 110, 100, 'white', 'black')
        attente([4, 52, 17])
        menu()
    elif plateau_inf[x][y] == 'S':
        vies[0] -= 1
        if vies[0] < 1:
            fr(90, 10, 130, 15, 'white')
            fr(80, 60, 160, 100, 'black')
            ds("Perdu !", 130, 100, 'white', 'black')
            attente([4, 52, 17])
            menu()

Si le joueur a retourné la case qui cachait le trésor, on le ramène au menu ; si, en revanche, celui-ci tombe sur un pique, on lui retire une vie, puis, on jette un coup d’œil au nombre de vies qu’il lui reste, et s’il est à zéro, on ramène le joueur au menu. La fonction menu() sera présentée plus tard.

De retour à la boucle. Si le joueur appuie sur la touche [DEL], on s’assure que la case sur laquelle il se trouve n’est pas déjà marquée, et, dans ce cas, on la marque.

def jeu():
    # [...]	
		elif touche == 17:
            if (x, y) not in cases_marquees:
                cases_marquees.append((x, y))
            break

Les deux bouts de code de la boucle présentés contiennent tous deux le mot-clef « break ». Ce dernier permet de sortir de la boucle secondaire afin de revenir dans la boucle principale de sorte que l’écran puisse être « rafraîchi », c’est-à-dire que les sprites soient mis à jour.

Enfin, en fonction de la flèche de navigation poussée par le joueur, on change les coordonnées de son curseur si celui-ci ne s’évade pas de la grille, puis on colore en noir l’emplacement précédent du curseur.

def jeu():
    # [...]	
		elif x > 0 and touche == 0:
            x -= 1
        elif x < 4 and touche == 3:
            x += 1
        elif y > 0 and touche == 1:
            y -= 1
        elif y < 4 and touche == 2:
            y += 1
        curseur(x_bis, y_bis, 'black')

Et nous voilà à la fin de la fonction jeu(). Le plus dur est dernière nous !

La mise en place du menu principal

La fonction menu() permet d’afficher les différents seuils de difficulté et d’accéder au tutoriel. Cette fonction est la première a être appelée.

Tout comme la fonction jeu(), menu() est composée d’une initialisation et d’une boucle.

violet = (148, 113, 222)
choix = 0

def menu():
    global choix
    fr(0, 0, 320, 240, 'white')
    fr(0, 200, 320, 40, jaune)
    ds('Chasse au trésor', 80, 20, 'black')
    ds('-----------------', 75, 40, 'black')
    ds("Code by nsi.xyz/chasse-au-tresor", 0, 202,'white', violet)

Durant l’initialisation, on affiche tout simplement quelques lignes de texte telles que le titre du jeu. Rien de bien compliqué. Il serait cependant intéressant de faire remarquer que la variable choix est placée hors de la fonction avant d’être rendue globale grâce au mot-clef « global ».

Pourquoi donc ? Eh bien, puisque la variable est hors de la fonction, sa valeur n’est pas écrasée lorsque l’on appelle à nouveau la fonction. Ainsi, le jeu peut se souvenir du choix du joueur lorsque celui-ci navigue parmi les options.

Passons à présent à la boucle de la fonction :

choix_couleurs = {0: ('Facile', 128, 70, vert),
                  1: ('Moyen', 133, 100, orange),
                  2: ('Difficile', 115, 130, rouge),
                  3: ('Tutoriel', 118, 160, jaune)}

def menu():
    # [...]
	while True:
        for i in range(4):
            texte, x, y, couleur = choix_couleurs[i]
            ds(texte, x, y, couleur if i == choix else 'black')

Cette partie de la boucle n’est pas aussi compliquée qu’il n’y paraît. En effet, selon le choix du joueur, elle affiche les quatre options disponibles dans différentes couleurs en exploitant un dictionnaire. Cela permet donc à l’utilisateur de visualiser ce qu’il s’apprête à faire.

La seconde partie de la boucle est également simple. Si le joueur appuie sur la flèche du haut ou du bas, la variable choix est mise à jour. Les conditions supplémentaires aux lignes 4 et 6 permettent de ne pas sortir des quatre options possibles :

def menu():
    # [...]
        touche = attente([1, 2, 4, 52])   
            if touche == 1 and choix > 0:
                choix -= 1
            elif touche == 2 and choix < 3:
                choix += 1
            elif touche == 4 or touche == 52:
                if choix == 0:
                    nb_piques[0] = 11
                    jeu()
                if choix == 1:
                    nb_piques[0] = 13
                    jeu()
                if choix == 2:
                    nb_piques[0] = 15
                    jeu()
                if choix == 3:
                    tutoriel()

En revanche, si l’utilisateur pousse la touche [OK], on modifie le nombre de piques selon la difficulté choisie, puis on se rend au jeu ou tutoriel. Et voilà !

Mot de fin

Créer ce projet sous couche graphique sur la calculatrice a été une expérience enrichissante. Non seulement ai-je été obligé de bien réfléchir à la logique de mon jeu en accord avec celle de mon programme, mais j’ai également dû coder avec les contraintes de mémoire de la calculatrice.

Mon script, j’en suis certain, pourrait être bien davantage optimisé ; mais je pense avoir fait du mieux que j’ai pu dans le temps imparti.

Je tiens également à faire remarquer que je n’ai pas abordé la fonction tutoriel() étant donné que celle-ci n’est composée que de lignes de texte affichées par la fonction draw_string(), et n’est par conséquent pas des plus captivantes à analyser.

Merci d’avoir lu jusqu’ici !

Lien

Voici le lien du jeu qui amène à mon workshop :

NumApps

Une chasse au trésor sur la NumWorks

Explorez un plateau et déterrez le trésor caché tout en évitant les pièges dans ce jeu inspiré du démineur !

Règles

Le jeu se déroule sur une grille de dimensions 5 x 5 remplie de chiffres. Celle-ci cache des pics et un trésor à découvrir afin de gagner.

Chaque chiffre représente le nombre de cases adjacentes qui cachent un pique. Cela signifie que chaque chiffre peut s’étendre de 0 à 4 (les cases en diagonale ne sont pas comptées comme adjacentes, contrairement au démineur).

Vous pouvez choisir de retourner la case que vous désirez. Si la case retournée abrite le trésor, vous gagnez la partie. En revanche, si elle cache un pique (représenté par la couleur grise), vous perdez une vie. Lorsque vos trois vies sont épuisées, vous avez échoué.

Dans le cas où la case est vide, celle-ci affiche une couleur qui vous renseigne sur sa distance par rapport au trésor :

  • Une case verte est éloignée du trésor ;
  • Une case orange est à deux à quatre cases du trésor ;
  • Une case rouge est à une à deux cases du trésor.

Voyez le schéma ci-dessous :

Toutefois, ne vous laissez pas berner ! Parmi les cases colorées, trois sont fausses et indiquent la mauvaise couleur. La disposition des couleurs peut davantage ressembler à cela :

Ainsi, votre but est de découvrir suffisamment de cases colorées afin de pouvoir estimer la position du trésor. Il se peut tout à fait que vous retourniez la case gagnante du premier coup, donc n’hésitez pas à faire plusieurs parties !

Commandes

◁ ▷OKDEL
Naviguer dans les menus
Déplacer le curseur
Sélectionner une option
Retourner une case
Marquer une case*
Retour

* Marquer une case, contrairement au démineur, n’empêche pas de la retourner. Cette fonctionnalité sert simplement d’aide visuelle au joueur. Également, une fois qu’une case est marquée, on ne peut plus retirer la marque.

Captures d’écran

Pour plus d’informations

Jetez un coup d’œil à cet article si vous souhaitez en apprendre plus sur le développement du jeu !

Lien

Voici le lien vers le jeu depuis mon workshop :

Tutoriels

Le guide complet des espaces en typographie

Qu’il s’agisse d’une dissertation, d’un e-mail ou d’une lettre de motivation, taper nos textes est devenu une norme de notre ère. Et cette tendance n’est pas insensée : pouvoir écrire ses mots avec une calligraphie, espacement et centrage parfaits représente un gain de temps indéniable ! Seulement, ce nouveau moyen de rédiger vient avec son lot de règles à respecter. Jetez un coup d’œil à ce tutoriel, et vous saurez tout ce que vous devez connaître afin de maîtriser la mise en page de votre texte !

Bande annonce 😉

Avant-propos

Tout au long de ce tutoriel, le nom « espace » sera utilisé au féminin. Par exemple, il pourrait être dit :

« Il faut une espace avant et après ce signe de ponctuation. »

Cela n’est pas une erreur ! Le nom « espace », lorsqu’il désigne une étendue, une capacité ou simplement notre cosmos, est bel est bien masculin ; en revanche, lorsqu’il désigne un blanc qui sépare deux mots, il est féminin. Selon certains, il s’agirait d’un archaïsme datant de l’ancien et moyen français, et selon d’autres, cela ferait référence aux lamelles utilisées jadis en imprimerie.

Bref. Par souci de purisme, j’utiliserai « espace » au féminin.

Introduction

La typographie est l’art et la technique de l’arrangement des lettres, des chiffres et des symboles dans un texte. Elle consiste à ajuster la mise en page, les polices de caractères, les tailles, les couleurs et les espacements afin de rendre un texte tapé lisible, clair, esthétique et, par-dessus tout, crédible.

Elle est utilisée dans de nombreux domaines telle la publication, la publicité, l’emballage, la signalétique et le design web.

Bien que les règles soient nombreuses, il n’empêche qu’en apprendre les bases vous aidera à produire des écrits qui vaudront d’être lus. Peut-être vous considérez-vous déjà familier avec ce sujet ; néanmoins, il réside toujours des subtilités qu’il serait intéressant de connaître.

Toutefois, tout logiciel de traitement de texte, tel Word, possède un correcteur automatique. Celui-ci non seulement régule les fautes d’orthographe, de conjugaison et de grammaire, mais indique toute erreur d’espacement. Dans ce cas, à quoi sert-il d’apprendre la typographie ? Je vous donnerai trois raisons :

1. Comprendre la logique derrière tout domaine permet d’affiner son esprit et améliorer sa culture générale. La typographie est une compétence qui peut être captivante, et en saisir le fonctionnement vous aidera toujours dans votre vie ;

2. Les correcteurs automatiques ne sont pas nécessairement justes : il advient toujours qu’une erreur ou deux ne soient pas remarquées par le correcteur ; ou, pire, que celui-ci propose une correction erronée. Dans le cas d’une opposition (cf. Les oppositions), il ne parviendra même pas à se décider ! Apprendre les bases vous permettra de ne pas tomber dans le panneau ;

3. Il arrivera qu’aucun correcteur automatique ne soit là pour confirmer vos phrases. Par exemple, lorsque vous rédigez un e-mail sur Gmail ou si vous tapez un texte sur Google doc, il ne vous est pas fourni de correcteur typographique. Si vous désirez faire bonne impression sans perdre le temps de copier/coller votre écrit dans un logiciel de traitement de texte, il vous faudra connaître ces règles.

En un mot, ce tutoriel vous enseignera la manière de placer correctement des espaces dans vos phrases. En effet, faut-il placer une espace avant un point d’exclamation ? Faut-il insérer des espaces à l’intérieur de guillemets ? Comment faut-il s’y prendre avec un texte en anglais ? Trouvez les réponses ci-après !

Les différents types d’espaces

Avant toute chose, considérons les différents types d’espaces en typographie. Nous avons :

  • L’espace justifiante
  • L’espace insécable
  • L’espace fine

L’espace justifiante est l’espace que l’on utilise le plus fréquemment et qui est tapée grâce à la barre d’espace sur un clavier. Elle est nommée ainsi car sa taille est ajustable si le texte est justifié.

Une espace insécable est une espace qui ne peut être séparée des deux mots qui l’entourent par un retour à la ligne. Autrement dit, ce type d’espace garde les deux mots sur la même ligne.

Une espace fine est une espace deux fois plus étroite que l’espace justifiante. Elle est considérée insécable dans la majorité des cas.

Nous allons utiliser ces trois types d’espaces tout au long de ce tutoriel.

Les signes de ponctuation simples

Les signes de ponctuation simples sont constitués d’un seul élément. Ils sont au nombre de trois :

  • La virgule (,)
  • Le point (.)
  • Les points de suspension ()

(Les points de suspension étant composés de points, ils font partie des signes de ponctuation simple.)

Pour ces signes, il ne faut pas mettre d’espace avant, mais en placer une après.

À faire :

Lundi matin,_le professeur de NSI entra dans la salle de classe en furie._Il avait sous le bras les contrôles de la semaine précédente_

À ne pas faire :

Lundi matin_,le professeur de NSI entra dans la salle de classe en furie_.Il avait sous le bras les contrôles de la semaine précédente_

Remarque : Lorsque la virgule sert à écrire un nombre décimal, elle ne nécessite pas d’espace après. On écrira donc « 42,666 ». Cela vaudrait de même pour un point qui séparerait un nombre en groupe de trois chiffres, comme dans « 120.000 » s’il n’était pas recommandé de mettre une espace insécable à la place, et de taper « 120 000 ».

Les signes de ponctuation complexes

Les signes de ponctuation complexes comportent deux éléments. Il en existe quatre :

  • Le point d’exclamation (!)
  • Le point d’interrogation (?)
  • Le double point (:)
  • Le point-virgule (;)

Il faut placer une espace avant et après ces signes.

À faire :

La mauvaise nouvelle fut vite annoncée_:_pas un élève avait eu au-dessus de la moyenne_!_Comment de tels résultats avaient-ils pu être possibles_?_

À ne pas faire :

La mauvaise nouvelle fut vite annoncée:_pas un élève avait eu au-dessus de la moyenne!_Comment de tels résultats avaient-ils pu     être possibles?_

Remarque 1 : L’espace placée devant un signe de ponctuation complexe doit être insécable. Elle peut être fine ou non. Word crée automatiquement une espace insécable lorsque vous tapez ces signes de ponctuation.

Remarque 2 : Si vous désirez placer un point d’interrogation à côté d’un point d’exclamation afin d’exprimer du décontenancement, il ne faut pas mettre d’espace entre les deux. La règle de l’espace avant et après s’applique au groupement. On écrira donc : « Qu’est-ce que c’est que ça_?!_»

L’apostrophe

L’apostrophe (), qu’elle soit droite ou courbe, n’a aucune espace de part et d’autre. En d’autres termes, elle est collée aux deux mots qui l’entourent.

À faire :

D'habitude, si quelqu'un se retrouvait avec une note médiocre, le professeur s'avérait bien plus compréhensif. Cette fois-ci, ce n'était  pas le cas.

À ne pas faire :

D_'_habitude, si quelqu_'_un se retrouvait avec une note médiocre, le professeur s_'_avérait bien plus compréhensif. Cette fois-ci, ce        n_'_était pas le cas.

Les tirets

Nous allons considérer trois types de tirets :

  • Le tiret court ou trait d’union ()
  • Le tiret moyen/demi-cadratin ()
  • Le tiret long/cadratin ()

Le tiret court ou trait d’union est utilisé pour les mots composés ainsi que les coupures. Il ne possède pas d’espace avant ni après.

Le tiret moyen ou demi-cadratin permet d’insérer des commentaires. Celui-ci est entouré par deux espaces.

Le tiret long ou cadratin est utile pour les dialogues. Afin de s’en servir, il faut aller à la ligne et le coller au bord gauche de la page. Il a une espace derrière lui.

À faire :

_Donnez-moi une seule raison__car je n’en trouve pas une__de ne pas tous vous punir ! s’exclama-t-il.

À ne pas faire :

Donnez_-_moi une seule raisoncar je n’en trouve pas unede ne pas tous vous punir ! s’exclama_-_t_-_il.

Remarque : Il faut placer deux espaces insécables à l’intérieur des tirets moyens lorsque ceux-ci insèrent un commentaire. Autrement dit, il faut une espace insécable à droite du premier tiret et une à gauche du second. Ces espaces peuvent être fines ou non.

Les parenthèses

Dans la famille des parenthèses, il y a :

  • Les parenthèses (())
  • Les crochets ([])
  • Les accolades ({})

Ces signes nécessitent une espace à l’extérieur mais aucune à l’intérieur. Il faut donc uniquement placer une espace à gauche de la parenthèse ouvrante et à droite de la parenthèse fermante.

À faire :

Les élèves honteux_(ils avaient promis de réviser)_ne surent quoi répondre.

À ne pas faire :

Les élèves honteux(_ils avaient promis de réviser_)ne surent quoi répondre.

Les guillemets

En français, il est possible d’utiliser ces trois types de guillemets :

  • Les guillemets français (« »)
  • Les guillemets anglais (” ”)
  • Les apostrophes (‘ ‘)

Les guillemets français sont utilisés pour insérer une citation, introduire un discours direct, encadrer une expression inhabituelle ou souligner le sens spécial d’un mot. Ceux-ci ont une espace à l’extérieur et à l’intérieur.

Les guillemets anglais sont surtout utilisés pour les doubles citations, c’est-à-dire des citations à l’intérieur d’une citation. Ils possèdent une espace à l’extérieur, mais non à l’intérieur.

Les apostrophes, bien que rares, sont utilisées pour les triples citations. Elles suivent la même règle que les guillemets anglais.

À faire :

En effet, leurs résultats étaient_«_absolument_"incroyables"_»_selon le ton ironique de leur professeur.

À ne pas faire :

En effet, leurs résultats étaient«absolument"_incroyables_selon le ton ironique de leur professeur.

Remarque : Les guillemets français nécessitent une espace insécable à l’intérieur. Il faut donc placer une espace insécable à droite du guillemet ouvrant et à gauche du guillemet fermant. Word ne crée pas ces espaces automatiquement.

La barre oblique

La barre oblique, ou le slash, sert à indiquer un choix entre plusieurs expressions, écrire une abréviation ou faire une fraction.

Ce signe de ponctuation est relativement jeune. De ce fait, les règles de typographie à son sujet ne sont pas gravées dans le marbre.

La plupart du temps, la barre oblique ne possède pas d’espaces de part et d’autre. Toutefois, lorsqu’elle sépare deux expressions composées de plus d’un mot, il est considéré comme judicieux de placer une espace à sa gauche et à sa droite.

L’important est de faire attention à l’uniformité du texte. En effet, placer une barre oblique entourée d’espaces juste à côté d’une sans espaces est à éviter. Il est intéressant alors de choisir l’une de ces deux règles pour l’entièreté d’un document.

À faire :

Ce dernier à présent pouvait punir tous ses élèves et/ou les jeter par la fenêtre.

À ne pas faire :

Ce dernier à présent pouvait punir tous ses élèves et_/_ou les jeter par la fenêtre.

Remarque : Lorsqu’une barre oblique délimite deux expressions qui contiennent plus d’un mot, cette barre oblique doit être entourée d’espaces insécables.

Les symboles arithmétiques

Les symboles arithmétiques sont nombreux et varient des plus connus (+ – × ÷ =) aux plus cryptiques. Leur règle est simple : il faut placer une espace de chaque côté du signe.

À faire :

Au lieu de cela, il s'empara de la première copie de sa pile de contrôles et lu : « 5_+_7_×_4_=_48 ».

À ne pas faire :

Au lieu de cela, il s'empara de la première copie de sa pile de contrôles et lu : « 5+7×4=48 ».

Les unités de mesure

Les unités de mesures sont de même nombreuses. Les plus fréquemment utilisées au quotidien peuvent être le gramme (g), le mètre (m), le litre (L), la seconde (s), l’euro (€) et le degré Celsius (°C). Ces symboles sont toujours précédés et suivis d’une espace.

À faire :

Il s'arrêta 1_s_et recula d'1_m_en silence.

À ne pas faire :

Il s'arrêta 1s_et recula d'1m_en silence.

Remarque : Il est nécessaire de placer une espace insécable entre le nombre et son unité de mesure.

Les oppositions

Il peut arriver que les règles de typographie se contredisent et créent des oppositions. En effet, imaginez que vous souhaitiez placer un point après avoir fermé une parenthèse. Faut-il placer une espace entre les deux ? D’un côté, oui car la parenthèse possède une espace à l’extérieur ; mais d’un autre côté, non car le point est forcément collé au signe qui le précède. Et en ce qui concerne une apostrophe suivit de guillemets français ? L’apostrophe nous indique qu’il ne faut pas mettre d’espace entre les deux signes, mais les guillemets en requièrent une !

Lorsque vous vous retrouvez face à ce genre de paradoxes, le mieux à faire est de ne pas mettre d’espace, quand bien même cela va à l’encontre de quelque règle de typographie.

À faire :

Les élèves comprirent que l ardeur » de leur professeur avait pris fin (sans vraie raison).

À ne pas faire :

Les élèves comprirent que l'_« ardeur » de leur professeur avait pris fin (sans vraie raison)_.

Et en anglais ?

Les règles exposées tout au long de ce tutoriel représentent les règles françaises de typographie. En d’autres termes, chaque langage possède ses propres lois d’espacement. Cette section vise à montrer les différences qui existent en typographie entre le français et l’anglais. J’ai choisi cette langue car elle est fréquemment utilisée sur Internet.

Le point et la virgule échangent de rôle dans les mathématiques anglaises. On écrira donc un nombre décimal avec un point, et tout nombre supérieur à 1 000 comportera des virgules tous les trois chiffres. Par exemple, on tapera en anglais : « 42,333.12 ». La règle reste toutefois inchangée : pas d’espace avant ni après.

Les signes de ponctuation complexes (: ; ! ?) ne sont pas précédés d’une espace. Autrement dit, ils sont collés au mot qui les précède.

Les guillemets français ne sont pas utilisés. Ainsi, dans un texte anglais seront uniquement tapés les guillemets anglais et les apostrophes, qui suivent les mêmes règles qu’en français.

En anglais, les dialogues ne se forment pas à partir de tirets cadratins, mais simplement de guillemets anglais mis à la ligne.

Les devises, c’est-à-dire la monnaie utilisée comme l’euro (€), le dollar ($), la livre sterling (£), etc., est placée devant le nombre et n’a pas d’espace après. On écrira donc, par exemple, « 10 » pour dix euros.

Hormis ces points, les règles anglaises et françaises sont similaires.

Un exemple de bonne typographie

Voici deux textes qui possèdent les mêmes mots mis côte à côte. Le premier suit les règles d’espacement en typographie, le second non.

Bon espacement / Mauvais espacement
Tutoriels

Formater facilement et rapidement un texte sur Word

Que ce soit pour un devoir ou juste pour votre plaisir d’écrivain, le logiciel de traitement de texte Word est bien souvent l’outil privilégié pour consigner ses mots. Mais on a beau s’en servir souvent, on ne prend pas forcément le temps de formater correctement et proprement ce que l’on rédige. Dans ce tutoriel, en plus d’explorer quelques fonctionnalités intéressantes que Word propose, je vous montrerai une manière simple et rapide de formater n’importe quel texte afin de le rendre plus esthétique. Finis les devoirs tapés à l’arrache et au visuel peu attrayant !


Déroulé du tutoriel

  1. La police
  2. L’interligne
  3. Les alinéas
  4. L’alignement
  5. Les marges
  6. Les titres
  7. L’en-tête et le pied de page
  8. Un exemple

1. La police

La police d’un texte est le paramètre le plus crucial dans sa lisibilité. De plus, elle détermine la place qu’il prend sur le document. Plus la police est grande, plus le texte est volumineux (bien entendu).

a) Le type

Comme la majorité des gens le savent, il suffit de cliquer sur la liste déroulante qui contient les types de polices dans l’onglet Accueil afin de modifier l’apparence du texte. Ici vous est proposé un large panel de polices, dont les plus utilisées comme Calibri, Arial ou encore Times New Roman.

Si une police en particulier n’est pas requise par votre professeur ou autre, il serait intéressant de s’aventurer un peu. En se rendant dans l’onglet Conception et en cliquant sur la liste déroulante Thèmes, vous pourrez choisir un thème à appliquer à votre document qui réglera le type et la couleur de votre police.

Cette méthode peut être conseillée si votre document contient beaucoup de texte afin de pouvoir le modifier entièrement en un clic. D’autre part, nous verrons qu’elle aura une autre utilité dans la partie 6 : « Les titres ».

Conseil : Choisissez un thème qui correspond à votre texte. Un devoir à rendre ? Un passage d’une œuvre littéraire ? Il ne tient qu’à vous d’expérimenter et de créer vos préférences. Si, bien entendu, vous ne trouvez pas votre bonheur, vous pouvez rester avec le thème « Office », celui de base.

b) La taille

La manière la plus simple de modifier la taille de votre police et de cliquer sur la liste déroulante juste à droite de celle qui contient les types de polices dans l’onglet Accueil. Vous pouvez choisir la taille qui vous convient le mieux, ou en taper une.

Conseil : La taille de votre police différera en fonction du texte que vous écrivez. Je trouve qu’il est plus esthétique de faire rentrer un texte sur une seule page s’il est court et de ne pas le laisser dépasser de quelques lignes sur une autre. Si vous rédigez un texte qui sera lu à voix haute, je vous conseille de régler la taille de la police à 16 et de faire un grand interligne (prochaine partie).


2. L’interligne

La lisibilité de vos lignes ainsi que de votre texte entier est également influencée par la taille de votre interligne.

a) Les paragraphes

Afin de changer l’espacement entre les paragraphes, vous avez deux possibilités :

  • Se rendre dans l’onglet Mise en page et remplacez le « 8 » dans la case du bas de la section Espacement par la taille que vous désirez. Cette action modifiera le texte surligné par le curseur de votre souris (surligner l’entièreté du document : ctrl + a) ;
  • Se rendre dans l’onglet Accueil et cliquer sur la flèche à droite du mot « Paragraphe ». Une fenêtre devrait s’ouvrir. Dans la section Espacement, remplacez le « 8 » par la taille désirée. Cette action modifiera également le texte surligné par le curseur de votre souris.

Conseil : Si vous rédigez un texte construit, que ce soit une dissertation en français ou une nouvelle, je vous conseille de régler l’espacement des paragraphes à 0. De cette façon, vos paragraphes seront collés et votre texte ne semblera pas fragmenté.

b) Les lignes

Afin de changer l’interligne, vous avez deux possibilités :

  • Choisir la taille de l’espacement depuis l’onglet Accueil avec la liste déroulante prévue. Cette action modifiera le texte surligné par le curseur de votre souris ;
  • Se rendre dans l’onglet Accueil et cliquer sur la flèche à droite du mot « Paragraphe ». Une fenêtre devrait s’ouvrir. Sélectionnez dans la liste déroulante Interligne l’option « Multiple », puis entrez dans la case juste à droite la taille désirée. Cette action modifiera également le texte surligné par le curseur de votre souris.

Conseil : La taille de votre interligne devrait correspondre au type de texte que vous rédigez. Comme je l’ai dit dans la partie précédente, un texte destiné à être lu à voix haute devrait comporter un interligne assez important afin que les lignes soient bien différenciables. Pour ce cas de figure, une taille de 1,5, selon moi, conviendrait le mieux.


3. Les alinéas

Qu’ils soient manuscrits ou tapés, les alinéas permettent de différencier les paragraphes d’un texte et à donner à ce dernier une forme intéressante. Ils sont tapés grâce à la touche Tab ↹.

Comme pour l’interligne, afin de régler la taille des alinéas, vous devez vous rendre dans l’onglet Accueil et cliquer sur la flèche à droite du mot « Paragraphe ». Ensuite, dans la section Retrait, choisissez l’option « Première ligne » de la liste déroulante Spécial, puis réglez la taille désirée dans la case juste à droite. Cette action modifiera le texte surligné par le curseur de votre souris.

Conseil : Réglez la taille des alinéas à 0,5 cm pour un texte littéraire et à 1 cm pour un devoir. Je pense qu’il vaut mieux privilégier des alinéas petits car, lorsqu’ils sont trop larges, le texte semble morcelé.


4. L’alignement

La forme que prend votre texte est en grande partie décidée par l’alignement pour lequel vous optez.

Vous avez deux façons de modifier l’alignement de votre texte :

  • Dans l’onglet Accueil, cliquez sur l’une des quatre propositions dans la section Paragraphe.
  • Dans l’onglet Accueil, cliquez sur la flèche à droite du mot « Paragraphe ». Dans la fenêtre ouverte, faites votre choix dans la liste déroulante Alignement.

Conseil : Optez pour l’alignement « Justifié » si vous pouvez étant donné qu’il équilibre votre texte sur la largeur de la page et le rend davantage homogène. Un problème peut tout de même survenir : les espaces à l’intérieur de certaines lignes peuvent devenir très larges pour que la longueur soit respectée. Dans ce cas, coupez le premier mot de la ligne suivante afin que sa première moitié se retrouve sur la ligne à régler.


5. Les marges

Les marges de votre texte définissent la place occupée par vos mots sur la page et le vide laissé pour les doigts du lecteur.

Afin de modifier les marges, rendez-vous dans l’onglet Mise en page et cliquez sur Marges. De là, vous pouvez choisir dans la liste déroulante le type de marges que vous préférez.

Vous pouvez également créer vos propres marges en cliquant sur Marges personnalisées. Une fenêtre devrait s’ouvrir. Dans la section Marges, entrez les paramètres désirés.

Ou sinon, vous pouvez vous rendre dans l’onglet Affichage et, dans la section Afficher, cochez Règle. Cette manipulation placera une « règle » juste en dessous du ruban grâce à laquelle vous pourrez modifier manuellement les marges du texte surligné par votre souris en bougeant les curseurs blancs.

Conseil : Privilégiez de petites marges afin d’utiliser moins de papier, d’avoir une taille de police plus volumineuse et de ne pas avoir trop de vide sur la page. En revanche, lorsque vous rédigez un texte qui sera lu à voix haute, peut-être pour un oral, il pourrait être intéressant de choisir les marges moyennes afin de laisser davantage de place pour tenir la feuille entre vos doigts.


6. Les titres

Afin que la structure de votre texte soit claire et saute aux yeux, il est fondamental que vos titres et sous-titres se détachent du corps du texte.

a) La manière simple

Selon la logique, un titre doit être plus large que le corps du texte. La méthode la plus simple pour créer cette différence de taille serait de modifier directement le titre en l’agrandissant (cf. la partie 1 : « La police », section b : « La taille »).

Mais en plus d’agrandir le titre, vous pouvez l’agrémenter grâce à l’onglet Accueil. Il est possible de :

  • Le souligner ;
  • L’encadrer ;
  • Ou lui mettre un fond.

Conseil : Centrez vos titres et sous-titres afin qu’ils se démarquent sur la page (cf. la partie 4 : « L’alignement »).

b) La manière plus intéressante

Dans l’onglet Accueil, la liste déroulante Styles permet de formater le texte surligné par votre souris et lui donner une place dans la hiérarchie de vos titres. Plus simplement : il peut attribuer le rôle de « Titre », « Sous-titre » ou « Normal » (corps du texte) à certains paragraphes.

Pour appliquer un style, surlignez votre titre avec le curseur de votre souris et cliquez sur « Titre 1 ».

Si vous avez suivi le conseil que j’ai donné dans la partie 1 : « La police », section a : « Le type », alors il est probable qu’un thème de l’onglet Conception soit appliqué à votre document. Si c’est le cas, alors votre titre aura une couleur et police en accord avec le reste du corps du texte. Chaque thème a un style de titre qui lui est propre.

Cette manière de formater un titre a un avantage : elle place le titre dans le Volet de navigation, accessible en se rendant dans l’onglet Affichage et cochant la case Volet de navigation.

Dans ce volet, allez dans la section Titres, et vous pourrez voir une liste de tous les titres de votre document. En cliquant sur l’un d’eux, la page montera ou descendra jusqu’à lui. Ainsi, en plus d’avoir une table des matières pour votre document (seulement visible s’il est lu numériquement), vous pouvez passer rapidement de partie en partie sans perdre de temps à faire défiler les pages. Si votre document comporte beaucoup de texte, cela pourrait certainement vous faciliter la tâche.

Conseil : Évidemment, si l’aspect de votre titre ne vous convient pas, vous pouvez toujours le modifier en lui laissant le style « Titre 1 ». Cela ne le retirera pas du Volet de navigation. Sinon, vous pouvez inventer vous-même votre propre style en cliquant sur Créer un style. Depuis la fenêtre ouverte, allez dans Modifier… et appliquez au texte les paramètres souhaités.


7. L’en-tête et le pied de page

L’en-tête et le pied de page, bien que pas forcément nécessaires, peuvent être un bon ajout à votre document.

a) L’en-tête

Afin de modifier l’en-tête de votre document, vous n’avez qu’à double-cliquer sur le haut de n’importe quelle page, à environ 1 cm du bord. Si vous n’y parvenez pas, vous pouvez également vous rendre dans l’onglet Insertion, cliquer sur la liste déroulante En-tête et choisir l’une des options.

Lorsque vous avez rempli l’en-tête, il vous suffit de double-cliquer en dehors afin de sortir de ce dernier, ou de cliquer sur Fermer l’en-tête et le pied de page dans la section Fermeture.

Désormais, cet en-tête se trouvera en haut de chaque page de votre document. Si vous souhaitez le changer pour une section en particulier, dans ce cas, rendez-vous dans l’onglet Mise en page, et, dans la liste déroulante Saut de page, choisissez Page suivante. Ensuite, ouvrez l’en-tête de la page apparue et, dans la section Navigation qui s’est affichée, cliquez sur Lier au précédent afin de désactiver cette fonctionnalité. Ainsi, vous pourrez modifier l’en-tête sans affecter celui de la page d’avant.

Conseil : Un en-tête peut servir à placer votre nom, une date, la problématique ou le titre d’une section sur chaque page. Si votre écrit est long, il pourrait être intéressant d’user de cette fonctionnalité.

b) Le pied de page

Modifier le pied de page se fait quasiment de la même façon que pour l’en-tête. Vous pouvez soit double-cliquer sur le bas de n’importe quelle page à environ 1 cm du bord, soit vous rendre dans l’onglet Insertion, cliquer sur la liste déroulante Pied de page et choisir l’une des options.

Et, comme pour l’en-tête, il vous suffit de double-cliquer en dehors du pied de page afin d’en sortir ou de cliquer sur Fermer l’en-tête et le pied de page. En suivant cette logique, changer le pied de page pour une section de votre document se fait de la même manière que pour l’en-tête (cf. section a).

Si vous souhaitez avoir le numéro de la page affiché dans le pied de page, rendez-vous dans l’onglet Insertion, cliquez sur la liste déroulante Numéro de page et choisir Bas de page. Enfin, optez pour l’option désirée (« Numéro normal 2 » est, selon moi, la meilleure).

Conseil : Hormis le numéro de page, vous pouvez mettre en pied de page le titre de votre document ainsi que le nom de son auteur (logiquement, vous).


8. Un exemple

En exemple visuel, nous modifierons ce texte qui n’est pas formaté en appliquant les conseils donnés dans ce tutoriel.

Version originale VS Version formatée

(Début du chapitre 1 de Une Vie, de Maupassant)

Projets

Une partie de Blackjack en Python

Les jeux d’argent ont beau être peu recommandables, il n’empêche qu’ils restent assez divertissants ; et afin de pouvoir y participer depuis chez soi, sans la moindre répercussion sur son compte en banque, je vous propose une partie de Blackjack grâce à un script en Python ! Vous pouvez miser de la fausse monnaie à votre guise ou simplement jouer pour le plaisir. Serez-vous capable de battre le croupier à plat de couture ?

Un dilemme vite résolu

Ma première idée pour ce projet était entièrement différente ; et, à vrai dire, j’avais véritablement l’intention d’opter pour elle. Seulement, l’intitulé de ce devoir était « Une programmation fonctionnelle en Python ». Mon plan initial s’est avéré très peu adapté à cette problématique ; par conséquent, j’ai préféré me rabattre sur mon second choix : le jeu du Blackjack.

De toute manière, mon idée de base était un tantinet trop ambitieuse pour le type de projet qui était à réaliser : je ne regrette pas ma décision de la changer.

Quelques recherches avant de débuter

Je ne pouvais guère me lancer dans l’écriture de mon script avant d’être certain de connaître les règles du Blackjack. Quelques recherches en ligne m’ont permis rapidement de déterminer les points importants à intégrer :

Les tours :

Le joueur commence. Il débute son tour en tirant deux cartes dont les points constituent son score de base. Ensuite, il a le choix de piocher ou non une nouvelle carte. S’il décide de le faire, les points de la carte sont ajoutés à son score ; sinon, il termine son tour. Son but est d’obtenir le score le plus élevé possible sans jamais dépasser vingt-et-un. Si c’est le cas, son tour s’arrête directement.

Ensuite, c’est au croupier de jouer. Dans un véritable casino, ses règles diffèrent légèrement de celles du joueur ; mais par souci de simplicité, j’ai préféré lui donner les mêmes. Son but est d’obtenir un score supérieur à celui du joueur, ou, au moins, de faire égalité.

Lorsque les deux tours touchent à leur fin, on compte les points. Celui qui en possède le plus sans dépasser vingt-et-un est déclaré vainqueur. Il est possible de faire égalité.

Les points :

Chaque carte possède son propre nombre de points :
– de deux à neuf : autant de points que le nombre affiché sur la carte.
– de dix à roi : 10 points.
– As : 1 ou 11 points (au choix du joueur).

Les mises :

Le joueur mise en début de partie une somme ne pouvant dépasser un certain montant. Ce dernier différant de casino en casino, je l’ai réglé à cent-cinquante euros.

Dans un véritable casino, le joueur a la possibilité de doubler sa mise , ou bien d’abandonner et d’en perdre la moitié, en pleine partie ; toutefois, j’ai pris la liberté de ne pas intégrer cette fonctionnalité afin de ne pas compliquer le jeu.

Si le joueur gagne, il récupère le double de sa mise ; en revanche, s’il perd, il ne la recouvre pas. En cas d’égalité, rien ne se passe.

J’ai consigné toutes ces règles dans mon script, affichées au gré du joueur.

Les premiers tests

Je n’ai pas voulu plonger tête première dans l’écriture de mon code sans avant tout faire quelques essais.

Je n’ai intégré que trois cartes au départ : l’as, le deux et le trois, respectivement à un, deux et trois points.

paquet = ("as","deux","trois")
points = (1, 2, 3)
score_joueur = 0

En créant deux n-uplets et en faisant correspondre le nom des cartes avec leur nombre de points, je pouvais aisément créer un système de pioche grâce au module random et donner le nom et les points de la carte tirée.

carte = randint(0,2) # piochage d'une carte au hasard
print("Votre première carte est un", paquet[carte])
score_joueur += points[carte] # points de la carte ajoutés au score du joueur

carte = randint(0,2)
print("Votre seconde carte est un", paquet[carte])
score_joueur += points[carte]

print("Votre score de base est de", score_joueur)

Lorsque la variable « carte » est égale à 0, par exemple, elle prend le premier item du n-uplet « paquet » et « points » qui correspondent respectivement à « as » et « 1 ». En revanche, si, pour la seconde carte, la variable « carte » vaut 2, elle prend le troisième item des deux n-uplets qui est « trois » et « 3 ». Une autre variable « score_joueur » récupère les points gagnés afin de constituer le score.

Dans cette situation, le script afficherait :

J’ai ainsi codé le début du tour du joueur.

Afin de respecter l’intitulé du projet (« Une programmation fonctionnelle en Python »), j’ai placé cette partie de code dans une fonction que j’ai nommée « base() ». J’ai également rendu la variable « score_joueur » globale de sorte qu’elle soit utilisable dans toutes les fonctions.

paquet = ("as","deux","trois")
points = (1, 2, 3)
score_joueur = [0]

def base():
    carte = randint(0,2) # piochage d'une carte au hasard
    print("Votre première carte est un", paquet[carte])
    score_joueur[0] += points[carte] # points de la carte ajoutés au score du joueur
    carte = randint(0,2)
    print("Votre seconde carte est un", paquet[carte])
    score_joueur[0] += points[carte]
    print("Votre score de base est de", score_joueur[0])
    
base()

Et, à partir de cette base, j’ai codé la partie « joueur » du jeu.

La partie « joueur »

Puisque le système qui met en place le score de base était déjà intégré, je me suis ensuite attelé au codage du reste du tour.

Selon les règles du Blackjack, le joueur décide s’il souhaite piocher une nouvelle carte ou non tant que son score est inférieur à vingt-et-un. Subséquemment, j’ai repris le code de la fonction « base() » dans une nouvelle fonction nommée « choix_joueur() » et ajouté une condition pour qu’il soit exécuté :

def choix_joueur():
    while score_joueur[0] < 21: # tant que le score du joueur est strictement inférieur à 21, il peut continuer de piocher
        ch = input("[Voulez-vous piocher ?] " )
        if ch == "o": # si le joueur continue de piocher
            carte = randint(0,2) # piochage d'une carte au hasard
            print("Vous piochez un", paquet[carte])
            score_joueur[0] += points[carte] # points de la carte ajoutés au score du joueur
            print("Votre score est de", score_joueur[0], "\n")
        elif ch == "n": # si le joueur cesse de piocher
            print("Vous décidez de vous arrêter.")
            break

Ce script peut, par exemple, afficher :

Afin que cette fonction se lance, je l’ai appelée à la fin de « base() » :

def base():
    carte = randint(0,2) # piochage d'une carte au hasard
    print("Votre première carte est un", paquet[carte])
    score_joueur[0] += points[carte] # points de la carte ajoutés au score du joueur
    carte = randint(0,2)
    print("Votre seconde carte est un", paquet[carte])
    score_joueur[0] += points[carte]
    print("Votre score de base est de", score_joueur[0])
    score_joueur() # suite du tour

Si le joueur dépasse le score de vingt-et-un, il perd automatiquement. J’ai, de ce fait, défini une fonction « defaite() » qui est appelée si le joueur va trop loin :

def choix_joueur():
    while score_joueur[0] < 21: # tant que le score du joueur est strictement inférieur à 21, il peut continuer de piocher
        # [...]
    if score_joueur[0] > 21:
    	defaite()

def defaite(): # lorsque le joueur perd
    print("Vous avez perdu...")

En revanche, si le joueur tombe pile sur vingt-et-un, il ne gagne pas automatiquement puisque le croupier pourrait faire égalité ; à la place, le jeu passe directement au tour du croupier et ne laisse pas le choix de tirer ou non une nouvelle carte. Étant donné que cesser de piocher et atteindre le score de vingt-et-un ont les mêmes conséquences, j’ai regroupé ces deux conditions en une seule :

    if score_joueur[0] > 21:
    	defaite()
    else:
        choix_ordi()

(La fonction « choix_ordi() » sera détaillée dans la prochaine partie : elle correspond au tour du croupier.)

Avec le codage du tour du joueur terminé, je pouvais désormais m’affairer à celui du croupier.

La partie « croupier »

Une fois la partie « joueur » créée, il ne suffisait que de recopier son code et de lui retirer son interactivité afin de programmer la partie « croupier ».

Ainsi, j’ai définie la fonction « choix_ordi » (montrée dans la partie précédente) et ajouté une nouvelle variable globale que j’ai nommée « score_ordi ». Le croupier continue de piocher tant qu’il n’a pas dépassé le score du joueur.

paquet = ("as","deux","trois")
points = (1, 2, 3)
score_joueur = [0]
score_ordi = [0]

def base():
	#[...]

def choix_joueur():
	#[...]

def choix_ordi():
    carte = randint(0,2) # piochage d'une carte au hasard
    print("La première carte du croupier est", paquet[carte])
    score_ordi[0] += points[carte] # points de la carte ajoutés au score du croupier
    carte = randint(0,2)
    print("La seconde carte du croupier est", paquet[carte])
    score_ordi[0] += points[carte]
    print("Le score de base du croupier est de", score_ordi[0], "\n")
    while score_ordi[0] < score_joueur[0]: # le croupier ne cessera pas de piocher tant que son score est inférieur à celui du joueur
        carte = randint(0,2)
        print("Le croupier pioche", paquet[carte])
        score_ordi[0] += points[carte]
        print("Le score du croupier est de", score_ordi[0], "\n")
    if score_ordi[0] > 21: # si le score du croupier dépasse 21, le joueur gagne automatiquement
      	reussite()
    else:
        print("Le croupier décide de s'arrêter.")
        defaite()

def defaite(): # lorsque le joueur perd
    print("Vous avez perdu...")

def reussite(): # lorsque le joueur gagne
  	print("Vous avez gagné !")

J’ai également créé la fonction « reussite() » qui est appelée lorsque le joueur gagne la partie.

La partie « croupier » m’a amené à réfléchir à l’intelligence artificielle de mon ordi. Oui, il est logique qu’il cesse de piocher lorsque son score est supérieur à celui du joueur et qu’il ne le fasse pas avant ; mais s’il tombe pile sur son score ? Devrait-il continuer et peut-être dépasser vingt-et-un où devrait-il s’arrêter ? En prenant en compte le système de mise d’argent, je me suis rendu à l’évidence qu’il valait mieux que, à un certain stage, si les deux scores sont identiques, le croupier ne tente pas sa chance.

J’ai donc complété la boucle while de la fonction afin qu’elle corresponde à mes attentes et est défini une nouvelle fonction : « egalite() ».

def choix_ordi():
    # [...]
    while score_ordi[0] <= score_joueur[0]:
        if score_ordi[0] == score_joueur[0]:
            if score_joueur[0] >= 15:
                break # si le score du croupier est égal à celui du joueur et est supérieur ou égal à 15, il cesse de piocher automatiquement
       # [...]
    if score_ordi[0] > 21:
    	reussite()
    else:
      	print("Le croupier décide de s'arrêter.")
      	if score_ordi[0] > score_joueur[0]:
      		defaite()
      	else:
      		egalite()

def egalite():
  	print("Vous avez fait égalité.")

Désormais, si le croupier fait un score identique à celui du joueur, il arrête de piocher s’il est au minimum à quinze ; sinon, il continue. Mon résonnement est simple : lorsque j’implémenterai le reste des cartes (partie suivante), il y aura plus de chances de dépasser vingt-et-un en piochant une carte à partir de quinze que non. Le croupier ne préfère pas tenter le diable.

Par ailleurs, un problème assez flagrant est visible à l’affichage de ce code, dans la console : tout le texte qui décrit le tour du croupier est imprimé en une fois, sans laisser le temps au joueur de lire.

(Texte imprimé en un coup.)

Le rythme d’affichage sera réglé plus tard, dans la partie « Les finitions ».

Le reste des cartes

Une fois la structure du jeu quasiment terminée (ne manquant que le système de mises et de banque qui sera traité dans la prochaine partie), je me suis décidé à ajouter le reste des cartes.

paquet = ("as","deux","trois","quatre","cinq","six","sept","huit","neuf","dix","valet","dame","roi")
points = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10)

Bien entendu, je ne me suis pas soucié de la couleur de chacune étant donné que seule la valeur importe dans le jeu du Blackjack.

D’autre part, j’ai changé le système de pioche en écrivant :

carte = randint(0,12)

Une fois le paquet entier codé, j’ai constaté un problème avec la carte « dame ». Lorsque cette dernière était piochée, il était affiché :

« Vous piochez un dame ». Quand bien même cette erreur est anodine, j’ai préféré la régler directement. De ce fait, j’ai modifié le n-uplet contenant le nom des cartes en ajoutant le bon article :

paquet = ("un as","un deux","un trois","un quatre","un cinq","un six","un sept","un huit","un neuf","un dix","un valet","une dame","un roi")

Ensuite, j’ai retiré les mots qui compromettaient cette nouvelle organisation :

print("Vous piochez", paquet[carte]) # au lieu de "print("Vous piochez un", paquet[carte])"

Le cas de l’as

Selon les règles du Blackjack, lorsqu’un as est tiré, le joueur peut choisir entre un et onze points. Par souci de fidélité au vrai jeu, j’ai décidé d’intégrer cette fonction. Cela signifiait deux choses : je devais donner la possibilité au joueur de prendre la décision et je devais programmer une intelligence artificielle qui choisirais la meilleure tactique.

Pour la première problématique, j’ai implémenté une condition qui vérifie si un as est tiré ou non. Si c’est le cas, un choix est donné au joueur :

def base():
    carte = randint(0,12)
    print("Votre première carte est", paquet[carte])
    if carte == 0: # si la carte est un as (choix entre 1 et 11 points)
        As = int(input("Préférez-vous qu'elle vaille 1 ou 11 points ? "))
        if As == 1:
            carte = 0
            print()
        elif As == 11:
            carte = 13
            print()
    score_joueur[0] += points[carte]
    carte = randint(0,12)
    print("Votre seconde carte est", paquet[carte])
    if carte == 0:
        As = int(input("Préférez-vous qu'elle vaille 1 ou 11 points ? "))
        if As == 1:
            carte = 0
            print()
        elif As == 11:
            carte = 13
            print()
    score_joueur[0] += points[carte]
    print("Votre score de base est de", score_joueur[0], "\n")
    choix_joueur()

Ici, si la variable « carte » prend la valeur 0, elle correspond au premier item du n-uplet « paquet » qui se trouve être as. Dans ce cas, le script donne le choix au joueur. S’il opte pour un point, on donne à la variable « carte » la valeur 0 ; en revanche, s’il opte pour onze points, on lui donne la valeur 13, soit le douzième item du n-uplet « points ».

Cela nous donne :

On applique ce processus à la fonction « choix_joueur() » :

def choix_joueur():
    while score_joueur[0] < 21:
        ch = input("[Voulez-vous piocher ?] " )
        if ch == "o":
            carte = randint(0,12)
            print("Vous piochez", paquet[carte])
            if carte == 0: # si la carte est un as (choix entre 1 et 11 points)
                As = int(input("Préférez-vous qu'il vaille 1 ou 11 points ? "))
                if As == 1:
                    carte = 0
                    print()
                elif As == 11:
                    carte = 13
                    print()
            score_joueur[0] += points[carte]
            print("Votre score est de", score_joueur[0], "\n")
        elif ch == "n":
            print("Vous décidez de vous arrêter.")
            break
    if score_joueur[0] > 21:
        defaite()
    else:
        choix_ordi()

Dès lors que la partie « joueur » est complétée, je pouvais m’atteler au processus de décision de l’ordi en commençant avec les deux cartes piochées au début de son tour.

Que la première carte piochée vaille un ou onze points, cela n’importe guère. Par conséquent, j’ai décidé de laisser le hasard faire les choses :

def choix_ordi():
    carte = randint(0,12)
    print("La première carte du croupier est", paquet[carte])
    if carte == 0: # si la carte du croupier est un as
        As = randint(1,2) # le croupier choisi au hasard entre 1 et 11 points
        if As == 1:
            print("Le croupier préfère que la carte vaille 1 point.")
            carte = 0
        else:
            print("Le croupier préfère que la carte vaille 11 points.")
            carte = 13        
    score_ordi[0] += points[carte]

Par contre, pour la deuxième carte, le processus est légèrement plus complexe.

Tout d’abord, si la première carte était un as à onze points, il est impératif que le croupier opte pour un point pour sa deuxième carte afin de ne pas dépasser vingt-et-un. Ce cas de figure, quand bien même plutôt rare, reste tout de même important à prendre en compte.

Sinon, il faut vérifier si ajouter onze au score du croupier le fait dépasser celui du joueur. Si c’est le cas, le deuxième as devrait correspondre automatiquement à onze points.

Si aucun de ces deux conditions n’est vraie, le croupier choisit au hasard.

carte = randint(0,12)
    print("La seconde carte du croupier est", paquet[carte])
    if carte == 0:
        if score_ordi[0] + 11 > 21: # si ajouter 11 points au score actuel du croupier le fait dépasser 21, l'as vaut 1 point
            print("Le croupier préfère que la carte vaille 1 point.")
            carte = 0
        elif score_ordi[0] + 11 >= score_joueur[0]: # si ajouter 11 points au score actuel du croupier le fait atteindre le score du jouer, l'as vaut 11 points 
            print("Le croupier préfère que la carte vaille 11 points.")
            carte = 13
        else:
            As = randint(1,2) # sinon, le croupier choisi au hasard entre 1 et 11 points
            if As == 1:
                print("Le croupier préfère que la carte vaille 1 point.")
                carte = 0
            else:
                print("Le croupier préfère que la carte vaille 11 points.")
                carte = 13
    score_ordi[0] += points[carte]

La même logique est appliquée pour le reste du tour.

Maintenant que toutes les cartes sont programmées, le projet ne semble plus très loin de sa fin. Encore quelques efforts !

Le système de mises et de banque

Un jeu d’argent ne serait rien sans l’argent lui-même.

La « banque » correspond à la quantité d’argent détenu par le joueur. Dans le code, elle est représentée par une variable globale :

banque = [300]

Par défaut, elle contient trois-cents euros (ce montant sera expliqué plus tard).

J’ajoute au système de banque la possibilité de miser en début de partie grâce à la fonction « miser() » :

mise = [0]

def miser():
    euro = int(input("Combien d'euros souhaitez-vous miser ? "))
    mise[0] = euro
    print()
    base()

La fonction globale « mise » sert à récupérer le montant versé par le joueur pour ensuite, lorsque la partie touche à sa fin, modifier la banque.

Dans la partie « Quelques recherches avant de débuter », j’ai expliqué que les casinos mettent en place un montant maximum pour les mises. J’ai élevé le mien à cent-cinquante euros. Une condition doit être implémentée dans la fonction afin de respecter ce choix.

def miser():
    while True:
    	euro = int(input("Combien d'euros souhaitez-vous miser ? (150 maximum) "))
    	if euro > 150: # si la mise est supérieure à 150
        	print("Vous devez miser en-dessous de 150 €.\n")
    	else:
        	break
    mise[0] = euro
    print()
    base()

Outre le montant de cent-cinquante euros, la mise du joueur ne peut pas dépasser le contenu de sa banque. Par exemple, si la banque du joueur contient cent euros, il ne peut pas en miser cent-cinquante.

def miser():
    while True:
    	euro = int(input("Combien d'euros souhaitez-vous miser ? (150 maximum) "))
    	if euro > 150: # si la mise est supérieure à 150
        	print("Vous devez miser en-dessous de 150 €.\n")
        elif euro > banque[0]: # si la mise est supérieure au contenu de la banque
        	print("Vous ne pouvez pas miser davantage que vous possédez (Votre banque contient", banque[0], "€)\n")
    	else:
        	break
    mise[0] = euro
    print()
    base()

Enfin, une mise négative ou nulle ne peut être acceptée : elle doit valoir au minimum un euro.

def miser():
    while True:
    	euro = int(input("Combien d'euros souhaitez-vous miser ? (150 maximum) "))
    	if euro > 150: # si la mise est supérieure à 150
        	print("Vous devez miser en-dessous de 150 €.\n")
        elif euro > banque[0]: # si la mise est supérieure au contenu de la banque
        	print("Vous ne pouvez pas miser davantage que vous possédez (Votre banque contient", banque[0], "€)\n")
    	elif euro <= 0: # si la mise vaut 0 ou moins
        	print("Vous devez miser davantage afin de pouvoir participer.\n")
        else:
        	break
    mise[0] = euro
    print()
    base()

La fonction est affichée de cette manière dans la console :

Désormais, il ne reste qu’à programmer les conséquences qui viennent modifier la banque lors d’une réussite ou défaite.

Lors d’une défaite, le joueur perd simplement la mise.

def defaite():
    print("Vous avez perdu...")
    banque[0] -= mise[0] # on soustrait à la banque la mise
    print("Votre banque contient", banque[0], "€") # affichage du contenu de la banque
	nouvelle_partie()

def nouvelle_partie():
    rejouer = input("Désirez-vous refaire une partie ? (\"o\" ou \"n\") ")
    if rejouer == "o": # si le joueur veut refaire une partie, son score ainsi que celui du croupier sont réinitialisés
        score_joueur[0] = 0
        score_ordi[0] = 0
        print()
        miser()
    elif rejouer == "n":
        fin()

def fin(): # lorsque le joueur ne veut pas refaire une partie
    print()
    print("À la prochaine !")

Entre autre, j’ai défini deux autres fonctions : « nouvelle_partie() » qui propose au joueur de rejouer et réinitialise les scores, et « fin() » si le joueur veut finir la partie.

Le processus est similaire pour la fonction « reussite() » :

def reussite():
  	print("Vous avez gagné !")
	banque[0] += 2 * mise[0] # on ajoute à la banque le double de la mise
    print("Votre banque contient", banque[0], "€")
    nouvelle_partie()

Une fois ces fonctionnalités programmées, un problème m’a sauté aux yeux : à quoi sert ce système de banque et de mise si, au final, cela n’a pas de conséquences ? Afin de donner un but précis au jeu, j’ai programmé la possibilité de perdre la partie si le contenu de la banque descend à zéro ou moins, ou de la gagner si le contenu atteint les mille euros.

def defaite():
    print("Vous avez perdu...")
    banque[0] -= mise[0]
    print("Votre banque contient", banque[0], "€")
    if banque[0] <= 0: # si la banque est vide, le joueur perd la partie
        print("Vous ne possédez plus assez d'argent pour pouvoir participer.")
        print("Vous êtes complétement ruiné !")
        rejouer = input("Désirez-vous rejouer ? (\"o\" ou \"n\") ")
        if rejouer == "o": # réinitialisation des paramètres
            banque[0] = 300
            score_joueur[0] = 0
            score_ordi[0] = 0
            print()
            miser()
        elif rejouer == "n":
            fin()
    else:
        nouvelle_partie()

Cette partie de code affiche :

def reussite():
  	print("Vous avez gagné !")
	banque[0] += 2 * mise[0]
    print("Votre banque contient", banque[0], "€")
    nouvelle_partie()
	if banque[0] >= 1000: # si le contenu de la banque atteint les 1000 €, le joueur gagne la partie
    	print("Votre banque contient", banque[0], "€ : vous avez atteint les 1000 € !\n")
    	print("Vous gagnez la partie !")
    	fin()
    else:
      	nouvelle_partie()
      

Implémenter ces fonctionnalités m’a également fait prend conscience d’une chose : peut-être que le joueur n’aimerait pas mettre de l’argent en jeu et désirerait simplement faire une partie pour le plaisir. De ce fait, je lui ai donné la possibilité de choisir entre deux modes : le mode « libre », sans mises, ou le mode « casino ».

mode = ["libre"]

mode[0] = input("Quel mode de jeu voulez-vous : libre ou casino ? ")

Ce morceau de code sera intégré à la fonction « menu() » dont je parlerai dans la prochaine partie.

Les modifications causées par le choix du mode sont assez nombreuses ; il est conseillé d’aller vérifier le code lui même donné à la fin de l’article.

Les finitions

Je touchait presque la fin de mon projet, seulement quelques bricoles restaient à régler.

Premièrement, il fallait intégrer les règles du Blackjack au début afin d’informer le joueur. Elles sont affichées grâce à la fonction « menu() », la première à être appelée dans le code.

def menu(): # première chose affichée
    print("Bienvenue au jeu du Blackjack !")
    regles = input("Souhaitez-vous lire les règles ? (\"o\" ou \"n\") ")
    if regles == "o": # affichage des règles
        # [...]
    print()
    mode[0] = input("Quel mode de jeu voulez-vous : libre ou casino ? ")
    if mode[0] == "libre":
        base()
    elif mode[0] == "casino": # contenu de la banque donné pour la première mise, inutile après la première partie
        print()
        print("Votre banque contient", banque[0], "€")
        miser()

Cela nous donne :

(L’entièreté des règles est affichée dans le script donné à la fin de cet article.)

Un autre problème à régler était le rythme du jeu : le texte était affiché en une seule fois, rendant l’expérience de jeu bien laborieuse. Grâce au module time et à sa fonction « sleep() », j’ai pu rendre l’affichage plus lent, imitant presque le chargement d’un vrai jeu vidéo !

Le dernière point le plus complexe à régler était l’espacement entre certaines lignes : afin que l’affichage soit cohérent, les sauts à la ligne doivent conserver la même logique. Je vous épargne toutes les modifications faites, hormis une que je trouve particulièrement pratique :

print()
print("------------------------------------\n")
sleep(1)

Cette barre de séparation aide vraiment à discerner les différentes parties du jeu à l’affichage, ce qui permet au joueur de mieux se repérer dans la partie.

Pour terminer, j’ai quelque peu modifié les choix qui sont présentés au fil d’une partie afin que le joueur ne puisse pas entrer n’importe quoi, grâce à une boucle while :

while True: # choix du mode
	mode[0] = input("Quel mode de jeu voulez-vous : libre ou casino ? ")
    if mode[0] != "libre" and mode[0] != "casino":
    	print("Désolé, mais ce n'est pas un choix proposé.\n")
        sleep(2)
    else:
        break

Et enfin, après quelques ajouts esthétiques, le script est enfin achevé !

Conclusion

Malgré la taille du projet et mon niveau peu haut en matière d’écriture de script, coder ce jeu a été plutôt plaisant, et chaque problème rencontré m’a paru comme une énigme à résoudre. Oui, quelquefois, j’ai été frustré par les bugs qui semblaient impossibles à régler ; mais à force de patience et persévérance, je suis parvenu à un script satisfaisant à mon goût ainsi qu’un jeu qui fonctionne !

Le script à télécharger