Chapitre 11. Tout se complique, correction

Correction des exercices du Chapitre 5, Tout se complique....

  1.         import curses
            
            def deplacement(touche,x,y):                  1
                if touche == curses.KEY_DOWN : y += 1
                elif touche == curses.KEY_UP : y -= 1
                elif touche == curses.KEY_LEFT : x -= 1
                elif touche == curses.KEY_RIGHT : x += 1
                return x,y
            
            def controle(x,y):                            2
                if x > xmax-1 : x = xmax-1
                if x < 0 : x=0
                if y > ymax-1 : y = ymax-1
                if y < 0 : y=0
                return x,y
            
            def dessine (x,y):                            3
                if ecran.inch(y,x) == ord(' '):
                    ecran.addch (y,x,'*')
                else:
                    ecran.addch (y,x,' ')
                ecran.move (y,x)
            
            ecran = curses.initscr()
            curses.noecho()
            ecran.keypad(1)
            
            ecran.clear()                                 4
            ymax,xmax = ecran.getmaxyx()
            x = 20
            y = 20
            while 1:
                x,y = controle (x,y) 
                ecran.move(y,x)
                c = ecran.getch()
                if c == ord('q') : break 
                elif c == ord(' ') : dessine (x,y)
                else : x,y = deplacement (c,x,y)
                
            curses.echo()
            curses.endwin()
          

    On remarquera dans ce programme l'utilisation de procédures et fonctions :

    1

    pour le calcul de la nouvelle position du curseur après un éventuel appui sur une des flèches de déplacement ;

    2

    pour le contrôle de la position du curseur ; on l'empêche de sortir des limites imposées ;

    3

    pour changer le dessin de ce qu'il y a sous le curseur : étoile si rien, rien si étoile ;

    4

    corps du programme.

    Elles ne sont pas là pour éviter de répêter le même code à plusieurs endroits du programme (chaque fonction ou procédure n'est utilisée qu'une fois), ce qui est une des principales raisons possibles de leur utilisation.

    Ici elles sont utilisées pour rendre le code plus clair : le corps 4 du programme est plus facile à lire et à comprendre, car il est plus court.

    Vous pouvez comparer avec la version suivante, sans fonction ni procédure, mono-bloc et plus difficile à analyser :

            import curses
            
            ecran = curses.initscr()
            curses.noecho()
            ecran.keypad(1)
            
            ecran.clear()
            ymax,xmax = ecran.getmaxyx()
            x = 20
            y = 20
            while 1:
                if x > xmax-1 : x = xmax-1
                if x < 0 : x=0
                if y > ymax-1 : y = ymax-1
                if y < 0 : y=0
                ecran.move(y,x)
                c = ecran.getch()
                if c == ord('q') : break 
                elif c == ord(' ') :
                    if ecran.inch(y,x) == ord(' '):
                        ecran.addch (y,x,'*')
                    else:
                        ecran.addch (y,x,' ')
                        ecran.move (y,x)
                else :
                    if c == curses.KEY_DOWN : y += 1
                    elif c == curses.KEY_UP : y -= 1
                    elif c == curses.KEY_LEFT : x -= 1
                    elif c == curses.KEY_RIGHT : x += 1
                
            curses.echo()
            curses.endwin()
          

    Cette version reste encore presque facile à comprendre (ce programme n'est pas très long), mais on commence à avoir du mal à y trouver une décomposition logique, alors que c'était immédiat dans la première version.

  2.         import random
            import curses
            import math
            
            ecran = curses.initscr()
            curses.noecho()
            ecran.nodelay(1)
            
            tirages=0
            disque=0
            
            while 1:
                if ecran.getch() == ord('q') : break 
                x = random.random()
                y = random.random()
                tirages += 1
                if x*x+y*y <= 1:
                    disque += 1
                monpi = 4.0*disque/tirages
                ecran.clear()
                ecran.addstr(5,5,str(tirages)+" tirages")
                ecran.addstr(6,5,"pi="+str(monpi))
                ecran.addstr(7,5,"ecart="+str(abs(monpi-math.pi)))
            
            curses.echo()
            curses.endwin()