Esempio n. 1
0
                                                run = False
                                            if event.type == KEYDOWN:
                                                key = insertNumber(event.key)
                                                remove = False
                                    sudoku.removeTrial(selected_square, key)

                                else:
                                    # Si l'ajout est un brouillon
                                    if sudoku.getGrid().isSketching():
                                        if selected_square.getValue() == 0:
                                            sudoku.addTrial(
                                                selected_square, key)
                                        sudoku.getGrid().setSketching(False)

                                    else:
                                        sudoku.addValue(selected_square, key)
                                        sudoku.clearTrials(selected_square)

                                        # Si la grille est de niveau 1, alors la gestion des brouillons (effacement) est automatique
                                        if level == 1:
                                            for i in range(size):
                                                sudoku.removeTrial(
                                                    sudoku.getGrid().getSquare(
                                                        selected_square.
                                                        getCoordinates().getX(
                                                        ), i), key
                                                )  # Suppression de tous les brouillons de même ligne correspondant à la valeur entrée
                                                sudoku.removeTrial(
                                                    sudoku.getGrid().getSquare(
                                                        i,
                                                        selected_square.
Esempio n. 2
0
def main():
    quit = False
    choice1 = 'M'
    name = None
    size = 9
    error_counter = 0
    sudoku = None

    # Tant que l'utlisateur n'a pas explicitement décidé de quitter le jeu, il peut interagir avec
    while quit is False:

        # Accès au menu principal
        if choice1 == 'M':
            print('_____________________________')
            print('(J) - Jouer')
            print('(R) - Règlement')
            print('(Q) - Quitter')
            print('_____________________________')
            choice1 = input()

        # Quand l'utilisateur a décidé de jouer
        elif choice1 == 'J':

            name = input("Entrez votre nom :")
            level = int(
                input("Entrez le niveau auquel vous souhaitez jouer :"))

            # Si l'utilisateur choisit un niveau en dehors de ceux proposés, on le ramène aux niveaux les plus proches
            if level < 1:
                level = 1
            elif level > 3:
                level = 3

            grid = Grid(level, size, 400, 400, grid_empty[level - 1])
            sudoku = Sudoku(grid)

            printSudoku(sudoku, size)
            printSudokuTrials(sudoku, size)

            end = False
            choice2 = 'L'

            # Tant que le jeu n'est pas terminé (gagné, perdu ou abandonné), l'utilisateur peut interagir avec
            while end is False:

                # Menu intermédiaire d'interaction avec la grille
                if choice2 == 'L':
                    print('_____________________________')
                    print('(V) - Entrer une valeur')
                    print('(B) - Entrer un brouillon')
                    print('(Z) - Effacer une case')
                    print('(E) - Effacer un brouillon')

                    # Indices disponibles seulement au premier niveau
                    if level == 1:
                        print(('(I) - Indice'))

                    print('(M) - Revenir au menu')
                    print('_____________________________')
                    choice2 = input()

                # Entrer une valeur dans une case
                elif choice2 == 'V':
                    s = chooseSquare(sudoku.getGrid())

                    # Si la case est fixe, elle n'est pas modifiable
                    if s.isFixed():
                        print("Tu ne peux pas modifier cette case.")
                    else:
                        v = 0
                        while v < 1 or v > 9:
                            v = int(
                                input(
                                    "Quelle valeur voulez-vous renseigner ? "))
                        sudoku.addValue(s, v)
                        sudoku.clearTrials(s)

                        # Si la grille est de niveau 1, alors la gestion des brouillons (effacement) est automatique
                        if level == 1:
                            for i in range(size):
                                sudoku.removeTrial(
                                    sudoku.getGrid().getSquare(
                                        s.getCoordinates().getX(), i), v
                                )  # Suppression de tous les brouillons de même ligne correspondant à la valeur entrée
                                sudoku.removeTrial(
                                    sudoku.getGrid().getSquare(
                                        i,
                                        s.getCoordinates().getY()), v
                                )  # Suppression de tous les brouillons de même colonne correspondant à la valeur entrée

                            for p in sudoku.getGrid().getPiece(s):
                                # Suppression de tous les brouillons de même "super-carré" correspondant à la valeur entrée, si et seulement s'il existe
                                if sudoku.getGrid().getSquare(
                                        p.getX(), p.getY()).haveTrial(v):
                                    sudoku.removeTrial(
                                        sudoku.getGrid().getSquare(
                                            p.getX(), p.getY()), v)

                        # Si la valeur renseignée correspond à celle entrée dans les solutions, alors l'attribut checked passe à True (pour signifier que la valeur est correcte)
                        if grid_soluce[level - 1][s.getCoordinates(
                        ).fromCoordinatesToNumber(size)] == v:
                            s.setChecked(True)
                        # Sinon la case est considérée comme incorrecte (cas où la valeur est modifiée même remplaçant une valeur correcte)
                        else:
                            s.setChecked(False)

                            # Si le niveau est le niveau 3, alors chaque valeur incorrecte est comptabilisée
                            if level == 3:
                                error_counter += 1

                        # Si le niveau est le niveau 3, on vérifie que l'utilisateur gagne ou perd
                        if level == 3:
                            end = winOrLoose(error_counter, 3,
                                             sudoku.getGrid())

                        # Sinon, on vérifie que le sudoku est complet et correct
                        else:
                            end = sudoku.getGrid().completeChecked()

                        printSudoku(sudoku, size)
                        printSudokuTrials(sudoku, size)

                        # On retourne ensuite au menu intermédiaire
                        choice2 = 'L'

                # Entrer un brouillon dans une case
                elif choice2 == 'B':
                    s = chooseSquare(sudoku.getGrid())

                    # Si la case est fixe, elle n'est pas modifiable
                    if s.isFixed():
                        print("Tu ne peux pas modifier cette case.")

                    # Si la case n'est pas vide, elle ne peut pas recevoir de brouillon
                    elif s.getValue() != 0:
                        print(
                            "Attention, pour entrer un brouillon dans une case, il faut d'abord que tu la vides."
                        )
                    else:
                        t = 0
                        while t < 1 or t > 9:
                            t = int(
                                input(
                                    "Quelle valeur voulez-vous renseigner pour votre brouillon ? "
                                ))
                        sudoku.addTrial(s, t)
                        printSudoku(sudoku, size)
                        printSudokuTrials(sudoku, size)

                        # On retourne ensuite au menu intermédiaire
                        choice2 = 'L'

                # Effacer une case
                elif choice2 == 'Z':
                    s = chooseSquare(sudoku.getGrid())
                    sudoku.clearSquare(s)
                    s.setChecked(False)
                    printSudoku(sudoku, size)
                    printSudokuTrials(sudoku, size)

                    # On retourne ensuite au menu intermédiaire
                    choice2 = 'L'

                # Effacer un brouillon
                elif choice2 == 'E':
                    s = chooseSquare(sudoku.getGrid())
                    t = 0
                    while t < 1 or t > 9:
                        t = int(
                            input(
                                "Quelle valeur voulez-vous effacer de votre brouillon ? "
                            ))
                    sudoku.removeTrial(s, t)
                    printSudoku(sudoku, size)
                    printSudokuTrials(sudoku, size)

                    # On retourne ensuite au menu intermédiaire
                    choice2 = 'L'

                # Accéder aux indices
                elif choice2 == 'I':

                    # Si le niveau n'est pas le niveau 1, on affiche un message d'erreur
                    if level == 1:
                        clue(sudoku.getGrid())
                    else:
                        print("Petit malin...")

                    # On retourne ensuite au menu intermédiaire
                    choice2 = 'L'

                # Retourner au menu
                elif choice2 == 'M':

                    # Étant donné qu'il s'agit également d'une remise à zéro, on s'assure qu'il s'agit bien du choix de l'utilisateur
                    print(
                        'Attention, toutes vos modifications seront perdues. Souhaitez-vous continuer ?'
                    )
                    print('(V) - Valider')
                    print('Toute autre action annulera votre démarche.')
                    ok = input()

                    if ok == 'V':
                        choice1 = 'M'
                        end = True
                    else:
                        choice2 = 'L'

                # Toute autre action de l'utilisateur le mène vers un message d'erreur
                else:
                    print(
                        'Veuillez vérifier votre réponse, elle ne correspond à aucune action connue.'
                    )
                    choice2 = 'L'

                choice1 = 'E'

        # Voir le règlement
        elif choice1 == 'R':
            print(
                "Remplissez les cases avec un chiffre de 1 à 9. Attention à n'utiliser un chiffre qu'une seule fois par ligne, par colonne et par carré. Vous pouvez choisir votre niveau de jeu, de 1 à 3. Le premier niveau fait apparaître les chiffres en vert ou en rouge, selon qu'il est correct ou non. Le deuxième niveau n'a pas d'indices mais n'a pas non plus de système d'erreur. Le troisième et dernier niveau n'offre la possibilité de ne faire que trois erreurs maximum."
            )
            print(
                "Le premier niveau fait apparaître les chiffres en vert ou en rouge, selon qu'il est correct ou non."
            )
            print(
                "Le deuxième niveau n'a pas d'indices mais n'a pas non plus de système d'erreur."
            )
            print(
                "Le troisième et dernier niveau n'offre la possibilité de ne faire que trois erreurs maximum."
            )
            print('_____________________________')
            print('(M) - Menu')
            print('(Q) - Quitter')
            print('_____________________________')
            choice1 = input()

        # Écran de fin de jeu
        elif choice1 == 'E':

            # Si le sudoku est complet et correct, alors un message de réussite s'affiche
            if sudoku.getGrid().completeChecked():
                print('Bravo {} ! Vous avez terminé la grille avec succès !'.
                      format(name))

            # Si le sudoku est incomplet et/ou incorrect, alors un message de défaite s'affiche
            elif not sudoku.getGrid().completeChecked():
                print('Oh... Désolé, {}, mais tu as perdu.'.format(name))

            # Sinon, c'est une utilision détournée, nous le faisons remarquer
            else:
                print('Petit malin...')

            # On retourne ensuite au menu principal
            choice1 = 'M'

        # Quitter le jeu
        elif choice1 == 'Q':
            quit = True

        # Toute autre action de l'utilisateur le mène vers un message d'erreur
        else:
            print(
                'Veuillez vérifier votre réponse, elle ne correspond à aucune action connue.'
            )

            # On retourne ensuite au menu principal
            choice1 = 'M'