remi-riandiere / ProjetLabyrinthe

0 stars 0 forks source link

Carte.py #4

Open MamanGvomi opened 6 years ago

MamanGvomi commented 6 years ago

#!/usr/bin/python3 -i
import random

"""
la liste des caractères semi-graphiques correspondant aux différentes cartes
l'indice du caractère dans la liste correspond au codage des murs sur la carte
le caractère 'Ø' indique que l'indice ne correspond pas à une carte
"""
listeCartes=['╬','╦','╣','╗','╩','═','╝','Ø','╠','╔','║','Ø','╚','Ø','Ø','Ø']
CarteExemple4={'Mur': {'ouest', 'nord'}, 'Trésor':2, 'pions': [1,4]}
CarteExemple2={'Mur': {'ouest'}, 'Trésor': 0, 'pions': []}
CarteExemple={'Mur': {'ouest', 'nord'}, 'Trésor': 0, 'pions': []}
CarteExemple3={'Mur': {'ouest', 'nord'}, 'Trésor': 0, 'pions': [1,4]}
CarteExemple5={'Mur': {'ouest', 'nord'}, 'Trésor': 4, 'pions': [1,4]}
CarteExemple6={'Mur': {'ouest', 'nord'}, 'Trésor': 0, 'pions': [1,4]}

def Carte( nord, est, sud, ouest, tresor=0, pions=[]):
    """
    permet de créer une carte:
    paramètres:
    nord, est, sud et ouest sont des booléens indiquant s'il y a un mur ou non dans chaque direction
    tresor est le numéro du trésor qui se trouve sur la carte (0 s'il n'y a pas de trésor)
    pions est la liste des pions qui sont posés sur la carte (un pion est un entier entre 1 et 4)
    """
    Carte={}
    Carte["Mur"]=set()
    if nord:
        Carte["Mur"].add("nord")
    if est:
        Carte["Mur"].add("est")
    if sud:
        Carte["Mur"].add("sud")
    if ouest:
        Carte["Mur"].add("ouest")
    Carte["Trésor"]=tresor
    Carte["pions"]=pions
    return Carte

assert Carte(True,False,False,True)=={'Mur': {'ouest', 'nord'}, 'Trésor': 0, 'pions': []}

def estValide(c):
    """
    retourne un booléen indiquant si la carte est valide ou non c'est à dire qu'elle a un ou deux murs
    paramètre: c une carte
    """
    NbMur=len(c["Mur"])
    if NbMur==1:
        return True
    if NbMur==2:
        return True
    return False

assert estValide(CarteExemple)==True
assert estValide(CarteExemple2)==True

def murNord(c):
    """
    retourne un booléen indiquant si la carte possède un mur au nord
    paramètre: c une carte
    """
    return "nord" in c["Mur"]

assert murNord(CarteExemple)==True
assert murNord(CarteExemple2)==False

def murSud(c):
    """
    retourne un booléen indiquant si la carte possède un mur au sud
    paramètre: c une carte
    """
    return "sud" in c["Mur"]

assert murSud(CarteExemple)==False
assert murSud(CarteExemple2)==False

def murEst(c):
    """
    retourne un booléen indiquant si la carte possède un mur à l'est
    paramètre: c une carte
    """
    return "est" in c["Mur"]

assert murEst(CarteExemple)==False
assert murEst(CarteExemple2)==False

def murOuest(c):
    """
    retourne un booléen indiquant si la carte possède un mur à l'ouest
    paramètre: c une carte
    """
    return "ouest" in c["Mur"]

assert murOuest(CarteExemple)==True
assert murOuest(CarteExemple2)==True

def getListePions(c):
    """
    retourne la liste des pions se trouvant sur la carte
    paramètre: c une carte
    """
    return c["pions"]

assert getListePions(CarteExemple)==[]

def setListePions(c,listePions):
    """
    place la liste des pions passées en paramètre sur la carte
    paramètres: c: est une carte
                listePions: la liste des pions à poser
    Cette fonction ne retourne rien mais modifie la carte
    """
    c["pions"]=listePions

def getNbPions(c):
    """
    retourne le nombre de pions se trouvant sur la carte
    paramètre: c une carte
    """
    return len(c["pions"])
assert getNbPions(CarteExemple)==0

def possedePion(c,pion):
    """
    retourne un booléen indiquant si la carte possède le pion passé en paramètre
    paramètre: c une carte
    """
    return pion in c["pions"]

assert possedePion(CarteExemple3,3)==False
assert possedePion(CarteExemple3,4)==True

def getTresor(c):
    """
    retourne la valeur du trésor qui se trouve sur la carte (0 si pas de trésor)
    paramètre: c une carte
    """
    return c["Trésor"]

assert getTresor(CarteExemple)==0

def prendreTresor(c):
    """
    enlève le trésor qui se trouve sur la carte et retourne la valeur de ce trésor
    paramètre: c une carte
    Cette fonction modifie la carte mais ne retourne rien
    """
    AncienTrésor=c["Trésor"]
    c["Trésor"]=0
    return AncienTrésor

assert prendreTresor(CarteExemple4)==2

def mettreTresor(c,tresor):
    """
    met le trésor passé en paramètre sur la carte et retourne la valeur de l'ancien trésor
    paramètres: c une carte
                tresor un entier positif
    Cette fonction modifie la carte mais ne retourne rien
    """
    AncienTrésor=c["Trésor"]
    c["Trésor"]=tresor
    return AncienTrésor

