IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Jeu de la vie avec des cercles


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Médecin
    Inscrit en
    Mars 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2024
    Messages : 4
    Par défaut Jeu de la vie avec des cercles
    Bonjour.
    Je sollicite votre aide pour un programme que j’essai de créer.
    J’ai découvert il y a quelques années le jeu de la vie de Conway qui m’a vraiment fasciné. Je l’ai revu récemment dans une vidéo de David Louapre (ScienceEtonnante) et j’ai été frappé par une chose : la « vie » n’est pas faite de pixels (jusqu’à preuve du contraire), mais plutôt d’éléments ronds, sphériques. Les étoiles/planètes sont des sphères, le noyau d’une cellule ou d’un atome est une sphère…
    Je me suis donc mis en tête de créer un automate cellulaire avec des cercles (je ne sais pas si cela a déjà été fait ?). Les cellules sont alors voisines de 6 autres cellules et non 8 pixels.
    J’ai réussi à créer un échantillon de 90 cellules, avec lequel j’ai trouvé des structures répétitives mais mon quadrillage est trop petit je pense pour mettre en évidence des structures mobiles.
    Malheureusement je bloque dans l’élargissement de mon « quadrillage ». Je ne comprend pas comment automatiser la reconnaissance de l’état de chaque cellule sans dessiner chaque cellule une par une, puis de définir tous les voisins, ce qui est réellement fastidieux.
    Soyez indulgent, ce n’est pas du tout mon domaine (je suis dans la santé), et c’est la 1ère fois que j’écris un code en Python.
    Dans mon 1er code Python, j’ai dessiné chaque cercle un à un, et je n’ai pas trouvé de solution pour ne pas avoir à lister chaque cercle et chaque valeur, ce qui entraîne des lignes très/trop longues. Mais ça fonctionne. J'ai mis une vidéo sur Youtube des structures intéressantes retrouvées avec ce modèle réduit : vous pouvez la trouver en tapant "Conway's game of life with circles"
    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
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    from tkinter import *
     
    x = 500
    y = 400
    r = 33
     
    def create_circle(x, y, r, canvas):
        x0 = x - r
        y0 = y - r
        x1 = x + r
        y1 = y + r
        return canvas.create_oval(x0, y0, x1, y1, fill='white')
     
    def change_circle_color(event):
        circle = event.widget.find_closest(event.x, event.y)[0]
        current_color = canvas.itemcget(circle, "fill")
        new_color = "black" if current_color == "white" else "white"
        canvas.itemconfigure(circle, fill=new_color)
     
    class CircleValues:
        def __init__(self, canvas, circles):
            self.canvas = canvas
            self.circles = circles
            self.values = []
            self.update_values()
     
        def update_values(self):
            self.values = [1 if self.canvas.itemcget(circle, "fill") == "black" else 0
                           for circle in self.circles]
     
    def configure_circle(canvas, circles, sum_value):
        color = "black" if sum_value == 2 else "white"
        canvas.itemconfigure(circles, fill=color)
     
    def evolution():
        values_obj = CircleValues(canvas, circles)
        value1, value2, value3, value4, value5, value6, value7, value8, value9, value10, value11, value12, value13, value14, value15, value16, value17, value18, value19, value20, value21, value22, value23, value24, value25, value26, value27, value28, value29, value30, value31, value32, value33, value34, value35, value36, value37, value38, value39, value40, value41, value42, value43, value44, value45, value46, value47, value48, value49, value50, value51, value52, value53, value54, value55, value56, value57, value58, value59, value60, value61, value62, value63, value64, value65, value66, value67, value68, value69, value70, value71, value72, value73, value74, value75, value76, value77, value78, value79, value80, value81, value82, value83, value84, value85, value86, value87, value88, value89, value90, value91 = values_obj.values
        sum1 = value2 + value3 + value4 + value5 + value6 + value7
        sum2 = value1 + value7 + value19 + value8 + value9 + value3
        sum3 = value1 + value2 + value9 + value10 + value11 + value4
        sum4 = value1 + value3 + value11 + value12 + value13 + value5
        sum5 = value1 + value4 + value13 + value14 + value15 + value6
        sum6 = value1 + value5 + value15 + value16 + value17 + value7
        sum7 = value1 + value6 + value17 + value18 + value19 + value2
        sum8 = value2 + value19 + value37 + value20 + value21 + value9
        sum9 = value2 + value8 + value21 + value22 + value10 + value3
        sum10 = value3 + value9 + value22 + value23 + value24 + value11
        sum11 = value3 + value10 + value24 + value25 + value12 + value4
        sum12 = value4 + value11 + value25 + value26 + value27 + value13
        sum13 = value4 + value12 + value27 + value28 + value14 + value5
        sum14 = value5 + value13 + value28 + value29 + value30 + value15
        sum15 = value5 + value14 + value30 + value31 + value16 + value6
        sum16 = value6 + value15 + value31 + value32 + value33 + value17
        sum17 = value6 + value16 + value33 + value34 + value18 + value7
        sum18 = value7 + value17 + value34 + value35 + value36 + value19
        sum19 = value2 + value7 + value18 + value36 + value37 + value8
        sum20 = value8 + value37 + value61 + value38 + value39 + value21
        sum21 = value8 + value20 + value39 + value40 + value22 + value9
        sum22 = value9 + value21 + value40 + value41 + value23 + value10
        sum23 = value10 + value22 + value41 + value42 + value43 + value24
        sum24 = value10 + value23 + value43 + value44 + value25 + value11
        sum25 = value11 + value24 + value44 + value45 + value26 + value12
        sum26 = value12 + value25 + value45 + value46 + value47 + value27
        sum27 = value12 + value26 + value47 + value48 + value28 + value13
        sum28 = value13 + value27 + value48 + value49 + value29 + value14
        sum29 = value14 + value28 + value49 + value50 + value51 + value30
        sum30 = value14 + value29 + value51 + value52 + value31 + value15
        sum31 = value15 + value30 + value52 + value53 + value32 + value16
        sum32 = value16 + value31 + value53 + value54 + value55 + value33
        sum33 = value16 + value32 + value55 + value56 + value34 + value17
        sum34 = value17 + value33 + value56 + value57 + value35 + value18
        sum35 = value18 + value34 + value57 + value58 + value59 + value36
        sum36 = value18 + value35 + value59 + value60 + value37 + value19
        sum37 = value8 + value19 + value36 + value60 + value61 + value20
        sum38 = value20 + value61 + value91 + value62 + value63 + value39
        sum39 = value20 + value38 + value63 + value64 + value40 + value21
        sum40 = value21 + value39 + value64 + value65 + value41 + value22
        sum41 = value22 + value40 + value65 + value66 + value42 + value23
        sum42 = value23 + value41 + value66 + value67 + value68 + value43
        sum43 = value23 + value42 + value68 + value69 + value44 + value24
        sum44 = value24 + value43 + value69 + value70 + value45 + value25
        sum45 = value25 + value44 + value70 + value71 + value46 + value26
        sum46 = value26 + value45 + value71 + value72 + value73 + value47
        sum47 = value26 + value46 + value73 + value74 + value48 + value27
        sum48 = value27 + value47 + value74 + value75 + value49 + value28
        sum49 = value28 + value48 + value75 + value76 + value50 + value29
        sum50 = value29 + value49 + value76 + value77 + value78 + value51
        sum51 = value29 + value50 + value78 + value79 + value52 + value30
        sum52 = value30 + value51 + value79 + value80 + value53 + value31
        sum53 = value31 + value52 + value80 + value81 + value54 + value32
        sum54 = value32 + value53 + value81 + value82 + value83 + value55
        sum55 = value32 + value54 + value83 + value84 + value56 + value33
        sum56 = value33 + value55 + value84 + value85 + value57 + value34
        sum57 = value34 + value56 + value85 + value86 + value58 + value35
        sum58 = value35 + value57 + value86 + value87 + value88 + value59
        sum59 = value35 + value58 + value88 + value89 + value60 + value36
        sum60 = value36 + value59 + value89 + value90 + value61 + value37
        sum61 = value20 + value37 + value60 + value90 + value91 + value38
        sum62 = value38 + value91 + value63
        sum63 = value38 + value62 + value64 + value39
        sum64 = value39 + value63 + value65 + value40
        sum65 = value40 + value64 + value66 + value41
        sum66 = value41 + value65 + value67 + value42
        sum67 = value42 + value66 + value68
        sum68 = value42 + value67 + value69 + value43
        sum69 = value43 + value68 + value70 + value44
        sum70 = value44 + value69 + value71 + value45
        sum71 = value45 + value70 + value72 + value46
        sum72 = value46 + value71 + value73
        sum73 = value46 + value72 + value74 + value47
        sum74 = value47 + value73 + value75 + value48
        sum75 = value48 + value74 + value76 + value49
        sum76 = value49 + value75 + value77 + value50
        sum77 = value50 + value76 + value78
        sum78 = value50 + value77 + value79 + value51
        sum79 = value51 + value78 + value80 + value52
        sum80 = value52 + value79 + value81 + value53
        sum81 = value53 + value80 + value82 + value54
        sum82 = value54 + value81 + value83
        sum83 = value54 + value82 + value84 + value55
        sum84 = value55 + value83 + value85 + value56
        sum85 = value56 + value84 + value86 + value57
        sum86 = value57 + value85 + value87 + value58
        sum87 = value58 + value86 + value88
        sum88 = value58 + value87 + value89 + value59
        sum89 = value59 + value88 + value90 + value60
        sum90 = value60 + value89 + value91 + value61
        sum91 = value38 + value61 + value90 + value62
     
     
        for circle, sum_value in [(circle1, sum1), (circle2, sum2), (circle3, sum3), (circle4, sum4), (circle5, sum5), (circle6, sum6), (circle7, sum7), (circle8, sum8), (circle9, sum9), (circle10, sum10), (circle11, sum11), (circle12, sum12), (circle13, sum13), (circle14, sum14), (circle15, sum15), (circle16, sum16), (circle17, sum17), (circle18, sum18), (circle19, sum19), (circle20, sum20), (circle21, sum21), (circle22, sum22), (circle23, sum23), (circle24, sum24), (circle25, sum25), (circle26, sum26), (circle27, sum27), (circle28, sum28), (circle29, sum29), (circle30, sum30), (circle31, sum31), (circle32, sum32), (circle33, sum33), (circle34, sum34), (circle35, sum35), (circle36, sum36), (circle37, sum37), (circle38, sum38), (circle39, sum39), (circle40, sum40), (circle41, sum41), (circle42, sum42), (circle43, sum43), (circle44, sum44), (circle45, sum45), (circle46, sum46), (circle47, sum47), (circle48, sum48), (circle49, sum49), (circle50, sum50), (circle51, sum51), (circle52, sum52), (circle53, sum53), (circle54, sum54), (circle55, sum55), (circle56, sum56), (circle57, sum57), (circle58, sum58), (circle59, sum59), (circle60, sum60), (circle61, sum61), (circle62, sum62), (circle63, sum63), (circle64, sum64), (circle65, sum65), (circle66, sum66), (circle67, sum67), (circle68, sum68), (circle69, sum69), (circle70, sum70), (circle71, sum71), (circle72, sum72), (circle73, sum73), (circle74, sum74), (circle75, sum75), (circle76, sum76), (circle77, sum77), (circle78, sum78), (circle79, sum79), (circle80, sum80), (circle81, sum81), (circle82, sum82), (circle83, sum83), (circle84, sum84), (circle85, sum85), (circle86, sum86), (circle87, sum87), (circle88, sum88), (circle89, sum89), (circle90, sum90), (circle91, sum91)]:
            configure_circle(canvas, circle, sum_value)
     
     
    larFen=1000
    hautFen=800
     
    fen = Tk()
    fen.title("ReaLife Game")
    fen.geometry(str(larFen)+"x"+str(hautFen+50))
     
    canvas = Canvas(fen, width=1000, height=800, borderwidth=0, highlightthickness=0, bg="white")
    canvas.grid()
     
    circle1 = create_circle(x, y, r, canvas)
    circle2 = create_circle(x + 2*r, y, r, canvas)
    circle3 = create_circle(x + r, y + 1.76*r, r, canvas)
    circle4 = create_circle(x - r, y + 1.76*r, r, canvas)
    circle5 = create_circle(x - 2*r, y, r, canvas)
    circle6 = create_circle(x - r, y - 1.76*r, r, canvas)
    circle7 = create_circle(x + r, y - 1.76*r, r, canvas)
    circle8 = create_circle(x + 4*r, y, r, canvas)
    circle9 = create_circle(x + 3*r, y + 1.76*r, r, canvas)
    circle10 = create_circle(x + 2*r, y + 1.76*2*r, r, canvas)
    circle11 = create_circle(x, y + 1.76*2*r, r, canvas)
    circle12 = create_circle(x - 2*r, y + 1.76*2*r, r, canvas)
    circle13 = create_circle(x - 3*r, y + 1.76*r, r, canvas)
    circle14 = create_circle(x - 4*r, y, r, canvas)
    circle15 = create_circle(x - 3*r, y - 1.76*r, r, canvas)
    circle16 = create_circle(x - 2*r, y - 1.76*2*r, r, canvas)
    circle17 = create_circle(x, y - 1.76*2*r, r, canvas)
    circle18 = create_circle(x + 2*r, y - 1.76*2*r, r, canvas)
    circle19 = create_circle(x + 3*r, y - 1.76*r, r, canvas)
    circle20 = create_circle(x + 6*r, y, r, canvas)
    circle21 = create_circle(x + 5*r, y + 1.76*r, r, canvas)
    circle22 = create_circle(x + 4*r, y + 1.76*2*r, r, canvas)
    circle23 = create_circle(x + 3*r, y + 1.76*3*r, r, canvas)
    circle24 = create_circle(x + r, y + 1.76*3*r, r, canvas)
    circle25 = create_circle(x - r, y + 1.76*3*r, r, canvas)
    circle26 = create_circle(x - 3*r, y + 1.76*3*r, r, canvas)
    circle27 = create_circle(x - 4*r, y + 1.76*2*r, r, canvas)
    circle28 = create_circle(x - 5*r, y + 1.76*r, r, canvas)
    circle29 = create_circle(x - 6*r, y, r, canvas)
    circle30 = create_circle(x - 5*r, y - 1.76*r, r, canvas)
    circle31 = create_circle(x - 4*r, y - 1.76*2*r, r, canvas)
    circle32 = create_circle(x - 3*r, y - 1.76*3*r, r, canvas)
    circle33 = create_circle(x - r, y - 1.76*3*r, r, canvas)
    circle34 = create_circle(x + r, y - 1.76*3*r, r, canvas)
    circle35 = create_circle(x + 3*r, y - 1.76*3*r, r, canvas)
    circle36 = create_circle(x + 4*r, y - 1.76*2*r, r, canvas)
    circle37 = create_circle(x + 5*r, y - 1.76*r, r, canvas)
    circle38 = create_circle(x + 8*r, y, r, canvas)
    circle39 = create_circle(x + 7*r, y + 1.76*r, r, canvas)
    circle40 = create_circle(x + 6*r, y + 1.76*2*r, r, canvas)
    circle41 = create_circle(x + 5*r, y + 1.76*3*r, r, canvas)
    circle42 = create_circle(x + 4*r, y + 1.76*4*r, r, canvas)
    circle43 = create_circle(x + 2*r, y + 1.76*4*r, r, canvas)
    circle44 = create_circle(x, y + 1.76*4*r, r, canvas)
    circle45 = create_circle(x - 2*r, y + 1.76*4*r, r, canvas)
    circle46 = create_circle(x - 4*r, y + 1.76*4*r, r, canvas)
    circle47 = create_circle(x - 5*r, y + 1.76*3*r, r, canvas)
    circle48 = create_circle(x - 6*r, y + 1.76*2*r, r, canvas)
    circle49 = create_circle(x - 7*r, y + 1.76*r, r, canvas)
    circle50 = create_circle(x - 8*r, y, r, canvas)
    circle51 = create_circle(x - 7*r, y - 1.76*r, r, canvas)
    circle52 = create_circle(x - 6*r, y - 1.76*2*r, r, canvas)
    circle53 = create_circle(x - 5*r, y - 1.76*3*r, r, canvas)
    circle54 = create_circle(x - 4*r, y - 1.76*4*r, r, canvas)
    circle55 = create_circle(x - 2*r, y - 1.76*4*r, r, canvas)
    circle56 = create_circle(x, y - 1.76*4*r, r, canvas)
    circle57 = create_circle(x + 2*r, y - 1.76*4*r, r, canvas)
    circle58 = create_circle(x + 4*r, y - 1.76*4*r, r, canvas)
    circle59 = create_circle(x + 5*r, y - 1.76*3*r, r, canvas)
    circle60 = create_circle(x + 6*r, y - 1.76*2*r, r, canvas)
    circle61 = create_circle(x + 7*r, y - 1.76*r, r, canvas)
    circle62 = create_circle(x + 10*r, y, r, canvas)
    circle63 = create_circle(x + 9*r, y + 1.76*r, r, canvas)
    circle64 = create_circle(x + 8*r, y + 1.76*2*r, r, canvas)
    circle65 = create_circle(x + 7*r, y + 1.76*3*r, r, canvas)
    circle66 = create_circle(x + 6*r, y + 1.76*4*r, r, canvas)
    circle67 = create_circle(x + 5*r, y + 1.76*5*r, r, canvas)
    circle68 = create_circle(x + 3*r, y + 1.76*5*r, r, canvas)
    circle69 = create_circle(x + r, y + 1.76*5*r, r, canvas)
    circle70 = create_circle(x - r, y + 1.76*5*r, r, canvas)
    circle71 = create_circle(x - 3*r, y + 1.76*5*r, r, canvas)
    circle72 = create_circle(x - 5*r, y + 1.76*5*r, r, canvas)
    circle73 = create_circle(x - 6*r, y + 1.76*4*r, r, canvas)
    circle74 = create_circle(x - 7*r, y + 1.76*3*r, r, canvas)
    circle75 = create_circle(x - 8*r, y + 1.76*2*r, r, canvas)
    circle76 = create_circle(x - 9*r, y + 1.76*r, r, canvas)
    circle77 = create_circle(x - 10*r, y, r, canvas)
    circle78 = create_circle(x - 9*r, y - 1.76*r, r, canvas)
    circle79 = create_circle(x - 8*r, y - 1.76*2*r, r, canvas)
    circle80 = create_circle(x - 7*r, y - 1.76*3*r, r, canvas)
    circle81 = create_circle(x - 6*r, y - 1.76*4*r, r, canvas)
    circle82 = create_circle(x - 5*r, y - 1.76*5*r, r, canvas)
    circle83 = create_circle(x - 3*r, y - 1.76*5*r, r, canvas)
    circle84 = create_circle(x - 33, y - 1.76*5*r, r, canvas)
    circle85 = create_circle(x + 33, y - 1.76*5*r, r, canvas)
    circle86 = create_circle(x + 3*r, y - 1.76*5*r, r, canvas)
    circle87 = create_circle(x + 5*r, y - 1.76*5*r, r, canvas)
    circle88 = create_circle(x + 6*r, y - 1.76*4*r, r, canvas)
    circle89 = create_circle(x + 7*r, y - 1.76*3*r, r, canvas)
    circle90 = create_circle(x + 8*r, y - 1.76*2*r, r, canvas)
    circle91 = create_circle(x + 9*r, y - 1.76*r, r, canvas)
     
    circles = [circle1, circle2, circle3, circle4, circle5, circle6, circle7, circle8, circle9, circle10, circle11, circle12, circle13, circle14, circle15, circle16, circle17, circle18, circle19, circle20, circle21, circle22, circle23, circle24, circle25, circle26, circle27, circle28, circle29, circle30, circle31, circle32, circle33, circle34, circle35, circle36, circle37, circle38, circle39, circle40, circle41, circle42, circle43, circle44, circle45, circle46, circle47, circle48, circle49, circle50, circle51, circle52, circle53, circle54, circle55, circle56, circle57, circle58, circle59, circle60, circle61, circle62, circle63, circle64, circle65, circle66, circle67, circle68, circle69, circle70, circle71, circle72, circle73, circle74, circle75, circle76, circle77, circle78, circle79, circle80, circle81, circle82, circle83, circle84, circle85, circle86, circle87, circle88, circle89, circle90, circle91]
    for circle in circles:
        canvas.tag_bind(circle, '<Button-1>', change_circle_color)
     
     
    evolution_speed = 500
     
    def start_infinite_evolution():
        fen.after(evolution_speed, evolution)
        fen.after(evolution_speed, start_infinite_evolution)
     
     
    evoluer=Button(fen,text="EVOLUTION",command=start_infinite_evolution)
    evoluer.place(x=larFen-400,y=hautFen+10)
     
     
    fen.mainloop()
    Dans ce 2ème code Python, j’ai créer un quadrillage avec 20 lignes de 20 cercles. Mais je ne vois pas comment calculer la somme de l’état des cellules voisines de manière automatisée, car avec des lignes paires et impaires décalées, les 6 voisins de chaque cellule ne sont pas toujours les mêmes (la cellule 22 a comme voisins : i-1, i+1, i-20, i-19, i+20, i+21, mais la cellule 43 a comme voisins : i-1, i+1, i-21, i-20, i+19, i+20)
    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
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    from tkinter import *
     
    r = 20
     
    def create_circle(i, x, y):
     circle = canvas.create_oval(x - r, y - r, x + r, y + r, fill="white")
     canvas.create_text(x, y, text=str(i))
     
    def change_color(i):
     circle = canvas.find_withtag("current")[0]
     current_color = canvas.itemcget(circle, "fill")
     new_color = "black" if current_color == "white" else "white"
     canvas.itemconfigure(circle, fill=new_color)
     
    class CircleValues:
     def __init__(self, canvas, i):
       self.canvas = canvas
       self.i = i
       self.values = []
       self.update_values()
     
     def update_values(self):
       self.values = [1 if self.canvas.itemcget(circle, "fill") == "black" else 0
                       for circle in self.i]
     
     
    def configure_circle(canvas, i, sum):
     color = "black" if sum == 2 else "white"
     canvas.itemconfigure(i, fill=color)
     
    def evolution(i, circle, values):
     values = CircleValues(canvas, i)
     sum = values[(i-1) + (i+1) + (i-20) + (i-19) + (i+20) + (i+21)]
     configure_circle(canvas, circle, sum)
     
     
    larFen=1000
    hautFen=800
     
    fen = Tk()
    fen.title("The game of ReaLife")
    fen.geometry(str(larFen)+"x"+str(hautFen+50))
     
    canvas = Canvas(fen, width=1000, height=800, borderwidth=0, highlightthickness=0, bg="white")
    canvas.grid()
     
    for i in range(1, 20):
     x = i * (r*2)
     y = 50
     create_circle(i, x, y)
     
    for i in range(21, 40):
     x = i * (r*2) - (r*39)
     y = 50 + (r*1.76)
     create_circle(i, x, y)
     
    for i in range(41, 60):
     x = i * (r*2) - (r*80)
     y = 50 + (r*2*1.76)
     create_circle(i, x, y)
     
    for i in range(61, 80):
     x = i * (r*2) - (r*119)
     y = 50 + (r*3*1.76)
     create_circle(i, x, y)
     
    for i in range(81, 100):
     x = i * (r*2) - (r*160)
     y = 50 + (r*4*1.76)
     create_circle(i, x, y)
     
    for i in range(101, 120):
     x = i * (r*2) - (r*199)
     y = 50 + (r*5*1.76)
     create_circle(i, x, y)
     
    for i in range(121, 140):
     x = i * (r*2) - (r*240)
     y = 50 + (r*6*1.76)
     create_circle(i, x, y)
     
    for i in range(141, 160):
     x = i * (r*2) - (r*279)
     y = 50 + (r*7*1.76)
     create_circle(i, x, y)
     
    for i in range(161, 180):
     x = i * (r*2) - (r*320)
     y = 50 + (r*8*1.76)
     create_circle(i, x, y)
     
    for i in range(181, 200):
     x = i * (r*2) - (r*359)
     y = 50 + (r*9*1.76)
     create_circle(i, x, y)
     
    for i in range(201, 220):
     x = i * (r*2) - (r*400)
     y = 50 + (r*10*1.76)
     create_circle(i, x, y)
     
    for i in range(221, 240):
     x = i * (r*2) - (r*439)
     y = 50 + (r*11*1.76)
     create_circle(i, x, y)
     
    for i in range(241, 260):
     x = i * (r*2) - (r*480)
     y = 50 + (r*12*1.76)
     create_circle(i, x, y)
     
    for i in range(261, 280):
     x = i * (r*2) - (r*519)
     y = 50 + (r*13*1.76)
     create_circle(i, x, y)
     
    for i in range(281, 300):
     x = i * (r*2) - (r*560)
     y = 50 + (r*14*1.76)
     create_circle(i, x, y)
     
    for i in range(301, 320):
     x = i * (r*2) - (r*599)
     y = 50 + (r*15*1.76)
     create_circle(i, x, y)
     
    for i in range(321, 340):
     x = i * (r*2) - (r*640)
     y = 50 + (r*16*1.76)
     create_circle(i, x, y)
     
    for i in range(341, 360):
     x = i * (r*2) - (r*679)
     y = 50 + (r*17*1.76)
     create_circle(i, x, y)
     
    for i in range(361, 380):
     x = i * (r*2) - (r*720)
     y = 50 + (r*18*1.76)
     create_circle(i, x, y)
     
    for i in range(381, 400):
     x = i * (r*2) - (r*759)
     y = 50 + (r*19*1.76)
     create_circle(i, x, y)
     
     
    for i in range(1, 760):
     canvas.tag_bind(i, "<Button-1>", lambda event, i=i:change_color(i))
     
     
    evolution_speed = 500
     
    def start_infinite_evolution():
       fen.after(evolution_speed, evolution)
       fen.after(evolution_speed, start_infinite_evolution)
     
    evoluer=Button(fen,text="EVOLUTION",command=start_infinite_evolution)
    evoluer.place(x=larFen-400,y=hautFen+10)
     
    fen.mainloop()
    Auriez vous des idées pour corriger ce code ?
    Merci beaucoup pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Lorsque je vois la répétition du pattern:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in range(1, 20):
     x = i * (r*2)
     y = 50
     create_circle(i, x, y)
    une dizaine de fois, je me dis que vous n'avez pas encore compris ce que programmer veut dire et que vous vous lancez dans des problèmes encore un peu trop compliqués.


    De toutes façons, c'est pas compliqué, on part d'un tableau avec éventuellement des lignes/colonnes supplémentaires pour gérer les bords plus facilement et à chaque itération on crée un nouveau tableau fonction des éléments existants et de leurs voisins.
    Afficher le tableau, c'est le plus facile: on efface tout et on fait le rendu des cases...

    Soyez indulgent, ce n’est pas du tout mon domaine (je suis dans la santé), et c’est la 1ère fois que j’écris un code en Python.
    Ouvrir un tuto. essayer de faire les exos est un préalable.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Candidat au Club
    Homme Profil pro
    Médecin
    Inscrit en
    Mars 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2024
    Messages : 4
    Par défaut
    Merci pour votre réponse.
    J'arrive à dessiner un quadrillage de cercles en lignes et colonnes comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(20):
      for j in range(20):
        dessiner_cercle(r + i*2*r, r + j*2*r)

    Nom : Capture d’écran 2024-03-06 à 18.54.00.png
