Jeu de la vie, TP n°3

Modification interactive de l'affichage avec curses

  1. Même chose, mais en appuyant sur la barre d'espacement, on change l'état de la cellule : si la case est vide, une étoile s'affiche, si il y avait une étoile elle se vide.
    interaction05.py [Cacher les numéros de ligne]
    1. # -*- coding: utf-8 -*-
    2. import curses
    3.  
    4. ###################################
    5. ####    CREATION DU TABLEAU    ####
    6. ###################################
    7. def creation() :
    8.     global tableau
    9.     for l in range(0,maxl) :        # pour chaque ligne
    10.         tableau.append([vide]*maxc) # créer la ligne
    11.  
    12. #########################
    13. ####    AFFICHAGE    ####
    14. #########################
    15. def affichagedessin() :
    16.     for l in range(0,maxl-1) :                      # pour chaque ligne
    17.         for c in range(0,maxc-1) :                  # pour chaque colonne
    18.             ecran.addstr(l,c,tableau[l][c],NORMAL)  # afficher la case
    19.  
    20. ###############################
    21. ####    INITIALISATIONS    ####
    22. ###############################
    23. ecran=curses.initscr()       # création de l'écran "graphique"
    24. ecran.keypad(True)           # codage des touches de fonctions en 1 octet
    25. curses.curs_set(False)       # pas d'affichage du curseur
    26. curses.start_color()         # utilisation des couleurs
    27. # premier jeu de couleur pour l'affichage normal
    28. curses.init_pair(1,curses.COLOR_WHITE,curses.COLOR_BLACK)
    29. NORMAL=curses.color_pair(1)+curses.A_BOLD
    30. # deuxième jeu de couleur pour l'affichage inversé
    31. curses.init_pair(2,curses.COLOR_BLACK,curses.COLOR_WHITE)
    32. INVERSE=curses.color_pair(2)+curses.A_BOLD
    33. tableau=[]                   # création du tableau vide
    34. plein="*"                    # contenu d'une case pleine
    35. vide=" "                     # contenu d'une case vide
    36. (maxl,maxc)=ecran.getmaxyx() # dimensions de l'écran
    37. creation()                   # initialisation du terrain
    38.  
    39. ##################################
    40. ####    CORPS DU PROGRAMME    ####
    41. ##################################
    42. ligne=1                     # position verticale initiale du curseur
    43. colonne=1                   # position horizontale initiale du curseur
    44. unetouche=0                 # pour pouvoir entrer dans la boucle
    45. while unetouche!=ord("q") : # tant que pas appuyé sur Q
    46.     if (unetouche==curses.KEY_RIGHT) and (colonne<maxc-2) : # à droite
    47.         colonne+=1
    48.     elif (unetouche==curses.KEY_LEFT) and (colonne>0) :     # à gauche
    49.         colonne-=1
    50.     elif (unetouche==curses.KEY_UP) and (ligne>0) :         # en haut
    51.         ligne-=1
    52.     elif (unetouche==curses.KEY_DOWN) and (ligne<maxl-2) :  # en bas
    53.         ligne+=1
    54.     elif unetouche==ord(" ") :                       # barre d'espace
    55.         if tableau[ligne][colonne]==vide :           #  -> change d'état
    56.             tableau[ligne][colonne]=plein
    57.         else :
    58.             tableau[ligne][colonne]=vide
    59.     ecran.clear()                   # effacer l'écran
    60.     affichagedessin()               # affichage de l'espace complet
    61.     ecran.addch(ligne,colonne,tableau[ligne][colonne],INVERSE) # curseur
    62.     unetouche=ecran.getch()         # attente d'une frappe clavier
    63.  
    64. curses.endwin()                     # revenir à la console
  2. Un menu sous curses permet de sélectionner un choix gràce aux touches haut et bas du clavier. Une fois le choix fait on appuie sur la touche d'espacement et le programme dit quel est le choix effectué.
    interaction06.py [Cacher les numéros de ligne]
    1. # -*- coding: utf-8 -*-
    2. import curses
    3. ecran= curses.initscr()    # initialisation de l'écran graphique
    4. ecran.keypad(True)         # codage des touches de fonctions en 1 octet
    5. curses.curs_set(False)     # pas d'affichage du curseur
    6. curses.start_color()       # utilisation des couleurs
    7. # premier jeu de couleur pour l'affichage normal
    8. curses.init_pair(1,curses.COLOR_WHITE,curses.COLOR_BLACK)
    9. NORMAL=curses.color_pair(1)+curses.A_BOLD
    10. # deuxième jeu de couleur pour l'affichage inversé
    11. curses.init_pair(2,curses.COLOR_BLACK,curses.COLOR_WHITE)
    12. INVERSE=curses.color_pair(2)+curses.A_BOLD
    13. choisir=[ord(" ")]               # liste des touches pour sortir
    14. liste=["hasard","dessin de la configuration"]    # liste des messages
    15. l0,c0=4,4                        # décalages horizontal et vertical
    16. # message d'invite
    17. ecran.addstr(l0-1,c0,"Faites votre choix, puis appuyez sur \"espace\" :")
    18. # calcul de longueur maximale
    19. l=0
    20. for phrase in liste :
    21.     if len(phrase)>l :
    22.         l=len(phrase)
    23. # égalisation des longueurs des message
    24. for i in range(0,len(liste)) :
    25.     while len(liste[i])<l :
    26.         liste[i]+=" "
    27. choix=0                       # initialisation du choix
    28. k=0                           # touche tapée
    29. while k not in choisir :      # TQ pas appuyé sur une touche de sortie
    30.     if k==curses.KEY_DOWN :   # descendre
    31.         choix=(choix+1) % len(liste)
    32.     elif k==curses.KEY_UP :   # monter
    33.         choix=(choix-1) % len(liste)
    34.     # afficher les messages
    35.     for i in range(0,len(liste)) :
    36.         if i==choix :         # le choix actuellement sélectionné
    37.             ecran.addstr(l0+i,c0+2," "+liste[i]+" ",INVERSE)
    38.         else :                # un autre choix
    39.             ecran.addstr(l0+i,c0+2," "+liste[i]+" ",NORMAL)
    40.     k=ecran.getch()                        # attendre frappe au clavier
    41. curses.endwin()                            # revenir à la console
    42. print "\nChoix : "+liste[choix]+"\n"       # afficher le choix
Dernière modification : 25/8/2016