ultime_coup_prime.py

Created by florian-allard

Created on March 15, 2025

14.8 KB

L’ultime coup prime ! Petit jeu de cartes et de jetons.


from random import choice,randint
from kandinsky import *
from ion import *
from time import sleep

#images=(('#&###','#$$$#','#$$$#','#$$$#','#&###'),('$$$#','#%$#','$$$#','$$$#','#&###'),('#&###','%$#','#&###','#$%#','#&###'),('#&###','%$#','#&###','%$#','#&###'),('#$$$#','#$$$#','#&###','%$#','%$#'),('#&###','#$%#','#&###','%$#','#&###'),('#&###','#$%#','#&###','#$$$#','#&###'),('#&###','%$#','$$$#','#$%#','#$%#'),('#&###','#$$$#','#&###','#$$$#','#&###'),('#&###','#$$$#','#&###','%$#','#&###'))
images=((),("'$%#", '&%%#', '%$$$%#', "'$%#", "'$%#", "'$%#", '%(#'),('&&$#', '%$&$#', ')$#', '($$#', "'$%#", '&$&#', '%(#'),('','%(#', '($$#', "'$%#", '&&$#', ')$#', ')$#', "%'$#"))
def DessineImage(truc,x,y,clr="b",clr_fond="w",zoom=1):
  longueur=(1,len(str(truc)))[len(str(truc))<3]
  for element in range(longueur):
    if str(truc)[element]=="-": fill_rect(x,y+3*zoom,zoom*5,zoom*1,clr)
    elif str(truc)[element]=="+": 
      fill_rect(x,y+3*zoom,zoom*5,zoom*1,clr)
      fill_rect(x+2*zoom,y+zoom,zoom*1,zoom*5,clr)
    else:
      if len(str(truc))<3: motif=images[int(str(truc)[element])]
      else: motif=icones[truc]
      for ligne in range(len(motif)):
        elt,rang = motif[ligne],0
        for pos in range(0,len(elt)-2,2):
          for k in (0,1):
            fill_rect(x+zoom*rang+zoom*5*element,y+zoom*ligne,zoom*(ord(elt[pos+k])-35),1*zoom,(clr_fond,clr)[k])
            rang+=ord(elt[pos+k])-35

#DessineImage("+2",50,50,"r","w")
#sleep(10)

Pioche=["Jeton+1","Jeton-1"]*3\
+["Jeton+2","Jeton-2"]*2\
+["Jeton+3","Jeton-3"]\
+["Transfert121","Transfert122","Transfert123"]\
+["Transfert131","Transfert132","Transfert133"]\
+["Transfert141","Transfert142","Transfert143"]\
+["Transfert231","Transfert232","Transfert233"]\
+["Transfert241","Transfert242","Transfert243"]\
+["Transfert341","Transfert342","Transfert343"]\
+["Rotation+","Rotation-"]*7\
+["Echange12","Echange13","Echange14","Echange23","Echange24","Echange34"]*4\
+["Carte+1"]


