dandelions.py

Created by florian-allard

Created on November 08, 2025

21.2 KB

Petit jeu qui oppose (ou associe) Flora, une planteuse de pissenlits, à Éole, qui maîtrise le vent.

Flora plante des pissenlits et son but est de remplir le plateau de pissenlits ou de leurs graines.

Éole souffle dans la direction qu’il souhaite et son but est d’empêcher Flora de remplir le plateau avec des pissenlits ou leurs graines.

Il est également possible de coopérer et d’œuvrer à deux pour remplir le plateau (en discutant d’une stratégie commune, ou sans communiquer).

On joue avec les flèches directionnelles et la touche OK (ou EXE).

Bon jeu !


# Jeu du pissenlit, Eole (dieu du vent) contre Flora (déesse des fleurs).
# par Afyu, 11/2025

from kandinsky import *
from ion import *
from time import *
from random import randint

Palette=[(204,102,51),(204,204,153),(153,51,51),(204,153,102),(153,0,153),(0,255,255),(255,255,255),(102,102,102),(153,102,102),(102,102,51),(0,0,0),(255,255,204),(180,153,18),(255,204,153),(51,51,0)]
Image_Sid=['EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE','EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE','EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEE','EEFFFFFFFFFFFFFFFFFFFFFFFEEEEEFFFFFGGGGGGGFFHFEE','EEFFFFFFFFFFFFFFFFFFFFFEEEEEGGEIFFGGGGGGGGGGGJGG','GGGGGFFFFFGGGGGGGFFFFFEEEEEEGGGEIFFFFFFFFHHFFFHE','EEHFFFFFFFFFGGGGGGGGGKKEEEEEIGIEEGFFFFFFFFFJFFHE','EHFFFFFFFFFFFFFFFFFLHKKEEEEEEEEEEEFFFFFFFFFFHFHE','EHFHFFFFFFFFFFFFFLLMJKEEEEEEEEEEEEIFFFFFFFMLGGGE','EHHFFFFFFFFFFFFLLLMMHKEEEEEEEEEEEEINLLLLLLLGGGGG','EHFLLMMMFFFFFLLLLMMMHEEEEEEEEEEEKEIILLLLLLLHKMLG','EHLGGGGMMMMLLLLLLLLMHOEEEKKEEEEKEEEILLLLLLLMKHLG','EGGGGGGGMMLLLLLLLLLMJOEEEEKEEEEEEEONNLLLLMMMHLGG','EGGMHHMLMMLLLLLLLLLMIOOEEEEEEEEEOOINLLLLMHMMHLLE','EGLHKKHLLMLLMMMMMLMMMHOOEEEEOOIIIINNLLMHOJMMOOEE','ELLHKKHMMLMMMMMMMMMMMMIIIIIIIIIINNNNMMOOOMMIHFEE','ELLLLLLMMLIOOOOHIMMMMMMMNNNNNNNNNMMHOKOOMMMHFFEE','EELLLLHHMMIIIOKKOOIHIMMMMMMMNMMMIHOKKOOMMMHHFFEE','EEHHJJOOMMMIINOKKKOOOJHOMGGGGGGGHKKKOIMMMHHJHFEE','EEFOOOOOMMMMHIIOKKKKKKKKMGGGGMGGJKKOIIMMJHHFFHEE','EEFFFJOOHMMMMMIIOKKKKKKKHLGGGMGLJKKIIMMMHHGHGGHG','EEFFFHFJHMMMMMMIIOKKKKKKKMGGLMMHKKONMMMKIFGGJGGG','EEFFKFFMJHMMMMMMMIOKKKKKKKMLLKKKKKNNMMMIMHFFFHEE','EEFHFFFJHHJHMMMMMMNOKKKKKKKKKKKKKONMMMMIFJFFFHEE','EEFHFFFHFHHHMMMMMMMIOKKKKKKKKKKKKINMMMMMFFFFFFEE','EEGGGGGGGMOHJMMMMMMNMKKKKKKKKKKKONNLMMMMFFFFFFEE','EEFFFFFFFFHHHMMMMMMMNJKKKOOOOOOKHNLLMMMFFFFFFFEE','EEFFFFFFFFFHHHMMMMMMMNOKKOOOIIIOGNLLLMMFFFFFFFEE','EEFFFFFFFFFFHHMMMMMMMNMKOOIINNNHLNLLLMMFGGGGGGEE','EEFFFFFFFFFFFJMMMMMMMMLIOIINNNIGLNLLLMMMGGGGGGEE','EEFFFFFFFFFFFMJMMMMMMMNLINNNNLINNLLLLLMMFFFFFFEE','GGGGGGGGGGGFFFMHMMMMMMMNNMGLGGNNNLLLLLMMFFFFFFEE','GGGGGGGGGGGFFFFHMMMMMMMMNNNMNNLNNLLLLLMLFFFFFFEE','EEFFFFFFFFFFFFFMHMMMMMMMMNNNLNNMLLLLLLMMFFGGGGGG','EEFFFFFFFFFFFFHFMHMMMMMMMMINNNIMLLLLLLLMFFFFFFEE','EEFFFFFFFFFFFFFFFMMMMMMMMMMIIIMLLLLLLLLMLFFFFFEE','EEFFFFFFFFFFFFFFFFHMMMMMMLLLMLLLLLLLLLLMMFFFFFEE','EEFFFFFFFFFFFFFFFFMMMMMMLLLLLLLLLLLLLLLLMMFFFFEE','EEFFFFFGGGGGGGGGFFFMMMMMMLLLLLLLLLLLLLLLMMLFFFEE','EEFFFFFGGGGGGGGGFFFFHMMMMLLLLLLLLLLLLLLLLGGGGGEE','EEFFFFFFFFFFFFFFFFFFMHMMMMLLLLLLLLLLLLLLLLMMLFEE','EEFFFFFFFFFFFFFFFFFFFMMMMMMLLLLLLLLLLLLLLLLMMLEE','EEGGGGGFFFFFFFFFFFFFFMJMMMMLLLLLLLLLLLLLLLLLMMEE','EEGGGGGFFFFFFFFFFFFFFFMHMMMMLLLLLLLLLLLLLLLLLMML','EEFFFFFFFFFFFGGGGGGGGGGHHMMMMMLLLLLLLLLLLLLLLLMM','EEFFFFFFFFFFFFFFFFFFFFFMHMMMMMMLLLLLLLLLLLLLLLMM','EEEEEEEEEEEEEEEEEEEEEEEEMJMMMMMMLLLLLLLLLLLLLLMM','EEEEEEEEEEEEEEEEEEEEEEEEEHHHMMMMMMLLLLLLLLLLLLLM']
Image_moulin=['GGGGGGGGKK','GGGGGGKKKA','GGGGGKKKAA','GGGKKKAKAA','GGKAKAKAAA','GKAKAAKAAA','KAKAAKAAAA','KKAAAKAAAA','GKAAKAAAKK','GGKAKAAAKA','GGKKKKKKKK','GGKBBBKBBB','GGKBKBKBKK','GGKBKBKBKK','GGKKBBKBKK','GKBBKBKBBB','GKBBBKKKKK','GKBKBKBBBB','GKBKBKBBKK','GKBBBKBBKK','GKKBBKBBKK','KBBKBKBBBB','KBBBKKKKKK','KBBBKBBBBB','KBBBKBBBBB','KBBBKBBBKC','KBBBKBBKKK','GKBBKBBCKC','GGKBKBBKKK','GGGKKBBCKC','GGGGKKKGGG']
Image_pale=['CCCC','CDCD','CCCC','CDCD','CCCC','CDCD','CCCC','CDCD','CCCC','CDCD','CCCC','CGGG','CGGG']
Image_pale_oblique=['GGGGGGGGCGG','GGGGGGGCDCG','GGGGGGCDCDC','GGGGGCDCDCG','GGGGCDCDCGG','GGGCDCDCGGG','GGCDCDCGGGG','GCDCDCGGGGG','CGCDCGGGGGG','GGGCGGGGGGG']


