def charger_niveau(joueur: list, caisses: list, cibles: list, murs: list, path: str): """ Fonction permettant de charger depuis un fichier.txt et de remplir les différentes listes permettant le fonctionnement du jeu (joueur, caisses, murs, cibles) :param joueur: liste des personnages :param caisses: liste des caisses :param cibles: liste des cibles :param murs: liste des murs :param path: chemin du fichier.txt :return: """ # Lecture des lignes du fichier et stockage dans une matrice 2D x:y telle que 9:6 mx = [] cases_vides = [] x = y = 0 with open(path, 'r') as file_level: mx = file_level.readlines() mx = [row.rstrip('\n') for row in mx] # Recherche les differents éléments dans la matrice et crée l'image correspondante sur le board selon les fonctions outils données for i in range(len(mx)): x = int(X_PREMIERE_CASE + DISTANCE_ENTRE_CASE / 2 + i * 32) for j in range(len(mx[i])): y = int(Y_PREMIERE_CASE + DISTANCE_ENTRE_CASE / 2 + j *32) if mx[i][j] == '#': # Mur murs.append(creer_mur(x,y)) elif mx[i][j] == '-': # Case_vide cases_vides.append(creer_case_vide(x,y)) elif mx[i][j] == '.': # Cible cibles.append(creer_cible(x,y)) elif mx[i][j] == '$': # Caisse caisses.append(creer_caisse(x,y)) elif mx[i][j] == '@': # Personnage joueur.append(creer_personnage(x,y))
def charger_niveau(joueur, caisses, cibles, murs, path): ''' Fonction permettant de charger depuis un fichier.txt et de remplir les différentes listes permettant le fonctionnement du jeu (joueur, caisses, murs, cibles) :param joueur: liste des personnages :param caisses: liste des caisses :param cibles: liste des cibles :param murs: liste des murs :param path: Chemin du fichier.txt :return: ''' listeEndroitsVides: list = [] fichier = open(path, 'r') lignes: list = fichier.readlines() cptLigne: int = 0 for ligne in lignes: y: int = int(Y_PREMIERE_CASE + DISTANCE_ENTRE_CASE / 2 + cptLigne * 32) cptColonnes: int = 0 for caractere in ligne: x: int = int(X_PREMIERE_CASE + DISTANCE_ENTRE_CASE / 2 + cptColonnes * 32) if caractere == '#': murs.append(creer_mur(x, y)) elif caractere == '@': joueur.append(creer_personnage(x, y)) elif caractere == '.': cibles.append(creer_cible(x, y)) elif caractere == '$': caisses.append(creer_caisse(x, y)) elif caractere == '-': listeEndroitsVides.append(creer_case_vide(x, y)) cptColonnes += 1 cptLigne += 1 fichier.close()
def effectuer_mouvement(coordonnee_destination, coordonnee_case_suivante, ancienne_caisse, caisses, murs, joueur, can, deplace_caisse_x, deplace_caisse_y, deplace_joueur_x, deplace_joueur_y, liste_image): ''' Fonction permettant d'effectuer le déplacement ou de ne pas l'effectuer si celui-ci n'est pas possible. Voir énoncé "Quelques règles". Cette methode est appelée par mouvement. :param coordonnee_destination: variable CaseVide ayant possiblement des coordonnées identiques à une autre variable (murs, caisse, casevide) :param coordonnee_case_suivante: variable CaseVide ayant possiblement des coordonnées identiques à une autre variable (murs, caisse, casevide) mais représente la case après coordonnee_destination :param ancienne_caisse: variable utile pour supprimer l'ancienne caisse (après avoir déplacé celle-ci) :param caisses: liste des caisses :param murs: liste des murs :param joueur: liste des joueurs :param can: Canvas (ignorez son fonctionnement), utile uniquement pour créer_image() :param deplace_caisse_x: coordonnée à laquelle la caisse va être déplacée en x (si le joueur pousse une caisse) :param deplace_caisse_y: coordonnée à laquelle la caisse va être déplacée en y (si le joueur pousse une caisse) :param deplace_joueur_x: coordonnée en x à laquelle le joueur va être après le mouvement :param deplace_joueur_y: coordonnée en y à laquelle le joueur va être après le mouvement :param liste_image: liste des images (murs, caisses etc...) détaillée dans l'énoncé :return: ''' if coordonnee_destination in caisses: if coordonnee_case_suivante in caisses or coordonnee_case_suivante in murs: pass else: x_joueur: int = coordonnee_x(joueur[0]) y_joueur: int = coordonnee_y(joueur[0]) caisses.append(creer_caisse(deplace_caisse_x, deplace_caisse_y)) creer_image(can, deplace_caisse_x, deplace_caisse_y, liste_image[2]) caisses.remove(ancienne_caisse) joueur.append(creer_personnage(deplace_joueur_x, deplace_joueur_y)) creer_image(can, x_joueur, y_joueur, liste_image[6]) # joueur.pop(0) joueur.remove(joueur[0]) elif coordonnee_destination in murs: pass else: x_joueur: int = coordonnee_x(joueur[0]) y_joueur: int = coordonnee_y(joueur[0]) joueur.append(creer_personnage(deplace_joueur_x, deplace_joueur_y)) creer_image(can, x_joueur, y_joueur, liste_image[6]) joueur.pop(0)
def charger_niveau(joueur, caisses, cibles, murs, path): ''' Fonction permettant de charger depuis un fichier.txt et de remplir les différentes listes permettant le fonctionnement du jeu (joueur, caisses, murs, cibles) :param joueur: liste des personnages :param caisses: liste des caisses :param cibles: liste des cibles :param murs: liste des murs :param path: Chemin du fichier.txt :return: ''' # Vérification des paramètres if not os.path.isfile(path): return None elif joueur is None or caisses is None or cibles is None or murs is None: return None # Variables de départ c_dpt_x: int = DISTANCE_ENTRE_CASE // 2 c_dpt_y: int = DISTANCE_ENTRE_CASE // 2 # Déclaration de la coordonnée Y coord_y: int = Y_PREMIERE_CASE + c_dpt_y # Overture du fichier en mode lecture with open(path, 'r') as filin: # Lecture de chaque ligne du fichier for ligne in filin: # Calibrage des coordonnees X et Y coord_x = X_PREMIERE_CASE + c_dpt_x # Lecture et création de chaque élément de la ligne for element in ligne: if element == '#': murs.append(creer_mur(coord_x, coord_y)) elif element == '.': cibles.append(creer_cible(coord_x, coord_y)) elif element == '$': caisses.append(creer_caisse(coord_x, coord_y)) elif element == '@': joueur.append(creer_personnage(coord_x, coord_y)) # Calibrage de la coordonnée X à chaque intéraction coord_x = coord_x + DISTANCE_ENTRE_CASE # Calibrage de la coordonée Y a chaque intéraction coord_y = coord_y + DISTANCE_ENTRE_CASE
def charger_niveau(joueur, caisses, cibles, murs, path): ''' Fonction permettant de charger depuis un fichier.txt et de remplir les différentes listes permettant le fonctionnement du jeu (joueur, caisses, murs, cibles) :param joueur: liste des personnages :param caisses: liste des caisses :param cibles: liste des cibles :param murs: liste des murs :param path: Chemin du fichier.txt :return: ''' cpt_x: int = 0 cpt_y: int = 0 with open(path, "r") as filin: lignes: list = filin.readlines() for i in lignes: for j in i: if j == "#": # faire deux boucles imbriqués, 20, 20 est la position initiale un for pour x et un for pour y # 32 étant l'espace entre deu éléments. 20 + 0 * 32 /// 20 étant l'espace entre le fichier texte et le premier bloc # du coup 20 et 32 reste il n'y a juste le 0 qui va varier murs.append(creer_mur(X_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_x), Y_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_y))) elif j == ".": cibles.append(creer_cible(X_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_x), Y_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_y))) elif j == "$": caisses.append(creer_caisse(X_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_x), Y_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_y))) elif j == "@": joueur.append(creer_personnage(X_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_x), Y_PREMIERE_CASE + (DISTANCE_ENTRE_CASE * cpt_y))) cpt_x += 1 cpt_y += 1 cpt_x = 0
def mouvement(direction, can, joueur, murs, caisses, liste_image): ''' Fonction permettant de définir les cases de destinations (il y en a 2 si le joueur pousse une caisse) selon la direction choisie. :param direction: Direction dans laquelle le joueur se déplace (droite, gauche, haut, bas) :param can: Canvas (ignorez son fonctionnement), utile uniquement pour créer_image() :param joueur: liste des joueurs :param murs: liste des murs :param caisses: liste des caisses :param liste_image: liste des images (murs, caisses etc...) détaillée dans l'énoncé :return: ''' # Vérification des paramètres if direction is None or joueur is None or murs is None or caisses is None or liste_image is None: return None # Position du joueur position_x_joueur: int = coordonnee_x(joueur[0]) position_y_joueur: int = coordonnee_y(joueur[0]) if direction == "droite": # Si l'utilisateur clic à droite effectuer_mouvement( creer_case_vide(position_x_joueur + DISTANCE_ENTRE_CASE, position_y_joueur), creer_case_vide(position_x_joueur + 2 * DISTANCE_ENTRE_CASE, position_y_joueur), creer_caisse(position_x_joueur + DISTANCE_ENTRE_CASE, position_y_joueur), caisses, murs, joueur, can, (position_x_joueur + 2 * DISTANCE_ENTRE_CASE), position_y_joueur, (position_x_joueur + DISTANCE_ENTRE_CASE), position_y_joueur, liste_image) elif direction == "gauche": # Si l'utilisateur clic à gauche effectuer_mouvement( creer_case_vide(position_x_joueur - DISTANCE_ENTRE_CASE, position_y_joueur), creer_case_vide(position_x_joueur - 2 * DISTANCE_ENTRE_CASE, position_y_joueur), creer_caisse(position_x_joueur - DISTANCE_ENTRE_CASE, position_y_joueur), caisses, murs, joueur, can, (position_x_joueur - 2 * DISTANCE_ENTRE_CASE), position_y_joueur, (position_x_joueur - DISTANCE_ENTRE_CASE), position_y_joueur, liste_image) elif direction == "haut": # Si l'utilisateur clic en haut effectuer_mouvement( creer_case_vide(position_x_joueur, position_y_joueur - DISTANCE_ENTRE_CASE), creer_case_vide(position_x_joueur, position_y_joueur - 2 * DISTANCE_ENTRE_CASE), creer_caisse(position_x_joueur, position_y_joueur - DISTANCE_ENTRE_CASE), caisses, murs, joueur, can, position_x_joueur, (position_y_joueur - 2 * DISTANCE_ENTRE_CASE), position_x_joueur, (position_y_joueur - DISTANCE_ENTRE_CASE), liste_image) elif direction == "bas": # Si l'utilisateur clic en bas effectuer_mouvement( creer_case_vide(position_x_joueur, position_y_joueur + DISTANCE_ENTRE_CASE), creer_case_vide(position_x_joueur, position_y_joueur + 2 * DISTANCE_ENTRE_CASE), creer_caisse(position_x_joueur, position_y_joueur + DISTANCE_ENTRE_CASE), caisses, murs, joueur, can, position_x_joueur, (position_y_joueur + 2 * DISTANCE_ENTRE_CASE), position_x_joueur, (position_y_joueur + DISTANCE_ENTRE_CASE), liste_image)
def effectuer_mouvement(coordonnee_destination, coordonnee_case_suivante, ancienne_caisse, caisses, murs, joueur, can, deplace_caisse_x, deplace_caisse_y, deplace_joueur_x, deplace_joueur_y, liste_image): ''' Fonction permettant d'effectuer le déplacement ou de ne pas l'effectuer si celui-ci n'est pas possible. Voir énoncé "Quelques règles". Cette methode est appelée par mouvement. :param coordonnee_destination: variable CaseVide ayant possiblement des coordonnées identiques à une autre variable (murs, caisse, casevide) :param coordonnee_case_suivante: variable CaseVide ayant possiblement des coordonnées identiques à une autre variable (murs, caisse, casevide) mais représente la case après coordonnee_destination :param ancienne_caisse: variable utile pour supprimer l'ancienne caisse (après avoir déplacé celle-ci) :param caisses: liste des caisses :param murs: liste des murs :param joueur: liste des joueurs :param can: Canvas (ignorez son fonctionnement), utile uniquement pour créer_image() :param deplace_caisse_x: coordonnée à laquelle la caisse va être déplacée en x (si le joueur pousse une caisse) :param deplace_caisse_y: coordonnée à laquelle la caisse va être déplacée en y (si le joueur pousse une caisse) :param deplace_joueur_x: coordonnée en x à laquelle le joueur va être après le mouvement :param deplace_joueur_y: coordonnée en y à laquelle le joueur va être après le mouvement :param liste_image: liste des images (murs, caisses etc...) détaillée dans l'énoncé :return: ''' # Vérification des paramètres if caisses is None or murs is None or joueur is None or deplace_caisse_x is None or deplace_caisse_y is None \ or deplace_joueur_x is None or deplace_joueur_y is None or liste_image is None: return None # Booléens pour connaître la "nature" de la case destination ou la case qui suit la case destination case_dest_mur: bool = False case_suiv_mur: bool = False case_dest_caisse: bool = False case_suiv_caisse: bool = False for elt in murs: if est_egal_a(elt, coordonnee_destination): case_dest_mur = True break for elt in murs: if est_egal_a(elt, coordonnee_case_suivante): case_suiv_mur = True break for elt in caisses: if est_egal_a(elt, coordonnee_destination): case_dest_caisse = True break for elt in caisses: if est_egal_a(elt, coordonnee_case_suivante): case_suiv_caisse = True break # Selon les résultats obtenus plus haut, autorise le déplacement et fait les changements nécessaires sur les cases "touchées" if not case_dest_mur: if not (case_dest_caisse and (case_suiv_caisse or case_suiv_mur)): if case_dest_caisse: creer_image(can, deplace_caisse_x, deplace_caisse_y, liste_image[2]) caisses.remove(ancienne_caisse) caisses.append(creer_caisse(deplace_caisse_x, deplace_caisse_y)) creer_image(can, coordonnee_x(joueur[0]), coordonnee_y(joueur[0]), liste_image[6]) joueur[0] = creer_personnage(deplace_joueur_x, deplace_joueur_y) else: creer_image(can, coordonnee_x(joueur[0]), coordonnee_y(joueur[0]), liste_image[6]) joueur[0] = creer_personnage(deplace_joueur_x, deplace_joueur_y)