assert prendreTresor(CarteExemple5)==4

def prendrePion(c, pion):
    """
    enlève le pion passé en paramètre de la carte. Si le pion n'y était pas ne fait rien
    paramètres: c une carte
                pion un entier compris entre 1 et 4
    Cette fonction modifie la carte mais ne retourne rien
    """
    if pion in c["pions"]:
        c["pions"].remove(pion)

def poserPion(c, pion):
    """
    pose le pion passé en paramètre sur la carte. Si le pion y était déjà ne fait rien
    paramètres: c une carte
                pion un entier compris entre 1 et 4
    Cette fonction modifie la carte mais ne retourne rien
    """
    if pion not in c["pions"]:
        c["pions"].append(pion)

def tournerHoraire(c):
    """
    fait tourner la carte dans le sens horaire
    paramètres: c une carte
    Cette fonction modifie la carte mais ne retourne rien
    """
    NvxMur=set()
    if "nord" in c["Mur"]:
        NvxMur.add("est")
    if "est" in c["Mur"]:
        NvxMur.add("sud")
    if "sud" in c["Mur"]:
        NvxMur.add("ouest")
    if "ouest" in c["Mur"]:
        NvxMur.add("nord")
    c["Mur"]=NvxMur

def tournerAntiHoraire(c):
    """
    fait tourner la carte dans le sens anti-horaire
    paramètres: c une carte
    Cette fonction modifie la carte mais ne retourne rien
    """
    print(c)
    NvxMur=set()
    if "nord" in c["Mur"]:
        NvxMur.add("ouest")
    if "est" in c["Mur"]:
        NvxMur.add("nord")
    if "sud" in c["Mur"]:
        NvxMur.add("est")
    if "ouest" in c["Mur"]:
        NvxMur.add("sud")
    c["Mur"]=NvxMur
    print(c)
def tourneAleatoire(c):
    """
    faire tourner la carte d'un nombre de tours aléatoire
    paramètres: c une carte
    Cette fonction modifie la carte mais ne retourne rien
    """
    NbTours=random.randint(1,10)
    for i in range(NbTours):
        sens=random.randint(0,1)
        if sens==0:
            tournerAntiHoraire(c)
        else:
            tournerHoraire(c)

def coderMurs(c):
    """
    code les murs sous la forme d'un entier dont le codage binaire
    est de la forme bNbEbSbO où bN, bE, bS et bO valent
       soit 0 s'il n'y a pas de mur dans dans la direction correspondante
       soit 1 s'il y a un mur dans la direction correspondante
    bN est le chiffre des unité, BE des dizaine, etc...
    le code obtenu permet d'obtenir l'indice du caractère semi-graphique
    correspondant à la carte dans la liste listeCartes au début de ce fichier
    paramètre c une carte
    retourne un entier indice du caractère semi-graphique de la carte
    """
    indice=0
    if "nord" in c["Mur"]:
        indice+=1
    if "est" in c["Mur"]:
        indice+=2
    if "sud" in c["Mur"]:
        indice+=4
    if "ouest" in c["Mur"]:
        indice+=8
    return indice

def decoderMurs(c,code):
    """
    positionne les murs d'une carte en fonction du code décrit précédemment
    paramètres c une carte
               code un entier codant les murs d'une carte
    Cette fonction modifie la carte mais ne retourne rien
    """
    indice=[]
    Mur=set()
    codeBin=list(bin(code))
    del codeBin[0]
    del codeBin[0]
    for i in range(1,len(codeBin)+1):
        if codeBin[-i]=="1":
            indice.append(i)
    print(indice)
    if 1 in indice:
        Mur.add("nord")
    if 2 in indice:
        Mur.add("est")
    if 3 in indice:
        Mur.add("sud")
    if 4 in indice:
        Mur.add("ouest")
    c["Mur"]=Mur

def toChar(c):
    """
    fournit le caractère semi graphique correspondant à la carte (voir la variable listeCartes au début de ce script)
    paramètres c une carte
    """
    indiceSemiGraph=coderMurs(c)
    return listeCartes[indiceSemiGraph]

def passageNord(carte1,carte2):
    """
    suppose que la carte2 est placée au nord de la carte1 et indique
    s'il y a un passage entre ces deux cartes en passant par le nord
    paramètres carte1 et carte2 deux carte
    résultat un booléen
    """
    return "nord" not in carte1["Mur"] and "sud" not in carte2["Mur"]

def passageSud(carte1,carte2):
    """
    suppose que la carte2 est placée au sud de la carte1 et indique
    s'il y a un passage entre ces deux cartes en passant par le sud
    paramètres carte1 et carte2 deux carte
    résultat un booléen
    """
    return "sud" not in carte1["Mur"] and "nord" not in carte2["Mur"]

def passageOuest(carte1,carte2):
    """
    suppose que la carte2 est placée à l'ouest de la carte1 et indique
    s'il y a un passage entre ces deux cartes en passant par l'ouest
    paramètres carte1 et carte2 deux carte
    résultat un booléen
    """
    return "ouest" not in carte1["Mur"] and "est" not in carte2["Mur"]

def passageEst(carte1,carte2):
    """
    suppose que la carte2 est placée à l'est de la carte1 et indique
    s'il y a un passage entre ces deux cartes en passant par l'est
    paramètres carte1 et carte2 deux carte
    résultat un booléen
    """
    return "est" not in carte1["Mur"] and "ouest" not in carte2["Mur"]