def affichage_sid(x,y):
  for ligne in range(len(Image_Sid)):
    for colonne in range(len(Image_Sid[0])):
      set_pixel(x+colonne,y+ligne,Palette[ord(Image_Sid[ligne][colonne])-65])

def affichage_moulin(x,y):
  if mode_dessin:
    for ligne in range(len(Image_moulin)):
      for colonne in range(len(Image_moulin[0])):
        set_pixel(x+colonne,y+ligne,Palette[ord(Image_moulin[ligne][colonne])-65])
        set_pixel(x+18-colonne,y+ligne,Palette[ord(Image_moulin[ligne][colonne])-65])

def affichage_pales(x,y,mode_effacer=0):
  if mode_dessin:
    for ligne in range(len(Image_pale)):
      for colonne in range(len(Image_pale[0])):
        clr=Palette[ord(Image_pale[ligne][colonne])-65]
        if clr!=(255,255,255):
          set_pixel(x+colonne,y-13+ligne,(clr,"w")[mode_effacer])
          set_pixel(x-colonne,y+13-ligne,(clr,"w")[mode_effacer])
          set_pixel(x+13-ligne,y+colonne,(clr,"w")[mode_effacer])
          set_pixel(x-13+ligne,y-colonne,(clr,"w")[mode_effacer])

def affichage_pales_obliques(x,y,mode_effacer=0):
  if mode_dessin:
    for ligne in range(len(Image_pale_oblique)):
      for colonne in range(len(Image_pale_oblique[0])): # par Afyu, 11/2025
        clr=Palette[ord(Image_pale_oblique[ligne][colonne])-65]
        if clr!=(255,255,255):
          set_pixel(x+1+colonne,y-9+ligne,(clr,"w")[mode_effacer])
          set_pixel(x-1-colonne,y+9-ligne,(clr,"w")[mode_effacer])
          set_pixel(x+9-ligne,y+1+colonne,(clr,"w")[mode_effacer])
          set_pixel(x-9+ligne,y-1-colonne,(clr,"w")[mode_effacer])


def dessine_curseur(Xc,Yc,clr):
  x=Xp+1+20*Xc
  y=Yp+1+20*Yc
  fill_rect(x,y,18,1,clr) # haut
  fill_rect(x,y+18,19,1,clr) # bas
  fill_rect(x,y,1,19,clr) # gauche
  fill_rect(x+18,y,1,18,clr) # droite

def dessine_plateau(x,y):
  for rang in range(N+1):
    fill_rect(x,y+20*rang,N*20+1,1,"b")
    fill_rect(x+20*rang,y,1,N*20+1,"b")

def dessine_pissenlit(Xc,Yc):
  x=Xp+10+20*Xc
  y=Yp+10+20*Yc
  vert_fonce=(0,150,0)

  # en mode dessin
  if mode_dessin:
    fill_rect(x-1,y-4,3,4,vert_fonce)
    fill_rect(x,y,1,7,vert_fonce)
    fill_rect(x-7,y+2,5,1,vert_fonce)
    fill_rect(x+3,y+2,5,1,vert_fonce)
    fill_rect(x-7,y+3,4,1,vert_fonce)
    fill_rect(x+4,y+3,4,1,vert_fonce)
    fill_rect(x-7,y+4,6,1,vert_fonce)
    fill_rect(x+2,y+4,6,1,vert_fonce)
    fill_rect(x-7,y+5,5,1,vert_fonce)
    fill_rect(x+3,y+5,5,1,vert_fonce)
    set_pixel(x-7,y+6,vert_fonce)
    set_pixel(x+7,y+6,vert_fonce)
    fill_rect(x-5,y+6,4,1,vert_fonce)
    fill_rect(x+2,y+6,4,1,vert_fonce)
    set_pixel(x-5,y+7,vert_fonce)
    set_pixel(x+5,y+7,vert_fonce)

    fill_rect(x-3,y+7,7,1,vert_fonce)
    fill_rect(x-2,y+8,5,1,vert_fonce)

    sleep(0.3)
    jaune_fonce=(250,220,0)
    fill_rect(x-2,y-6,5,2,jaune_fonce)
    for k in range(3):
      set_pixel(x-2+2*k,y-4,jaune_fonce)

    sleep(0.3)
    fill_rect(x-2,y-7,5,1,jaune_fonce)
    fill_rect(x-3,y-6,1,3,jaune_fonce)
    fill_rect(x+3,y-6,1,3,jaune_fonce)
    for k in range(2):
      set_pixel(x-2+4*k,y-3,jaune_fonce)

    sleep(0.3)
    fill_rect(x-4,y-6,9,6,jaune_fonce)
    for k in range(2):
      fill_rect(x-5+10*k,y-4,1,2,jaune_fonce)
    fill_rect(x-2,y,5,1,jaune_fonce)

    sleep(0.3)
    for k in range(11):
      vert_fonce=(250-25*k,220-7*k,0) # jaune_fonce=(250,220,0)
      fill_rect(x-1,y-3,3,2,vert_fonce)
      fill_rect(x,y-1,1,2,vert_fonce)
      gris=(250-3*k,220,22*k)
      fill_rect(x-2,y-7,5,1,gris)
      fill_rect(x-4,y-6,9,3,gris)
      for k in range(2):
        fill_rect(x-5+10*k,y-4,1,2,gris)
      for k in range(2):
        fill_rect(x-4+6*k,y-3,3,3,gris)
        fill_rect(x-2+3*k,y-1,2,2,gris)
      sleep(0.1)

  # en mode pas dessin
  else:
    for i in (-1,0,1):
      for j in (-1,0,1):
        for k in range(7-2*i**2*j**2):
          set_pixel(x+k*i,y+k*j,vert_fonce)

