Bonjour ou rebonjour pour certains,

J'ai fabriqué ma première petite animation avec PyGame : utilisations des Rect (merci à josmiley pour le coup de main !). Je suis donc passé à la suite : intéragir avec l'utilisateur.
Pour cela, je me suis dis qu'un simple morpion ferait l'affaire. J'ai passé 2 bonnes heures dessus mais j'y suis arrivé.
Pour corser un peu la chose, j'ai voulu tenter d'afficher qui était le vainqueur en cas de victoire (voir match nul et réinitialisation pourquoi pas) !
Et bien je bloque totalement sur ce fichu affichage. J'essaye d'afficher un message au milieu de la fenêtre et centré en fonction de la longueur du texte. Et bien je galère pas mal. Mais ce qui m'empêche le plus d'avancer c'est l'affichage du texte. Au moment ou je déclenche le display du texte, il ne s'affiche pas. Mais le plus étonnant c'est que le texte s'affiche uniquement si je réduit la fenêtre (direction la barre des tâches ouindoz) et que je la réaffiche.
J'avoue être totalement bluffé par ce "fonctionnement". Ma gestion des event est pourtant assez simpliste, je catch uniquement les click souris.

Quelque chose vous parait étrange la dedans ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
 
from pygame import *
import random
 
init()
scrrect = Rect(0,0,300,300) # rectangle de la fenetre
screen = display.set_mode(scrrect.size) # creation de a fenetre
 
class Plateau(Rect):
 
    def __init__(self, rect):
        self.lignes = [Ligne(0), Ligne(1), Ligne(2)]
        self.colonnes = [Colonne(0, self.lignes), Colonne(1, self.lignes), Colonne(2, self.lignes)]
        self.diagonales = [Diagonale(self.lignes, 0, 1), Diagonale(self.lignes, 2, -1)]
        self.rect = rect
        self.joueurActif = 1
        self.annonce = Annonce(self.rect)
 
    def switchPlayer(self):
        if self.joueurActif == 1:
            self.joueurActif = 2
        elif self.joueurActif == 2:
            self.joueurActif = 1
 
    def click(self, xclick, yclick):
        for ligne in self.lignes:
            for case in ligne.cases:
                if case.joueur == 0 and case.collidepoint(xclick, yclick):
                    case.update(self.joueurActif)
                    return True
        return False
 
    def checkWin(self):
        for ligne in self.lignes:
            if ligne.checkComplete():
                return True
        for colonne in self.colonnes:
            if colonne.checkComplete():
                return True
        for diagonale in self.diagonales:
            if diagonale.checkComplete():
                return True
        return False
 
    def displayWinner(self):
        self.annonce.display("Joueur "+str(self.joueurActif)+" gagne !", self)
 
class Diagonale():
    def __init__(self, lignes, y, pas):
        self.cases = [lignes[0].cases[y+0*pas], lignes[1].cases[y+1*pas], lignes[2].cases[y+2*pas]]
        self.complete = False
 
    def checkComplete(self):
        prems = self.cases[0].joueur
        if prems == 0:
            return False
        for c in self.cases:
            if c.joueur != prems:
                return False
        return True
 
class Ligne():
 
    def __init__(self, index):
        self.cases = [Case(0, index), Case(1, index), Case(2, index)]
        self.idx = index
        self.complete = False
 
    def checkComplete(self):
        prems = self.cases[0].joueur
        if prems == 0:
            return False
        for c in self.cases:
            if c.joueur != prems:
                return False
        return True
 
class Colonne():
 
    def __init__(self, index, lignes):
        self.cases = [lignes[0].cases[index], lignes[1].cases[index], lignes[2].cases[index]]
        self.idx = index
        self.complete = False
 
    def checkComplete(self):
        prems = self.cases[0].joueur
        if prems == 0:
            return False
        for c in self.cases:
            if c.joueur != prems:
                return False
        return True
 
class Case(Rect):
    rect = Rect(0,0,100,100)
 
    def __init__(self, ligne, colonne):
        self.joueur = 0
        self.ligne = ligne
        self.colonne = colonne
        self.img = None
        Rect.__init__(self,Case.rect.move((self.ligne)*100,(self.colonne)*100))
 
    def update(self, joueur):
        self.img = image.load("player"+str(joueur)+".png")
        self.joueur = joueur
        screen.blit(self.img,self)
 
class Annonce(Rect):
    fontObj = font.Font(None, 50)
    font = fontObj.render("",1,(255,255,255))
    rect = font.get_rect()
 
    def __init__(self, pltRect):
        Rect.__init__(self, Annonce.rect.move(pltRect.w/2 - Annonce.rect.w/2, pltRect.h/2 - Annonce.rect.h/2))
 
    def display(self, text, pltRect):
        font = Annonce.fontObj.render(text,1,(255,255,255))
        rect = font.get_rect()
        self.move(pltRect.w/2 - rect.w/2, pltRect.h/2 - rect.h/2)
        screen.blit(font, self)
 
 
 
 
pltJeu = Plateau(Rect(0,0,300,300))
state = 0
 
while state != 2:
    action = event.wait()
    if action.type == QUIT:
        state = 2
    elif action.type == MOUSEBUTTONDOWN:
        if state == 1:
            state == 2
        else:
            x,y = mouse.get_pos()
            if pltJeu.rect.collidepoint(x,y):
                if pltJeu.click(x,y):
                    display.flip()
                    if pltJeu.checkWin():
                        state = 1
                        pltJeu.displayWinner()
                    else:
                        pltJeu.switchPlayer()
display.quit()
sys.exit()