Python Homework Assignment
from turtle import Turtle,Screen import math import random t = Turtle() screen = Screen() def iota(n): #Si n non positif if n < 0: return False #Append i au tableau else: tab = [] for i in range(n): tab.append(i) #Mettre tableau en ordre (optionel) tab.sort() return tab def contient(tab, x): i = 0 #Tant qu'on atteint pas la fin de la liste while i != len(tab): #Si la valeur a l'indice i == x.. if tab[i] == x: return True i += 1 else: return False def ajouter(tab, x): #Si x n'est pas dans le tableau #append x if x not in tab: tab.append(x) return tab def retirer(tab, x): #Boucle while pour enlever les doublons #ex: [9,9,9], on veut enlever tous les 9 #jusqu'a ce qu'ils soient tous enlevés while x in tab: tab.remove(x) return tab # def xy2no(x, y, nx): return x + y * nx # def no2x(no, nx): return no%nx # def no2y(no, nx): return math.floor(no/nx) # def voisins(x, y, nx, ny): tab = [] no = xy2no(x, y, nx) if y > 0: tab.append(no - nx) elif x > 0: tab.append(no - 1) elif x + 1 < nx: tab.append(no + 1) elif y + 1 < ny: tab.append(no + nx) return tab ###### # def dessinerMurV(murV, pas, nx, ny): xCenterOffset = nx/2 * pas yCenterOffset = ny/2 * pas x = murV % (nx + 1) * pas - xCenterOffset y = yCenterOffset - math.floor(murV / (nx+1)) * pas t.pu() t.goto(x,y) t.pd() t.goto(x,y-pas) # def dessinerMurH(murH, pas, nx, ny): xCenterOffset = nx/2 * pas yCenterOffset = ny/2 * pas x = murH * nx * pas - xCenterOffset y = yCenterOffset - math.floor(murH/nx) * pas t.pu() t.goto(x,y) t.pd() t.goto(x + pas, y) # def dessinerMurs(murs, pas, nx, ny): for i in range(murs.get(v)[i]): dessinerMurV(murs.get(h)[i], pas, nx, ny) for i in range(murs.get(h)[i]): dessinerMurH(murs.get(h)[i], pas, nx, ny) ##### # # def creerMurs(nx,ny): return iota(nx*(ny+1)), iota(ny*(nx+1)) # def creerCave(nx,ny): return math.floor(random.random() * nx * ny) # def creerFront(cavite, nx, ny): return voisins(no2x(cavite, nx) , no2y(cavite,nx), nx, ny) # def obtenirNouvCavite(front): return front[math.floor(random.random() * len(front))] # def retirerMursHorEntreeSortie(murs): return murs.slice[1:-1], murs.get(v) # def retirerMur(murs, nouvCavite, caviteVoisine, nx): mursH = murs.get(h) mursV = murs.get(v) xNouvCavite = no2x(nouvCavite, nx) yNouvCavite = no2y(nouvCavite, nx) xCaviteVoisine = no2x(caviteVoisine, nx) yCaviteVoisine = no2y(caviteVoisine, nx) if xNouvCavite == xCaviteVoisine: #> ? murRetirer = xNouvCavite + (yNouvCavite + (yCaviteVoisine > yNouvCavite)) * nx mursH = retirer(mursH,murRetirer) else: murRetirer = (xCaviteVoisine > xNouvCavite) + xNouvCavite + yNouvCavite * (nx + 1) mursV = retirer(mursV, murRetirer) return mursH, mursV # def obtenirVoisins(nouvCavite, nx, ny, cave): voisinsCave = [] voisinsFront = [] voisinsNouvCavite = voisins(no2x(nouvCavite, nx), no2y(nouvCavite, nx), nx, ny) for i in range(len(voisinsNouvCavite)): if contient(cave, voisinsNouvCavite[i]): voisinsCave.append(voisinsNouvCavite[i]) else: voisinsFront.append(voisinsNouvCavite[i]) caviteVoisine = voisinsCave[math.floor(random.random() * len(voisinsCave))] cavite = caviteVoisine front = voisinsFront return cavite, front # def ajouterCavite(cave, nouvCavite): return ajouter(cave, nouvCavite) # def obtenirNouvFront(front, nouvCavite, voisinsFront): nouvFront = retirer(front, nouvCavite) for i in range(len(voisinsFront)): nouvFront = ajouter(nouvFront, voisinsFront[i]) return nouvFront # def genererLaby(nx, ny, pas): murs = creerMurs(nx, ny) cave = creerCave(nx, ny) front = creerFront(cave, nx, ny) while len(front) != 0: nouvCavite = obtenirNouvCavite(front) voisins = obtenirVoisins(nouvCavite, nx, ny, cave) murs = retirerMur(murs, nouvCavite, voisins.cavite, nx) cave = ajouterCavite(cave, nouvCavite) front = obtenirNuvFront(front, nouvCavite, voisins.front) murs = retirerMursHorEntreeSortie(front, nouvCavite, voisins.front) return murs # def noMurN(x,y,nx): return x+y*nx # def noMurS(x, y, nx): return (x + (y+1) *nx) # def noMurE(x, y, nx): return (1 + x + y * (nx+1)) # def noMurO(x, y, nx): return (x + y * (nx + 1)) # def obtenirDirectionNormalisee(direction): return (4 + (direction % 4)) % 4 # def murDevantExiste(position, direction, nx, murs): noMur = [noMurS, noMurE, noMurN, noMurO] idx = obtenirDirectionNormalisee(direction) if idx%2 == 0: mursContient = murs.get(h) else: mursContient = murs.get(v) return contient(mursContient, noMur[idx](x,y,nx)) # def murDroitExiste(position, direction, nx, murs): noMur = [noMurO, noMurS, noMurE, noMurN] idx = obtenirDirectionNormalisee(direction) if idx % 2 == 0: mursContient = murs.get(h) else: mursContient = murs.get(v) return contient(mursContient, noMur[idx](x, y, nx)) ### # def laby(nx, ny, pas): mursLaby = genererLaby(nx, ny, pas) dessinerMurs(mursLaby, pas, nx, ny) laby(10, 9, 20) def laby(nx, ny, pas): cs() mursLaby = genererLaby(nx, ny, pas) dessinerMurs(mursLaby, pas, nx, ny) def labySol(nx, ny, pas): cs() mursLaby = genererLaby(nx, ny, pas) dessinerMurs(mursLaby, pas, nx, ny) resoudreLaby(nx, ny, pas, mursLaby)