Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def marquageDirect(plateau,calque,ancienneVal,nouvelleVal):
- """
- permet de marquer avec nouvelleVal les cases non marquées adjacentes à
- une case marquée par ancienneVal
- paramètres: plateau le plateau considéré
- calque une matrice de la même dimension que le plateau et qui porte le marquage
- ancienneVal la valeur de marquage recherchée
- nouvelleVal la valeur utilisée pour marquer les nouvelle case
- cette fonction ne retourne rien mais modifie le claque
- """
- res = False
- for lig in range(matrice.getNbLignes(calque)):
- for col in range(matrice.getNbColonnes(calque)):
- if matrice.getVal(calque, lig, col) == 0 and matrice.getVal(plateau["plateau"], lig, col) != 1:
- # pas de mur et pas marquer#
- if lig != 0 and matrice.getVal(calque, lig - 1, col) == ancienneVal:
- # voisin du haut#
- setVal(calque, lig, col, nouvelleVal)
- res = True
- elif lig != getNbLignes(calque) - 1 and matrice.getVal(calque, lig + 1, col) == ancienneVal:
- # voisin du bas#
- setVal(calque, lig, col, nouvelleVal)
- res = True
- elif col != 0 and matrice.getVal(calque, lig, col - 1) == ancienneVal:
- # voisin de gauche#
- setVal(calque, lig, col, nouvelleVal)
- res = True
- elif col != getNbColonnes(calque) - 1 and matrice.getVal(calque, lig, col + 1) == ancienneVal:
- # voisin de droite#
- setVal(calque, lig, col, nouvelleVal)
- res = True
- return res
- def casesAccessibles(plateau,listeDepart,distance):
- """
- retourne la liste des cases accessibles sous la forme de liste de couples
- de coordonnées (lig,col)
- paramètres: plateau le plateau considéré
- listeDepart: une liste de couples (lig,col) indiquant les points de départ de la recherche
- distance: un entier positif indiquant de combien de cases on a le droit de se déplacer
- résultat: la liste des case atteignable à partir d'un des départs en utilisant moins de distance déplacements
- """
- result = []
- mat = plateau["plateau"]
- calque = matrice.Matrice(matrice.getNbLignes(mat),matrice.getNbColonnes(mat),0)
- for depart in listeDepart:
- if case.getCategorie(matrice.getVal(mat,depart[0], depart[1])) is not None:
- matrice.setVal(calque, depart[0], depart[1])
- cpt = 1
- nouvellesCasesMarquees = True
- while nouvellesCasesMarquees and cpt <= distance:
- nouvellesCasesMarquees = marquageDirect(calque,mat,cpt, cpt+1)
- cpt+=1
- for lig in range(matrice.getNbLignes(calque)):
- for col in range(matrice.getNbColonnes(calque)):
- if matrice.getVal(calque,lig,col) > 0:
- result.append((lig,col,matrice.getVal(calque,lig,col)))
- return result
- def distancePieces(plateau,lig,col):
- """
- retourne un dictionnaire dont les clés sont les identifiant des pièces et les valeurs la distance
- a parcourir pour atteindre la pièce à partir de la case de coordonnées (lig,col)
- paramètres: plateau le plateau considéré
- lig: le numéro de la ligne de la case considérée
- col: le numéro de la colonne de la case considérée
- résultat: le dictionnaire décrit plus haut
- """
- result = dict()
- mat = plateau["plateau"]
- calque = matrice.Matrice(matrice.getNbLignes(mat),matrice.getNbColonnes(mat),0)
- if case.getCategorie(matrice.getVal(mat,lig, col)) is not None:
- matrice.setVal(calque, lig, col)
- cpt = 1
- nouvellesCasesMarquees = True
- while nouvellesCasesMarquees:
- nouvellesCasesMarquees = marquageDirect(calque,mat,cpt, cpt+1)
- cpt+=1
- for room in getPieces(plateau):
- min = None
- for entry in piece.getListeEntrees(room):
- e_col = entree.getColonne(entry)
- e_lig = entree.getLigne(entry)
- if min is None or min > matrice.getVal(calque, e_lig, e_col):
- result[piece.getNumPiece(room)] = matrice.getVal(calque, e_lig, e_col)
- return result
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement