Petit Jeu YAM's ou Yahtzee - fr, en, de, sp

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Petit Jeu YAM's ou Yahtzee - fr, en, de, sp

Message par kernadec »

bjr à tous
Voir règles du Yams Yahtzee sur le net ou Wikipédia
A partir d'une procédure dessin d'un "Dés créé par NicTheQuick"
qui se trouve dans les exemples de Code Archive

j'ai ajouté la possibilité d'avoir un nombre de Dés au choix
et jusqu' a 5 dés pour le Yam's avec 3 essais par joueurs.

je précise que ce code fonctionne sur la version demo de PureBasic 6.40
puisqu'il n'utilise aucun API Windows.

new version 2.2
Ajout au menu d'une remise a zéro des valeurs et des parties en cours.

new version 2.3
Gestion des versions PB 5.73 à PB 6.40 pour CreateImage() et sa transparence
avec le test : #PB_Compiler_Version :idea:
Désolé; je n'ai pas teste avec les versions inferieurs à PB 5.73 :wink:

new version 4, celle ci seras probablement la dernière du 5/8/2026
plusieurs ajustements notamment le choix du langage pour l'interface..

ps: dans le dernier post se trouve la même version plus compacte en moins de 800 lignes
pour PureBasic Démo qui peut être compilée.

ps: v.5 - Ajout d un mode aléatoire des couleurs de joueurs au lancement du jeu.

modification du jeu maintenant les 2 paires 10points et les suite mineures 15 points
sont en option ainsi que la diction de points. voici un lien pour les voix.
https://drive.google.com/file/d/1I5yLdB ... rive_link

Cordialement

Code : Tout sélectionner

; Forum: http://www.purebasic.fr/german/viewtopic.php?t=3249&start=10
; Autheur de procedure DrawCube: NicTheQuick (updated for PB 4.00 by Andre) 
; (YAMS Auteur kernadec  PB 630 et supérieur par kernadec le 25 Juin 2026) 
; Version corrigée pour la selection de Dés avec la souris on/off Aout 2026
; version 5 avec option petites-suites et 2 paires et un mode vocal

UsePNGImageDecoder()

EnableExplicit

Enumeration 
  #Window_Des
EndEnumeration

Structure yams
  Num.l
  Tours.l
  Points.l
EndStructure

Global NewList Ranglist.yams()

Global Event, Cube_Size.l, Cube_Points_r.l, Cube_Img.l, Cube_alpha.l, main, SonActif.l, TitreW$, block
Global numero.l, Lancer.l = 1, Joueur.l, Jco, Jcolor.l, i, u, a.l, n.l, ne.l, ns.l, m$, lg, ii, uu
Global Total, Total$, Total1$, Total2$, Total3$, Score$, result1.l,ColorDes,tmp.l, foix1.l, ToPair
Global Calcul1$, Calcul2$, Calcul3$, Calcul4$, Calcul5$, Calcul6$, dicte$, version$, Chemin$, Pt_Suite
Global FtArial, ni, txi, tyi, xt, yt, T$, Cf, Cb, Ht, col, bcol, xb, yb, Styl, fon$, fon1$, fon2$
Global Dim Resultat(6), Dim  Resultat2(6), Dim XPosition(6), Dim Des_Fixe(6),Dim Couleur(6)
Global Dim TourJoueur(6), Dim RangJoueur$(6), Dim Filtre(6), Dim triage$(5), Dim Paire$(6)
Global Dim ScoreJoueur(6), Dim ScoreChance(6), Dim Language$(36), Dim Language1$(36)

Procedure country(lg)
  If lg = 1  ; french()
    Language$(1) = "Joueur n°1"
    Language$(2) = "Joueur n°2"
    Language$(3) = "Joueur n°3"
    Language$(4) = "Joueur n°4"
    Language$(5) = "Joueur n°5"
    Language$(6) = "Joueur n°6"
    Language$(7) = "JOUEUR  N° "
    Language$(8) = "[ Espace ]...  Lance " + Str(5) + " Dés"
    Language$(9) = "[ Return ]  =  PASSER et VALIDER LE RESULTAT"
    Language$(10) = " [Joueur suivant]   RESULTAT = "
    Language$(11) = "[ Espace ].Résultat du 1er Coup "
    Language$(12) = "[ Espace ].Résultat du 2ème Coup"
    Language$(13) = "[ Espace ]...3ème Coup = RESULTAT"
    Language$(14) = "Cliquer sur les Dés qui doivent conserver leurs valeurs     Pour choisir un joueur > Clavier de 1 à 6"
    Language$(15) = "Color Des"
    Language$(16) = "Resultat Sonor"
    Language$(17) = "Efface tout"
    Language$(18) = "Quit"
    Language$(19) = "[ Espace ]...  Lance 5 Dés"
    Language$(20) = " Score  "
    Language$(21) = " Points "
    Language$(22) = " Tours "
    Language$(23) = " Chance "
    Language$(24) = " Tirage "
    Language$(25) = "Tours"
    Language$(26) = "rang"
    Language$(27) = "Options"
    Language$(28) = "Joueur"
    Language$(29) = " Brelan 20"
    Language$(30) = "    Full 25"
    Language$(31) = "  Carre 30"
    Language$(32) = " Pt.Suit 15"
    Language$(33) = " Gr.Suit 40"
    Language$(34) = "  YAM'S 50"
    Language$(35) = "  Z e r o + 0 "
    Language$(36) = " 2 Paires 10"
  EndIf
  If lg = 2  ;English()
    Language$(1) = " Player n°1"
    Language$(2) = " Player n°2"
    Language$(3) = " Player n°3"
    Language$(4) = " Player n°4"
    Language$(5) = " Player n°5"
    Language$(6) = " Player n°6"
    Language$(7) = "PLAYER  N° "
    Language$(8) = "( Space )...Roll the" + Str(5) + " Dice"
    Language$(9) = "[ Return ] = PROCESS and COMFIRM THE RESULT"
    Language$(10) = " [ Next player ] THE RESULT = "
    Language$(11) = "[ Space ]...Result of the 1st Round"
    Language$(12) = "[ Space ]...Result of the 2nd Round"
    Language$(13) = "[ Space ]...3rd Move = RESULT"
    Language$(14) = "Click on the dice that should keep their values     To select a player > Keyboard keys 1 to 6"
    Language$(15) = "Dice Color"
    Language$(16) = "Sound Result"
    Language$(17) = "Erase everything"
    Language$(18) = "Quit"
    Language$(19) = "[ Space ]... Roll the 5 Dice"
    Language$(20) = " Score  "
    Language$(21) = " Points "
    Language$(22) = "RoundPlay"
    Language$(23) = " Luck "
    Language$(24) = "Sort order"
    Language$(25) = "Round"
    Language$(26) = "Row"
    Language$(27) = "Options"
    Language$(28) = "Player"
    Language$(29) = " 3of kind 20"
    Language$(30) = "FullHouse 25"
    Language$(31) = " 4of kind 30"
    Language$(32) = "Sequen4 15"
    Language$(33) = "Sequen5 40"
    Language$(34) = " Yahtzee 50"
    Language$(35) = "  Z e r o + 0 "
    Language$(36) = " 2 pairs 10"
  EndIf
  If lg = 3  ;German()
    Language$(1) = "Spieler n°1"
    Language$(2) = "Spieler n°2"
    Language$(3) = "Spieler n°3"
    Language$(4) = "Spieler n°4"
    Language$(5) = "Spieler n°5"
    Language$(6) = "Spieler n°6"
    Language$(7) = "SPIELER N° "
    Language$(8) = "[Leertaste]..Starte " + Str(5) + " Würfel"
    Language$(9) = "[ Return ] = Ausführen und Ergebnis bestätigen"
    Language$(10) = " [Nächster Spieler]   ERGEBNIS ="
    Language$(11) = "[Leerzeichen]. Ergebnis 1. Wurfs"
    Language$(12) = "[Leerzeichen]. Ergebnis 2. Wurfs"
    Language$(13) = "[Leerzeichen]..3. Zug = ERGEBNIS"
    Language$(14) = "Klicken Sie auf die Würfel, um deren Wert zu behalten : einen Spieler auszuwählen >Tastatur 1bis6"
    Language$(15) = "Farbe des Würfels"
    Language$(16) = "Klangresultat"
    Language$(17) = "Löscht alles"
    Language$(18) = "Beenden"
    Language$(19) = "[Leertaste] ... " + "5" + " Würfel werfen"
    Language$(20) = " Spielstand"
    Language$(21) = " Punkte "
    Language$(22) = " Zyklus "
    Language$(23) = " Glück "
    Language$(24) = " Auflage"
    Language$(25) = "Zyklus"
    Language$(26) = "rang"
    Language$(27) = "Option"
    Language$(28) = "Spieler"
    Language$(29) = " Drilling 20"
    Language$(30) = "FullHous 25"
    Language$(31) = " Vierling 30"
    Language$(32) = "Fortset4 15"
    Language$(33) = "Fortset5 40"
    Language$(34) = " Yahtzee 50"
    Language$(35) = "  Z e r o + 0 "
    Language$(36) = " 2 Paare 10"
  EndIf
  If lg = 4  ;Spagne()
    Language$(1) = " Jugador 1"
    Language$(2) = " Jugador 2"
    Language$(3) = " Jugador 3"
    Language$(4) = " Jugador 4"
    Language$(5) = " Jugador 5"
    Language$(6) = " Jugador 6"
    Language$(7) = "JUGADOR N° "
    Language$(8) = "[ Espacio ]...  Lanza" + Str(5) + "Dados"
    Language$(9) = "[ Return ]  =  PASAR y VALIDAR EL RESULTADO"
    Language$(10) = "[Siguiente jugador]   RESULTADO ="
    Language$(11) = "[Espacio]....Resultado de la 1.ª ronda"
    Language$(12) = "[ Espacio ]...Resultado de la segunda ronda"
    Language$(13) = "[ Espacio ]...3.er golpe = RESULTADO"
    Language$(14) = "Haz clic en los dados que deban conservar valores    Para elegir un jugador > Teclado del 1 al 6"
    Language$(15) = "Dados Color"
    Language$(16) = "Su resultado"
    Language$(17) = "Borra todo"
    Language$(18) = "Salir"
    Language$(19) = "[Espacio]... Lanza 5 dados"
    Language$(20) = " Score  "
    Language$(21) = " Puntos "
    Language$(22) = " Ciclo"
    Language$(23) = "Fortuna"
    Language$(24) = "Sorteo"
    Language$(25) = "Redonda"
    Language$(26) = "Fila"
    Language$(27) = "Opciones"
    Language$(28) = "Jugador"
    Language$(29) = "3Iguales 20"
    Language$(30) = "Casalena 25"
    Language$(31) = "4Iguales 30"
    Language$(32) = "Esquale4 15"
    Language$(33) = "Esquale5 40"
    Language$(34) = "5Iguales 50"
    Language$(35) = "  Z e r o + 0 "
    Language$(36) = " 2 pares 10"
  EndIf
