Attention aux bords

# -*- coding: utf-8 -*-
import curses  # pour le dessin
import time    # pour la mesure du temps d'attente

# renvoie la nouvelle direction après appui sur la touche "DROITE"
def droite() :
    if direction == DROITE : return BAS
    elif direction == BAS : return GAUCHE
    elif direction == GAUCHE : return HAUT
    else : return DROITE

# renvoie la nouvelle direction après appui sur la touche "GAUCHE"
def gauche() :
    if direction == DROITE : return HAUT
    elif direction == HAUT : return GAUCHE
    elif direction == GAUCHE : return BAS
    else : return DROITE

# calcule la nouvelle position et place le serpent
def deplace() :
    l = ligne + direction[LGN]
    c = colonne + direction[COL]
    ecran.addch(l,c,'O')
    return l,c

# ===================================
#              NOUVEAU
# ===================================
# teste si on a touché les bords
def touche() :
    return (ligne <= 0) or (colonne <= 0) or (ligne >= hauteur-1) or (colonne >= largeur-1)

# affiche un message (s) au centre de l'écran
def message(s) :
    vide = (largeur-len(s))/2                   # longueur libre de chaque côté du message
    debut = hauteur/2 - 2                       # hauteur d'affichage du message
    ecran.addstr(debut  ,0,largeur*"=")         # un trait au-dessus
    ecran.addstr(debut+1,0,vide*" "+s+vide*" ") # message au centre de la ligne
    ecran.addstr(debut+2,0,largeur*"=")         # un trait au-dessous
    ecran.nodelay(False)                        # attente sur les getch()
    ecran.getch()                               # pour attendre...
    
# dessine le bord du terrain
def bord():
    ecran.addstr(0,0,largeur*"+")          # bord du haut
    ecran.addstr(hauteur-1,0,largeur*"+")  # bord du bas
    for lg in range(1,hauteur-1):          # les côtés :
        ecran.addstr(lg,0,"+")             #    à gauche   
        ecran.addstr(lg,largeur-1,"+")     #    à droite
# ===================================

    
ecran = curses.initscr() # intialisation de l'écran
ecran.nodelay(True)      # pas d'attente sur getch()
ecran.keypad(True)       # UN code sur les touches de fonctions
curses.curs_set(False)   # cacher le curseur

# définitions des directions de déplacement
DROITE = (0,1)
GAUCHE = (0,-1)
HAUT = (-1,0)
BAS = (1,0)

# indices pour les accès aux éléments d'un couple de  coordonénes
LGN = 0
COL = 1

# initialisations du positionnement du serpent
hauteur, largeur = ecran.getmaxyx() # taille de l'écran
ligne,colonne = hauteur/3,largeur/3 # position (de départ : arbitraire!)
direction = DROITE                  # directon (de départ : arbitraire!)
largeur -= 1                        # NOUVEAU : pour ne pas accéder à la dernière colonne
                                    # (bord : pb d'affichage dans coin en bas à droite)


c=''                          # pour que c existe à la ligne suivante
while c <> ord('q'):          # tant qu'on n'a pas appuyé sur la touche 'q'
    ecran.clear()             # effacer l'écran
    bord()                    # dessin du bord du terrain
    ligne,colonne = deplace() # calcule la nouvelle position et place le serpent
    if touche() :             # si on touche le bord ...
        message ('Perdu !')   #   ... affichage du message "Perdu!"
        break                 #   ... sortie de la boucle while (donc fin du programme)
    time.sleep(0.1)           # attente pour ralentir (arbitraire!)
    c=ecran.getch()           # saisie de l'appui sur une touche du clavier
    if c == curses.KEY_LEFT: direction = gauche()
                              # on tourne à gauche
    elif c == curses.KEY_RIGHT: direction = droite()
                              # on tourne à droite

# remettre l'écran en "bon" état
curses.endwin()               # sortie du mode "curses"
print "\n\n\tF I N I !\n\n"   # message de fin!