Domino Merge est un jeu de réflexion addictif qui combine placement, anticipation et réactions en chaîne. Le programme que tu as partagé décrit en détail le fonctionnement interne du jeu : tirage des dominos, règles de fusion, gestion du score, interface graphique et conditions de fin de partie. Voici une présentation complète et fidèle à ce que fait réellement le jeu.
Un plateau simple, une profondeur surprenante
Le jeu se déroule sur un plateau de 5 colonnes et 6 lignes, entièrement vide au départ.
Chaque domino occupe deux cases adjacentes, horizontalement ou verticalement.
Le joueur peut :
- Placer le domino dans l’une des quatre orientations
- Le jeter via la poubelle (coût : 10 pièces)
- Afficher l’aide
- Voir le domino suivant pour anticiper ses coups
Le message initial du jeu le dit clairement :
- « Clique sur une case : le domino occupe deux cases »
Un tirage de dés pensé pour favoriser les fusions
Les valeurs des dés ne sont pas tirées uniformément. Le programme indique que :
- Les valeurs 1, 2 et 3 sortent plus souvent
- Les valeurs élevées sont plus rares
- Un dé sur quatre est un double (valeurs identiques)
Ce système encourage les fusions fréquentes en début de partie, tout en rendant les valeurs hautes plus gratifiantes.
Rotation et placement : l’art d’optimiser l’espace
Le joueur peut tourner le domino grâce au bouton dédié.
Lors du placement, le jeu vérifie :
- Si le domino dépasse du plateau
- Si les deux cases sont libres
- Si l’orientation est valide
En cas d’erreur, des messages clairs apparaissent :
- « Il faut deux cases libres côte à côte »
- « Le domino dépasse du plateau : tourne-le »
Le cœur du gameplay : les fusions en chaîne
Dès qu’un domino est posé, le jeu analyse le plateau pour détecter des groupes de trois dés identiques ou plus qui se touchent.
Le programme décrit précisément ce mécanisme :
- « Trois dés identiques qui se touchent fusionnent en un dé supérieur. »
Lorsqu’un groupe est trouvé :
- Les dés disparaissent
- Un dé de valeur supérieure apparaît
- Le joueur gagne des points
Une réaction en chaîne peut se produire si ce nouveau dé crée une nouvelle fusion
Les gains dépendent :
- De la valeur du dé
- Du nombre de dés fusionnés
- Du multiplicateur de chaîne
- Les valeurs élevées rapportent aussi davantage de pièces.
Score, pièces et progression
Le joueur commence avec 20 pièces.
Les fusions rapportent :
- Des points, proportionnels à la valeur et à la taille du groupe
- Des pièces, plus généreuses pour les valeurs élevées
Le jeu suit :
- Le score actuel
- Le record
- Le meilleur dé obtenu
Fin de partie : quand il n’y a plus d’espace
La partie se termine lorsqu’il n’existe plus deux cases libres adjacentes.
Le jeu affiche alors un écran de fin avec :
- Le score
- Le meilleur dé
- Un bouton pour recommencer
Une boucle de jeu fluide et intuitive
Le programme gère :
- L’affichage complet
- Les interactions de la souris
- Les animations des dés
- Les messages contextuels
- Les transitions entre les états (jeu, aide, fin de partie)
Domino Merge est donc un jeu complet, cohérent, et très bien structuré.
Programme :
@ CONFIGURATION
graph est une toile
dimension(graph, 400, 550)
COLS est un nombre
LIGS est un nombre
COLS vaut 5
LIGS vaut 6
CS est un nombre
BX est un nombre
BY est un nombre
CS vaut 52
BX vaut 44
BY vaut 80
COUT_POUBELLE est un nombre
COUT_POUBELLE vaut 10
score est un nombre
score vaut 0
record est un nombre
record vaut 0
pieces est un nombre
pieces vaut 20
meilleurDomino est un nombre
meilleurDomino vaut 1
// Le domino en main : deux dés et une orientation de 0 à 3
valA est un nombre
valB est un nombre
sA est un nombre
sB est un nombre
orient est un nombre
orient vaut 0
derLig est un nombre
derCol est un nombre
der2Lig est un nombre
der2Col est un nombre
derLig vaut - 1
derCol vaut - 1
der2Lig vaut - 1
der2Col vaut - 1
finPartie est un booléen
finPartie vaut faux
aide est un booléen
aide vaut faux
message est un texte
message vaut "Clique sur une case : le domino occupe deux cases"
@ PLATEAU
plateau est un tableau
marque est un tableau
pour i de 0 à LIGS
ligG est un tableau
ligM est un tableau
pour j de 0 à COLS
ligG ajoute 0
ligM ajoute faux
fin pour
plateau ajoute ligG
marque ajoute ligM
fin pour
// Le plateau démarre entièrement vide
@ TIRAGE DES DOMINOS
// Les petites valeurs sortent bien plus souvent que les grandes,
// et un domino sur quatre est un double.
tirage est un nombre
tirage vaut hasard(1, 100)
si tirage <= 40 alors
valA vaut 1
sinon si tirage <= 72 alors
valA vaut 2
sinon si tirage <= 90 alors
valA vaut 3
sinon
valA vaut 4
fin si
si hasard(1, 100) <= 25 alors
valB vaut valA
sinon
tirage vaut hasard(1, 100)
si tirage <= 40 alors
valB vaut 1
sinon si tirage <= 72 alors
valB vaut 2
sinon si tirage <= 90 alors
valB vaut 3
sinon
valB vaut 4
fin si
fin si
tirage vaut hasard(1, 100)
si tirage <= 40 alors
sA vaut 1
sinon si tirage <= 72 alors
sA vaut 2
sinon si tirage <= 90 alors
sA vaut 3
sinon
sA vaut 4
fin si
si hasard(1, 100) <= 25 alors
sB vaut sA
sinon
tirage vaut hasard(1, 100)
si tirage <= 40 alors
sB vaut 1
sinon si tirage <= 72 alors
sB vaut 2
sinon si tirage <= 90 alors
sB vaut 3
sinon
sB vaut 4
fin si
fin si
@ DESSIN D'UN DÉ
procédure dessinerDomino(t, x, y, c, val, ombre)
ray est un nombre
ray vaut c / 4
si ombre = vrai alors
rectangle_arrondi(t, x + 1, y + 4, c, c, ray, rgba(0, 0, 0, 0.4))
fin si
coul est un texte
sombre est un texte
si val = 1 alors
coul vaut #FF3B6B
sombre vaut #D42B54
sinon si val = 2 alors
coul vaut #2D9CFF
sombre vaut #1B76CC
sinon si val = 3 alors
coul vaut #FF9A2B
sombre vaut #D97812
sinon si val = 4 alors
coul vaut #E040FB
sombre vaut #B026C9
sinon si val = 5 alors
coul vaut #7C4DFF
sombre vaut #5A2FCC
sinon
coul vaut #00E5C0
sombre vaut #00B396
fin si
// Un socle plus foncé sous la face donne du volume au dé
rectangle_arrondi(t, x, y, c, c, ray, sombre)
rectangle_arrondi(t, x, y, c, c * 7 / 8, ray, coul)
// Reflet du dessus
rectangle_arrondi(t, x + c / 7, y + c / 9, c * 5 / 7, c / 9, 3, rgba(255, 255, 255, 0.3))
// Les points, disposés comme sur un dé
r est un nombre
r vaut c / 11
ax est un nombre
bx est un nombre
dx est un nombre
ay est un nombre
by est un nombre
dy est un nombre
ax vaut x + c / 4
bx vaut x + c / 2
dx vaut x + c * 3 / 4
ay vaut y + c * 27 / 100
by vaut y + c / 2
dy vaut y + c * 73 / 100
si val = 1 ou val = 3 ou val = 5 alors
cercle(t, bx, by + 1, r, rgba(0, 0, 0, 0.18))
cercle(t, bx, by, r, #FFFFFF)
fin si
si val >= 2 alors
cercle(t, ax, ay + 1, r, rgba(0, 0, 0, 0.18))
cercle(t, ax, ay, r, #FFFFFF)
cercle(t, dx, dy + 1, r, rgba(0, 0, 0, 0.18))
cercle(t, dx, dy, r, #FFFFFF)
fin si
si val >= 4 alors
cercle(t, dx, ay + 1, r, rgba(0, 0, 0, 0.18))
cercle(t, dx, ay, r, #FFFFFF)
cercle(t, ax, dy + 1, r, rgba(0, 0, 0, 0.18))
cercle(t, ax, dy, r, #FFFFFF)
fin si
si val = 6 alors
cercle(t, ax, by + 1, r, rgba(0, 0, 0, 0.18))
cercle(t, ax, by, r, #FFFFFF)
cercle(t, dx, by + 1, r, rgba(0, 0, 0, 0.18))
cercle(t, dx, by, r, #FFFFFF)
fin si
fin procédure
@ UNE CASE VIDE
procédure dessinerCaseVide(t, x, y, c)
rectangle_arrondi(t, x, y, c, c, c / 4, #45464C)
rectangle_arrondi(t, x + c / 6, y + c / 8, c * 2 / 3, c / 10, 3, rgba(255, 255, 255, 0.04))
fin procédure
@ DESSIN D'UN DOMINO COMPLET (DEUX DÉS)
procédure dessinerCouple(t, x, y, c, v1, v2, dl, dc, ombre)
// La barrette de liaison passe sous les deux dés
si dc = 1 alors
rectangle_arrondi(t, x + c - 3, y + c / 3, c / 4 + 6, c / 3, 3, #6B6D75)
sinon
rectangle_arrondi(t, x + c / 3, y + c - 3, c / 3, c / 4 + 6, 3, #6B6D75)
fin si
appelle dessinerDomino(t, x, y, c, v1, ombre)
appelle dessinerDomino(t, x + dc * (c + 6), y + dl * (c + 6), c, v2, ombre)
fin procédure
@ UNE PIÈCE D'OR
procédure dessinerPiece(t, cx, cy, r)
cercle(t, cx, cy + 1, r, #C99A19)
cercle(t, cx, cy, r, #FFC93C)
cercle(t, cx, cy, r * 3 / 5, #FFE9A8)
fin procédure
@ LA POUBELLE
procédure dessinerPoubelle(t, x, y, actif)
fond est un texte
cIcone est un texte
si actif = vrai alors
fond vaut #55565C
cIcone vaut #E8EAF0
sinon
fond vaut #414248
cIcone vaut #6B6D75
fin si
rectangle_arrondi(t, x, y + 2, 44, 48, 11, rgba(0, 0, 0, 0.3))
rectangle_arrondi(t, x, y, 44, 48, 11, fond)
rectangle_arrondi(t, x + 8, y + 11, 28, 4, 2, cIcone)
rectangle_arrondi(t, x + 17, y + 7, 10, 4, 2, cIcone)
rectangle_arrondi(t, x + 11, y + 17, 22, 23, 4, cIcone)
rectangle(t, x + 17, y + 22, 3, 13, fond)
rectangle(t, x + 25, y + 22, 3, 13, fond)
fin procédure
@ LE BOUTON DE ROTATION
procédure dessinerRotation(t, x, y)
rectangle_arrondi(t, x, y + 2, 44, 48, 11, rgba(0, 0, 0, 0.3))
rectangle_arrondi(t, x, y, 44, 48, 11, #55565C)
// Anneau ouvert en haut à droite
cercle(t, x + 22, y + 26, 14, #E8EAF0)
cercle(t, x + 22, y + 26, 8, #55565C)
rectangle(t, x + 22, y + 10, 15, 16, #55565C)
// Pointe de la flèche
pF est un tableau
pF ajoute x + 18
pF ajoute y + 10
pF ajoute x + 34
pF ajoute y + 10
pF ajoute x + 26
pF ajoute y + 24
polygone(t, pF, #E8EAF0)
fin procédure
@ BOUCLE PRINCIPALE
tant que vrai
// --- Forme du domino en main selon son orientation ---
v1 est un nombre
v2 est un nombre
dl est un nombre
dc est un nombre
si orient = 0 alors
v1 vaut valA
v2 vaut valB
dl vaut 0
dc vaut 1
sinon si orient = 1 alors
v1 vaut valA
v2 vaut valB
dl vaut 1
dc vaut 0
sinon si orient = 2 alors
v1 vaut valB
v2 vaut valA
dl vaut 0
dc vaut 1
sinon
v1 vaut valB
v2 vaut valA
dl vaut 1
dc vaut 0
fin si
// ================= AFFICHAGE =================
effacer(graph)
contour(graph, #0)
remplir(graph, #2E2F34)
// ---------- BANDEAU DU HAUT ----------
rectangle_arrondi(graph, 12, 8, 376, 58, 14, #35363C)
appelle dessinerPiece(graph, 34, 30, 11)
label(graph, 50, 36, "" + pieces, #FFFFFF, 15)
label(graph, 150, 38, "" + score, #FF9A2B, 22)
label(graph, 244, 36, "??", #FFFFFF, 15)
label(graph, 268, 37, "" + record, #FF9A2B, 18)
rectangle_arrondi(graph, 344, 14, 34, 34, 9, #4B4C52)
rectangle_arrondi(graph, 353, 21, 5, 20, 2, #E8EAF0)
rectangle_arrondi(graph, 364, 21, 5, 20, 2, #E8EAF0)
label(graph, 26, 60, message, #8A8C94, 10)
// ---------- LE PLATEAU ----------
rectangle_arrondi(graph, 36, 72, 328, 380, 16, #35363C)
pour i de 0 à LIGS
pour j de 0 à COLS
xk est un nombre
yk est un nombre
xk vaut BX + j * CS + 3
yk vaut BY + i * CS + 3
si plateau[i][j] = 0 alors
appelle dessinerCaseVide(graph, xk, yk, 46)
sinon
appelle dessinerDomino(graph, xk, yk, 46, plateau[i][j], vrai)
fin si
fin pour
fin pour
// ---------- ZONE DE JEU DU BAS ----------
rectangle_arrondi(graph, 12, 458, 376, 84, 14, #35363C)
actifP est un booléen
actifP vaut faux
si pieces >= COUT_POUBELLE alors
actifP vaut vrai
fin si
appelle dessinerPoubelle(graph, 26, 466, actifP)
appelle dessinerPiece(graph, 32, 528, 7)
label(graph, 44, 533, "" + COUT_POUBELLE, #B9BCC4, 11)
// Le domino en main, centré dans la zone quelle que soit son orientation
xm est un nombre
ym est un nombre
si dc = 1 alors
xm vaut 138
ym vaut 478
sinon
xm vaut 160
ym vaut 464
fin si
appelle dessinerCouple(graph, xm, ym, 38, v1, v2, dl, dc, vrai)
appelle dessinerRotation(graph, 278, 466)
// Le domino suivant, en petit
label(graph, 338, 476, "suiv.", #8A8C94, 9)
appelle dessinerCouple(graph, 344, 482, 18, sA, sB, 1, 0, faux)
// ---------- SURCOUCHES ----------
si aide = vrai alors
rectangle(graph, 0, 0, 400, 550, rgba(0, 0, 0, 0.72))
rectangle_arrondi(graph, 30, 110, 340, 330, 16, #4B4C52)
label(graph, 58, 158, "COMMENT JOUER", #FFFFFF, 20)
label(graph, 58, 200, "Chaque domino porte deux dés.", #D6D8DE, 13)
label(graph, 58, 222, "Le bouton de droite le fait tourner", #D6D8DE, 13)
label(graph, 58, 244, "dans les quatre positions.", #D6D8DE, 13)
label(graph, 58, 282, "Clique sur une case libre : le premier", #D6D8DE, 13)
label(graph, 58, 304, "dé s'y pose, le second juste à côté.", #D6D8DE, 13)
label(graph, 58, 342, "Trois dés identiques qui se touchent", #D6D8DE, 13)
label(graph, 58, 364, "fusionnent en un dé supérieur.", #D6D8DE, 13)
label(graph, 58, 396, "Poubelle : " + COUT_POUBELLE + " pièces.", #D6D8DE, 13)
label(graph, 58, 424, "Clique pour fermer", #FFC93C, 13)
fin si
si finPartie = vrai alors
rectangle(graph, 0, 0, 400, 550, rgba(0, 0, 0, 0.78))
rectangle_arrondi(graph, 40, 160, 320, 230, 16, #4B4C52)
label(graph, 86, 212, "PLUS DE PLACE !", #FFFFFF, 24)
label(graph, 86, 256, "Score : " + score, #FF9A2B, 20)
label(graph, 86, 292, "Meilleur dé :", #D6D8DE, 14)
appelle dessinerDomino(graph, 220, 268, 32, meilleurDomino, faux)
label(graph, 86, 356, "Clique pour rejouer", #FFC93C, 15)
fin si
affiche graph
// ================= LA SOURIS =================
xc est un nombre
yc est un nombre
cliquer graph dans xc, yc
si finPartie = vrai alors
// ---------- NOUVELLE PARTIE ----------
pour i de 0 à LIGS
pour j de 0 à COLS
plateau[i][j] vaut 0
fin pour
fin pour
score vaut 0
pieces vaut 20
meilleurDomino vaut 1
orient vaut 0
derLig vaut - 1
derCol vaut - 1
finPartie vaut faux
message vaut "Clique sur une case : le domino occupe deux cases"
sinon si aide = vrai alors
aide vaut faux
sinon si xc >= 344 et xc <= 378 et yc >= 14 et yc <= 48 alors
aide vaut vrai
sinon si xc >= 278 et xc <= 322 et yc >= 466 et yc <= 514 alors
// ---------- TOURNER LE DOMINO ----------
orient vaut orient + 1
si orient > 3 alors
orient vaut 0
fin si
message vaut "Domino tourné"
sinon si xc >= 26 et xc <= 70 et yc >= 466 et yc <= 514 alors
// ---------- JETER LE DOMINO ----------
si pieces >= COUT_POUBELLE alors
pieces vaut pieces - COUT_POUBELLE
valA vaut sA
valB vaut sB
tirage vaut hasard(1, 100)
si tirage <= 40 alors
sA vaut 1
sinon si tirage <= 72 alors
sA vaut 2
sinon si tirage <= 90 alors
sA vaut 3
sinon
sA vaut 4
fin si
si hasard(1, 100) <= 25 alors
sB vaut sA
sinon
tirage vaut hasard(1, 100)
si tirage <= 40 alors
sB vaut 1
sinon si tirage <= 72 alors
sB vaut 2
sinon si tirage <= 90 alors
sB vaut 3
sinon
sB vaut 4
fin si
fin si
message vaut "Domino jeté : - " + COUT_POUBELLE + " pièces"
sinon
message vaut "Il te faut " + COUT_POUBELLE + " pièces pour jeter"
fin si
sinon si xc >= BX et xc < BX + (COLS + 1) * CS et yc >= BY et yc < BY + (LIGS + 1) * CS alors
// ---------- POSER LE DOMINO SUR DEUX CASES ----------
l1 est un nombre
c1 est un nombre
c1 vaut arrondi_inferieur((xc - BX) / CS)
l1 vaut arrondi_inferieur((yc - BY) / CS)
c1 vaut limiter(c1, 0, COLS)
l1 vaut limiter(l1, 0, LIGS)
l2 est un nombre
c2 est un nombre
l2 vaut l1 + dl
c2 vaut c1 + dc
si l2 > LIGS ou c2 > COLS alors
message vaut "Le domino dépasse du plateau : tourne-le"
sinon si plateau[l1][c1] <> 0 ou plateau[l2][c2] <> 0 alors
message vaut "Il faut deux cases libres côte à côte"
sinon
plateau[l1][c1] vaut v1
plateau[l2][c2] vaut v2
derLig vaut l1
derCol vaut c1
der2Lig vaut l2
der2Col vaut c2
message vaut "Domino posé"
// Le suivant passe en main, et on tire un nouveau suivant
valA vaut sA
valB vaut sB
tirage vaut hasard(1, 100)
si tirage <= 40 alors
sA vaut 1
sinon si tirage <= 72 alors
sA vaut 2
sinon si tirage <= 90 alors
sA vaut 3
sinon
sA vaut 4
fin si
si hasard(1, 100) <= 25 alors
sB vaut sA
sinon
tirage vaut hasard(1, 100)
si tirage <= 40 alors
sB vaut 1
sinon si tirage <= 72 alors
sB vaut 2
sinon si tirage <= 90 alors
sB vaut 3
sinon
sB vaut 4
fin si
fin si
// ---------- FUSIONS EN CHAÎNE ----------
chaine est un nombre
chaine vaut 0
encore est un booléen
encore vaut vrai
tant que encore = vrai
encore vaut faux
pour i de 0 à LIGS
pour j de 0 à COLS
si plateau[i][j] > 0 et encore = faux alors
val est un nombre
val vaut plateau[i][j]
// --- Groupe connecté de même valeur, propagé par vagues ---
pour r de 0 à LIGS
pour c de 0 à COLS
marque[r][c] vaut faux
fin pour
fin pour
marque[i][j] vaut vrai
propage est un booléen
propage vaut vrai
tant que propage = vrai
propage vaut faux
pour r de 0 à LIGS
pour c de 0 à COLS
si marque[r][c] = vrai alors
pour d de 0 à 3
dLi est un nombre
dCo est un nombre
si d = 0 alors
dLi vaut 0 - 1
dCo vaut 0
sinon si d = 1 alors
dLi vaut 1
dCo vaut 0
sinon si d = 2 alors
dLi vaut 0
dCo vaut 0 - 1
sinon
dLi vaut 0
dCo vaut 1
fin si
vr est un nombre
vc est un nombre
vr vaut r + dLi
vc vaut c + dCo
si vr >= 0 et vr <= LIGS et vc >= 0 et vc <= COLS alors
si plateau[vr][vc] = val et marque[vr][vc] = faux alors
marque[vr][vc] vaut vrai
propage vaut vrai
fin si
fin si
fin pour
fin si
fin pour
fin pour
fin tant que
// --- Le groupe est-il assez grand ? ---
nbGroupe est un nombre
nbGroupe vaut 0
ligNaiss est un nombre
colNaiss est un nombre
ligNaiss vaut i
colNaiss vaut j
pour r de 0 à LIGS
pour c de 0 à COLS
si marque[r][c] = vrai alors
nbGroupe ajoute 1
si r > ligNaiss alors
ligNaiss vaut r
colNaiss vaut c
fin si
fin si
fin pour
fin pour
// Le dé supérieur naît de préférence sur une case que tu viens de jouer
si der2Lig >= 0 alors
si marque[der2Lig][der2Col] = vrai alors
ligNaiss vaut der2Lig
colNaiss vaut der2Col
fin si
fin si
si derLig >= 0 alors
si marque[derLig][derCol] = vrai alors
ligNaiss vaut derLig
colNaiss vaut derCol
fin si
fin si
si nbGroupe >= 3 alors
pour r de 0 à LIGS
pour c de 0 à COLS
si marque[r][c] = vrai alors
plateau[r][c] vaut 0
fin si
fin pour
fin pour
si val < 6 alors
plateau[ligNaiss][colNaiss] vaut val + 1
derLig vaut ligNaiss
derCol vaut colNaiss
der2Lig vaut - 1
der2Col vaut - 1
si val + 1 > meilleurDomino alors
meilleurDomino vaut val + 1
fin si
sinon
derLig vaut - 1
derCol vaut - 1
der2Lig vaut - 1
der2Col vaut - 1
fin si
gain est un nombre
gain vaut val * nbGroupe * 10 * (chaine + 1)
score ajoute gain
chaine ajoute 1
si val >= 4 alors
pieces ajoute 3
sinon
pieces ajoute 1
fin si
si val = 6 alors
message vaut "Six sublimé ! + " + gain + " points"
sinon si chaine > 1 alors
message vaut "Réaction en chaîne x" + chaine + " : + " + gain
sinon
message vaut "Fusion de " + nbGroupe + " dés : + " + gain
fin si
encore vaut vrai
fin si
fin si
fin pour
fin pour
fin tant que
// ---------- RESTE-T-IL DEUX CASES LIBRES CÔTE À CÔTE ? ----------
placeRestante est un booléen
placeRestante vaut faux
pour i de 0 à LIGS
pour j de 0 à COLS
si plateau[i][j] = 0 alors
si j < COLS alors
si plateau[i][j + 1] = 0 alors
placeRestante vaut vrai
fin si
fin si
si i < LIGS alors
si plateau[i + 1][j] = 0 alors
placeRestante vaut vrai
fin si
fin si
fin si
fin pour
fin pour
si placeRestante = faux alors
finPartie vaut vrai
si score > record alors
record vaut score
fin si
fin si
fin si
fin si
fin tant que