EndProcedure 

Couleur(1) = RGBA(0, 255, 255, 0)  
Couleur(2) = #Red     
Couleur(3) = #Green  
Couleur(4) = #Blue   
Couleur(5) = #Yellow 
Couleur(6) = #Magenta 
RandomizeArray(Couleur(),1,6)

version$ = " 5"+ Space(30)
TitreW$ = " YAHTZEE - Y A M S "
Chemin$ = ""
SonActif = 0

fon1$ = "courier new normal"
fon2$ = "Modern normal"

If #PB_Compiler_Version => 630  ;## Réglages CreateImage() ########
  Cube_alpha  = 255 
Else ; mettre à zero "Cube_alpha" pour version inferieur à PB 6.30
  Cube_alpha  = 0 
EndIf

bcol = RGBA(173, 173, 173, 0)  ; couleur selection boutons

numero = 5   ; Mode 5 Dés
Joueur = 1
Cube_Size = 105 
Cube_Points_r = Cube_Size / 10 

For i = 0 To 6
  CreateImage(i, Cube_Size, Cube_Size, 32 , RGBA(255, 255, 255, Cube_alpha))
Next i

For i = 21 To 26
  CreateImage(21, Cube_Size, Cube_Size, 32 , RGBA(255, 255, 255, 30))
Next i

CreateImage(11, 15, 15, 24 , Couleur(1)) ;
CreateImage(12, 15, 15, 24 , Couleur(2))
CreateImage(13, 15, 15, 24 , Couleur(3))
CreateImage(14, 15, 15, 24 , Couleur(4)) 
CreateImage(15, 15, 15, 24 , Couleur(5))
CreateImage(16, 15, 15, 24 , Couleur(6))

CreateImage(21, 50, 20, 24 , Couleur(1))
CreateImage(22, 50, 20, 24 , Couleur(2))
CreateImage(23, 50, 20, 24 , Couleur(3))
CreateImage(24, 50, 20, 24 , Couleur(4)) 
CreateImage(25, 50, 20, 24 , Couleur(5))
CreateImage(26, 50, 20, 24 , Couleur(6))

XPosition(1) =  10
XPosition(2) = 130
XPosition(3) = 250
XPosition(4) = 370
XPosition(5) = 490
XPosition(6) = 610