def coup_de_vent_pissenlit(Xc,Yc):
  x=Xp+10+20*Xc
  y=Yp+10+20*Yc
  set_pixel(0,0,(220,220,220))
  cible=get_pixel(0,0)
  set_pixel(0,0,"w")
  
  if mode_dessin:
    if get_pixel(x,y-7)==cible:
      fill_rect(x-2,y-7,5,1,"w")
      fill_rect(x-3,y-6,7,1,"w")
      fill_rect(x-2,y-5,5,1,"w")
      fill_rect(x-1,y-4,3,1,"w")
    elif get_pixel(x-2,y-4)==cible:
      fill_rect(x-4,y-6,9,1,"w")
      fill_rect(x-4,y-5,9,1,"w")
      fill_rect(x-3,y-4,7,1,"w")
    elif get_pixel(x-3,y-3)==cible:
      fill_rect(x-5,y-4,11,1,"w")
      fill_rect(x-5,y-3,3,1,"w")
      fill_rect(x+3,y-3,3,1,"w")
      set_pixel(x-4,y-2,"w")
      set_pixel(x+4,y-2,"w")
    elif get_pixel(x-2,y)==cible:
      fill_rect(x-4,y-3,3,4,"w")
      fill_rect(x+2,y-3,3,4,"w")
      fill_rect(x-1,y-1,1,2,"w")
      fill_rect(x+1,y-1,1,2,"w")


def dessine_graine(Xc,Yc,mode_rose_des_vents=0,clr="gray"):
  x=(Xp+10,Xr)[mode_rose_des_vents]+(20+mode_rose_des_vents*(10-9*Xc**2*Yc**2))*Xc
  y=(Yp+10,Yr)[mode_rose_des_vents]+(20+mode_rose_des_vents*(10-9*Xc**2*Yc**2))*Yc
  # en mode dessin
  if mode_dessin:
    if clr=="gray":
      gris=(150,150,150)
    elif clr=="w":
      gris="w"
    else:
      gris=(0,0,0) # noir
    for k in range(-4,4):
      set_pixel(x+k,y-k,gris)
    set_pixel(x-1,y-4,gris)
    set_pixel(x+1,y-4,gris)
    fill_rect(x,y-3,1,2,gris)
    set_pixel(x+4,y-1,gris)
    set_pixel(x+4,y+1,gris)
    fill_rect(x+2,y,2,1,gris)

  # en mode pas dessin
  else:
    if clr=="gray":
      vert="g"
    elif clr=="w":
      vert="w"
    else:
      vert=(0,150,0)
    fill_rect(x-2,y-1,5,3,vert)
    fill_rect(x-1,y-2,3,5,vert)


def dessine_rose_des_vents():
  for i in (-1,0,1):
    for j in (-1,0,1):
      if (i,j)!=(0,0):
        dessine_branche(i,j,"brown")