def AfficherJetons(joueur,clr="k"):
  for i in range(18):
    DessineJeton(20+210*(joueur>1)+12*(i%6),110-70*(0<joueur<3)+12*(i//6),("w",clr)[i<Jetons[joueur]])

def AffichagePlateau(que_jetons=False):
  for j in range(4):
    if not que_jetons:
      draw_string("J"+str(j+1),20+210*(j>1),85-70*(0<j<3),"b","pink")
    # nb carte
    MiniCarte(40+210*(j>1),70-70*(0<j<3),"k","g")
    #fill_rect(45+210*(j>1),85-70*(0<j<3),10,18,"brown")
    draw_string("×"+str(len(Mains[j])),70+210*(j>1),85-70*(0<j<3),"b")

    # jetons
    AfficherJetons(j)

def AfficherMain(j):
  for l in range(len(Mains[j])):
    DessineCarte(5+53*l,155,Mains[j][l])

def DessineFlecheH(x,y,clr):
  for (i,j) in ((0,2),(1,1),(3,1),(4,2)):
    set_pixel(x+i,y+j,clr)
  fill_rect(x+2,y,1,5,clr)

def DessineFlecheB(x,y,clr):
  for (i,j) in ((0,2),(1,3),(3,3),(4,2)):
    set_pixel(x+i,y+j,clr)
  fill_rect(x+2,y,1,5,clr)

def DessineFlecheD(x,y,clr):
  for (i,j) in ((0,2),(1,3),(3,3),(4,2)):
    set_pixel(x+j,y+i,clr)
  fill_rect(x,y+2,5,1,clr)

def DessineFlecheG(x,y,clr):
  for (i,j) in ((0,2),(1,1),(3,1),(4,2)):
    set_pixel(x+j,y+i,clr)
  fill_rect(x,y+2,5,1,clr)

def DessineFleche31(x,y,clr):
  for i in range(5):
    set_pixel(x+i,y+4-i,clr)
  fill_rect(x+1,y+4,2,1,clr)
  fill_rect(x,y+2,1,2,clr)

def DessineFleche13(x,y,clr):
  for i in range(5):
    set_pixel(x+i,y+4-i,clr)
  fill_rect(x+2,y,2,1,clr)
  fill_rect(x+4,y+1,1,2,clr)

def DessineFleche24(x,y,clr):
  for i in range(5):
    set_pixel(x+i,y+i,clr)
  fill_rect(x+2,y+4,2,1,clr)
  fill_rect(x+4,y+2,1,2,clr)

def DessineFleche42(x,y,clr):
  for i in range(5):
    set_pixel(x+i,y+i,clr)
  fill_rect(x+1,y,2,1,clr)
  fill_rect(x,y+1,1,2,clr)



def DessineJetonCasse(x,y,clr):
  fill_rect(x,y,8,1,clr)
  fill_rect(x,y+1,1,8,clr)
  fill_rect(x+10,y+2,1,8,clr)
  fill_rect(x+3,y+10,8,1,clr)
  fill_rect(x+2,y+2,2,2,clr)
  fill_rect(x+2,y+5,1,2,clr)
  fill_rect(x+3,y+4,1,2,clr)
  set_pixel(x+4,y+3,clr)
  set_pixel(x+5,y+2,clr)
  fill_rect(x+7,y+7,2,2,clr)
  fill_rect(x+8,y+4,1,2,clr)
  fill_rect(x+7,y+5,1,2,clr)
  set_pixel(x+6,y+7,clr)
  set_pixel(x+5,y+8,clr)

def DessineJeton(x,y,clr):
  # cadre
  fill_rect(x,y,8,1,clr)
  fill_rect(x,y,1,8,clr)
  fill_rect(x,y+8,9,1,clr)
  fill_rect(x+8,y,1,8,clr)
  # motif
  for i in (0,1):
    for j in (0,1):
      fill_rect(x+2+3*i,y+2+3*j,2,2,clr)
      set_pixel(x+4,y+3+2*j,clr)
      set_pixel(x+3+2*i,y+4,clr)

def MiniCarte(x,y,clr,clr_cadre):
  fill_rect(x+15,y+14,13,1,clr_cadre)
  fill_rect(x+14,y+15,1,19,clr_cadre)
  fill_rect(x+28,y+15,1,19,clr_cadre)
  fill_rect(x+15,y+34,13,1,clr_cadre)
  for n in (-1,1):
    for i in range(3,12): # haut et bas
      j=(3,3,3,2,2,2)[i%6]
      set_pixel(x+14+i,y+24+(10-j)*n,clr)
      if 4<=i<=10:
        j=(5,5,5,5,4,5,5,5,5,5,4)[i%11]
        set_pixel(x+14+i,y+24+(10-j)*n,clr)
    for k in range(3,19): # gauche et droite
      j=(3,3,3,2,2,2)[k%6]
      set_pixel(x+21+(7-j)*n,y+14+k,clr)
      if 6<=k<=14:
        j=(4,5,5,5,5)[k%5]
        set_pixel(x+21+(7-j)*n,y+14+k,clr)

def DessineCarte(x,y,carte,clr_cadre="g",que_cadre=False,effacement=False):
  if effacement: 
    clr_cadre="w"
  fill_rect(x+1,y,41,1,clr_cadre)
  fill_rect(x+1,y+58,41,1,clr_cadre)
  fill_rect(x,y+1,1,57,clr_cadre)
  fill_rect(x+42,y+1,1,57,clr_cadre)

  # bordures
  clr="k"
  clr_txt="r"
  if effacement:
    clr="w"
    clr_txt="w"
  for n in (-1,1):
    for i in range(3,40): # haut et bas
      j=(4,4,4,3,2,2,2,3)[i%8]
      set_pixel(x+i,y+29+(29-j)*n,clr)
      if 5<=i<=37:
        j=(7,7,7,7,6,5,6,7)[i%8]
        set_pixel(x+i,y+29+(29-j)*n,clr)
    for k in range(4,55): # gauche et droite
      j=(4,4,4,3,2,2,2,3)[k%8]
      set_pixel(x+21+(21-j)*n,y+k,clr)
      if 5<=k<=53:
        j=(7,7,7,7,6,5,6,7)[k%8]
        set_pixel(x+21+(21-j)*n,y+k,clr)

  if carte.startswith("Transfert"):
    #draw_string(carte[-1],x+17,y+33,clr_txt)
    DessineImage(carte[-1],x+17,y+42,clr_txt)

  if carte.startswith("Echange") or carte.startswith("Rotation") or carte.startswith("Transfert"):
    DessineJeton(x+9,y+17,clr)
    DessineJeton(x+9,y+33,clr)
    DessineJeton(x+25,y+17,clr)
    DessineJeton(x+25,y+33,clr)

  if carte=="Jeton+1":
    DessineJeton(x+17,y+18,clr)
    DessineImage("+1",x+15,y+42,clr_txt)
    #draw_string("+1",x+11,y+33,clr_txt)

  elif carte=="Jeton-1":
    DessineJetonCasse(x+16,y+17,clr)
    DessineImage("-1",x+15,y+42,clr_txt)
    #draw_string("-1",x+11,y+33,clr_txt)

  elif carte=="Jeton+2":
    DessineJeton(x+17,y+12,clr)
    DessineJeton(x+17,y+24,clr)
    DessineImage("+2",x+15,y+42,clr_txt)
    #draw_string("+2",x+11,y+33,clr_txt)

  elif carte=="Jeton-2":
    #draw_string("-2",x+11,y+33,clr_txt)
    DessineJetonCasse(x+16,y+11,clr)
    DessineJetonCasse(x+16,y+23,clr)
    DessineImage("-2",x+15,y+42,clr_txt)

  elif carte=="Jeton+3":
    DessineJeton(x+17,y+12,clr)
    DessineJeton(x+11,y+24,clr)
    DessineJeton(x+23,y+24,clr)
    DessineImage("+3",x+15,y+42,clr_txt)
    #draw_string("+3",x+11,y+33,clr_txt)

  elif carte=="Jeton-3":
    #draw_string("-3",x+11,y+33,clr_txt)
    DessineJetonCasse(x+16,y+11,clr)
    DessineJetonCasse(x+10,y+23,clr)
    DessineJetonCasse(x+22,y+23,clr)
    DessineImage("-3",x+15,y+42,clr_txt)

  elif carte=="Echange12":
    DessineFlecheB(x+8,y+27,clr)
    DessineFlecheH(x+14,y+27,clr)

  elif carte=="Echange34":
    DessineFlecheB(x+30,y+27,clr)
    DessineFlecheH(x+24,y+27,clr)

  elif carte=="Echange23":
    DessineFlecheD(x+19,y+16,clr)
    DessineFlecheG(x+19,y+22,clr)

  elif carte=="Echange14":
    DessineFlecheD(x+19,y+32,clr)
    DessineFlecheG(x+19,y+38,clr)

  elif carte.startswith("Transfert12"):
    DessineFlecheH(x+11,y+27,clr)
  
  elif carte.startswith("Transfert21"):
    DessineFlecheB(x+11,y+27,clr)

  elif carte.startswith("Transfert13"):
    DessineFleche13(x+19,y+27,clr)

  elif carte.startswith("Transfert31"):
    DessineFleche31(x+19,y+27,clr)

  elif carte.startswith("Transfert14"):
    DessineFlecheD(x+19,y+35,clr)

  elif carte.startswith("Transfert41"):
    DessineFlecheG(x+19,y+35,clr)

  elif carte.startswith("Transfert23"):
    DessineFlecheD(x+19,y+19,clr)

  elif carte.startswith("Transfert32"):
    DessineFlecheG(x+19,y+19,clr)
  
  elif carte.startswith("Transfert24"):
    DessineFleche24(x+19,y+27,clr)

  elif carte.startswith("Transfert42"):
    DessineFleche42(x+19,y+27,clr)

  elif carte.startswith("Transfert34"):
    DessineFlecheB(x+27,y+27,clr)

  elif carte.startswith("Transfert43"):
    DessineFlecheH(x+27,y+27,clr)



  elif carte=="Rotation-":
    DessineFlecheD(x+19,y+35,clr)
    DessineFlecheG(x+19,y+19,clr)
    DessineFlecheB(x+11,y+27,clr)
    DessineFlecheH(x+27,y+27,clr)

  elif carte=="Rotation+":
    DessineFlecheG(x+19,y+35,clr)
    DessineFlecheD(x+19,y+19,clr)
    DessineFlecheH(x+11,y+27,clr)
    DessineFlecheB(x+27,y+27,clr)

  elif carte=="Echange13":
    DessineFleche13(x+21,y+27,clr)
    DessineFleche31(x+17,y+27,clr)

  elif carte=="Echange24":
    DessineFleche24(x+21,y+27,clr)
    DessineFleche42(x+17,y+27,clr)


  elif carte=="Carte+1":
    if not effacement:
      clr_cadre="g"
    DessineImage("+1",x+15,y+42,clr_txt)
    #draw_string("+1",x+11,y+34,clr_txt)
    MiniCarte(x,y,clr,clr_cadre)

def jeu(choix,j):
  global Jetons
  N=len(Mains)
  fill_rect(140,60,45,60,"w")
  DessineCarte(140,60,choix)
  if j>=NJ:
    sleep(1)
  if choix.startswith("Carte"):
    Mains[j].append(choice(Pioche))
  elif choix.startswith("Jeton"):
    NB=int(choix[-2:])
    if Jetons[j]+NB<0:
      NB=-Jetons[j]
    for nb in range(min(Jetons[j],Jetons[j]+NB),max(Jetons[j],Jetons[j]+NB)):
      DessineJeton(20+210*(j>1)+12*(nb%6),110-70*(0<j<3)+12*(nb//6),"rg"[NB>0])
    Jetons[j]+=NB
    #Jetons[j]=max(0,Jetons[j])
  elif choix.startswith("Transfert"):
    NB=min(Jetons[int(choix[-3])-1],int(choix[-1]))
    for k in (-3,-2):#int(choix[-3]),int(choix[-2])):
      J=int(choix[k])-1
      for nb in range(min(Jetons[J],Jetons[J]+NB*(-1)**(k==-3)),max(Jetons[J],Jetons[J]+NB*(-1)**(k==-3))):
        DessineJeton(20+210*(J>1)+12*(nb%6),110-70*(0<J<3)+12*(nb//6),"rg"[k==-2])
      Jetons[J] += NB*(-1)**(k==-3)
  elif choix.startswith("Echange"):
    for J in (-1,-2):
      AfficherJetons(int(choix[J])-1,clr=CLR)
    Jetons[int(choix[-1])-1],Jetons[int(choix[-2])-1]=Jetons[int(choix[-2])-1],Jetons[int(choix[-1])-1]
  elif choix=="Rotation+":
    Jetons=[Jetons.pop(-1)]+Jetons
    for J in range(4):
      AfficherJetons(J,clr=CLR)
  elif choix=="Rotation-":
    Jetons.append(Jetons.pop(0))
    for J in range(4):
      AfficherJetons(J,clr=CLR)
  sleep(1)
  #DessineCarte(140,60,choix,effacement=True)
  fill_rect(0,140,320,82,"w")
  if NJ==1:
    AfficherMain(0)
  AffichagePlateau()
  sleep(1)
  draw_string("J"+str(j+1),20+210*(j>1),85-70*(0<j<3),"b","pink")


draw_string("L'ultime coup prime !",55,80,"purple")
draw_string("Valider avec OK",85,130,"purple")
for k in range(2): fill_rect(60,50+k*122,200,1,"g")

for k in range(2):
  for i in range(6):
    DessineJeton(119+15*i,20+180*k,"k")
for k in range(4):
  DessineCarte(8+261*(k//2),12+140*(k%2),["Jeton+1","Echange23","Rotation+","Jeton-3"][k])
#for carte in Pioche:
#  DessineCarte(8,20,carte)
#  sleep(1)
#  DessineCarte(8,20,carte,effacement=True)
while not (keydown(KEY_EXE) or keydown(KEY_OK)):1
while keydown(KEY_EXE) or keydown(KEY_OK):1

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

  #draw_string("Maximiser le nombre de jetons !",5,50,"purple")
  draw_string("Présentation",100,10,"g")
  Regles=("Chacun des 4 joueurs commence","la partie avec 6  (jetons).","","Chacun leur tour, les joueurs","jouent leurs 6   (cartes) pour",\
  "récolter le maximum de jetons.")
  for k in range(len(Regles)):
    draw_string(Regles[k],10,33+18*k,"b")
  DessineJeton(176,55,"k")
  MiniCarte(143,89,"k","g")

  draw_string("Nombre de joueurs humains",35,150,"b")
  draw_string("<   >",135,170,"r")
  draw_string("Valider avec OK",85,192,"purple")

  CLR=(160,0,250)
  Mains=[[],[],[],[]]
  Jetons=[6,6,6,6]
  for j in range(4):
    Mains[j]=[choice(Pioche) for k in range(6)]


  NJ=0
  chg=1
  while not (keydown(KEY_EXE) or keydown(KEY_OK)):
    if chg:
      draw_string(str(NJ),155,170,"w")
      NJ=(NJ+chg)%5
      draw_string(str(NJ),155,170,"b")
      sleep(0.2)
    chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
  while keydown(KEY_EXE) or keydown(KEY_OK):1

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

  while not any([Mains[k]==[] for k in range(4)]):
    AffichagePlateau()
    while keydown(KEY_EXE) or keydown(KEY_OK):1
    for j in range(4):
      draw_string("J"+str(j+1),20+210*(j>1),85-70*(0<j<3),"purple","cyan")
      if j>=NJ: # IA joue
        choix=Mains[j].pop(randint(0,len(Mains[j])-1))
        #jeu(choix,j)
      else: # un joueur joue
        if NJ==1:
          AfficherMain(j)
        if NJ>1:
          draw_string("Appuyer sur OK pour",65,170,"purple")
          draw_string("afficher les cartes de J"+str(j+1),40,190,"purple")
          while not (keydown(KEY_EXE) or keydown(KEY_OK)):1
          draw_string("Appuyer sur OK pour",65,170,"w")
          draw_string("afficher les cartes de J"+str(j+1),40,190,"w")
          while keydown(KEY_EXE) or keydown(KEY_OK):1
          AfficherMain(j)
        chg=1
        rang=-1
        while not (keydown(KEY_EXE) or keydown(KEY_OK)):
          if chg:
            AffichagePlateau(True)
            DessineCarte(5+53*rang,155,Mains[j][rang],"g",True) # que cadre
            AfficherJetons(j)
            rang=(rang+chg)%len(Mains[j])
            DessineCarte(5+53*rang,155,Mains[j][rang],"r",True) # que cadre
            choix=Mains[j][rang]
            if choix.startswith("Jeton"):
              for nb in range(min(Jetons[j],Jetons[j]+int(choix[-2:])),max(Jetons[j],Jetons[j]+int(choix[-2:]))):
                DessineJeton(20+210*(j>1)+12*(nb%6),110-70*(0<j<3)+12*(nb//6),"rg"[int(choix[-2:])>0])
            elif choix.startswith("Transfert"):
              NB=min(Jetons[int(choix[-3])-1],Jetons[int(choix[-2])-1],int(choix[-1]))
              for k in (-3,-2):#int(choix[-3]),int(choix[-2])):
                J=int(choix[k])-1
                for nb in range(min(Jetons[J],Jetons[J]+NB*(-1)**(k==-3)),max(Jetons[J],Jetons[J]+NB*(-1)**(k==-3))):
                  DessineJeton(20+210*(J>1)+12*(nb%6),110-70*(0<J<3)+12*(nb//6),"rg"[k==-2])
            elif choix.startswith("Echange"):
              for J in (-1,-2):
                  AfficherJetons(int(choix[J])-1,clr=CLR)
            elif choix.startswith("Rotation"):
              for J in range(4):
                AfficherJetons(J,clr=CLR)
            sleep(0.2)
          chg=keydown(KEY_RIGHT)-keydown(KEY_LEFT)
        while keydown(KEY_EXE) or keydown(KEY_OK):1
        choix=Mains[j].pop(rang)
      
      jeu(choix,j)

  # gagnant : maximum de Jetons
  for j in range(4):
    if Jetons[j]==max(Jetons):
      draw_string("J"+str(j+1)+" a gagné.",100,130+20*j,"r")
  sleep(2)
  fill_rect(140,60,45,60,"w")
  draw_string("OK pour",125,40,"purple")
  draw_string("relancer",120,60,"purple")
  draw_string("une partie",110,80,"purple")
  while not (keydown(KEY_OK) or keydown(KEY_EXE)):1
  while keydown(KEY_OK) or keydown(KEY_EXE):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.