RETROGICIEL
LA CARTE SUIVANTE
RETROGICIEL
LA CARTE SUIVANTE
⇩. Présentation
Voici un petit divertissement inspiré d'un jeu proposé par une station de radio des années 80.
Il joue avec un jeu de 52 cartes standard. Après avoir mélangé le tas de cartes, la machine vous présente la carte du dessus face visible et attend que le joueur choisisse si la carte suivante, face cachée sur le talon, aura une valeur supérieure ou inférieure à celle visible. La couleur des cartes n'a aucune importance ici.
Chaque fois que le joueur fait le bon pronostique, il marque 1 point sinon la partie se termine.
La valeur des cartes va du 2, la plus faible, à l'as, la plus forte. Si les 2 cartes ont la même valeur, le coup est annulé.
⇩. Consignes
Le programme doit :
mélanger les 52 cartes ;
présenter la première carte du talon ;
attendre le pronostique du joueur ;
comparer le pronostique avec les valeurs des 2 cartes ;
si le pronostique est juste :
ajouter 1 point au score du joueur ;
recommencer pour la carte suivante ;
sinon :
arrêter la partie ;
proposer de faire une nouvelle partie.
D'abord, faite-le fonctionner. Ensuite, faite-le beau. Enfin, faite-le performant.
Amusez-vous bien !
Télécharger RETROGICIEL - La carte suivante.
Cette présentation nécessite que Python 3 soit installé sur votre machine.
Après avoir téléchargé le fichier La carte suivante.7z, décompressez-le dans le répertoire de votre choix.
Ouvrez le répertoire qui vient d'être créé.
Lancez le fichier Retrogiciel.py.
Cliquez sur l'onglet RUN et testez le programme.
Créez votre propre script dans un des langages proposés ou un autre de votre choix.
Le répertoire contient aussi :
- Python.py, l'exemple en PYTHON sans tkinter ;
- Tkinter.py, l'exemple en PYTHON avec tkinter ;
- Qb84.bas, l'exemple en QBASIC avec qb64 ;
- Bbc.bas, l'exemple en BBC BASIC avec bbc sdl.
# --- Origine Nerd ---
# --- RETROGICIEL - PYTHON ---
# --- La carte suivante ---
# -*- coding: utf-8 -*-
# --- IMPORTATION DES MODULES ---
# --- Modules de la bibliothèque standard ---
import random
# --- INITIALISATION GÉNÉRALE ---
LST_Cartes = [ kvaleur + kcouleur for kcouleur in ( "\u2660" , "\u2665" , "\u2666" , "\u2663") for kvaleur in "234567890VDRA" ]
# --- DÉFINITION DES FONCTIONS PERSONNALISEES ---
# --- Jouer une partie ---
def FNC_Jouer ( ) :
# --- Initialisation d'une nouvelle partie ---
ktirage = 0
kscore = 0
random.shuffle ( LST_Cartes )
kprecedente = FNC_Valeur ( LST_Cartes [ ktirage ] )
print ( f"\nTirage { ktirage } : { LST_Cartes [ ktirage ] }.")
while True :
# --- Saisie du pronostique du joueur ---
print ( "D'après-vous la valeur de la carte suivante sera" )
while True :
kchoix = input ( "[S]upérieur ou [I]nférieur ? " ).upper ( )
if kchoix in "SI" and kchoix != "" : break
# --- Tirage de la carte suivante et comparaison des cartes ---
ktirage += 1
ksuivante = FNC_Valeur ( LST_Cartes [ ktirage ] )
print ( f"\nTirage { ktirage } : { LST_Cartes [ ktirage ] }." , end = " " )
if ksuivante > kprecedente : kreference = "S"
elif ksuivante < kprecedente : kreference = "I"
else :
print ( "Égalité de valeur. Ce tirage est annulé." )
continue
# --- Comparaison avec le pronostique du joueur ---
if kreference != kchoix : break
kscore += 1
print ( f"C'est gagné. votre score { kscore } points." )
kprecedente = ksuivante
# --- Fin de la partie, retour du score du joueur ---
return kscore
# --- Valeur d'une carte ---
def FNC_Valeur ( Q ) :
match Q [ 0 ] :
case "0" : return 10
case "V" : return 11
case "D" : return 12
case "R" : return 13
case "A" : return 14
case _ : return int ( Q [ 0 ] )
# --- PRESENTATION ---
print ( "LA CARTE SUIVANTE." )
print ( )
# --- BOUCLE PRINCIPALE ---
while True :
# --- Initalisation d'une nouvelle partie ---
kscore = FNC_Jouer ( )
print ( f"C'est perdu. votre score final est de { kscore } points." )
# --- Choix du bouclage du programme ---
kchoix = input ( "Voulez-vous faire une autre partie (O ou N) ?" )
if kchoix.upper ( ) == "N" : break
# --- FIN DU PROGRAMME ---
print ( "Au revoir" )
# --- Programme : JFB ---
# --- Octobre 2025 ---
# --- Fin ---
Pour mieux comprendre l'exemple en PYTHON sans tkinter.
# --- Origine Nerd ---
# --- RETROGICIEL - TKINTER ---
# --- La carte suivante ---
# -*- coding: utf-8 -*-
# --- IMPORTATION DES MODULES ---
# --- Modules de la bibliothèque standard ---
import tkinter
import random
# --- INITIALISATION GÉNÉRALE ---
LST_Cartes = [ kvaleur + kcouleur for kcouleur in ( "\u2660" , "\u2665" , "\u2666" , "\u2663") for kvaleur in "234567890VDRA" ]
DCT_Donnees = { "tirage" : 0 , "score" : 0 }
# --- DÉFINITION DES FONCTIONS PERSONNALISEES ---
# --- Choix du joueur ---
def FNC_Action ( Q ) :
BUT_Plus [ "state" ] = "disabled"
BUT_Moins [ "state" ] = "disabled"
kcarte = LST_Cartes [ DCT_Donnees [ "tirage" ] ]
if kcarte [ 0 ] == "0" : kcarte = "1" + kcarte
LAB_CarteB [ "text" ] = kcarte
LAB_CarteB [ "foreground" ] = "green" if LAB_CarteB [ "text" ] [ 1 ] in ( "\u2665" , "\u2666" ) else "blue"
kcartea = FNC_Valeur ( LAB_CarteA [ "text" ] )
kcarteb = FNC_Valeur ( LAB_CarteB [ "text" ] )
if kcarteb > kcartea : kdifference = "+"
elif kcarteb < kcartea : kdifference = "-"
else : kdifference = "="
if kdifference == "=" : FNC_Annuler ( )
elif kdifference != Q : FNC_Perdu ( )
else : FNC_Gagne ( )
# --- Les 2 cartes sont de même valeurs (coup annulé) ---
def FNC_Annuler ( ) :
LAB_Message [ "text" ] = "Annulé"
FNC_Suivante ( )
# --- Le pronostique du joueur est bon (gagné) ---
def FNC_Gagne ( ) :
DCT_Donnees [ "score" ] += 1
LAB_Score [ "text" ] = f"Score : { DCT_Donnees [ 'score' ] }."
LAB_Message [ "text" ] = "GAGNÉ !"
FNC_Suivante ( )
# --- Début d'une nouvelle partie ---
def FNC_Nouveau ( ) :
BUT_Nouveau [ "state" ] = "disabled"
random.shuffle ( LST_Cartes )
LAB_Message [ "text" ] = "Votre choix"
DCT_Donnees [ "tirage" ] = 1
DCT_Donnees [ "score" ] = 0
LAB_Tirage [ "text" ] = f"Tirage 1."
LAB_Score [ "text" ] = "Score : 0."
LAB_CarteA [ "foreground" ] = "green" if LST_Cartes [ 0 ] [ 1 ] in ( "\u2665" , "\u2666" ) else "blue"
LAB_CarteB [ "foreground" ] = "black"
kcarte = LST_Cartes [ 0 ]
if kcarte [ 0 ] == "0" : kcarte = "1" + kcarte
LAB_CarteA [ "text" ] = kcarte
LAB_CarteB [ "text" ] = "??"
BUT_Plus [ "state" ] = "normal"
BUT_Moins [ "state" ] = "normal"
# --- Le pronostique du joueur est mauvais (perdu) ---
def FNC_Perdu ( ) :
LAB_Message [ "text" ] = "PERDU !"
BUT_Nouveau [ "state" ] = "normal"
# --- Préparation du pronostique suivant ---
def FNC_Suivante ( ) :
TKI_Principal.update ( )
TKI_Principal.after ( 1500 )
DCT_Donnees [ "tirage" ] += 1
LAB_Tirage [ "text" ] = f"Tirage : { DCT_Donnees [ 'tirage' ] }."
LAB_Message [ "text" ] = "Votre choix"
LAB_CarteA [ "foreground" ] = "green" if LAB_CarteB [ "text" ] [ 1 ] in ( "\u2665" , "\u2666" ) else "blue"
LAB_CarteB [ "foreground" ] = "black"
LAB_CarteA [ "text" ] = LAB_CarteB [ "text" ]
LAB_CarteB [ "text" ] = "??"
BUT_Plus [ "state" ] = "normal"
BUT_Moins [ "state" ] = "normal"
# --- Valeur d'une carte ---
def FNC_Valeur ( Q ) :
match Q [ 0 ] :
case "V" : return 11
case "D" : return 12
case "R" : return 13
case "A" : return 14
case "1" if len ( Q ) == 3 : return 10
case _ : return int ( Q [ 0 ] )
# --- CREATION DE L'INTERFACE GRAPHIQUE ---
# --- Création de la fenêtre principale ---
TKI_Principal = tkinter.Tk ( )
TKI_Principal.title ( "RETROGICIEL - La carte suivante" )
# --- Création des controles nommées ---
BUT_Moins = tkinter.Button ( TKI_Principal , text = "inférieur" , command = lambda : FNC_Action ( "-" ) )
BUT_Nouveau = tkinter.Button ( TKI_Principal , text = "Démarer" , command = FNC_Nouveau )
BUT_Plus = tkinter.Button ( TKI_Principal , text = "Superieur" , command = lambda : FNC_Action ( "+" ) )
LAB_CarteA = tkinter.Label ( TKI_Principal , font = ( None , 40 ) , bg = "white" , relief = "solid" , bd = 3 , width = 4 , height = 2 )
LAB_CarteB = tkinter.Label ( TKI_Principal , font = ( None , 40 ) , bg = "white" , relief = "solid" , bd = 3 , width = 4 , height = 2 )
LAB_Score = tkinter.Label ( TKI_Principal , font = ( None , 22 , "bold" ) )
LAB_Tirage = tkinter.Label ( TKI_Principal )
LAB_Message = tkinter.Label ( TKI_Principal )
# --- Mise en place des controles (anonymes et nommés) dans la fenêtre principale ---
LAB_Score.grid ( row = 0 , column = 0 , columnspan = 2 , sticky = "nesw" )
LAB_CarteA.grid ( row = 1 , column = 0 , padx = 5 , sticky = "nesw" )
LAB_CarteB.grid ( row = 1 , column = 1 , padx = 5 , sticky = "nesw" )
BUT_Moins.grid ( row = 2 , column = 1 , sticky = "nesw" )
BUT_Plus.grid ( row = 3 , column = 1 , sticky = "nesw" )
LAB_Tirage.grid ( row = 2 , column = 0 , sticky = "nesw" )
LAB_Message.grid ( row = 3 , column = 0 , sticky = "nesw" )
BUT_Nouveau.grid ( row = 4 , column = 0 , sticky = "nesw" )
tkinter.Button ( TKI_Principal , text = "Quitter" , command = TKI_Principal.destroy ).grid ( row = 4 , column = 1 , sticky = "nesw" )
# --- Mise à jour des controles ---
FNC_Nouveau ( )
# --- DEBUT DU PROGRAMME ---
TKI_Principal.mainloop ( )
# --- Programme : JFB ---
# --- Octobre 2025 ---
# --- Fin ---
Pour mieux comprendre l'exemple en PYTHON avec tkinter.
' --- Origine Nerd propose pour ---
' --- RETROGICIEL - QB64 ---
' --- La carte suivante ---
' --- INITIALISATION GENERALE ---
' --- Declarations des variables globales ---
DIM SHARED LST_Cartes(51)
' --- Initialisation des nombres aleatoires ---
RANDOMIZE TIMER
' --- BOUCLE PRINCIPALE ---
DO
' --- Initialisation d'une partie ---
FNC_Melanger
ktirage = 1
kscore = 0
kcarte1 = LST_Cartes(0)
' --- Boucle des pronostiques gagnants ---
DO
' --- Presentation du coups ---
CLS
PRINT "LA CARTE SUIVANTE.": PRINT
PRINT "Tirage numero "; STR$(ktirage)
PRINT "Votre score "; STR$(kscore): PRINT
FNC_Carte (kcarte1)
' --- Saisie du pronostique du joueur ---
kchoix$ = FNC_Saisie$
' --- Affichage la nouvelle carte et evaluation de sa valeur ---
kcarte2 = LST_Cartes(ktirage)
PRINT: PRINT "La carte suivante est :"
FNC_Carte (kcarte2)
' --- Analyse du tirage et du pronostique ---
kcomparaison$ = FNC_Comparaison$(kcarte1, kcarte2)
kresultat = FNC_Analyse(kchoix$, kcomparaison$)
IF kresultat = -1 THEN EXIT DO
' --- Tour suivant ---
INPUT "Appuyez sur la touche Entree pour continuer ...", kpause
kscore = kscore + kresultat
ktirage = ktirage + 1
kcarte1 = kcarte2
LOOP UNTIL FALSE
' --- Bouclage du programme ---
PRINT "Votre socre final est de "; STR$(kscore); " point(s)."
PRINT: INPUT "Voulez-vous faire une autre partie [ O ou N ] "; kchoix$
LOOP UNTIL UCASE$(kchoix$) = "N"
' --- FIN DU PROGRAMME ---
PRINT "Au revoir."
END
' --- DEFINITION DES FONCTIONS PERSONNALISEES ---
' --- Comparaison du tirage et du pronostique ---
FUNCTION FNC_Analyse (Qpronnostique$, Qtirage$)
IF Qtirage$ = "=" THEN
PRINT "Les 2 cartes ont la meme valeur."
PRINT "Ce tirage est annule."
FNC_Analyse = 0
EXIT FUNCTION
END IF
IF Qpronnostique$ = Qtirage$ THEN
PRINT "Felicitation, vous avez fait un bon pronostique."
FNC_Analyse = 1
ELSE
PRINT "Vous n'avez pas fait le bon pronostique."
FNC_Analyse = -1
END IF
END FUNCTION
' --- Afficher la valeur et la couleur d'une carte ---
SUB FNC_Carte (Q)
kvaleur = (Q MOD 13) + 1
SELECT CASE kvaleur
CASE 11: kvaleur$ = " VALET"
CASE 12: kvaleur$ = " DAME"
CASE 13: kvaleur$ = " ROI"
CASE 1: kvaleur$ = " AS"
CASE ELSE: kvaleur$ = STR$(kvaleur)
END SELECT
kcouleur = Q \ 13
SELECT CASE kcouleur
CASE 0: kcouleur$ = "coeur"
CASE 1: kcouleur$ = "pique"
CASE 2: kcouleur$ = "trefle"
CASE 3: kcouleur$ = "carreau"
END SELECT
PRINT kvaleur$ + " de " + kcouleur$
END SUB
' --- Comparaison des valeurs des 2 cartes en jeu ---
FUNCTION FNC_Comparaison$ (Q1, Q2)
kvaleur1 = Q1 MOD 13: IF kvaleur1 = 0 THEN kvaleur1 = 13
kvaleur2 = Q2 MOD 13: IF kvaleur2 = 0 THEN kvaleur2 = 13
IF kvaleur1 = kvaleur2 THEN kcomparaison$ = "="
IF kvaleur1 > kvaleur2 THEN kcomparaison$ = "I"
IF kvaleur1 < kvaleur2 THEN kcomparaison$ = "S"
FNC_Comparaison$ = kcomparaison$
END FUNCTION
' --- Melange du talon des cartes pour demarer une nouvelle partie ---
SUB FNC_Melanger
' --- Attribution d'une valeur aleatoire a chaque carte ---
FOR kcarte = 0 TO 51: LST_Cartes(kcarte) = RND: NEXT kcarte
' --- designe le rang de chaque carte dans le talon ordonnee ---
FOR krang = 1 TO 52
kmaximum = -1
kcarte = 0
FOR kitem = 0 TO 51
IF LST_Cartes(kitem) >= 1 THEN _CONTINUE
IF LST_Cartes(kitem) >= kmaximum THEN
kmaximum = LST_Cartes(kitem)
kcarte = kitem
END IF
NEXT kitem
LST_Cartes(kcarte) = krang
NEXT krang
END SUB
' --- Saisie et controle de la validite du choix du joueur ---
FUNCTION FNC_Saisie$
PRINT: PRINT "D'apres vous la carte suivante aura une valeur"
PRINT "S pour Superieure ou I pour inferieure"
DO
INPUT "Entrez votre choix (S ou I ) ", kchoix$
kchoix$ = UCASE$(kchoix$)
LOOP UNTIL kchoix$ = "S" OR kchoix$ = "I"
RINT
FNC_Saisie$ = kchoix$
END FUNCTION
' --- Programme : JFB ---
' --- Octobre 2025 ---
' --- Fin ---
Pour mieux comprendre l'exemple en QB64.
REM --- Origine Nerd propose pour ---
REM --- RETROGICIEL - BBC BASIC ---
REM --- La carte suivante ---
REM --- INITIALISATION GENERALE ---
REM --- Déclarations des variables globales ---
DIM LST_Cartes(51)
REM --- BOUCLE PRINCIPALE ---
REPEAT
REM --- Initialiser une nouvelle partie ... ---
PROC_Melanger
ktirage = 1
kscore = 0
kcarte1 = LST_Cartes(0)
REM --- Boucle des pronostiques gagnants ---
REPEAT
REM --- Presentation du coups ---
CLS
PRINT "LA CARTE SUIVANTE.": PRINT
PRINT "Tirage numero "; STR$(ktirage)
PRINT "Votre score "; STR$(kscore): PRINT
PROC_Carte(kcarte1)
REM --- Saisie du pronostique du joueur ---
kchoix$ = FN_Saisie$
REM --- Affichage la nouvelle carte et evaluation de sa valeur ---
kcarte2 = LST_Cartes(ktirage)
PRINT: PRINT "La carte suivante est :"
PROC_Carte(kcarte2)
REM --- Analyse du tirage et du pronostique ---
kcomparaison$ = FN_Comparaison$(kcarte1, kcarte2)
kresultat = FN_Analyse(kchoix$, kcomparaison$)
IF kresultat = -1 THEN EXIT REPEAT
REM --- Tour suivant ---
INPUT "Appuyez sur la touche Entree pour continuer ...", kpause
kscore = kscore + kresultat
ktirage = ktirage + 1
kcarte1 = kcarte2
UNTIL FALSE
REM --- Bouclage du programme ---
PRINT "Votre socre final est de "; STR$(kscore); " point(s)."
INPUT "Voulez-vous recommencer [ O ou N ] "; kchoix$
UNTIL kchoix$ = "N" OR kchoix$ = "n"
REM --- FIN DU PROGRAMME ---
PRINT "Au revoir."END
REM --- DEFINITION DES FONCTIONS PERSONNALISEES ---
REM --- Comparaison du tirage et du pronostique ---
DEF FN_Analyse(Qpronnostique$, Qtirage$)
IF Qtirage$ = "=" THEN
PRINT "Les 2 cartes ont la meme valeur."
PRINT "Ce tirage est annule."
= 0
ELSEIF Qpronnostique$ = Qtirage$ THEN
PRINT "Felicitation, vous avez fait un bon pronostique."
= 1
ELSE
PRINT "Vous n'avez pas fait le bon pronostique."
= -1
ENDIF
ENDIF
REM FIN DE LA DEFINITION
REM --- Afficher la valeur et la couleur d'une carte ---
DEF PROC_Carte(Q)
kvaleur = (Q MOD 13) + 1
CASE kvaleur OF
WHEN 11 : kvaleur$ = " VALET"
WHEN 12 : kvaleur$ = " DAME"
WHEN 13 : kvaleur$ = " ROI"
WHEN 1 : kvaleur$ = " AS"
OTHERWISE kvaleur$ = STR$(kvaleur)
ENDCASE
kcouleur = Q DIV 13
CASE kcouleur OF
WHEN 0 : kcouleur$ = "coeur"
WHEN 1 : kcouleur$ = "pique"
WHEN 2 : kcouleur$ = "trefle"
WHEN 3 : kcouleur$ = "carreau"
ENDCASE
PRINT kvaleur$ + " de " + kcouleur$
ENDPROC
REM --- Comparaison des valeurs des 2 cartes en jeu ---
DEF FN_Comparaison$(Q1, Q2)
kvaleur1 = Q1 MOD 13: IF kvaleur1 = 0 THEN kvaleur1 = 13
kvaleur2 = Q2 MOD 13: IF kvaleur2 = 0 THEN kvaleur2 = 13
IF kvaleur1 = kvaleur2 THEN kcomparaison$ = "="
IF kvaleur1 > kvaleur2 THEN kcomparaison$ = "I"
IF kvaleur1 < kvaleur2 THEN kcomparaison$ = "S"
= kcomparaison$
REM FIN DE LA DEFINITION
REM --- Melange du talon des cartes pour demarer une nouvelle partie ---
DEF PROC_Melanger
REM --- Attribution d'une valeur aleatoire a chaque carte ---
FOR kcarte = 0 TO 51: LST_Cartes(kcarte) = RND(1): NEXT kcarte
REM --- designe le rang de chaque carte dans le talon ordonnee ---
FOR krang = 1 TO 52
kmaximum = -1
kcarte = 0
FOR kitem = 0 TO 51
IF LST_Cartes(kitem) < 1 AND LST_Cartes(kitem) >= kmaximum THEN
kmaximum = LST_Cartes(kitem)
kcarte = kitem
ENDIF
NEXT kitem
LST_Cartes(kcarte) = krang
NEXT krang
ENDPROC
REM --- Saisie et controle de la validite du choix du joueur ---
DEF FN_Saisie$
PRINT: PRINT "D'apres vous la carte suivante aura une valeur"
PRINT "S pour Superieure ou I pour inferieure"
REPEAT
WAIT( 15 ) : kchoix$ = GET$
IF kchoix$ = "s" THEN kchoix$ = "S"
IF kchoix$ = "i" THEN kchoix$ = "I"
UNTIL kchoix$ = "S" OR kchoix$ = "I"
= kchoix$
REM FIN DE LA DEFINITION
REM --- Programme : JFB ---
REM --- Octobre 2025 ---
REM --- Fin ---
Pour mieux comprendre l'exemple en BBC BASIC.