Je suis continuellement à la répétition du code et vous demandez-vous si il existe un moyen de simplifier ces instructions if

0

La question

Le code que j'ai créé est utilisé dans pygame pour mettre en surbrillance des boutons que je suis planant au-dessus et lorsqu'il est cliqué sur déclenchera leur fonction correspondante

if singleplayer_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), singleplayer_button)
    WIN.blit(singleplayer_button_text, (295, 400))
    if click:
        singleplayer()
else:
    pygame.draw.rect(WIN, RED, singleplayer_button)
    WIN.blit(singleplayer_button_text, (295, 400))

if multiplayer_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), multiplayer_button)
    WIN.blit(multiplayer_button_text, (727, 400))
    if click:
        multiplayer1()
else:
    pygame.draw.rect(WIN, RED, multiplayer_button)
    WIN.blit(multiplayer_button_text, (727, 400))

if leaderboard_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), leaderboard_button)
    WIN.blit(leaderboard_button_text, (291, 550))
    if click:
        leaderboard()
else:
    pygame.draw.rect(WIN, RED, leaderboard_button)
    WIN.blit(leaderboard_button_text, (291, 550))

if credit_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), credit_button)
    WIN.blit(credits_button_text, (774, 550))
    if click:
        credit()
else:
    pygame.draw.rect(WIN, RED, credit_button)
    WIN.blit(credits_button_text, (774, 550))

if register_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), register_button)
    WIN.blit(register_button_text, (300, 700))
    if click:
        register()
else:
    pygame.draw.rect(WIN, RED, register_button)
    WIN.blit(register_button_text, (300, 700))

if exit_button.collidepoint(mx, my):
    pygame.draw.rect(WIN, (180, 0, 0), exit_button)
    WIN.blit(exit_button_text, (737, 700))
    if click:
        exit_window()
else:
    pygame.draw.rect(WIN, RED, exit_button)
    WIN.blit(exit_button_text, (737, 700))

####_button est un rectangle

####_button_text est un texte qui se blitted sur le dessus du rectangle

pygame python
2021-11-23 17:15:29
1

La meilleure réponse

3

Lire un combat de Classes.

Créer un Button classe:

class Button():
    def __init__(self, rect, text, action):
        self.rect = rect
        self.text = text
        self.action = action
    def draw(self, win):
        pygame.draw.rect(win, (180, 0, 0), self.rect)
        WIN.blit(self.text, self.text.get_rect(center = self.rect.center))
    def click(self, mx, my, click):
        if self.rect.collidepoint(mx, my) and click:
            self.action()

Créer une liste de Botton objets:

buttons = [
    Button(singleplayer_button, singleplayer_button_text, singleplayer),
    Button(multiplayer_button,  multiplayer_button_text,  multiplayer1),
    Button(leaderboard_button,  leaderboard_button_text,  leaderboard),
    Button(credit_button,       credits_button_text,      credit),
    Button(register_button,     register_button_text,     register),
    Button(exit_button,         exit_button_text,         exit_window)
]

Dessiner les boutons dans une boucle:

for button in buttons:
    button.draw(WIN)

Faire cliquez sur la détection dans une boucle:

for button in buttons:
    button.click(mx, my, click)
2021-11-23 19:01:17

Merci pour la solution, si je pouvais upvote ce que je ferais.
Minhaj Rahman

@MinhajRahman Merci. Vous êtes les bienvenus.
Rabbid76

Je voulais juste suivre cette. Je reçois et d'erreur lorsque j'essaie d'exécuter le code de la ligne 147, par un tirage au sort pour GAGNER.blit(de soi.texte, de soi.texte.get_rect(centre=auto.rect.centre d')) AttributeError: 'pygame.Rect' objet n'a pas d'attribut "get_rect'
Minhaj Rahman

@MinhajRahman Désolé, mon mauvais. Il y avait une erreur dans la réponse. Button(register_button, register_button_text, register), au lieu de Button(register_button, register_button, register), (le 2ème argument est register_button_text).
Rabbid76

De même pour Button(exit_button, exit_button_text, exit_window).
Rabbid76

Ahhhh j'ai essayé de comprendre cela pour un certain temps maintenant, et n'avait même pas remarqué, merci encore
Minhaj Rahman

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................