示例#1
0
文件: Game.py 项目: Cassius-P/Sudoku
class Game(QWidget):
    def __init__(self, parent=None, size=int, load=[]):
        super().__init__(parent)
        # crée la grille et le bouton de verif

        self.table = QTableWidget(self)
        self.table.itemChanged.connect(self.changeValue)

        #Verification button
        verif = QPushButton("Verifier grille")
        verif.clicked.connect(self.verifButton)
        self.verif = verif

        #Save Game button
        save = QPushButton("Sauvegarder")
        save.clicked.connect(self.saveGame)
        self.save = save

        self.size = size
        self.table.setRowCount(self.size)
        self.table.setColumnCount(self.size)

        # Cache les entêtes horizontale et verticale
        self.table.horizontalHeader().hide()
        self.table.verticalHeader().hide()

        # Définit les cases carrées 50 pixels x 50 pixels
        for row in range(self.size):
            self.table.setRowHeight(row, 50)
            for col in range(self.size):
                self.table.setColumnWidth(col, 50)

        # remplit la grille avec des QTableWidgetItem
        for row in range(self.size):
            for col in range(self.size):
                tableItem = QTableWidgetItem()
                # val= self.testGrid[row][col]
                tableItem.setTextAlignment(QtCore.Qt.AlignHCenter
                                           | QtCore.Qt.AlignVCenter)
                # tableItem.setText(str(val))
                self.table.setItem(row, col, tableItem)

        # définit la police de caractère par défaut de la table
        font = QFont()
        font.setFamily(u"DejaVu Sans")
        font.setPointSize(16)
        self.table.setFont(font)

        # taille de la fenêtre
        self.setFixedSize(52 * self.size + 6, 53 * self.size + 55)

        # positionne la table dans la fenêtre
        posit = QGridLayout()
        posit.addWidget(self.table, 0, 0)
        #posit.addWidget(self.timer, 88 * self.size, 0)
        posit.addWidget(self.verif, 52 * self.size, 0)
        posit.addWidget(self.save, 75 * self.size, 0)

        self.setLayout(posit)

        # Grille test
        self.grilleTest = Grille(self.size)
        print("Load : ", load)

        #Chargement de la grille pour chargée et nouvelle partie
        if len(load) == 0:
            print("New game detected")
            self.full = self.grilleTest.getCompleteGrille()

            self.startMatrix = self.grilleTest.getGrille()
            self.matrix = self.startMatrix
        else:
            print("Loaded game detectd")
            self.full = load[1]
            self.grilleTest.setGrid(load)
            self.startMatrix = load[0]
            self.matrix = load[2]
            print("loaded")

        # intégre le delegate pour lignes en gras et les cases en couleur
        self.delegate = ItemDelegate(self.table)
        self.table.setItemDelegate(self.delegate)

        # redessine les lignes en gras et les cases de couleur
        self.delegate.grilleinit(self.matrix, self.size)

        # affiche la grille courante
        self.showGrille(self.matrix)

        # place le focus
        self.table.setFocus()
        self.table.setCurrentCell(0, 0)

    #Verification d'une grille
    def verifButton(self):
        for i in range(self.size):
            print(self.matrix[i])
        verif = VerifGrid(self.matrix, self.size)
        self.verif.setText(verif.getStatut())
        self.verif.setDisabled(True)

    #Enregistrement d'une partie
    def saveGame(self):
        infos = [self.startMatrix, self.full, self.matrix]
        print('\n' + self.formatNumbers(infos[0]))
        with open(str(time.time()) + ".sudoku", 'w') as file:
            print(file)
            file.write(self.formatNumbers(infos[0]) + "\n")
            file.write(self.formatNumbers(infos[1]) + "\n")
            file.write(self.formatNumbers(infos[2]) + "\n")
            file.close()

        self.save.setText("Sauvegardé !")
        self.save.setDisabled(True)

    #Formatage de la date pour l'enregistrement du fichier de sauvegarde
    def formatNumbers(self, array):
        sep = ''
        stringList = []
        for n1 in array:
            for n2 in n1:
                stringList.append(str(n2))
        return sep.join(stringList)

    #event quand une case de la grille change de valeur
    def changeValue(self):
        ac = self.table.currentItem()
        if (isinstance(ac, QTableWidgetItem)):
            row = ac.row()
            col = ac.column()
            try:
                indice = False
                if (keyboard.is_pressed('ctrl')):
                    indice = True
                if (self.size == 9):
                    val = int(ac.text())
                    if (val < self.size):
                        self.matrix[row][col] = val if indice != True else 0
                        self.setCouleur((row, col),
                                        QColor(255, 255, 255) if indice != True
                                        else QColor(51, 153, 255))
                        self.save.setText("Sauvegarder")
                        self.save.setDisabled(False)
                        self.verif.setText("Vérifier grille")
                        self.verif.setDisabled(False)
                    else:
                        self.table.item(row, col).setText('')
                else:
                    print("Grid of 16")

            except ValueError:
                print("pas un nombre")
                self.table.item(row, col).setText('')
                # self.setCouleur((row, col), QColor(240,0,0))

    #Affichage de la grille de départ avec remplssage des valeurs
    def showGrille(self, grille):
        for row in range(self.size):
            for col in range(self.size):
                #Si la valeur vaut 0, affichage casse vide
                if grille[row][col] == 0:
                    self.table.item(row, col).setText(u"")
                    self.table.item(row,
                                    col).setFlags(QtCore.Qt.ItemIsEnabled
                                                  | QtCore.Qt.ItemIsSelectable
                                                  | QtCore.Qt.ItemIsEditable)
                #Si valeur différente de 0 affichage valeur non modifiable par utilisateur
                else:
                    self.table.item(row, col).setText(str(grille[row][col]))
                    self.table.item(row,
                                    col).setFlags(QtCore.Qt.ItemIsEnabled
                                                  | QtCore.Qt.ItemIsSelectable)

                    #Mise en évidence des valeurs non modifiables
                    font = QFont()
                    font.setWeight(70)
                    self.table.item(row, col).setFont(font)

                    # Détruit le design (grille) donc commenté
                    # self.table.item(row, col).setBackground(QColor(228, 228, 228))

    #Changement de la couleur d'une case
    def setCouleur(self, coordinates, color):
        x, y = coordinates
        self.table.item(x, y).setBackground(color)
        return True

    #Bordure des cases avec 'bold' pour sépration des blocs
    def caseBorder(painter, option, ligne):
        r = option.rect
        x, y, w, h = r.x(), r.y(), r.width(), r.height()
        if ligne == 'h':
            x1, y1, x2, y2 = x, y, x + w, y
        elif ligne == 'd':
            x1, y1, x2, y2 = x + w, y, x + w, y + h
        elif ligne == 'b':
            x1, y1, x2, y2 = x + w, y + h, x, y + h
        elif ligne == 'g':
            x1, y1, x2, y2 = x, y + h, x, y
        else:
            return
        pen = QtGui.QPen()
        pen.setWidth(2)
        painter.setPen(pen)
        painter.drawLine(x1, y1, x2, y2)