Aller au contenu

Jeu pygame : le jeu doit se lancer via l'appel d'une fonction qui sera facilement identifiable.


rm57Sp

Messages recommandés

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

Bonjour, je débute sur python et j'ai remarqué que l'on pouvait utiliser pygame si l'on veut créer des jeux. Alors j'essaye actuellement de créer une sorte de jeu basique où le joueur doit cliquer sur un puzzle et ce puzzle doit changer de couleur à chaque case cliquer (vraiment basique). Par contre j'ai un petit souci j'ai le code où il y a toute les cases, j'ai le code qui permet de changer de couleur mais je n'arrive pas à les faire fonctionner ensemble. Il me faut aussi utiliser une class pour ce code mais je l'ai retiré car ça bugé encore plus. Voici ce que j'ai fait jusqu'à présent.

import pygame, sys
from pygame.locals import *
c=50
pygame.init()
# Création de l'objet fenêtre
mafenetre=pygame.display.set_mode((8*c,8*c))
pygame.display.set_caption('echiquier')

# Création de l'objet fond, Surface sur laquelle on dessine
fond = pygame.Surface((c*8,c*8))
fond = fond.convert()
fond.fill((230, 55, 35))


for li in range(8):
    #boucler sur les colones
    for col in range(8):
        if (li+col)%2==0:
            couleur=(55,30,30)
        else:
            couleur=(55,30,30)
        pygame.draw.rect(fond ,couleur, (col*c,li*c,c ,c), 1)


BLUE = (0, 0, 255)
COLORS = ( BLUE)
color_index = 0

stop = False

clickable_area = pygame.Rect((0, 0), (50, 50))
rect_surf = pygame.Surface(clickable_area.size)
rect_surf.fill(COLORS[color_index])

while not stop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            stop = True
        elif event.type == MOUSEBUTTONUP: # quand je relache le bouton
            if event.button == 1: # 1= clique gauche
                if clickable_area.collidepoint(event.pos):
                    color_index = (color_index + 1) % 3
                    rect_surf.fill(COLORS[color_index])

mafenetre.blit(rect_surf, clickable_area)
mafenetre.blit(fond, (0, 0))
while True:
    # Mise à jour de l'affichage de la fenêtre
    pygame.display.flip()
    # Détection d'évènement(s)
    for event in pygame.event.get():
        # Si l'utilisateur clique sur la fermeture de la fenêtre, on ferme pygame
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

Lien à poster
Partager sur d’autres sites

Annonces
Maintenant
Membre, Le prendre au sérieux, nuit gravement à la santé, Posté(e)
azad2B Membre 5 932 messages
Le prendre au sérieux, nuit gravement à la santé,
Posté(e)

Ton script dessine effectivement un damier de 64 cases, mais semble incomplet car effectivement on voit bien les cases, on peut en changer les couleurs via le script mais la gestion de la souris n'est pas activée. Dis nous au moins quel est le but du "jeu" ? Est qu'il consiste simplement à changer la couleur du background de la case cliquée ???

Pas besoin de pygame pour faire cela, tkinter est bien suffisant. Maintenant il faut bien comprendre que Python est très capricieux, c'est un langage abominable car il y a autant de Python que d'utilisateurs de Python, chacun puisant dans les 3 ou 4 milles bibliothèques disponibles et ne jurant que par elles...

Passe-nous au moins le script de la classe que tu as sans doute un peu trop rapidement supprimé.

 

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)
Le 06/11/2021 à 01:45, azad2B a dit :

Ton script dessine effectivement un damier de 64 cases, mais semble incomplet car effectivement on voit bien les cases, on peut en changer les couleurs via le script mais la gestion de la souris n'est pas activée. Dis nous au moins quel est le but du "jeu" ? Est qu'il consiste simplement à changer la couleur du background de la case cliquée ???

Pas besoin de pygame pour faire cela, tkinter est bien suffisant. Maintenant il faut bien comprendre que Python est très capricieux, c'est un langage abominable car il y a autant de Python que d'utilisateurs de Python, chacun puisant dans les 3 ou 4 milles bibliothèques disponibles et ne jurant que par elles...

Passe-nous au moins le script de la classe que tu as sans doute un peu trop rapidement supprimé.

 

Bonjour azad2B, tout comme tu la dit le jeu n'est pas vraiment un jeu en sois c'est comme tu l'as si bien dit il faut juste changer la couleur du background de la case cliquée. Mais je sais que tkinter est bien suffisant mais je suis dans l'obligation de travailler avec pygame... Et le script de la classe que j'ai ne te servira à pas grand chose car elle ne fonctionne pas...

Mais voici un aperçu de ce que ça doit donner un peu près à la fin https://www.jaapsch.net/puzzles/javascript/lightjcl.htm

Lien à poster
Partager sur d’autres sites

