LABYRINTHE
Soit un labyrinthe simple pour illustrer un algorithme simple.
La démarche consiste a partir de « D » dans le coin nord-ouest et de se rendre au « F » dans le coin sud-est en marchant sur le « gazon » bleu, le noir étant un mur « infranchissable ». Y a-t-il un algorityme récursif pour effectuer ce périple : en effet. Le coeur du code
###########################################
def resout(x,y):
if y > len(maze) or x > len(maze[y]):
return False # une erreur
if maze[y][x] == "F":
return True # rendu à destination
if maze[y][x] != " ":
return False # frappé un mur
if resout(x+1,y) == True : #droite
maze[y][x] = ">"
return True
if resout(x,y+1) == True : #bas
maze[y][x] = "v"
return True
if resout(x-1,y) == True : #gauche
maze[y][x] = "<"
return True
if resout(x,y-1) == True : #haut
maze[y][x] = "^"
return True
#reculer
maze[y][x] = " "
return False
###########################################
Cependant pour « voir » ce qui se passe il faut bourrer le code à chaque tournant. Un delai pour ralentir et nous laisser comprendre et afficher des messages sur la console. L’énoncé « pygame.event.wait() » arrête l’exécution du code et attende une action de l’utilisateur : clavier, mouvement de la souris. Ça donne le code suivant :
###################################################
def resout(niv,x,y):
print("entrée niv=",niv)
pg.event.wait()
time.sleep(delai)
if y > len(maze) or x > len(maze[y]):
print("sortie niv=", niv,"Erreur")
return False
if maze[y][x] == "F":
print("sortie niv=", niv,"terminé, chemin de retour")
time.sleep(5*delai)
return True
if maze[y][x] != " ":
print("sortie niv=", niv,"pas d'espace, on recul")
return False
#marquage
maze[y][x] = "o"
affMaze(win,maze)
if resout(niv+1,x+1,y) == True : #droite
maze[y][x] = ">"
affMaze(win, maze)
time.sleep(delai)
print("sortie niv=", niv,"droite")
return True
if resout(niv+1,x,y+1) == True : #bas
maze[y][x] = "v"
affMaze(win, maze)
time.sleep(delai)
print("sortie niv=", niv,"bas")
return True
if resout(niv+1,x-1,y) == True : #gauche
maze[y][x] = "<"
affMaze(win, maze)
time.sleep(delai)
print("sortie niv=", niv,"gauche")
return True
if resout(niv+1,x,y-1) == True : #haut
maze[y][x] = "^"
affMaze(win, maze)
time.sleep(delai)
print("sortie niv=", niv,"haut")
return True
#recul
maze[y][x] = " "
affMaze(win,maze)
print("sortie niv=", niv, "recul")
return False
###########################################