Affichages : 276
Taille : 289,2 Ko


    Mais ce n'est pas ce que je veux faire.
    Je souhaite que les cercles soient collés et en quinconce, et je ne vois pas par quelle formule le faire. Il y a certainement une solution, je vais chercher...
    Images attachées Images attachées   

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Citation Envoyé par blacksoul222 Voir le message
    Mais ce n'est pas ce que je veux faire.
    Je souhaite que les cercles soient collés et en quinconce, et je ne vois pas par quelle formule le faire. Il y a certainement une solution, je vais chercher...
    Vous pourriez remarquer que les lignes impaires (ou une ligne sur 2) sont décalées de R(ayon)...
    Ppur ce qui est du déplacement vertical, je vous laisse revoir vos cours de trigo.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Candidat au Club
    Homme Profil pro
    Médecin
    Inscrit en
    Mars 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2024
    Messages : 4
    Par défaut
    J'ai trouvé la solution, je progresse !
    Il faut décaler une fois sur 2 en effet tout simplement. Et de la même manière je vais essayer de créer une règle où les voisins sont différents une ligne sur 2... Merci
    Mes cours de math du lycée sont très loin malheureusement, et je ne les utilise pour ainsi dire jamais.
    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
    from tkinter import *
     
    r = 20
     
     
    def create_circle(i, x, y):
      circle = canvas.create_oval(x - r, y - r, x + r, y + r, fill="white")
      canvas.create_text(x,y)
     
    def change_color(i):
      circle = canvas.find_withtag("current")[0]
      current_color = canvas.itemcget(circle, "fill")
      new_color = "black" if current_color == "white" else "white"
      canvas.itemconfigure(circle, fill=new_color)
     
    class CircleValues:
      def __init__(self, canvas, i):
        self.canvas = canvas
        self.i = i
        self.values = []
        self.update_values()
     
      def update_values(self):
        self.values = [1 if self.canvas.itemcget(circle, "fill") == "black" else 0
                        for circle in self.i]
     
     
    def configure_circle(canvas, i, sum):
      color = "black" if sum == 2 else "white"
      canvas.itemconfigure(i, fill=color)
     
    def evolution(i, circle, values):
      values = CircleValues(canvas, i)
      sum = values[(i-1) + (i+1) + (i-20) + (i-19) + (i+20) + (i+21)]
      configure_circle(canvas, circle, sum)
     
    larFen=1400
    hautFen=1200
     
    fen = Tk()
    fen.title("The game of ReaLife")
    fen.geometry(str(larFen)+"x"+str(hautFen+50))
     
    canvas = Canvas(fen, width=1400, height=1200, borderwidth=0, highlightthickness=0, bg="white")
    canvas.grid()
     
    for j in range(20):
      if j % 2 == 0:
        gap = 0
      else:
        gap = r
      for i in range(20):
        create_circle(i, 2*r + i*2*r + gap, 2*r + j*r*1.76)
     
    for i in range(1, 760):
      canvas.tag_bind(i, "<Button-1>", lambda event, i=i:change_color(i))
     
     
    evolution_speed = 500
     
    def start_infinite_evolution():
        fen.after(evolution_speed, evolution)
        fen.after(evolution_speed, start_infinite_evolution)
     
    evoluer=Button(fen,text="EVOLUTION",command=start_infinite_evolution)
    evoluer.place(x=larFen-400,y=hautFen+10)
     
    fen.mainloop()

  6. #6
    Candidat au Club
    Homme Profil pro
    Médecin
    Inscrit en
    Mars 2024
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2024
    Messages : 4
    Par défaut
    Bon, j’ai enfin trouvé ce que je cherchais avec le mauvais mot clé… Ça a déjà été testé mais avec des hexagones, ce qui donne le même résultat qu’avec des cercles (6 voisins).
    Les structures répétitives sont jolies mais il n’y a pas de déplacement ni de vaisseaux, donc peu d’intérêt.

Discussions similaires

  1. Le jeu de la vie - compréhension des pointeurs
    Par debutantenc2002 dans le forum C
    Réponses: 2
    Dernier message: 16/12/2021, 19h44
  2. Réponses: 4
    Dernier message: 07/03/2009, 20h32
  3. Jeu 2D avec des cases
    Par Zoloom dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 08/02/2008, 17h33
  4. Colorier un cercle avec des droites
    Par keumlebarbare dans le forum 2D
    Réponses: 6
    Dernier message: 04/05/2007, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo