Example #1
0
 def __init__(self, first_player, matrice_jeu):
     super(Window, self).__init__()
     self.image_pion = {1: "pion1.png", 2: "pion2.png", 11: "chef1.png", 12: "chef2.png", 0: ""}
     self.winSize = min(QDesktopWidget().height(), QDesktopWidget().width())  # dim fenetre vs écran
     # print("self.winSize ", QDesktopWidget().height())
     self.ratioWinVsEcran = 1  # ratio d'occupation de la fenêtre vis à vis de l'écran
     self.resize(self.ratioWinVsEcran * self.winSize, self.ratioWinVsEcran * self.winSize)
     self.ratio = 0.70  # ratio plateau vs ecran
     self.taillePlateau = self.winSize * self.ratio
     self.marge = (self.winSize - self.taillePlateau) / 2  # marge fenêtre
     self.tailleCase = self.taillePlateau / 8
     self.decalage = self.tailleCase / 2
     self.setWindowIcon(QIcon(RESSOURCES + "logo_enac.png"))
     self.centrerSurEcran()
     self.initMenu()
     self.jeu = Jeu(first_player, matrice_jeu)
     self.affichePlayerCourant(self.jeu.player)
Example #2
0
class Window(QMainWindow):
    def __init__(self, first_player, matrice_jeu):
        super(Window, self).__init__()
        self.image_pion = {1: "pion1.png", 2: "pion2.png", 11: "chef1.png", 12: "chef2.png", 0: ""}
        self.winSize = min(QDesktopWidget().height(), QDesktopWidget().width())  # dim fenetre vs écran
        # print("self.winSize ", QDesktopWidget().height())
        self.ratioWinVsEcran = 1  # ratio d'occupation de la fenêtre vis à vis de l'écran
        self.resize(self.ratioWinVsEcran * self.winSize, self.ratioWinVsEcran * self.winSize)
        self.ratio = 0.70  # ratio plateau vs ecran
        self.taillePlateau = self.winSize * self.ratio
        self.marge = (self.winSize - self.taillePlateau) / 2  # marge fenêtre
        self.tailleCase = self.taillePlateau / 8
        self.decalage = self.tailleCase / 2
        self.setWindowIcon(QIcon(RESSOURCES + "logo_enac.png"))
        self.centrerSurEcran()
        self.initMenu()
        self.jeu = Jeu(first_player, matrice_jeu)
        self.affichePlayerCourant(self.jeu.player)
        # self.setFixedSize(self.ratioWinVsEcran * self.winSize, self.ratioWinVsEcran * self.winSize)  # pour avoir une fenêtre de taille fixée

    def initMenu(self):
        self.setWindowTitle("Le chemin des chefs - IENAC 15 - Groupe 25")
        self.setStatusTip("Cliquer sur le pion à déplacer puis sur la nouvelle position souhaitée.")
        self.setWindowIcon(QIcon(RESSOURCES + "logo_enac.png"))
        menuFichier = self.menuBar().addMenu("&Fichier")
        self.toolbar = self.addToolBar("")
        # menu et icône nouvelle partie
        actionNouvellePartie = menuFichier.addAction("&Nouvelle partie")
        self.toolbar.addAction(actionNouvellePartie)
        actionNouvellePartie.setShortcut("Ctrl+N")
        actionNouvellePartie.setStatusTip("Nouvelle partie")
        actionNouvellePartie.setIcon(QIcon(RESSOURCES + "new.png"))
        actionNouvellePartie.triggered.connect(lambda: self.nouvelle_partie())
        # menu et icône charger partie
        actionChargerPartie = menuFichier.addAction("&Charger une partie")
        actionChargerPartie.setIcon(QIcon(RESSOURCES + "folder.png"))
        actionChargerPartie.triggered.connect(lambda: self.chargerPartie())
        self.toolbar.addAction(actionChargerPartie)
        actionChargerPartie.setShortcut("Ctrl+C")
        actionChargerPartie.setStatusTip("Charger une partie")
        # menu et icône enregistrer partie
        actionEnregistrerPartie = menuFichier.addAction("&Enregistrer la partie")
        actionEnregistrerPartie.setIcon(QIcon(RESSOURCES + "save.png"))
        actionEnregistrerPartie.triggered.connect(lambda: self.enregistrerPartie())
        self.toolbar.addAction(actionEnregistrerPartie)
        actionEnregistrerPartie.setShortcut("Ctrl+E")
        actionEnregistrerPartie.setStatusTip("Sauvegarder la partie")
        # menu et icône aide
        menuAide = self.menuBar().addMenu("&?")
        actionRegle = menuAide.addAction("&Règles du jeu")
        actionRegle.setShortcut("Ctrl+R")
        actionRegle.setStatusTip("Règles du jeu")
        actionRegle.setIcon(QIcon(RESSOURCES + "regle.png"))
        actionRegle.triggered.connect(lambda: self.ouvrirFichier("chemin_des_chefs.pdf"))
        self.toolbar.addAction(actionRegle)
        # menu et icone "recette logicielle"
        actionRecette = menuAide.addAction("Recette logicielle")
        actionRecette.setStatusTip("Document de recette logicielle")
        actionRecette.setIcon(QIcon(RESSOURCES + "recette.png"))
        actionRecette.triggered.connect(lambda: self.ouvrirFichier("Recette.ods"))
        self.toolbar.addAction(actionRecette)
        # menu et icône quitter
        actionQuitter = menuFichier.addAction("&Quitter")
        actionQuitter.triggered.connect(qApp.quit)
        actionQuitter.setIcon(QIcon(RESSOURCES + "exit.png"))
        actionQuitter.setShortcut("Ctrl+Q")
        actionQuitter.setStatusTip("Quitter l'application")
        self.statusBar()
        self.toolbar.addAction(actionQuitter)
        # Définition du central widget
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.centralWidget.setGeometry(0, 0, self.winSize, self.winSize)
        # labels informant qui doit jouer
        self.haut = QLabel()
        self.haut.setParent(self.centralWidget)
        self.haut.setGeometry(self.taillePlateau / 2, self.marge / 3, 250, 20)
        self.bas = QLabel()
        self.bas.setParent(self.centralWidget)
        self.bas.setGeometry(self.taillePlateau / 2, self.winSize - self.marge, 250, 20)
        self.information = QLabel()
        self.information.setParent(self.centralWidget)
        self.information.setGeometry(0, 0, 250, 20)
        self.centralWidget.setParent(self)
        self.centralWidget.setGeometry(0, 0, self.winSize, self.winSize)
        self.centralWidget.setStyleSheet(BLANC)
        plateau = Plateau(self)
        # plateau.setParent(self.centralWidget)
        plateau.setGeometry(self.marge, self.marge, self.taillePlateau, self.taillePlateau)
        self.btn = {}  # dico des boutons qui effectuent un pavage, ou recouvrement, du plateau
        # chaque bouton symbolise une intersection dans la grille constituant le plateau de jeu.
        for i in range(0, N):
            for j in range(0, N):
                button = Button(self, i, j)
                # button.setParent(self.centralWidget)
                button.setToolTip(str(i) + "_" + str(j))
                self.btn[(i, j)] = button

    def nouvelle_partie(self):
        """crée un nouveau jeu sans créer une nouvelle fenêtre
        :param filename:
        :return:
        """
        l = list(load_jeu(RESSOURCES + "init_jeu.txt"))
        self.jeu.matrice_jeu = l[0]
        self.jeu.player = l[1]
        self.draw_pions(self.jeu.matrice_jeu)  # trace les pions
        self.affichePlayerCourant(self.jeu.player)

    def ouvrirFichier(self, filename):
        try:
            import webbrowser

            webbrowser.open_new_tab(RESSOURCES + filename)
        except Exception:
            print("Problème ouverture fichier ", filename)

    def chargerPartie(self):
        try:
            filename = QFileDialog.getOpenFileName(self, "Charger partie", BACKUPS_DIR)[0]
            l = list(load_jeu(filename))
            self.jeu.matrice_jeu = l[0]
            self.jeu.player = l[1]
            self.draw_pions(self.jeu.matrice_jeu)  # trace les pions
            self.affichePlayerCourant(self.jeu.player)
        except Exception:
            print("Abandon chargement jeu ou Problème en lien avec l'ouverture de fichier")

    def enregistrerPartie(self):
        try:
            filename = QFileDialog.getSaveFileName(self, "enregistrerPartie", BACKUPS_DIR)[0]
            self.jeu.save_jeu(filename)
        except Exception:
            print("Problème lors de l'enregistrement du fichier")

    def affichePlayerCourant(self, num_joueur):
        """ Informe le joueur dont c'est le "tour" de jouer
        :param num_joueur: joueur 1 ou 2
        :return:
        """
        self.information.setText("")
        self.haut.setText("")
        self.bas.setText("")
        if num_joueur in (1, 2):
            txt = "A VOUS DE JOUER, JOUEUR {} !!!!!".format(num_joueur)
            if num_joueur == 1:
                self.haut.setText(txt)
            else:
                self.bas.setText(txt)

    def afficheInfo(self, txt, width=250):
        """
        :param txt: affiche le txt au dessus du plateau
        :return:
        """
        self.information.setGeometry(0, 0, width, 20)
        self.information.setStyleSheet("color: red")
        self.information.setText(txt)

    def centrerSurEcran(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def draw_pions(self, mat_jeu):
        """
        :param jeu: type list contenant des types Pions
        :return:
        """
        for i in range(N):
            for j in range(N):
                icon = QIcon()
                # utilisation de la méthode get() de la classe python dictionnaire pour la fonctionnalité valeur par défaut
                icon.addPixmap(QPixmap(RESSOURCES + self.image_pion.get(mat_jeu[i][j], "")), QIcon.Normal, QIcon.Off)
                self.btn[(i, j)].setIcon(icon)