def dessine_branche(dirX,dirY,clr,dessin_fleche=False):
  # en mode dessin : 
  if mode_dessin:
    if dirX*dirY==0:
      fill_rect(Xr+(dirX==-1),Yr+(dirY==-1),(1,22*dirX)[dirX],(1,22*dirY)[dirY],clr)
      for k in range(5):
        fill_rect(Xr+(k+1)*dirX+(dirX==-1)+(k+1)*dirY,Yr-(k+1)*dirX+(k+1)*dirY+(dirY==-1),(1,(19-4*k)*dirX)[dirX],(1,(19-4*k)*dirY)[dirY],clr)
        set_pixel(Xr+k*dirX-k*dirY,Yr+k*dirX+k*dirY,clr)
        fill_rect(Xr+(5+3*k)*dirX+(dirX==-1)-(5-k)*dirY,Yr+(5-k)*dirX+(5+3*k)*dirY+(dirY==-1),(1,3*dirX)[dirX],(1,3*dirY)[dirY],clr)
    else: # diagonales
      fill_rect(Xr+(5+(3-(dirX==-1))*(dirY==dirX))*dirX,Yr+(5+(3-(dirY==-1))*(dirX!=dirY))*dirY,(1,3*dirX)[dirX==dirY],(1,3*dirY)[dirY!=dirX],clr)
      for k in range(8):
        fill_rect(Xr+(6+k)*dirX+(dirX==-1)*(dirY==-1),Yr+(6+k)*dirY+(dirX==1)*(dirY==-1),(1,(5-k//2)*dirX)[dirX==dirY],(1,(5-k//2)*dirY)[dirY!=dirX],clr)
      for k in range(5):
        fill_rect(Xr+(10+k,5+2*k)[dirY==dirX]*dirX+(dirX==-1)*(dirY==-1),Yr+(5+2*k,10+k)[dirX==dirY]*dirY+(dirX==1)*(dirY==-1),(1,2*dirX)[dirX==dirY],(1,2*dirY)[dirY!=dirX],clr)  
      #fill_rect(Xr+k*dirX+(dirX==-1)+k*dirY,Yr-k*dirX+k*dirY+(dirY==-1),(1,(23-4*k)*dirX)[dirX],(1,(23-4*k)*dirY)[dirY],clr)
          
      #fill_rect(Xr+2*dirX+(dirX==-1)+2*dirY,Yr-2*dirX+2*dirY+(dirY==-1),(1,15*dirX)[dirX],(1,15*dirY)[dirY],"b")
  
  # en mode pas dessin : 
  else:
    T=20
    for k in range(1,T*(1-0.3*dirX**2*dirY**2)): # branche
      set_pixel(Xr+k*dirX,Yr+k*dirY,clr)

    if dessin_fleche:
      for k in range(4+dirX**2*dirY**2): # flèche
        d=int(T*(1-0.3*dirX**2*dirY**2)-1)
        if (dirX,dirY) in ((1,0),(-1,0)):
          coeff1X,coeff2X,coeff1Y,coeff2Y=-dirX,-dirX,-1,1
        elif (dirX,dirY) in ((0,1),(0,-1)):
          coeff1X,coeff2X,coeff1Y,coeff2Y=-1,1,-dirY,-dirY
        else:
          coeff1X,coeff2X,coeff1Y,coeff2Y=-dirX,0,0,-dirY
        
        set_pixel(Xr+d*dirX+k*coeff1X,Yr+d*dirY+k*coeff1Y,clr)
        set_pixel(Xr+d*dirX+k*coeff2X,Yr+d*dirY+k*coeff2Y,clr)

mode_dessin=1
fill_rect(0,0,320,222,"w")
draw_string("Dandelions",110,70,"purple")
draw_string("(Pissenlits)",100,95,"purple")
draw_string("Valider avec OK",85,135,"purple")
for k in range(2): 
  fill_rect(60,49+k*122,200,1,"g")

N=5
Xp,Yp=70,81#(242-20*N)//2,40+(182-20*N)//2 # permet d'aller jusqu'à un plateau de 9×9 cases
Xr,Yr=Xp+174,Yp+10 # centre de la rose des vents
Xm,Ym=70,75 # position du moulin
orientation_pales=0

dessine_rose_des_vents()

for k in (-2,10):
  for l in (-3,5):
    if keydown(KEY_OK) or keydown(KEY_EXE):break
    dessine_pissenlit(k,l)
    #coup_de_vent_pissenlit(k,l)
    if k==-2:
      dessine_branche(1,0,"g")
      coup_de_vent_pissenlit(k,l)
      for i in range(1,12):
        dessine_graine(k+i,l)
        
        if orientation_pales: # effacer
          affichage_pales_obliques(Xm+9,Ym+9,1)
          affichage_moulin(Xm,Ym)
          affichage_pales(Xm+9,Ym+9)
        else:
          affichage_pales(Xm+9,Ym+9,1)
          affichage_moulin(Xm,Ym)
          affichage_pales_obliques(Xm+9,Ym+9)
        orientation_pales=1-orientation_pales
        
        if keydown(KEY_OK) or keydown(KEY_EXE):break
        sleep(0.2)
      dessine_branche(1,0,"brown")
    elif l==5:
      for kb in (-2,10):
        dessine_branche(0,-1,"g")
        coup_de_vent_pissenlit(kb,l)
        for i in range(1,8):
          dessine_graine(kb,l-i)
          
          if orientation_pales: # effacer
            affichage_pales_obliques(Xm+9,Ym+9,1)
            affichage_moulin(Xm,Ym)
            affichage_pales(Xm+9,Ym+9)
          else:
            affichage_pales(Xm+9,Ym+9,1)
            affichage_moulin(Xm,Ym)
            affichage_pales_obliques(Xm+9,Ym+9)
          orientation_pales=1-orientation_pales
          
          if keydown(KEY_OK) or keydown(KEY_EXE):break
          sleep(0.2)
        dessine_branche(0,-1,"brown")

while not (keydown(KEY_OK) or keydown(KEY_EXE)):1
while keydown(KEY_OK) or keydown(KEY_EXE):1

while 1:
  fill_rect(0,0,320,222,"w")

  draw_string("Présentation",100,10,(80,150,50))
  Regles=(("La déesse Flora plante des","pissenlits   et le dieu Eole","dirige le vent qui en répand","les graines. Flora veut recou-","vrir le plateau de pissenlits","ou de graines  tandis qu'Eole","essaye de l'en empêcher.","","Il est possible de coopérer !"),\
  ("Par défaut, la partie se","déroule en 7 tours :","7 pissenlits plantés et","7 coups de vent soufflés.")) # joueur ou IA pour chacun des deux
  for i in range(2):
    draw_string("Présentation",100,10,(80,150,50))
    for k in range(len(Regles[i])):
      draw_string(Regles[i][k],15,33+3+18*k,"b")
    #draw_string("Page "+str(i+1)+"/2       → OK",120,200,(80,150,50))
    if i==0:
      Xp,Yp=60,71 # au lieu de 71, 81 pour l'écran d'accueil
      dessine_pissenlit(3,-1)
      Xp,Yp=65,66
      dessine_graine(4,3)
      draw_string("→ OK",270,200,(80,150,50))

      #draw_string("Page 1/2       → OK",120,200,(80,150,50))
      while not (keydown(KEY_OK) or keydown(KEY_EXE)):1
      while keydown(KEY_OK) or keydown(KEY_EXE):1

    if i==1:
      #draw_string("Page 1/2       → OK",120,200,(80,150,50))
      draw_string("Taille du plateau : ",15,33+3+18*5,"purple")
      draw_string("<  >",215,33+3+18*5,"orange")
      N=5
      chg=1
      while not (keydown(KEY_OK) or keydown(KEY_EXE)):
        if chg:
          draw_string(str(N),230,33+3+18*5,"w")
          N=(N+chg-3)%7+3
          draw_string(str(N),230,33+3+18*5,"b")
          sleep(0.2)
        chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
      while keydown(KEY_OK) or keydown(KEY_EXE):1

      draw_string("Nombre de tours : ",15,33+3+18*6,"purple")
      draw_string("<  >",195,33+3+18*6,"orange")
      Nb_tours=6
      chg=1
      while not (keydown(KEY_OK) or keydown(KEY_EXE)):
        if chg:
          draw_string(str(Nb_tours),210,33+3+18*6,"w")
          Nb_tours=(Nb_tours+chg-2)%7+2
          draw_string(str(Nb_tours),210,33+3+18*6,"b")
          sleep(0.2)
        chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
      while keydown(KEY_OK) or keydown(KEY_EXE):1

      draw_string("Affichage : ",15,33+3+18*7,"purple")
      draw_string("<             >",135,33+3+18*7,"orange")
      Xp,Yp=54,78
      mode_dessin=0
      chg=1
      while not (keydown(KEY_OK) or keydown(KEY_EXE)):
        if chg:
          draw_string(("symboles"," dessins")[mode_dessin],150-5*mode_dessin,33+3+18*7,"w")
          fill_rect(235,33+3+18*7-3,35,20,"w") # efface les deux motifs
          mode_dessin=1-mode_dessin
          draw_string(("symboles"," dessins")[mode_dessin],150-5*mode_dessin,33+3+18*7,"b")
          dessine_pissenlit(9,4)
          dessine_graine(10,4)
          sleep(0.2)
        chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
      while keydown(KEY_OK) or keydown(KEY_EXE):1

      draw_string("Flora (pissenlits) : ",15,33+3+18*8,"purple")
      draw_string("<       >",225,33+3+18*8,"orange")
      Flora_IA=1
      chg=1
      while not (keydown(KEY_OK) or keydown(KEY_EXE)):
        if chg:
          draw_string(("humain","hasard")[Flora_IA],240,33+3+18*8,"w")
          Flora_IA=1-Flora_IA
          draw_string(("humain","hasard")[Flora_IA],240,33+3+18*8,"b")
          sleep(0.2)
        chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
      while keydown(KEY_OK) or keydown(KEY_EXE):1

      draw_string("Eole (vent) : ",15,33+3+18*9,"purple")
      draw_string("<       >",155,33+3+18*9,"orange")
      Eole_IA=1
      chg=1
      while not (keydown(KEY_OK) or keydown(KEY_EXE)):
        if chg:
          draw_string(("humain","hasard")[Eole_IA],170,33+3+18*9,"w")
          Eole_IA=1-Eole_IA
          draw_string(("humain","hasard")[Eole_IA],170,33+3+18*9,"b")
          sleep(0.2)
        chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
    
        draw_string("→ OK",270,200,(80,150,50))
      while keydown(KEY_OK) or keydown(KEY_EXE):1

    fill_rect(0,0,320,222,"w")

  #Nb_tours=7
  #N=8
  Xp,Yp=(222-20*N)//2,40+(182-20*N)//4 # permet d'aller jusqu'à un plateau de 9×9 cases
  Xr,Yr=Xp+20*N+(320-Xp-20*N)//2,Yp+5*N # centre de la rose des vents
  #x,y=50,50
  Plateau=[["." for k in range(N)] for l in range(N)]
  dessine_plateau(Xp,Yp)
  directions_utilisees=[(0,0)]
  dessine_rose_des_vents()


  for i in range(Nb_tours):
    # joueur Pissenlit place un pissenlit
    draw_string(" Choisir une case à planter ",20,3,"g")
    if Flora_IA:
      Xc=randint(0,N-1)
      Yc=randint(0,N-1)
      while Plateau[Yc][Xc]=="P": # tant qu'on a choisi une case déjà plantée
        Xc=randint(0,N-1)
        Yc=randint(0,N-1)
      dessine_curseur(Xc,Yc,"g")
      sleep(0.5)
    else:
      Xc,Yc=0,1
      chgX,chgY=0,-1
      while not ((keydown(KEY_EXE) or keydown(KEY_OK)) and Plateau[Yc][Xc]!="P"):
        if chgX or chgY:
          dessine_curseur(Xc,Yc,"w")
          Xc=(Xc+chgX)%N
          Yc=(Yc+chgY)%N
          dessine_curseur(Xc,Yc,"gr"[Plateau[Yc][Xc]=="P"])
          sleep(0.2)
        chgX=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
        chgY=keydown(KEY_DOWN)-keydown(KEY_UP)
      while keydown(KEY_EXE) or keydown(KEY_OK):1
    
    # dessine un pissenlit
    Plateau[Yc][Xc]="P"
    dessine_graine(Xc,Yc,0,"w") # on efface une éventuelle graine déjà présente
    dessine_pissenlit(Xc,Yc)
    dessine_curseur(Xc,Yc,"w")# on efface le curseur

    # joueur Vent choisit une direction pour le vent
    draw_string("Choisir la direction du vent",20,3,"brown")
    if Eole_IA:
      dirX=randint(-1,1)
      dirY=randint(-1,1)
      while (dirX,dirY)==(0,0) or (dirX,dirY) in directions_utilisees:
        dirX=randint(-1,1)
        dirY=randint(-1,1)
      dessine_branche(dirX,dirY,"gr"[(dirX,dirY) in directions_utilisees])
      sleep(0.5)
    else:
      dirX,dirY=0,1
      while not ((keydown(KEY_EXE) or keydown(KEY_OK)) and ((dirX,dirY) not in directions_utilisees)):
        if chgX or chgY:
          dessine_branche(dirX,dirY,"w",1) # on efface la flèche
          dessine_branche(dirX,dirY,"brown",(dirX,dirY) in directions_utilisees)
          #dessine_rose_des_vents()
          dirX,dirY=chgX,chgY
          dessine_branche(dirX,dirY,"gr"[(dirX,dirY) in directions_utilisees],1) # avec la flèche
          sleep(0.3)
        chgX=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
        chgY=keydown(KEY_DOWN)-keydown(KEY_UP)
    
    #dessine_branche(dirX,dirY,"r")
    dessine_graine(dirX,dirY,1) # mode rose des vents
    directions_utilisees.append((dirX,dirY))
    while keydown(KEY_EXE) or keydown(KEY_OK):1

    #draw_string(str(dirX)+" "+str(dirY)+"  ",230,140,"r")
    # on applique la direction du vent choisie
    orientation_pales=0
    Xm,Ym=Xp+10*N-9-(10*N+20)*dirX,Yp+10*N-12-(10*N+20)*dirY # position du moulin
    for ligne in range(N):
      for colonne in range(N):
        if Plateau[ligne][colonne]=="P": # si la case contient un pissenlit
          coup_de_vent_pissenlit(colonne,ligne)
          d=0
          while 0<=ligne+d*dirY<=N-1 and 0<=colonne+d*dirX<=N-1:
            if Plateau[ligne+d*dirY][colonne+d*dirX]!="P":
              if orientation_pales: # effacer
                affichage_pales_obliques(Xm+9,Ym+9,1)
                affichage_moulin(Xm,Ym)
                affichage_pales(Xm+9,Ym+9)
              else:
                affichage_pales(Xm+9,Ym+9,1)
                affichage_moulin(Xm,Ym)
                affichage_pales_obliques(Xm+9,Ym+9)
              orientation_pales=1-orientation_pales

              Plateau[ligne+d*dirY][colonne+d*dirX]="G" # on sème une graine
              dessine_graine(colonne+d*dirX,ligne+d*dirY,0,"noir") # on dessine les nouvelles graines en noir
              sleep(0.2)
            d+=1
    # on efface le moulin
    fill_rect(Xm-4,Ym-4,27,36,"w")
    for ligne in range(N):
      for colonne in range(N):
        if Plateau[ligne][colonne]=="G":
          dessine_graine(colonne,ligne) # on redessine les nouvelles graines en gris

    dessine_branche(dirX,dirY,"brown",1) # on réaffiche la branche en marron, en ajoutant la flèche

  draw_string(" "*32,0,3,"w")
  draw_string(" "*32,0,22,"w")
  if any("." in ligne for ligne in Plateau):
    draw_string("Le dieu Eole a gagné.",55,3,"brown")
    draw_string("La déesse Flora a perdu.",40,22,"g")
  else:
    draw_string("Le dieu Eole a perdu.",55,3,"brown")
    draw_string("La déesse Flora a gagné.",40,22,"g")
  sleep(2)
  affichage_sid(Xr-24,Yr+40)
  draw_string("Oh, un",Xr-30,Yr+95,"b")
  draw_string("pissenlit !",Xr-55,Yr+115,"b")
  
  while not (keydown(KEY_EXE) or keydown(KEY_OK)):1
  while keydown(KEY_EXE) or keydown(KEY_OK):1

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.