[TP] Le jeu du plus ou moins

Vous connaissez certainement le plus ou moins. Vous avez peut être même une petite version qui traîne sur votre ordinateur !

Nous allons mettre ce jeu un peu à jour en le refaisant mais avec une interface graphique. Je vais donc vous faire réaliser la version minimale du jeu, ce sera à vous d’ajouter toutes les options que vous voudrez. Le but ? Obtenir un plus ou moins le plus complet au monde ! :soleil:

Consignes

Bon, les règles du plus ou moins sont très simples. L’ordinateur tire un nombre compris entre 0 et 100 et l’utilisateur doit le trouver. Le programme lui indiquant seulement si le nombre cherché est supérieur ou inférieur que le nombre entré.

Voici la version que je vous conseille de commencer à faire :

La version la plus simple possible du jeu du plus ou moins

Ça ne se voit pas, mais en appuyant sur la touche Entrée, ça fonctionne aussi. De plus, si vous comptez utiliser vous aussi un Gtk.SpinButton pensez à bien désactiver l’incrémentation par les boutons + et - ! Sinon l’utilisateur a juste à rester appuyé jusqu’à voir la réponse apparaître.

Correction

Et hop, voici la correction de la version basique.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python3
# coding: utf-8

from gi.repository import Gtk
from random import randint


def on_validate(widget, label, entry=None):
    '''
    Fonction callback appellée quand l'utilisateur valide un nombre
    '''
    global random_nb

    # Soit c'est un bouton qui est passé dans l'agument widget, soit le SpinButton
    # On vérifie :
    if entry is not None:
        user_nb = int(entry.get_value())
    else:
        user_nb = int(widget.get_value())

    # On change le texte
    if user_nb > random_nb:
        label.set_text('La solution est inférieur à {}.'.format(user_nb))
    elif user_nb < random_nb:
        label.set_text('La solution est supérieur à {}.'.format(user_nb))
    else:
        label.set_text('Bravo, vous avez trouvé la bonne réponse !')


def build_interface():
    '''
    Construit toute l'interface et en retourne le layout la contenant
    '''
    # Le layout principal
    main_layout = Gtk.Grid()

    # Espacement entre les colonnes et entre les lignes
    main_layout.set_column_spacing(6)
    main_layout.set_row_spacing(6)
    # On autorise l'homogénéité des lignes
    main_layout.set_column_homogeneous(True)

    # La zone de texte où l'utilisateur va pouvoir entrer un nombre
    # Notre adjustement va de 0 à 100 en empechant l'incrémentation
    adjustment = Gtk.Adjustment(0, 0, 100, 0, 10, 0)

    # Le label qui affichera l'état de la partie
    printer = Gtk.Label('Rentrez un nombre et validez !')

    number_entry = Gtk.SpinButton()
    number_entry.set_adjustment(adjustment)  # On lui assigne l'ajustement
    number_entry.set_numeric(True)  # On accepte seulement les nombres
    # L'entrée sera passée automatiquement en paramètre pas besoin de le préciser
    number_entry.connect('value-changed', on_validate, printer)

    # Le bouton valider
    ok_btn = Gtk.Button(label='Valider')
    # Ici l'entrée n'est pas passée automatiquement, on le fait manuellement
    ok_btn.connect('clicked', on_validate, printer, number_entry)

    # On les attache tous
    main_layout.attach(number_entry, 0, 0, 1, 1)
    main_layout.attach(ok_btn, 1, 0, 1, 1)
    main_layout.attach(printer, 0, 1, 2, 1)

    # On retourne le layout principal contenant toute notre interface
    return main_layout

if __name__ == '__main__':
    window = Gtk.Window()

    window.set_title('Plus ou moins')  # On assigne un titre à notre fenêtre
    window.set_border_width(10)  # Des bordures de 10px pour l'esthétisme

    window.connect('delete-event', Gtk.main_quit)

    main_layout = build_interface()
    window.add(main_layout)

    # On tire un nombre aléatoire entre 0 et 100 compris
    random_nb = randint(0, 100)

    window.show_all()
    Gtk.main()

Améliorations

Ce programme est beaucoup trop simple ! Voici quelques idées d’amélioration :

  • Un bouton pour recommencer une partie
  • Sélecteur de niveau, de 0 à 100 étant le niveau bac à sable !
  • Une icône pour le programme
  • Un système de score
  • Un classement des meilleurs scores
  • Une sous fenêtre expliquant les règles
  • Faire la version la plus horrible du siècle

Les possibilités sont infinies. Je suis sûr que vous allez réussir à faire quelque chose de super !


J’espère que vous vous serez bien amusé avec ce plus ou moins. Vous pouvez passer désormais passer à la seconde partie.