Membre, Le prendre au sérieux, nuit gravement à la santé, Posté(e)
azad2B Membre 5 932 messages
Le prendre au sérieux, nuit gravement à la santé,
Posté(e)

Hum ! Tu m'inquiète ! Le lien que tu m'as indiqué pointe sur un véritable jeu, ou plutôt un casse_tête.

As-tu remarqué que quand on clique sur une case, d'une part on inverse son fond et d'autre part le fond des 8 cases qui l'entourent s'inverse également. Si la case cliquée est près d'un bord du damier, son fond change ainsi que celui des  5 cases voisines qui sont à l'intérieur du damier ( 3 seulement si la case cliquée est celle d'un des coins.) Le but du jeu est donc, je suppose d'obtenir un damier qui serait rempli par un seul et même motif. Réaliser un tel jeu est assez facile, mais la méthode utilisable à laquelle je pense, implique la manipulation de matrices (sous la forme d'un tableau à 2 dimensions d'ordre 8. Et bien entendu, comme tu n'es pas trop bavard et que tu sembles pratiquer la loi de l' Omerta, dite loi du silence, je ne sais rien de ton niveau de scolarité. En premier point : en quelle classe es-tu ? En second point : es-tu un bon élève ?

Et enfin, troisième point, je commencerais à t'aider quand tu m'aura envoyé un aperçu de ce que tu as déjà fait. Je te dis cela parce que parfois les gens qui programment utilisent un algorithme qui n'est pas dénué d'intérêt et ce serait dommage de t'en imposer un qui ne serait pas de ton cru.

Si le mot algorithme te fais peur, remplace le par "j'ai une bonne idée"

 

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

Désolé oui je ne suis pas trop bavard et même dans la vrai vie, ce qui fait que j'ai beaucoup de mal à m'exprimer. Ensuite pour répondre à ta question je suis en terminale et j'ai des difficultés en python surtout cette année. L'année passé j'ai eu beaucoup de souci familiers et du coup j'ai arrêter de bosser, ce qui fait que j'avais perdu le fil. Moi qui avait 14 de moyenne au 1er trimestre de 1ère en NSI, je suis passé à 8 au second. Bref maintenant j'ai eu le temps de bien relire ce qui était demander et j'ai donc tout recommencer. Je te met le code si dessous et tu pourras me donner ton avis. C'est un peu long, je te l'avoue.

 

#ATTENTION POUR TESTER LE JEU IL FAUT CLIQUER SUR START
class Le_Jeu(object):

    def __init__(self, largeur=1200, hauteur=800, fps=60):
        """Initialiser pygame, fenêtre, arrière-plan, police,...
           arguments par défaut
        """
        pygame.init()
        pygame.display.set_caption("Le jeu du casse tête")
        self.largeur = largeur
        self.hauteur = hauteur
        self.screen = pygame.display.set_mode((self.largeur, self.hauteur), pygame.DOUBLEBUF)
        self.background = pygame.Surface(self.screen.get_size()).convert()
        self.background.fill((255,255,255)) # arrière plan blanc
        self.clock = pygame.time.Clock()
        self.fps = fps
        self.playtime = 0.0
        self.font = pygame.font.SysFont('mono', 24, bold=True)
        self.initialMat = np.zeros((8,8)).astype(int)
        # ------------- création des boutons initiaux ----------
        button = self.font.render('Solve', True, (0,255,0), (0,0,128))#nous n'avons malheuresement pas réussi cette fonction qui permettrait de résoudre automatiquement le jeu
        buttonRect = button.get_rect()
        buttonRect.center = (500,500)
        self.background.blit(button,buttonRect)
        for num in range(4,9):
            numButton = self.font.render(' '+ str(num) + ' ',True,(0,255,0), (0,0,128))
            numButtonRect = numButton.get_rect()
            numButtonRect.center = (-150 + 50*num, 500)
            self.background.blit(numButton,numButtonRect)
        mess = self.font.render('Choisir la taille', True, (0,0,0), (255,255,255))
        messRect = mess.get_rect()
        messRect.center = (150,470)
        self.background.blit(mess,messRect)
        randButton = self.font.render('Random', True, (0,255,0),(0,0,128))
        randRect = randButton.get_rect()
        randRect.center = (340,500)
        self.background.blit(randButton,randRect)
        setupButton = self.font.render('START', True, (0,255,255), (250,0,250))
        setupRect = setupButton.get_rect()
        setupRect.center = (425,500)
        self.background.blit(setupButton,setupRect)

    def verification(self,Mat = np.zeros((5,5))):
        ##Vérifie si le jeu peut être résolue
        size = np.sqrt(len(Mat))
        if size == 4:
            verif1 = np.array([1,0,0,0, 1,1,0,0, 1,0,1,0, 0,1,1,1])
            verif2 = np.array([0,0,0,1, 0,0,1,1, 0,1,0,1, 1,1,1,0])
            verif3 = np.array([0,1,0,0, 1,1,1,0, 0,0,0,1, 1,1,0,1])
            verif4 = np.array([0,0,1,0, 0,1,1,1, 1,0,0,0, 1,0,1,1])
            if np.dot(Mat,verif1)%2>0 or np.dot(Mat,verif2)%2>0 or np.dot(Mat,verif3)%2>0 or np.dot(Mat,verif4)%2>0:
                return False
            else:
                return True
        elif size == 5:
            verif1 = np.array([0,1,1,1,0, 1,0,1,0,1, 1,1,0,1,1, 1,0,1,0,1, 0,1,1,1,0])
            verif2 = np.array([1,0,1,0,1, 1,0,1,0,1, 0,0,0,0,0, 1,0,1,0,1, 1,0,1,0,1])
            if np.dot(Mat,verif1)%2>0 or np.dot(Mat,verif2)%2>0:
                return False
            else:
                return True
        else:
            return True


    def Choisir(self,sz = 5):
        ##Pas tout les puzzles ne sont solubles, alors choisir seulement un qui l'est##
        randMat = np.random.randint(2,size=sz*sz)
        while self.verification(Mat = randMat) == False:
            randMat = np.random.randint(2,size=sz*sz)
        randMat = randMat.reshape((sz,sz))
        return randMat

    def verif_victoire(self, flag, Mat = np.ones((5,5))):
        size = len(Mat)
        if flag == True:
            for i in range(size):
                if flag == True:
                    for j in range(size):
                        if Mat[i,j]==1:
                            flag = False
                            break
        return flag

    def paintInit(self, Mat = np.ones((5,5)), sM = np.zeros((5,5))):
        '''peindre les cases initiales'''
        size = len(Mat)
        shift = size + 2
        for ligne in range(size):
            for col in range(size):
                mycell = Cell(col=col, ligne=ligne, color=(0,255*Mat[ligne,col],255),
                              background=self.background)
                mycell.blit(self.background)
                solcell = Cell(col=col+shift, ligne=ligne, color=(255*sM[ligne,col],0,255),
                               background=self.background)
                solcell.blit(self.background)

    def paintPuz(self,Mat = np.ones((5,5))):
        '''peindre le puzzle'''
        size = len(Mat)
        for ligne in range(size):
            for col in range(size):
                mycell = Cell(col=col, ligne=ligne,
                              color=(255*Mat[ligne,col],255*Mat[ligne,col],255*(1-Mat[ligne,col])),
                              background=self.background)
                mycell.blit(self.background)


    def paint(self,col=0, ligne=0, color=(0,0,255)):
        """mettre à jour une seule cellule"""
        #------- Test de fonctions trouver sur internet --------
        # pygame.draw.line(Surface, color, start, end, width)
        # pygame.draw.rect(Surface, color, Rect, width=0): return Rect
        #pygame.draw.rect(self.background, (0,255,0), (50,50,100,25)) # rect: (x1, y1, width, height)
        # pygame.draw.circle(Surface, color, pos, radius, width=0): return Rect
        # pygame.draw.polygon(Surface, color, pointlist, width=0): return Rect
        # pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1): return Rect
        # ------------------- blitting a cell --------------
        mycell = Cell(col=col,ligne=ligne,color=color,background=self.background)
        mycell.blit(self.background)

    def cliquable(self, ligne, col, M = np.ones((5,5)),sM = np.zeros((5,5))):
        size = len(M)
        shift = size + 2
        if ligne>=size or col >=size:
            pass
        else:
            for i in range(size):
                for j in range(size):
                    if (np.abs(ligne-i)<2 and col==j) or (ligne==i and np.abs(col-j)<2):
                        M[i,j] = (M[i,j]+1)%2
                        self.paint(ligne=i,col=j,color=(0,255*M[i,j],255))
            sM[ligne,col] = sM[ligne,col]+1
            ##peindre la cellule sur laquelle vous avez cliqué dans la solution
            self.paint(col=col+shift,ligne=ligne,color=(255*(sM[ligne,col]%2),0,255))
        return M, sM

    def alterne(self, ligne, col, M = np.ones((5,5))):
        size = len(M)
        if ligne>=size or col >=size:
            pass
        else:
            M[ligne,col] = (M[ligne,col]+1)%2 ##alterne la lumière
            self.paint(ligne=ligne,col=col,color=(0,255*M[ligne,col],255))
        return M

    def dernière_ligne(self, M=np.ones((5,5))):
        ##création d'une chaîne dans la dernière colonne
        size = len(M)
        arr = ''
        for j in range(size):
            arr = arr + str(M[-1,j])
        return arr

    def iterate(self, i, j, step2, size):
        if j<size-1:
            j += 1
        elif step2 == True:
            j = 0
            step2 = False
        else:
            i += 1
            j = 0
            if i == size-1:
                step2 = True
        return i, j, step2


## Modifiez ceci pour exécuter une étape de l’algorithme de résolution de chaque image
    def execute(self):
        """la boucle principale"""
        #matrix = self.ChooseInitBoard(sz=8)
        initMat = np.zeros((8,8))
        matrix = np.zeros((8,8))
        size = matrix.shape[0]
        solMatrix = np.zeros((size,size))  ## garder une trace des boutons enfoncés dans le travail pour résoudre
        self.paintInit(Mat=matrix, sM=solMatrix)
        running = True
        setup = True ##False lorsque l'utilisateur a terminer l'installation
        stop = False  ##True lorsque le chrono doit s'arrêter
        solving = False  ##True lorsque le processus de résolution est en cours d'execution
        step2 = False  ##True pour signifier l’étape 2 du processus de résolution
        errorMes = False  ##True lorsque le message d’erreur est visible
        finalRow = ''
        attempt = ''  ##tentative de solution si la solution est inconnue
        while running:
            ligne = -1
            col = -1
            pos = []
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        running = False
                elif event.type == pygame.MOUSEBUTTONUP:
                    errorMes = False
                    pos = pygame.mouse.get_pos()
                    #print(pos)
                    if 5<=pos[0]%55 and 5<=pos[1]%55:  ##assurez-vous que le clic n’est pas sur une limite
                        ligne = pos[1]//55
                        col = pos[0]//55

            if setup == True and len(pos)>0:
                if pos[1]<450:  ##il pourrait être sur une cellule
                    matrix = self.alterne(ligne,col,matrix)
                elif 485<=pos[1]<=515:  ##il pourrait être sur un boutton
                    if 300<=pos[0]<=385:  ##c'est le bouton "aléatoire"
                        matrix = self.Choisirlatailleinitiale(sz=size)
                        self.paintInit(Mat = matrix, sM = solMatrix)
                    elif 390<=pos[0]<=460:  ##c'est le bouton "commencer"
                        if self.verification(Mat=matrix.reshape(matrix.size,)):
                            setup = False
                            print('Out of Setup Mode')
                            initMat = matrix.astype(int)
                            matrix = matrix.astype(int)
                            self.clock = pygame.time.Clock()
                            stop = False  ##Commencer le temps
                        else: ##ne permettent pas à l’utilisateur de définir un modèle insoluble
                            errorMes = True
                    else:  #s'assurer si on clique bien sur un nombre
                        for num in range(4,9):
                            if -170+50*num<=pos[0]<=-130+50*num:
                                size = num
                                matrix = np.zeros((num,num))
                                solMatrix = np.zeros((num,num))
                                whitescreen = pygame.draw.rect(self.background, (255,255,255), (0,0,1000,450))
                                self.paintInit(Mat = matrix, sM = solMatrix)
                                break ##peut juste cliquer sur un bouton à la fois
            elif solving == False and len(pos)>0:
                ##n’autorise pas le clic pendant qu’il est en cours de résolution##
                if 460<=pos[0]<=540 and 485<=pos[1]<=515:  ##puis on clique sur le bouton résoudre
                    solving = True
                    #définir la position initiale de l’algorithme de résolution#
                    i=0
                    j=0
                elif ligne>=0 and col>=0:
                    #print(ligne,col)
                    matrix, solMatrix = self.cliquable(ligne, col, matrix, solMatrix)

            if solving == True:
                ##passer par l’étape suivante du processus de résolution##
                if i == 0 and step2 == True:
                    if attempt[j]=='1':
                        matrix, solMatrix = self.cliquable(ligne=i,col=j,M=matrix, sM=solMatrix)
                elif i<size-1:  ##ensuite, nous exécutant la première partie de l’algorithme
                    ##si une lumière est allumée, utilisez la ligne suivante vers le bas pour l’effacer
                    if matrix[i,j] == 1:
                        matrix, solMatrix = self.cliquable(ligne=i+1,col=j,M=matrix, sM=solMatrix)
                elif i == size-1:
                    ##lorsque vous atteignez la dernière ligne, obtenez une chaîne pour l’arrangement
                    temp = self.dernière_ligne(M = matrix)
                    if '1' in temp:  ##si nous n’avons pas encore fini de résoudre
                        if len(finalRow) == len(temp):
                            diff = '' ##mesurer la différence entre la dernière ligne précédente et la nouvelle
                            for ch in range(len(finalRow)):
                                diff = diff + str((int(temp[ch]) - int(finalRow[ch]))%2)
                            if diff not in KnownSols:
                                KnownSols[diff] = attempt
                                ## enregistrer les solutions connus ##
                                with open('KS.p', 'wb') as fp:
                                    pickle.dump(KnownSols, fp, protocol=pickle.HIGHEST_PROTOCOL)
                        finalRow = temp
                        print('Dernière ligne: ', finalRow)
                        if finalRow in KnownSols:
                            attempt = KnownSols[finalRow]
                        else:  ##choisissez une sélection aléatoire de boutons à appuyer dans la ligne supérieure
                            attempt = ''
                            while '1' not in attempt and attempt not in KnownSols.values():
                                attempt = ''
                                for i in range(size):
                                    attempt = attempt + str(np.random.randint(0,2))
                        step2 = True
                        i=0
                        j=-1
                        print('Attempt: ', attempt)
                    else:  ##si nous avons terminé, ajoutez les informations au dictionnaire si elles sont manquantes
                        résoudre = False
                        if finalRow not in KnownSols:
                            KnownSols[finalRow] = attempt
                            ## enregistrer les solution connu##
                            with open('KS.p', 'wb') as fp:
                                pickle.dump(KnownSols, fp, protocol=pickle.HIGHEST_PROTOCOL)
                i,j,step2 = self.iterate(i,j,step2,size)

            if stop == False:
                if self.verif_victoire(True, Mat = matrix): #checkflag == True:
                    print('Victoire!!')
                    stop = True
                    if self.playtime != 0: ##si le jeu a réellement commencer
                        setup = True
                        self.paintPuz(Mat = initMat)
                else:
                    #CREATION D'UN CHRONOMETRE (perso)
                    milliseconds = self.clock.tick(self.fps)
                    self.playtime += milliseconds / 1000.0
            self.draw_text("Cliques: {:6.4}{}TEMPS DE JEU: {:6.4} SECONDES".format(np.sum(solMatrix), " "*5, self.playtime))
            self.draw_text("Cliques Min: {:6.3}".format(np.sum(solMatrix%2)), loc=(50,570))
            self.draw_text("Cases initialement cliqué", loc=((2.7*size/2)*55,(size+0.5)*55))

            if errorMes == True:
                self.draw_text("Error: Modèle insoluble", loc = (50,520), color = (255,0,0))

            pygame.display.flip()
            self.screen.blit(self.background, (0, 0))

        pygame.quit()


    def draw_text(self, text,loc=(50,550), color=(0,0,0)):
        """Centrer le texte dans la fenêtre
        """
        fw, fh = self.font.size(text)
        surface = self.font.render(text, True, color)
        self.screen.blit(surface, loc)

class Cell(object):
    """Ceci est censé être une méthode pour créer une seule cellule"""
    def __init__(self, length = 50, col = 0, ligne = 0, color=(0,0,255),
                 background = pygame.Surface((600,600))):
        self.length = length
        self.x = col*55
        self.y = ligne*55
        self.color = color
        self.surface = background
        ##création de l’arrière-plan de la cellule##
        pygame.draw.rect(self.surface, (0,0,1), (self.x,self.y,self.length+10, self.length+10))
        ## création de la cellule##
        pygame.draw.rect(self.surface, self.color, (self.x+5, self.y+5, self.length, self.length))
        self.surface = self.surface.convert()

    def blit(self,background):#dessine une image sur une autre
        background.blit(self.surface, (0,0))##dessine une surface source sur cette surface

class Victoire():
    """
    Documentation :

        Description : La classe Victoire affiche une fenêtre popup lorsque le joueur arrive à gagner la partie

        Méthodes :

            -__init__() : initialisation de la fenêtre (méthode de base) : crée une popup qui nous affiche un message de victoire et le nombre de click total

            Arguments :

                Aucun argument nécessaire
    """

def __init__(self):
    global nb_clicks
    Tk().wm_withdraw() # to hide the main window
    messagebox.showinfo('Bravo !' , 'Félicitations, vous avez gagné la partie avec' + str(nb_clicks) + 'clicks !' )

####

if __name__ == '__main__':

    # appel avec largeur de fenêtre et fps
    Le_Jeu().execute()

Lien à poster
Partager sur d’autres sites

Membre, Le prendre au sérieux, nuit gravement à la santé, Posté(e)
azad2B Membre 5 932 messages
Le prendre au sérieux, nuit gravement à la santé,
Posté(e)

Salut

le fait est que le script n'est pas clair ! En particulier, l'objet np qui apparaît vers la ligne 21 et qui possède plusieurs attribut, n'est défini nulle part. En plus on ne peut pas dire que l'auteur est très bavard : ses commentaires ne servent à rien.

Bref je t'envoie demain un script que je crois fonctionnel et qui est très dépouillé. Tu pourras très facilement l'amputer d'au moins 80 lignes

Ce sera simplifié au maximum pour que tu puisses comprendre le principe. Après si tu veux on pourra l'améliorer ensemble.

Je n'utilise pas pygame mais tu peux facilement l'adapter car tu n'auras qu'à t'en servir pour placer les boutons là où tu les souhaites.

A plus...

Lien à poster
Partager sur d’autres sites

Membre, Le prendre au sérieux, nuit gravement à la santé, Posté(e)
azad2B Membre 5 932 messages
Le prendre au sérieux, nuit gravement à la santé,
Posté(e)

Voici la première version, fonctionnelle mais très vilaine !Entre autres défauts, elle présente celui de faire appel à un outil caché de Python que tout le monde possède, mais que personne n'utilise. C'est l'outil functools qui est une librairie contenant la methode que j'utilise en l'important (la méthode 'partial') Si tu ne veux pas utiliser les outils functools tu peux supprimer son importation, le tableau va se remplir, mais, ne fonctionne plus.

Le principe est facile à comprendre, Et avec pygame tu n'auras aucune difficulté à le créer.

from tkinter import *
from functools import partial
from random import randint

def button_text_changer(val, buttons):
    # inverse la valeur du bouton n° val que l'on a pressé
    buttons[val].config(text = str(int(buttons[val].config('text')[-1]) ^ 1))

    # inverse la valeur des boutons adjacents à celui que l'on a pressé
    if val == 0:
        buttons[1].config(text = str(int(buttons[1].config('text')[-1]) ^ 1))
        buttons[5].config(text = str(int(buttons[5].config('text')[-1]) ^ 1))
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
    if val == 1:
        buttons[0].config(text = str(int(buttons[0].config('text')[-1]) ^ 1))
        buttons[2].config(text = str(int(buttons[2].config('text')[-1]) ^ 1))
        buttons[5].config(text = str(int(buttons[5].config('text')[-1]) ^ 1))
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
    if val == 2:
        buttons[1].config(text = str(int(buttons[1].config('text')[-1]) ^ 1))
        buttons[3].config(text = str(int(buttons[3].config('text')[-1]) ^ 1))
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[8].config(text = str(int(buttons[8].config('text')[-1]) ^ 1))
    if val == 3:
        buttons[2].config(text = str(int(buttons[2].config('text')[-1]) ^ 1))
        buttons[4].config(text = str(int(buttons[4].config('text')[-1]) ^ 1))
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[8].config(text = str(int(buttons[8].config('text')[-1]) ^ 1))
        buttons[9].config(text = str(int(buttons[9].config('text')[-1]) ^ 1))
    if val == 4:
        buttons[3].config(text = str(int(buttons[3].config('text')[-1]) ^ 1))
        buttons[8].config(text = str(int(buttons[8].config('text')[-1]) ^ 1))
        buttons[9].config(text = str(int(buttons[9].config('text')[-1]) ^ 1))
    if val == 5:
        buttons[0].config(text = str(int(buttons[0].config('text')[-1]) ^ 1))
        buttons[1].config(text = str(int(buttons[1].config('text')[-1]) ^ 1))
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
        buttons[10].config(text = str(int(buttons[10].config('text')[-1]) ^ 1))
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
    if val == 6:
        buttons[0].config(text = str(int(buttons[0].config('text')[-1]) ^ 1))
        buttons[1].config(text = str(int(buttons[1].config('text')[-1]) ^ 1))
        buttons[2].config(text = str(int(buttons[2].config('text')[-1]) ^ 1))
        buttons[5].config(text = str(int(buttons[5].config('text')[-1]) ^ 1))
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[10].config(text = str(int(buttons[10].config('text')[-1]) ^ 1))
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
    if val == 7:
        buttons[1].config(text = str(int(buttons[1].config('text')[-1]) ^ 1))
        buttons[2].config(text = str(int(buttons[2].config('text')[-1]) ^ 1))
        buttons[3].config(text = str(int(buttons[3].config('text')[-1]) ^ 1))
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
        buttons[8].config(text = str(int(buttons[8].config('text')[-1]) ^ 1))
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
    if val == 8:
        buttons[2].config(text = str(int(buttons[2].config('text')[-1]) ^ 1))
        buttons[3].config(text = str(int(buttons[3].config('text')[-1]) ^ 1))
        buttons[4].config(text = str(int(buttons[4].config('text')[-1]) ^ 1))
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[9].config(text = str(int(buttons[9].config('text')[-1]) ^ 1))
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
        buttons[14].config(text = str(int(buttons[14].config('text')[-1]) ^ 1))
    if val == 9:
        buttons[3].config(text = str(int(buttons[3].config('text')[-1]) ^ 1))
        buttons[4].config(text = str(int(buttons[4].config('text')[-1]) ^ 1))
        buttons[8].config(text = str(int(buttons[8].config('text')[-1]) ^ 1))
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
        buttons[14].config(text = str(int(buttons[14].config('text')[-1]) ^ 1))
    if val == 10:
        buttons[5].config(text = str(int(buttons[5].config('text')[-1]) ^ 1))
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
        buttons[15].config(text = str(int(buttons[15].config('text')[-1]) ^ 1))
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
    if val == 11:
        buttons[5].config(text = str(int(buttons[5].config('text')[-1]) ^ 1))
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[10].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
        buttons[15].config(text = str(int(buttons[15].config('text')[-1]) ^ 1))
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
    if val == 12:
        buttons[6].config(text = str(int(buttons[6].config('text')[-1]) ^ 1))
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[8].config(text = str(int(buttons[8].config('text')[-1]) ^ 1))
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
    if val == 13:
        buttons[7].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[8].config(text = str(int(buttons[7].config('text')[-1]) ^ 1))
        buttons[9].config(text = str(int(buttons[9].config('text')[-1]) ^ 1))
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
        buttons[14].config(text = str(int(buttons[14].config('text')[-1]) ^ 1))
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
        buttons[19].config(text = str(int(buttons[19].config('text')[-1]) ^ 1))
    if val == 14:
        buttons[8].config(text = str(int(buttons[8].config('text')[-1]) ^ 1))
        buttons[9].config(text = str(int(buttons[9].config('text')[-1]) ^ 1))
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
        buttons[19].config(text = str(int(buttons[19].config('text')[-1]) ^ 1))
    if val == 15:
        buttons[10].config(text = str(int(buttons[10].config('text')[-1]) ^ 1))
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[20].config(text = str(int(buttons[20].config('text')[-1]) ^ 1))
        buttons[21].config(text = str(int(buttons[21].config('text')[-1]) ^ 1))
    if val == 16:
        buttons[10].config(text = str(int(buttons[10].config('text')[-1]) ^ 1))
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
        buttons[15].config(text = str(int(buttons[15].config('text')[-1]) ^ 1))
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
        buttons[20].config(text = str(int(buttons[20].config('text')[-1]) ^ 1))
        buttons[21].config(text = str(int(buttons[21].config('text')[-1]) ^ 1))
        buttons[22].config(text = str(int(buttons[22].config('text')[-1]) ^ 1))
    if val == 17:
        buttons[11].config(text = str(int(buttons[11].config('text')[-1]) ^ 1))
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
        buttons[21].config(text = str(int(buttons[21].config('text')[-1]) ^ 1))
        buttons[22].config(text = str(int(buttons[22].config('text')[-1]) ^ 1))
        buttons[23].config(text = str(int(buttons[23].config('text')[-1]) ^ 1))
    if val == 18:
        buttons[12].config(text = str(int(buttons[12].config('text')[-1]) ^ 1))
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
        buttons[14].config(text = str(int(buttons[14].config('text')[-1]) ^ 1))
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
        buttons[19].config(text = str(int(buttons[19].config('text')[-1]) ^ 1))
        buttons[22].config(text = str(int(buttons[22].config('text')[-1]) ^ 1))
        buttons[23].config(text = str(int(buttons[23].config('text')[-1]) ^ 1))
        buttons[24].config(text = str(int(buttons[24].config('text')[-1]) ^ 1))
    if val == 19:
        buttons[13].config(text = str(int(buttons[13].config('text')[-1]) ^ 1))
        buttons[14].config(text = str(int(buttons[14].config('text')[-1]) ^ 1))
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
        buttons[23].config(text = str(int(buttons[23].config('text')[-1]) ^ 1))
        buttons[24].config(text = str(int(buttons[24].config('text')[-1]) ^ 1))
    if val == 20:
        buttons[15].config(text = str(int(buttons[15].config('text')[-1]) ^ 1))
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[21].config(text = str(int(buttons[21].config('text')[-1]) ^ 1))
    if val == 21:
        buttons[15].config(text = str(int(buttons[15].config('text')[-1]) ^ 1))
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
        buttons[20].config(text = str(int(buttons[20].config('text')[-1]) ^ 1))
        buttons[22].config(text = str(int(buttons[22].config('text')[-1]) ^ 1))
    if val == 22:
        buttons[16].config(text = str(int(buttons[16].config('text')[-1]) ^ 1))
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
        buttons[21].config(text = str(int(buttons[21].config('text')[-1]) ^ 1))
        buttons[23].config(text = str(int(buttons[23].config('text')[-1]) ^ 1))
    if val == 23:
        buttons[17].config(text = str(int(buttons[17].config('text')[-1]) ^ 1))
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
        buttons[19].config(text = str(int(buttons[19].config('text')[-1]) ^ 1))
        buttons[22].config(text = str(int(buttons[22].config('text')[-1]) ^ 1))
        buttons[24].config(text = str(int(buttons[24].config('text')[-1]) ^ 1))
    if val == 24:
        buttons[18].config(text = str(int(buttons[18].config('text')[-1]) ^ 1))
        buttons[19].config(text = str(int(buttons[19].config('text')[-1]) ^ 1))
        buttons[23].config(text = str(int(buttons[23].config('text')[-1]) ^ 1))

def get_rand_list():
    # retourne une liste de 25 nombres formée de 0 et de 1
    tirage = []
    for i in range(25):
        if randint(0, 1) == 0:
            tirage.append(0)
        else:
            tirage.append(1)
    return tirage

def add_Buttons(fen1, tirage):
    # chaque case de la grille est un bouton on en ajoute 25
    # portants le numero attribué au tirage à la fenetre fen1
    row = 0
    buttons = []
    for i in range(25):
        if i != 0 and i % 5 == 0:
            row += 1
        button = Button(fen1, text = tirage[i], font = ('arial', 28, 'bold'))
        button.grid(row = row, column = i % 5)
        buttons.append(button)
    for i in range(25):
        buttons[i].config(command = partial(button_text_changer, i, buttons))

def demarre():
    # GO...
    fen1 = Tk()
    add_Buttons(fen1,get_rand_list())
    fen1.mainloop()
if __name__ == '__main__':
    demarre()

Reste maintenant à rendre cette horreur un peu plus digeste ...

Lien à poster
Partager sur d’autres sites

Membre, 20ans Posté(e)
rm57Sp Membre 17 messages
Forumeur balbutiant‚ 20ans‚
Posté(e)

Merci pour ton aide, maintenant je vais essayer de l'adapter sur pygame. Juste j'avais une petite questions, si tu devrais traduire cela en français ça donnerait quoi?: à savoir que la fonction Python Numpy numpy.dot() calcule le produit en points de deux tableaux d’entrée et le signe pourcentage est un opérateur en Python. Il nous donne le reste d’une division euclidienne.

verif1 = np.array([1,0,0,0, 1,1,0,0, 1,0,1,0, 0,1,1,1])
            verif2 = np.array([0,0,0,1, 0,0,1,1, 0,1,0,1, 1,1,1,0])
            verif3 = np.array([0,1,0,0, 1,1,1,0, 0,0,0,1, 1,1,0,1])
            verif4 = np.array([0,0,1,0, 0,1,1,1, 1,0,0,0, 1,0,1,1])
            if np.dot(Mat,verif1)%2>0 or np.dot(Mat,verif2)%2>0 or np.dot(Mat,verif3)%2>0 or np.dot(Mat,verif4)%2>0:

Lien à poster
Partager sur d’autres sites

Membre, Le prendre au sérieux, nuit gravement à la santé, Posté(e)
azad2B Membre 5 932 messages
Le prendre au sérieux, nuit gravement à la santé,
Posté(e)

Salut

Sais-tu que tu n'es pas sérieux ?

Tu donnes tes informations au compte-goute. Par exemple en lisant ton dernier post qui pose une question concernant la classe supprimée de ton programme je me suis aperçu que le np qui me posait problème voulait tout simplement dire que quelque part en un lieu seul connu de toi, tu caches un bout de code contenant quelque chose commençant par

import numpy as np

l'importation de numpy déguisé en np passe donc inaperçue

Pour ta dernière question le fragment que tu donnes est en fait la fonction

import numpy as np

def verification(Mat=np.zeros((5,5))):
    ##Vérifie si le jeu peut être résolue
    size=np.sqrt(len(Mat))
    if size==4:
        verif1=np.array([1,0,0,0,1,1,0,0,1,0,1,0,0,1,1,1])
        verif2=np.array([0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,0])
        verif3=np.array([0,1,0,0,1,1,1,0,0,0,0,1,1,1,0,1])
        verif4=np.array([0,0,1,0,0,1,1,1,1,0,0,0,1,0,1,1])
        if np.dot(Mat,verif1)%2>0 or np.dot(Mat,verif2)%2>0 or np.dot(Mat,verif3)%2>0 or np.dot(Mat,verif4)%2>0:
            return False
        else:
            return True
    elif size==5:
        verif1=np.array([0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,1,1,0])
        verif2=np.array([1,0,1,0,1,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,1,0,1,0,1])
        if np.dot(Mat,verif1)%2>0 or np.dot(Mat,verif2)%2>0:
            return False
        else:
            return True
    else:
        return True

où le np est en fait numpy

il y a 4 variables verif1,verif2,verif3 et verif4 et on cherche à savoir si l'une d'elles (au moins) est  impaires si c'est le cas, on retourne False

sinon toutes sont paires et on retourne True

Et encore une chose que tu m'a cachée :

ton jeu peut se jouer avec un tableau de 4X4 ou de 5X5

Il vaut mieux arrêter là ton jeu de devinettes avec moi.

Lien à poster
Partager sur d’autres sites

Membre, Le prendre au sérieux, nuit gravement à la santé, Posté(e)
azad2B Membre 5 932 messages
Le prendre au sérieux, nuit gravement à la santé,
Posté(e)

Ha je te précise que ton jeu est en fait quelque chose de très simple à programmer et si on n'utilise pas la méthode "force brute" comme dans mon exemple il doit en fait tenir en moins de 50 lignes de code.

Et que si l'on utilise des tableaux multi-dimensionnels on peut en prime et pour quelques lignes de plus savoir par avance si un tableau donné est soluble et en combien de coups.

Python a une bibliothèque (itertools) très puissante pour ce genre de recherche.

Lien à poster
Partager sur d’autres sites

Annonces
Maintenant

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×