Procedure carre(col, xb)   ; affiche carre autour du bouton selecte
  StartDrawing(WindowOutput(#Window_Des)) 
  LineXY(xb + 7 , 0 + 7 , xb + Cube_Size + 17, 0 + 7 , col)
  LineXY(xb + 7 , 1 + 7 , xb + Cube_Size + 17, 1 + 7 , col)
  LineXY(xb + 7 , 2 + 7 , xb + Cube_Size + 17, 2 + 7 , col)
  LineXY(xb + 7 , 3 + 7 , xb + Cube_Size + 17, 3 + 7 , col)
  ;ligne bas
  LineXY(xb + 1 + 7, Cube_Size-3 + 18, xb + Cube_Size + 17, Cube_Size-3 + 18, col)
  LineXY(xb + 1 + 7, Cube_Size-2 + 18, xb + Cube_Size + 17, Cube_Size-2 + 18, col)
  LineXY(xb + 1 + 7, Cube_Size-1 + 18, xb + Cube_Size + 17, Cube_Size-1 + 18, col)
  LineXY(xb + 1 + 7, Cube_Size   + 18, xb + Cube_Size + 17, Cube_Size   + 18, col)
  ;ligne gauche
  LineXY(xb + 3 + 7, 7, xb +  3 + 7, Cube_Size + 17 , col) 
  LineXY(xb + 2 + 7, 7, xb +  2 + 7, Cube_Size + 17 , col)  
  LineXY(xb + 1 + 7, 7, xb +  1 + 7, Cube_Size + 17 , col)
  LineXY(xb + 0 + 7, 7, xb +  0 + 7, Cube_Size + 17 , col)
  ;ligne droite
  LineXY(xb + Cube_Size-3 + 17 , 7, xb + Cube_Size-3 + 17, Cube_Size + 17 , col)
  LineXY(xb + Cube_Size-2 + 17 , 7, xb + Cube_Size-2 + 17, Cube_Size + 17 , col)
  LineXY(xb + Cube_Size-1 + 17 , 7, xb + Cube_Size-1 + 17, Cube_Size + 17 , col)
  LineXY(xb + Cube_Size   + 17 , 7, xb + Cube_Size   + 17, Cube_Size + 17 , col)
  StopDrawing()
EndProcedure

Procedure ButtonTextColor(ni, txi, tyi, xt, yt, T$, Cf, Cb, Ht, Styl, fon$)  
  If IsImage(ni):FreeImage(ni):EndIf
  If CreateImage(ni, txi, tyi, 32, Cb)
    FtArial = LoadFont(1, fon$, Ht, Styl)
    StartDrawing(ImageOutput(ni))
    DrawingFont(FtArial)
    DrawingMode(1)
    DrawText(xt+1, yt-1, T$, RGBA(0, 0, 0, Cube_alpha), cb)
    DrawText(xt, yt, T$, Cf, Cb)
    DrawingFont(GetStockObject_(#SYSTEM_FONT))
    StopDrawing()
  EndIf
EndProcedure 

Procedure Col_Joueur(Jco)
  If Jco = 1 : Jcolor = Couleur(1) : EndIf 
  If Jco = 2 : Jcolor = Couleur(2) : EndIf 
  If Jco = 3 : Jcolor = Couleur(3) : EndIf 
  If Jco = 4 : Jcolor = Couleur(4) : EndIf 
  If Jco = 5 : Jcolor = Couleur(5) : EndIf 
  If Jco = 6 : Jcolor = Couleur(6) : EndIf
  SetWindowColor(#Window_Des, Jcolor)
EndProcedure

Procedure CheckBox_0()
  ; reactive en gris le bouton valide return avant les 3 coup de des
  ButtonTextColor(7, 350, 34, 56, 11, Language$(9), RGBA(0, 0, 0, 0), RGBA(220, 220, 220, 128), 8, 0, fon2$)
  ButtonImageGadget(17, 350, 145, Cube_Size + 145, 30, ImageID(7), #PB_Button_Toggle)
  
  For i = 1 To 6 : SetGadgetState(20 + i, 0) : Des_Fixe(i) = 0: Next i
  For i = 1 To 6
    ButtonImageGadget(i, XPosition(i), 10, Cube_Size + 5, Cube_Size + 5, ImageID(0), #PB_Image_Border | #PB_Button_Toggle)
  Next i
EndProcedure

Procedure StateMenu(a)
  If a = 0 : For i = 1 To  6 : SetMenuItemState(0, i, 0) : Next i : EndIf
  If a = 1 : For i = 11 To 16 : SetMenuItemState(0, i, 0) : Next i : EndIf
EndProcedure

Procedure NewMenuIcon(Nimg.l, co.l) 
  CreateImage(Nimg, 16, 16, 32) 
  StartDrawing(ImageOutput(Nimg))
  DrawingMode(#PB_2DDrawing_Default )
  Box(0, 0, 15, 15, co) 
  DrawingMode(#PB_2DDrawing_Outlined )
  Box(0, 0, 16, 16, RGBA(127, 127, 127, 255))
  StopDrawing() 
  ProcedureReturn ImageID(Nimg) 
EndProcedure  

Procedure efface_des(ne)
  StartDrawing(ImageOutput(ne))  
  DrawingMode(0) 
  Box(0, 0, Cube_Size - 1, Cube_Size - 1, RGB(255, 255, 255)) 
  StopDrawing()  
  SetGadgetState(ne, ImageID(ne))
  SetWindowTitle(0, TitreW$ + version$ + Space(15) + Language$(7) + Str(Joueur))
  ButtonTextColor(8, 350, 34, 110, 11, Language$(8), RGBA(0, 0, 0, 0), RGBA(220, 250, 190, 100), 8, 0, fon2$)
  ButtonImageGadget(15, XPosition(1), 145, Cube_Size + 131, 30, ImageID(8), #PB_Button_Toggle)
  ; affiche gains
  ButtonTextColor(105, 92, 28, -10, 6, "", RGBA(255, 255, 255, Cube_alpha), RGBA(255, 255, 255, Cube_alpha), 12, 0, fon1$)
  ButtonImageGadget(105, 248, 146, 100, 28, ImageID(105))
EndProcedure

Procedure test_select()
  block = 0 : 
  For i = 1 To 5 
    If GetGadgetState(20 + i) = 0 
      block + 1 
    EndIf 
  Next i
  If  block = 5 : score$ = Language$(35) : Total2$ = "" : EndIf
EndProcedure

Procedure vocal(Chemin$, dicte$,tmp)   ; donner de la voix aux resultats
  
  ;precedure en attente de fichiers son
  ;#####################################################################################
  ;Utiliza este sitio para crear letras durante el juego "https://soundoftext.com)
  ;copiar los archivos paroles.OGG en el directorio del Yahtzee
  ;Nutze diese Website, um während des Spiels Songtexte zu erstellen "https://soundoftext.com)
  ;Kopieren Sie die Dateien paroles.OGG in das Yahtzee-Verzeichnis
  ;Use this site to create lyrics during the game "https://soundoftext.com)
  ;copy the paroles.OGG files to the Yahtzee directory
  ;Utiliser ce site pour creer des paroles pendant le jeu "https://soundoftext.com)
  ;copier les fichiers paroles.OGG dans repertoire du Yahtzee
  ;Default file names example : 15.ogg, 20.ogg, 25.ogg, 30.ogg, 40.ogg, 50.ogg
  ;#####################################################################################
  If InitSound()                       ; Initialisation des Sons
    UseOGGSoundDecoder()               ; Utilisation des fichiers ogg
    If LoadSound(0, #PB_Compiler_Home + Chemin$ + dicte$)
      PlaySound(0, #PB_Sound_Loop)
      Delay(tmp) 
      FreeSound(0)                     ; Le son est libéré
    EndIf
  EndIf 
EndProcedure

Procedure Range()
  For i = 1 To 5 : triage$(i) = Mid(Total2$,i ,1) : Next i 
  SortArray(triage$(), #PB_Sort_Ascending)
  Total2$ = triage$(1) + triage$(2) + triage$(3) + triage$(4) + triage$(5)
EndProcedure

Procedure Cherche2paires()
  Range()
  uu = 0
  For ii = 1 To 6
    If CountString(total2$,Paire$(ii))
      uu = uu + 1
      If uu = 2
        Score$ = Language$(36)
      Else
        Score$ = ""
      EndIf
    EndIf
  Next ii
EndProcedure

Procedure Cherche_Petite_Suite()
  ;Cherche_Petite_Suite 
  Range() : If Left(total2$,4) = "1234"    : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,4) = "2345"    : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,4) = "3456"    : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "11234"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "12234"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "12334"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "22345"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "23345"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "23445"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "33456"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "34456"   : Score$ = Language$(32) : EndIf 
  Range() : If Left(total2$,5) = "34556"   : Score$ = Language$(32) : EndIf
  Range() : If Left(total2$,5) = "13456"   : Score$ = Language$(32) : EndIf
EndProcedure

Procedure Combinaisons()
  
  ; recherche des repetitions de chiffres dans Total2 trié en croissance
  Calcul1$ = Str(CountString(Total2$, "1"))
  Calcul2$ = Str(CountString(Total2$, "2"))   
  Calcul3$ = Str(CountString(Total2$, "3"))
  Calcul4$ = Str(CountString(Total2$, "4"))
  Calcul5$ = Str(CountString(Total2$, "5"))
  Calcul6$ = Str(CountString(Total2$, "6"))
  
  ; Total3 = Second Rangement Croissant
  Total3$ = Calcul1$ + Calcul2$ + Calcul3$ + Calcul4$ + Calcul5$ + Calcul6$
  
  ; Recherche des Combinaisons selon les règles du YAMS standard
  
  If ToPair = 1 : Cherche2paires() : EndIf
  
  If Pt_Suite = 1 : Cherche_Petite_Suite() : EndIf
  
  If CountString(Total3$, "3")     = #True : Score$ = Language$(29) : EndIf 
  If CountString(Total3$, "3")     = #True
  If CountString(Total3$, "2")     = #True : Score$ = Language$(30) : EndIf : EndIf
  If CountString(Total3$, "4")     = #True : Score$ = Language$(31) : EndIf
  If CountString(Total3$, "5")     = #True : Score$ = Language$(34) : EndIf
  
  ;grande suite
  Range() : If Left(total2$,5) = "12345"   : Score$ = Language$(33) : EndIf
  Range() : If Left(total2$,5) = "23456"   : Score$ = Language$(33) : EndIf
  
  If score$ = "" : score$ = Language$(35) : EndIf
  
  ; change couleur passe return en vert
  If score$ = Language$(30) Or score$ = Language$(33) ;Or score$ = Language$(29) Or score$ = Language$(31)
    ButtonTextColor(7, 350, 34, 56, 11, Language$(9), RGBA(0, 0, 0, 0), RGBA(135, 235, 125, 128), 8, 0, fon2$)
    ButtonImageGadget(17, 350, 145, Cube_Size + 145, 30, ImageID(7), #PB_Button_Toggle)
  Else
    ButtonTextColor(7, 350, 34, 56, 11, Language$(9), RGBA(0, 0, 0, 0), RGBA(220, 220, 220, 128), 8, 0, fon2$)
    ButtonImageGadget(17, 350, 145, Cube_Size + 145, 30, ImageID(7), #PB_Button_Toggle) 
  EndIf
  
EndProcedure

Procedure Score_des_Joueur_options(ns, Joueur) 
  If Lancer <= 3
    
    ; copie Resultat en Resultat2 pour le tri et garde position origine DES dans Resultat
    CopyArray(Resultat(), Resultat2()) 
    
    Total1$ = "" : Total2$ = ""
    For i = 1 To  ns : Total1$ = Total1$ + Str(Resultat2(i)) : Next i ; stock Resultat2 en Total1
    
    SortArray(Resultat2(), #PB_Sort_Ascending  , 1 , ns)
    For i = 1 To  ns : Total2$ = Total2$ + Str(Resultat2(i)) : Next i ; stock Resultat2 tri en Total2
    
    Combinaisons()
    
    SetWindowTitle(0, TitreW$ + version$ + Space(15) + Language$(7) + Str(Joueur)+Space(10) + Score$)
    
    ;##############################################################################################
    ;Creer des sons.OGG avec des noms de scores
    ;Activer la Procedure vocal(Chemin$, dicte$,tmp)
    If lancer = 3 And Score$ = "" : Score$ = Language$(35)       : EndIf 
    
    If SonActif = 1 ; score sonor
      If score$ = Language$(36)  : vocal(Chemin$, "10.ogg", 400) : EndIf
      If score$ = Language$(32)  : vocal(Chemin$, "15.ogg", 400) : EndIf
      If score$ = Language$(29)  : vocal(Chemin$, "20.ogg", 400) : EndIf
      If score$ = Language$(30)  : vocal(Chemin$, "25.ogg", 700) : EndIf
      If score$ = Language$(31)  : vocal(Chemin$, "30.ogg", 400) : EndIf
      If score$ = Language$(33)  : vocal(Chemin$, "40.ogg", 400) : EndIf
      
      If Lancer = 3 : If score$ = Language$(34)  : vocal(Chemin$, "50.ogg", 400) : EndIf : EndIf
    EndIf
    
  EndIf
  
  If score$ = Language$(34)  : Lancer = 3  : EndIf ; valide le resultat
  
  SetWindowTitle(0, TitreW$ + version$ + Space(15) + Language$(7) + Str(Joueur)+Space(10) + Score$)
  ButtonTextColor(105, 92, 28, -10, 6, "  " + Score$, Jcolor, RGBA(255, 255, 255, Cube_alpha), 12, 0, fon1$)
  ButtonImageGadget(105, 248, 145, 100, 30, ImageID(105))
  
EndProcedure

Procedure Score_des_Joueur_List(ns, Joueur)
  
  If Lancer <= 3
    ; copie Resultat en Resultat2 pour le tri et garde position origine DES dans Resultat
    CopyArray(Resultat(), Resultat2()) 
    
    Total1$ = "" : Total2$ = ""
    For i = 1 To  ns : Total1$ = Total1$ + Str(Resultat2(i)) : Next i ; stock Resultat2 en Total1
    
    SortArray(Resultat2(), #PB_Sort_Ascending  , 1 , ns)
    For i = 1 To  ns : Total2$ = Total2$ + Str(Resultat2(i)) : Next i ; stock Resultat2 tri en Total2
    
    Combinaisons()
    
    ScoreJoueur(Joueur) = ScoreJoueur(Joueur) + Val(Right(Score$, 2))
    TourJoueur(Joueur) = TourJoueur(Joueur) + 1
    If TourJoueur(Joueur) > 0
      ScoreChance(Joueur) =  ((scoreJoueur(Joueur) * 2)/TourJoueur(Joueur)) ; %
    EndIf
    
    AddGadgetItem (40, -1, " n°"+ Str(Joueur)+Chr(10)+Str(ScoreJoueur(Joueur))+Chr(10)+LTrim(Score$)+Chr(10)+Str(TourJoueur(Joueur))+Chr(10)+Str(ScoreChance(Joueur))+"%"+Chr(10)+Total1$, ImageID(Joueur+10)) 
    
    ;Affiche le dernier coup visible avec scoll ascenseur mis en bas
    SetGadgetState(40, CountGadgetItems(40)-1) 
    
    AddElement(Ranglist())
    Ranglist()\Num = Joueur
    Ranglist()\Tours = TourJoueur(Joueur)
    Ranglist()\Points = ScoreJoueur(Joueur) 
    
    SortStructuredList(Ranglist(), #PB_Sort_Descending, OffsetOf(yams\tours), TypeOf(yams\tours))
    SortStructuredList(Ranglist(), #PB_Sort_Descending, OffsetOf(yams\Points), TypeOf(yams\Points))
    
    ClearGadgetItems(42)
    
    For i = 1 To 6 : Filtre(i) = 1 : Next i 
    
    ForEach  Ranglist()
      If Filtre(Ranglist()\Num) = 1      ; Filtre 
        Filtre(Ranglist()\Num) = 0       ; Filtre pas plus de 6 résultats dans le ListIconGadget()
        AddGadgetItem(42, -1, "" +Ranglist()\Num+Chr(10)+""+Ranglist()\Tours+Chr(10)+""+Ranglist()\Points, ImageID(Ranglist()\Num + 10))  
        Lancer = 4
      EndIf
    Next
  EndIf
  
  If Lancer = 4 
    ButtonTextColor(8,350, 34, 66, 11, Language$(10) + Score$ + "  -->", RGBA(0, 0, 0, 0), RGBA(220, 165, 195, 200), 8, 0, fon2$)
    ButtonImageGadget(15,XPosition(1), 145, Cube_Size + 131, 30, ImageID(8), #PB_Button_Toggle)
    ButtonTextColor(7, 350, 34, 56, 11, Language$(9), RGBA(0, 0, 0, 0), RGBA(220, 220, 220, 128), 8, 0, fon2$)
    ButtonImageGadget(17, 350, 145, Cube_Size + 145, 30, ImageID(7), #PB_Button_Toggle)
    
    Score$ = ""
    For i = 0 To 600 Step 120 ; efface cadres cubes selectes
      carre(jcolor, i)
      SetGadgetState(20 + ((i/120)+1), 0)
    Next i
  EndIf 
  
EndProcedure   

Procedure DrawCube(numero, Nr.l) 
  ;Author Procedure : NicTheQuick 
  Protected a.l, x.l, y.l, drhx.l, drhy.l 
  
  If Nr < 0 And Nr > 6 : ProcedureReturn #False : EndIf 
  
  If numero > 0 
    Restore Cube_Pos 
    a = Nr * (Nr - 1) / 2 
    
    While a : Read.l x : Read.l y : a - 1 : Wend 
    
    StartDrawing(ImageOutput(numero))  
    
    DrawingMode(0)
    Box(0, 0, Cube_Size - 1, Cube_Size - 1, RGB(255, 255, 255)) 
    
    drhx = Random(1) 
    drhy = Random(1) 
    For a = 1 To Nr 
      Read.l x : If drhx : x = 100 - x : EndIf 
      Read.l y : If drhy : y = 100 - y : EndIf 
      
      x = x * Cube_Size / 100 
      y = y * Cube_Size / 100 
      
      If ColorDes = 1  ; Points de Dés au couleur du jour
        Circle(x + 2, y - 1, Cube_Points_r, RGB(110, 110, 110)) ;couleur de l'ombre
        Circle(x, y, Cube_Points_r, $000000)
      Else
        Circle(x + 2, y - 1, Cube_Points_r, RGB(80, 80, 80)) ;couleur de l'ombre
        Circle(x, y, Cube_Points_r, Jcolor) 
      EndIf
    Next 
    
    StopDrawing() 
    
    ProcedureReturn numero 
  Else 
    ProcedureReturn #False 
  EndIf 
  
  DataSection 
    Cube_Pos: 
    Data.l 50, 50 
    Data.l 25, 25, 75, 75 
    Data.l 25, 25, 50, 50, 75, 75 
    Data.l 25, 25, 75, 25, 25, 75, 75, 75 
    Data.l 25, 25, 75, 25, 50, 50, 25, 75, 75, 75 
    Data.l 25, 25, 75, 25, 25, 50, 75, 50, 25, 75, 75, 75 
  EndDataSection 
EndProcedure 

Procedure des(numero)
  If numero = 1
    If GetGadgetState(20 + numero) = 0
      Resultat(numero) = Random(5) + 1
      DrawCube(numero, Resultat(numero)) 
      ButtonImageGadget(numero, XPosition(numero), 10, Cube_Size + 5, Cube_Size + 5, ImageID(numero), #PB_Image_Border | #PB_Button_Toggle)
      SetGadgetState(numero, ImageID(numero)) 
    EndIf
    total$ = Str(Resultat(1))
  EndIf
  
  If numero = 2
    If GetGadgetState(20 + numero) = 0
      Resultat(numero) = Random(5) + 1
      DrawCube(numero, Resultat(numero)) 
      ButtonImageGadget(numero, XPosition(numero), 10, Cube_Size + 5, Cube_Size + 5, ImageID(numero), #PB_Image_Border | #PB_Button_Toggle)
      SetGadgetState(numero, ImageID(numero))
    EndIf
    total$ = Str(Resultat(1) + Resultat(2))
  EndIf
  
  If numero = 3
    If GetGadgetState(20 + numero) = 0
      Resultat(numero) = Random(5) + 1
      DrawCube(numero, Resultat(numero))  
      ButtonImageGadget(numero, XPosition(numero), 10, Cube_Size + 5, Cube_Size + 5, ImageID(numero), #PB_Image_Border | #PB_Button_Toggle)
      SetGadgetState(numero, ImageID(numero)) 
    EndIf
    total$ = Str(Resultat(1) + Resultat(2) + Resultat(3))
  EndIf
  
  If numero = 4
    If GetGadgetState(20 + numero) = 0
      Resultat(numero) = Random(5) + 1 
      DrawCube(numero, Resultat(numero))  
      ButtonImageGadget(numero, XPosition(numero), 10, Cube_Size + 5, Cube_Size + 5, ImageID(numero), #PB_Image_Border | #PB_Button_Toggle)
      SetGadgetState(numero, ImageID(numero)) 
    EndIf
    total$ = Str(Resultat(1) + Resultat(2) + Resultat(3) + Resultat(4))
  EndIf
  
  If numero = 5
    If GetGadgetState(20 + numero) = 0
      Resultat(numero) = Random(5) + 1
      DrawCube(numero, Resultat(numero)) 
      ButtonImageGadget(numero, XPosition(numero), 10, Cube_Size + 5, Cube_Size + 5, ImageID(numero), #PB_Image_Border | #PB_Button_Toggle)
      SetGadgetState(numero, ImageID(numero))
    EndIf
    total$ = Str(Resultat(1) + Resultat(2) + Resultat(3) + Resultat(4) + Resultat(5))
  EndIf
EndProcedure

Procedure Partie_Lancer(n)
  If Lancer <= 3 
    For i =1 To 5 : If Des_Fixe(i) = 0 : efface_des(i) : EndIf : Next i
    For i = 1 To n : If Des_Fixe(i) = 0 : des(i) : EndIf :  Next i   
    SetWindowTitle(0, TitreW$ + version$ + Space(15) + Language$(7) + Str(Joueur))
    StateMenu(0) : SetMenuItemState(0, 5, GetMenuItemState(0, 5))
    
    ; CacheBouton() : HideGadget(15, #False) 
    Total = Resultat(1) + Resultat(2) + Resultat(3) + Resultat(4) + Resultat(5)
    If Lancer = 1
      ButtonTextColor(8,350, 34, 100, 11, Language$(11), RGBA(0, 0, 0, 0), RGBA(220, 250, 190, 100), 8, 0, fon2$)
      ButtonImageGadget(15,XPosition(1), 145, Cube_Size + 131, 30, ImageID(8), #PB_Button_Toggle)
      Score_des_Joueur_options(n, Joueur) : test_select()
    EndIf
    If Lancer = 2 
      ButtonTextColor(8,350, 34, 100, 11, Language$(12), RGBA(0, 0, 0, 0), RGBA(220, 250, 190, 100), 8, 0, fon2$)
      ButtonImageGadget(15,XPosition(1), 145, Cube_Size + 131, 30, ImageID(8), #PB_Button_Toggle)
      Score_des_Joueur_options(n, Joueur) : test_select()
    EndIf
    If Lancer = 3 
      ButtonTextColor(8,350, 34, 100, 11, Language$(13), RGBA(0, 0, 0, 0), RGBA(220, 250, 190, 100), 8, 0, fon2$)
      ButtonImageGadget(15,XPosition(1), 145, Cube_Size + 131, 30, ImageID(8), #PB_Button_Toggle)
      Score_des_Joueur_options(n, Joueur) : test_select()
      Score_des_Joueur_List(n, Joueur)
    EndIf
    Lancer = Lancer + 1
  EndIf
EndProcedure

Procedure Main_Joueur(main)
  
  If GetGadgetState(main) = 1
    carre(Jcolor, 120 * (main - 1))
    Des_Fixe(main) = 0
    SetGadgetState(20 + main, 0)
    SetGadgetState(main, ImageID(main)) 
  Else
    carre(bcol, 120 * (main - 1))
    Des_Fixe(main) = 1
    SetGadgetState(20 + main, 1) 
  EndIf 
  
EndProcedure

Procedure AfficheBoutons()
  ;// Sélection du Joueur listIcone
  SetMenuItemBitmaps_(MenuID(0), 11  , #MF_BYCOMMAND, NewMenuIcon(11, Couleur(1)), 0) 
  SetMenuItemBitmaps_(MenuID(0), 12  , #MF_BYCOMMAND, NewMenuIcon(12, Couleur(2)), 0) 
  SetMenuItemBitmaps_(MenuID(0), 13  , #MF_BYCOMMAND, NewMenuIcon(13, Couleur(3)), 0) 
  SetMenuItemBitmaps_(MenuID(0), 14  , #MF_BYCOMMAND, NewMenuIcon(14, Couleur(4)), 0) 
  SetMenuItemBitmaps_(MenuID(0), 15  , #MF_BYCOMMAND, NewMenuIcon(15, Couleur(5)), 0) 
  SetMenuItemBitmaps_(MenuID(0), 16  , #MF_BYCOMMAND, NewMenuIcon(16, Couleur(6)), 0)
  
  ;// Sélection du Joueur
  ButtonTextColor(51, 180, 40, 47, 11, Language$(1), Couleur(1), RGBA(220, 220, 220, Cube_alpha), 12, #PB_Font_Bold, fon1$)
  ButtonImageGadget(51, 10, 333, 90, 34, ImageID(51), #PB_Button_Toggle):
  
  ButtonTextColor(52, 180, 40, 47, 11, Language$(2), Couleur(2), RGBA(220, 220, 220, Cube_alpha), 12, #PB_Font_Bold, fon1$)
  ButtonImageGadget(52, 109, 333, 90, 34, ImageID(52), #PB_Button_Toggle)
  
  ButtonTextColor(53, 180, 40, 47, 11, Language$(3), Couleur(3), RGBA(220, 220, 220, Cube_alpha), 12, #PB_Font_Bold, fon1$)
  ButtonImageGadget(53, 209, 333, 90, 34, ImageID(53), #PB_Button_Toggle)
  
  ButtonTextColor(54, 180, 40, 47, 11, Language$(4), Couleur(4), RGBA(220, 220, 220, Cube_alpha), 12, #PB_Font_Bold, fon1$)
  ButtonImageGadget(54, 309, 333, 90, 34, ImageID(54), #PB_Button_Toggle)
  
  ButtonTextColor(55, 180, 40, 47, 11, Language$(5), Couleur(5), RGBA(220, 220, 220, Cube_alpha), 12, #PB_Font_Bold, fon1$)
  ButtonImageGadget(55, 409, 333, 90, 34, ImageID(55), #PB_Button_Toggle)
  
  ButtonTextColor(56, 180, 40, 47, 11, Language$(6), Couleur(6), RGBA(220, 220, 220, Cube_alpha), 12, #PB_Font_Bold, fon1$)
  ButtonImageGadget(56, 509, 333, 90, 34, ImageID(56), #PB_Button_Toggle)
  
  ButtonTextColor(105, 92, 28, -10, 6, "", RGBA(255, 255, 255, Cube_alpha), RGBA(255, 255, 255, Cube_alpha), 12, 0, fon1$)
  ButtonImageGadget(105, 248, 145, 100, 30, ImageID(105))
  
EndProcedure

Procedure Reset_Efface_Tout() 
  ; Efface les toutes parties et remise zero des scores
  RandomizeArray(Couleur(),1,6)
  
  ClearGadgetItems(40)   
  ClearGadgetItems(42)
  
  For i = 1 To 6 
    Resultat(i) = 0 
    Resultat2(i) = 0 
    ScoreJoueur(i) = 0 
    ScoreChance(i) = 0
    TourJoueur(i) = 0
  Next i
  
  For i = 1 To 5       ; Effece les dés
    efface_des(i)
    ButtonImageGadget(i, XPosition(i), 10, Cube_Size + 5, Cube_Size + 5, ImageID(i), #PB_Image_Border | #PB_Button_Toggle)
    SetGadgetState(i, 1)
  Next i
  
  Total1$ = "" : Total2$ = ""
  
  ForEach  Ranglist()
    Ranglist()\Num = 0
    Ranglist()\Tours = 0
    Ranglist()\Points = 0
  Next
  
  For i = 0 To 600 Step 120 ; Efface cadres cubes selectes
    carre(jcolor, i)
  Next i
  
  Calcul1$ = ""
  Calcul2$ = ""   
  Calcul3$ = ""
  Calcul4$ = ""
  Calcul5$ = ""
  Calcul6$ = ""
  
  CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 11, GetMenuItemState(0, 11)!1) : Col_Joueur(1) : Joueur = 1
  For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
  
  AfficheBoutons()
EndProcedure 

If OpenWindow(1, 0, 0, 220, 260, "YAHTZEE -  Kernadec  - YAM'S", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  StickyWindow(1,#True) 
  
  ButtonGadget(0, 10,  10, 200, 30, "Français")
  ButtonGadget(1, 10,  50, 200, 30, "Anglais")
  ButtonGadget(2, 10,  90, 200, 30, "Allemand")
  ButtonGadget(3, 10, 130, 200, 30, "Espagnol")
  CheckBoxGadget(4, 8 , 190, 205, 12, "Ptsuite, Sequen4, Fortset4, Esquale4") 
  CheckBoxGadget(5, 8 , 207, 205, 12, "2 Paires, 2 pairs, 2 Paar, 2 Pares") 
  CheckBoxGadget(6, 8 , 224, 205, 12, "Points , Voix , Voice , Stimme , Voz") 
  GadgetToolTip(6, "Valeur phonétique , Phonetic Value, Lautwert, Valor fonético")
  TextGadget(7, 86, 170,45,20,"Options")
  TextGadget(8, 10, 242,220,20,"       version " + Left(version$,2) + " -  aout MMXXVI")
  
  Repeat
    Event = WaitWindowEvent()
    
    Select Event
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0 : lg = 1 : Break
            
          Case 1 : lg = 2 : Break
            
          Case 2 : lg = 3 : Break
            
          Case 3 : lg = 4 : Break
            
            Case 4 : If GetGadgetState(4) : SetGadgetState(4,1) : Pt_Suite = 1 : Else : SetGadgetState(4,0) : Pt_Suite = 0  : EndIf
            
            Case 5 : If GetGadgetState(5) : SetGadgetState(5,1) : Topair = 1 : Else : SetGadgetState(5,0) : Topair = 0 : EndIf
            
            Case 6 : If GetGadgetState(6) : SetGadgetState(6,1) : SonActif = 1 : Else : SetGadgetState(6,0) : SonActif = 0 : EndIf
        EndSelect 
    EndSelect
  Until Event = #PB_Event_CloseWindow
EndIf

CloseWindow(1)

If lg = 0 : lg = 1 : EndIf
Country(lg)

;// adresse de telechargement de fichier son ogg pour la diction des pointsé 
;// https://drive.google.com/file/d/1d92Pp6kI0QqeRo7SpAL_tIAI3SH-hE-L/view?usp=drive_link
If lg = 1 : Chemin$ = "Yahtzee_French\" : EndIf
If lg = 2 : Chemin$ = "Yahtzee_English\" : EndIf
If lg = 3 : Chemin$ = "Yahtzee_German\" : EndIf
If lg = 4 : Chemin$ = "Yahtzee_Spain\" : EndIf

;sauve langue  traduction en fichiers externes
; CreateFile(0,"Langue"+ Str(lg) + ".txt")
; For u=1 To 35 
;   WriteStringN(0,Language$(u))
; Next u     
; CloseFile(0)

;charge langue ; lecture du fichier de données- read file
; If ReadFile(0,"Langue"+ Str(lg) + ".txt") <> 0 : u = 1          
;   While Eof(0) = 0
;     Language1$(u) = ReadString(0,#PB_Ascii)
;     u + 1
;   Wend  
;   CloseFile(0) 
;EndIf 

If OpenWindow(#Window_Des, 0, 0, Cube_Size + XPosition(numero) + 15, 294 + Cube_Size, TitreW$ + version$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  
  If CreateMenu(0, WindowID(#Window_Des))    
    MenuTitle(Language$(27))
    MenuItem(11, Language$(1) + Chr(9) + "/ Key 1")  ;Cyan
    MenuItem(12, Language$(2) + Chr(9) + "/ Key 2")  ;Rouge
    MenuItem(13, Language$(3) + Chr(9) + "/ Key 3")  ;Vert 
    MenuItem(14, Language$(4) + Chr(9) + "/ Key 4")  ;Blue 
    MenuItem(15, Language$(5) + Chr(9) + "/ Key 5")  ;Jaune
    MenuItem(16, Language$(6) + Chr(9) + "/ Key 6")  ;violet
    MenuBar()
    MenuItem(17, Language$(15))
    MenuItem(18, Language$(16))
    MenuItem(25, Language$(32))
    MenuItem(26, Language$(36))
    MenuItem(23, Language$(17) + Chr(9) + "/ Ctrl Del")
    MenuItem(24, Language$(18))
    MenuTitle("       " + Language$(14))
  EndIf
  
  SetMenuItemState(0, 5, GetMenuItemState(0, 5))
  SetMenuItemState(0, 11, GetMenuItemState(0, 11))
  If ColorDes = 0 
    ColorDes = 0 
    SetMenuItemState(0,17,1)
  Else 
    ColorDes = 1 
    SetMenuItemState(0,17,0)
  EndIf
  Paire$(1) = "11":Paire$(2) = "22":Paire$(3) = "33":Paire$(4) = "44":Paire$(5) = "55":Paire$(6) = "66"
  
  SetMenuItemBitmaps_(MenuID(0), 17  , #MF_BYCOMMAND, NewMenuIcon(17, RGBA(150, 215, 255, 100)), 0)
  SetMenuItemBitmaps_(MenuID(0), 18  , #MF_BYCOMMAND, NewMenuIcon(18, RGBA(150, 215, 255, 100)), 0)
  
  ButtonTextColor(7, 350, 34, 56, 11, Language$(9), RGBA(0, 0, 0, 0), RGBA(220, 220, 220, 128), 8, 0, fon2$)
  ButtonImageGadget(17, 350, 145, Cube_Size + 145, 30, ImageID(7), #PB_Button_Toggle)
  
  AfficheBoutons()
  
  ButtonTextColor(105, 92, 28, -10, 6, "", RGBA(255, 255, 255, Cube_alpha), RGBA(255, 255, 255, Cube_alpha), 12, 0, fon1$)
  ButtonImageGadget(105, 248, 145, 100, 30, ImageID(105))
  
  ButtonImageGadget(1, XPosition(1), 10, Cube_Size + 5, Cube_Size + 5, ImageID(1), #PB_Image_Border | #PB_Button_Toggle)
  ButtonImageGadget(2, XPosition(2), 10, Cube_Size + 5, Cube_Size + 5, ImageID(2), #PB_Image_Border | #PB_Button_Toggle) 
  ButtonImageGadget(3, XPosition(3), 10, Cube_Size + 5, Cube_Size + 5, ImageID(3), #PB_Image_Border | #PB_Button_Toggle) 
  ButtonImageGadget(4, XPosition(4), 10, Cube_Size + 5, Cube_Size + 5, ImageID(4), #PB_Image_Border | #PB_Button_Toggle) 
  ButtonImageGadget(5, XPosition(5), 10, Cube_Size + 5, Cube_Size + 5, ImageID(5), #PB_Image_Border | #PB_Button_Toggle) 
  ButtonImageGadget(6, XPosition(6), 10, Cube_Size + 5, Cube_Size + 5, ImageID(6), #PB_Image_Border | #PB_Button_Toggle)  
  
  ButtonTextColor(8,350, 34, 100, 11, Language$(19), RGBA(0, 0, 0, 0), RGBA(220, 250, 190, 100), 8, 0, fon2$)
  ButtonImageGadget(15,XPosition(1), 145, Cube_Size + 131, 30, ImageID(8), #PB_Button_Toggle)
  
  CheckBoxGadget(21, XPosition(1) + 50 ,  125, 30, 12, "F1") 
  CheckBoxGadget(22, XPosition(2) + 50 ,  125, 30, 12, "F2") 
  CheckBoxGadget(23, XPosition(3) + 50 ,  125, 30, 12, "F3") 
  CheckBoxGadget(24, XPosition(4) + 50 ,  125, 30, 12, "F4") 
  CheckBoxGadget(25, XPosition(5) + 50 ,  125, 30, 12, "F5") 
  CheckBoxGadget(26, XPosition(6) + 50 ,  125, 12, 12, "")   ; non key 
  
  ListIconGadget(40, 10, 180, WindowWidth(#Window_Des) - 169, 145, Language$(28), 48, #PB_ListIcon_GridLines)
  AddGadgetColumn(40, 1, Language$(20), (WindowWidth(#Window_Des) - 12) / 8)
  AddGadgetColumn(40, 2, Language$(21), (WindowWidth(#Window_Des) - 12) / 7)
  AddGadgetColumn(40, 3, Language$(22), (WindowWidth(#Window_Des) - 12) / 8)
  AddGadgetColumn(40, 4, Language$(23), (WindowWidth(#Window_Des) - 42) / 9)
  AddGadgetColumn(40, 5, Language$(24), (WindowWidth(#Window_Des) - 12) / 8)
  
  ListIconGadget(42, 450, 180, 150, 145, Language$(28), 49, #PB_ListIcon_GridLines) 
  AddGadgetColumn(42, 1, Language$(25), 49)
  AddGadgetColumn(42, 2, Language$(26), 48)
  
  Col_Joueur(Joueur)
  SetWindowTitle(0, TitreW$ + version$ + Space(15) + Language$(7) + Str(Joueur))
  Joueur = 1
  
  If Pt_Suite = 1 : SetMenuItemState(0,25,1) : Else : SetMenuItemState(0,25,0) : EndIf
  If ToPair   = 1 : SetMenuItemState(0,26,1) : Else : SetMenuItemState(0,26,0) : EndIf
  If SonActif = 1 : SetMenuItemState(0,18,1) : Else : SetMenuItemState(0,18,0) : EndIf
  
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Escape, 27)  ;  27 = Valeur Touche Escape
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Space, 32)   ;  32 = Valeur Touche Espace
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_1, 101)      ; 1 = Valeur Touche 1
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Pad1, 111)   ; 1 = Valeur Touche 1
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_2, 102)      ; 2 = Valeur Touche 2
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Pad2, 112)   ; 2 = Valeur Touche 2
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_3, 103)      ; 3 = Valeur Touche 3
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Pad3, 113)   ; 2 = Valeur Touche 2
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_4, 104)      ; 4 = Valeur Touche 4
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Pad4, 114)   ; 2 = Valeur Touche 2
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_5, 105)      ; 5 = Valeur Touche 5
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Pad5, 115)   ; 2 = Valeur Touche 2
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_6, 106)      ; 6 = Valeur Touche 6
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Pad6, 116)   ; 2 = Valeur Touche 2
  
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_F1, 121)       ; 2 = Valeur Touche 121
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_F2, 122)       ; 2 = Valeur Touche 122
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_F3, 123)       ; 2 = Valeur Touche 123
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_F4, 124)       ; 2 = Valeur Touche 124
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_F5, 125)       ; 2 = Valeur Touche 125
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Return, 130)   ;  32 = Valeur Touche Espace
  AddKeyboardShortcut(#Window_Des, #PB_Shortcut_Control | #PB_Shortcut_Delete, 23)  ; Raccourci clavier control delete)
  
  Repeat   
    
    Event = WaitWindowEvent() 
    
    Select Event 
        
      Case #PB_Event_Menu      ; Un élément du menu a été sélectionné
        Select EventMenu()     ; On recupère le numéro de cet élement...
            
          Case 11, 101, 111 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 11, GetMenuItemState(0, 11)!1) : Col_Joueur(1) : Joueur = 1
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
          Case 12, 102, 112 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 12, GetMenuItemState(0, 12)!1) : Col_Joueur(2) : Joueur = 2 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
          Case 13, 103, 113 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 13, GetMenuItemState(0, 13)!1) : Col_Joueur(3) : Joueur = 3 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
          Case 14, 104, 114 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 14, GetMenuItemState(0, 14)!1) : Col_Joueur(4) : Joueur = 4 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
          Case 15, 105, 115 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 15, GetMenuItemState(0, 15)!1) : Col_Joueur(5) : Joueur = 5 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
          Case 16, 106, 116 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 16, GetMenuItemState(0, 16)!1) : Col_Joueur(6) : Joueur = 6 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1 
            
          Case 21 
            If GetGadgetState(21) = 0 : SetGadgetState(21, 1):   EndIf
            
          Case 17 
            If ColorDes = 0 
              ColorDes = 1 
              SetMenuItemState(0,17,0)
            Else 
              ColorDes = 0
              SetMenuItemState(0,17,1)
            EndIf
            
          Case 18  
            If SonActif = 0 
              SonActif = 1 
              SetMenuItemState(0,18,1)
            Else 
              SonActif = 0 
              SetMenuItemState(0,18,0)
            EndIf
            
          Case 23 : Reset_Efface_Tout()  ; efface les toutes parties et remise Z des scores
            
          Case 24 : End
            
          Case 25  
            If Pt_Suite = 0 
              Pt_Suite = 1 
              SetMenuItemState(0,25,1)
            Else 
              Pt_Suite = 0 
              SetMenuItemState(0,25,0)
            EndIf
            
          Case 26  
            If Topair = 0 
              ToPair = 1 
              SetMenuItemState(0,26,1)
            Else 
              ToPair  = 0 
              SetMenuItemState(0,26,0)
            EndIf
            
          Case 32 : Partie_Lancer(5)  ;Yams
            
            ; ####################### touche F1 à F5
            Case 121 : If Des_Fixe(1) = 0 : Des_Fixe(1) = 1 : SetGadgetState(21, 1) : carre(bcol, 0)   : Else : Des_Fixe(1) = 0 : SetGadgetState(21, 0) : carre(Jcolor, 0)   : EndIf
            
            Case 122 : If Des_Fixe(2) = 0 : Des_Fixe(2) = 1 : SetGadgetState(22, 1) : carre(bcol, 120) : Else : Des_Fixe(2) = 0 : SetGadgetState(22, 0) : carre(Jcolor, 120) : EndIf
            
            Case 123 : If Des_Fixe(3) = 0 : Des_Fixe(3) = 1 : SetGadgetState(23, 1) : carre(bcol, 240) : Else : Des_Fixe(3) = 0 : SetGadgetState(23, 0) : carre(Jcolor, 240) : EndIf
            
            Case 124 : If Des_Fixe(4) = 0 : Des_Fixe(4) = 1 : SetGadgetState(24, 1) : carre(bcol, 360) : Else : Des_Fixe(4) = 0 : SetGadgetState(24, 0) : carre(Jcolor, 360) : EndIf
            
            Case 125 : If Des_Fixe(5) = 0 : Des_Fixe(5) = 1 : SetGadgetState(25, 1) : carre(bcol, 480) : Else : Des_Fixe(5) = 0 : SetGadgetState(25, 0) : carre(Jcolor, 480) : EndIf
            
            ;Return Passer Valider
            
          Case 130
            If Lancer < = 3
              Score_des_Joueur_List(numero, Joueur)
            EndIf
            Lancer = 4
            
        EndSelect 
        
      Case #PB_Event_CloseWindow 
        
        Break 
        
      Case #PB_Event_Gadget 
        Select EventGadget() 
            
          Case 15 : Partie_Lancer(5)  ;YAMs
          Case 17                     ; Passe = termine ce tour
            ButtonTextColor(7, 350, 34, 56, 11, Language$(9), RGBA(0, 0, 0, 0), RGBA(220, 220, 220, 255), 8, 0, fon2$)
            ButtonImageGadget(17, 350, 145, Cube_Size + 145, 30, ImageID(7), #PB_Button_Toggle)
            
            If Lancer < = 3
              Score_des_Joueur_List(numero, Joueur)
            EndIf
            Lancer = 4
            
          Case 1 : Main_Joueur(1)
            
          Case 2 : Main_Joueur(2)
            
          Case 3 : Main_Joueur(3)
            
          Case 4 : Main_Joueur(4)
            
          Case 5 : Main_Joueur(5)
            
          Case 6 : Main_Joueur(6)
            
          Case 51 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 11, GetMenuItemState(0, 11)!1) : Col_Joueur(1) : Joueur = 1
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1 
            
          Case 52 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 12, GetMenuItemState(0, 12)!1) : Col_Joueur(2) : Joueur = 2 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
            
          Case 53 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 13, GetMenuItemState(0, 13)!1) : Col_Joueur(3) : Joueur = 3 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
            
          Case 54 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 14, GetMenuItemState(0, 14)!1) : Col_Joueur(4) : Joueur = 4 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
            
          Case 55 : CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 15, GetMenuItemState(0, 15)!1) : Col_Joueur(5) : Joueur = 5 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1
            
          Case 56: CheckBox_0() : StateMenu(1) : SetMenuItemState(0, 16, GetMenuItemState(0, 16)!1) : Col_Joueur(6) : Joueur = 6 
            For i = 1 To 6  : efface_des(i) : Next i : Lancer = 1 
        EndSelect 
    EndSelect  
  ForEver 
  CloseWindow(0)
EndIf
Dernière modification par kernadec le mar. 18/août/2026 9:56, modifié 40 fois.
Avatar de l’utilisateur
Ar-S
Messages : 9588
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Petits jeux de Dés YAMS Etc..

Message par Ar-S »

Salut,
ça plante des que je lance les dés...

[ERREUR] Ligne: 87
[ERREUR] Erreur de lecture des données: plus de données à lire.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petits jeux de Dés YAMS Etc..

Message par kernadec »

bjr Ar-S
code mis à jours
Merci du retour, oops , je ne l'avais pas essayé en PB 573 64bits
Les read.l avaient besoin du type de données Data.l
avec PB 573 32bits je n'avait pas eu ce soucis :?
A l'occasion, je mettrais une Listview pour afficher les données
de chaque joueurs pour permettre de visualiser la partie..
Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petits jeux de Dés YAMS Etc..

Message par kernadec »

bsr à tous
j'ai revisité mon code pour ajouter un ListIconGadget() les scores pour chaque joueurs jusqu'a 6
à partir de ce code on peut faire pleins de jeux de Dés :mrgreen:
ça amuseras probablement les enfants :mrgreen:
Cordialement

ps: Remis à jour car il y avait une différence dans la taille de fenêtre et des Gadgets entre Seven et XP :?

voir 1er post pour le code
Dernière modification par kernadec le dim. 09/août/2026 6:30, modifié 12 fois.
Marc56
Messages : 2201
Inscription : sam. 08/févr./2014 15:19

Re: Petits jeux de Dés YAMS Etc..

Message par Marc56 »

comment faire pour éviter le doublons dans le ListIconGadget() classement des joueurs..merci
Tu charges les noms dans une map et tu vérifies que AddMapElement() retourne une valeur différente de zéro.
:wink:
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petits jeux de Dés YAMS Etc..

Message par kernadec »

bjr Marc56
j 'ai mis à jour le 2ème code
Autant, je maitrise les newlists avec les listIconGadget() etc.. j' avais jamais rencontré un truc pareil
mais avec les Newmaps, j'ai pas compris comment avoir plusieurs index.
Donc pour le moment, j'explore cette idée, mais avec les tests du YAMS
je commence a saturer les yeux avec ce jeux.

j'ai un tour de passe passe dans le second listIconGadget()
au moment ou j'ai les 6 résultats croissants au deuxième tour très souvent il
me fait disparaitre un résultat et repasse à 5 résultats voir 4 et puis ça revient à 6
le mystère demeure dans la commande SortStructuredArray()
je pense que c 'est elle mon soucis

ps: si tu as un exemple Newmap avec deux index, merci

Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petits jeux de Dés YAMS Etc..

Message par kernadec »

bsr à tous
Code précédent mis à jour :wink:
Aujourd'hui Je me suis remis au Yams, car j'en avais fait une overdose :mrgreen:
j'ai réglé tous les problèmes comme j'avais lâché un peu le codage
depuis un moment, alors pas mal de d'astuces avaient été oubliées :?

la seule chose que je n'ai pas définie, c'est de compté le nombre tour
au Yams normalement c'est 13.
Mais on peut visualiser cela dans le ListIconGadget() de droite.
Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petit Jeu YAM's ou Yahtzee

Message par kernadec »

bjr à tous
suite aux modification des options de creatImage()
à partir de la version 6.30 de PureBasic

Voici les Nouvelles options de CreateImage()
(Si l'image est en 32 bits, utilisez RGBA() pour obtenir une couleur valide.
Pour les images 32 bits, des constantes spéciales peuvent également être utilisées :
- #PB_Image_Transparent, similaire à RGBA(255,255,255,0),
un fond blanc peut être utilisé pour un anticrénelage clair.
- #PB_Image_TransparentBlack, similaire à RGBA(0,0,0,0),
un fond noir peut être utilisé pour un anticrénelage foncé.)

ajout d'un test version pour régler ce problème :wink:

Code : Tout sélectionner

If #PB_Compiler_Version => 630  ;## Réglages CreateImage() ########
  Cube_alpha  = 255 
Else ; mettre à zero "Cube_alpha" pour version inferieur à PB 6.30
  Cube_alpha  = 0 
EndIf
Cordialement
Dernière modification par kernadec le dim. 09/août/2026 6:36, modifié 2 fois.
Avatar de l’utilisateur
venom
Messages : 3222
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Petit Jeu YAM's ou Yahtzee

Message par venom »

Bonjour kernadec.

Merci pour la partage de ton travail, même si je n'ai pas encore compilé et que je connais ce jeu que de nom. C'est toujours sympa le partage de ce type de code 8)






@++
Windows 10 x64, PureBasic 6.30 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petit Jeu YAM's ou Yahtzee

Message par kernadec »

bjr venon eh ben merci :D
je suis content que cela te plaise :wink:
en utilisant des icones cartes ca pourrait devenir un poker :idea:
Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petit Jeu YAM's ou Yahtzee

Message par kernadec »

bjr à tous
Je n'avais plus utilsé ce jeu depuis un moment
et ce matin en faisant quelques partie de yam's
je me suis apercu d'une erreur discrète.... 8O
qui se manifeste avec la selection souris sur un " dé "
le fait de selecter et déselecter le " dé " avec la souris le checkbox changeait d'état
mais le " dé " rester bloqué dans sa valeur :oops:
Donc une correction à été éffectuée dans la boucle EventGadget()
par une permutation de valeur dans la variable: " Des_Fixe(1) "
ligne 472 Des_Fixe(1) = 0
ligne 476 Des_Fixe(1) = 1
etc... pour les autres tests
le code du post précédent est Corrigé

Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petit Jeu YAM's ou Yahtzee

Message par kernadec »

bjr à tous
mise à jour du code Y A M S en version 2
accessible depuis le 1er post
j'ai ajouter des boutons joueurs :idea:
pour un mode souris complet :wink:
Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petit Jeu YAM's ou Yahtzee

Message par kernadec »

Bjr à tous
mise à jour du code Y A M S en version 2.2
accessible depuis le 1er post
New version 2.2
Ajout au menu d'une remise a zéro des valeurs et des parties en cours.
pour le fun un menu noir ou couleur pour les Dés du joueur
Cordialement
Avatar de l’utilisateur
threedslider
Messages : 479
Inscription : dim. 01/juil./2018 22:38

Re: Petit Jeu YAM's ou Yahtzee

Message par threedslider »

Hello kernadec,

Merci pour ce jeu et merci pour le partage aussi 8O :mrgreen:

Happy coding !
Avatar de l’utilisateur
kernadec
Messages : 1636
Inscription : ven. 25/avr./2008 11:14

Re: Petit Jeu YAM's ou Yahtzee

Message par kernadec »

bjr à tous
Voici, le code YAM's qui à été mis à jours sur le 1er post
En m'intéressant de plus près aux règles du Yahtzee
je me suis aperçu qu'il y a des suites de 4 dés, :roll:
j'ai donc ajouté cela et fait changer la couleur verte
du bouton passer (return) avant les 2e et 3ème lancé
de dés pour activer un bon tirage..ensuite j'ai ajouter
un tableau pour choisir une langue parmi 4 traductions
fr, en, de, sp, chacun pourra l'adapter pour son pays
dans ce tableau pour sa langue, sinon le code aurait
dépassé les 800 lignes règle pour que ce code soit
utilisable avec une version demo de PureBasic.
On peut mettre des fichiers audio créer a partir
de ce lien : https://soundoftext.com
des fichiers de diction des points en fichiers OGG
exemple: 10.ogg, 15.ogg,20.ogg,25.ogg,30.ogg,40.ogg,50.ogg
déposer ceux ci dans le dossier du YAM's.

ps: @ threedslider merci pour tes encouragements :wink:

les codes sont mis à jours voir 1er ou en moins de 800 lignes le dernier post

Cordialement
Dernière modification par kernadec le lun. 17/août/2026 13:10, modifié 5 fois.
Répondre