Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/06/2021, à 22:26

DonutMan75

Un petit script Python pour assister la création d'un jeu de Dobble

Bonjour à tous,

je suis en train de finaliser un petit projet perso qui consiste à créer mon propre jeu de Dobble.
Je profite d'ailleurs de l'occasion pour remercier la communauté pour vos avis sur les logiciels adaptés pour créer les cartes !

Pour ceux qui ne connaissent pas c'est un jeu de société où le but est de trouver le symbole commun sur deux cartes circulaires.

En voici un exemple ci-dessous :
Jeu de Dobble

A cette occasion, j'ai développé un petit script Python qui m'a beaucoup assisté pour les créations des cartes. Je vous le livre ici si ça peut intéresser quelqu'un.
Il est réduit à sa plus simple mécanique mais enfin, il fait le job. Je suis preneur de toutes remarques/suggestions smile

Le point de départ du script est de définir le nombre M de symboles qu'on souhaite avoir par carte. Avec un Dobble classique on a M=8, mais ça fonctionne avec n'importe quelle valeur de M du moment que M-1 est un nombre premier.
Avec M symboles par cartes, il est nécessaire de disposer au préalable d'un alphabet de N = 1+M*(M-1) symboles. Ces derniers sont supposés être au format png et stockés dans le répertoire pointé par la variable dir_symbols.

Le script va créer un répertoire par carte au sein du répertoire de sortie pointé par dir_cards. A l'intérieur de ces répertoires, le script va stocker M liens symboliques qui vont pointer vers 8 symboles donnés. In fine, on aura un jeu de Dobble fonctionnel et il ne restera plus qu'à les assembler sur une carte (avec Inkscape par exemple).

Bonne soirée à tous

Donut Man


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun  4 19:50:39 2021

@author: DonutMan
@license: GPL
"""

from os import symlink, mkdir
from glob import glob
import sys
from sympy import isprime
import numpy as np
from matplotlib import pyplot as plt, rc


M = 8 # Ordre du Dobble
p = M-1 # Ordre du plan projectif sous-jacent

dir_symbols = '/home/donut/project/dobble/symbols'
dir_cards = './cards/symb'

# Sanity check
if not isprime(p):
    sys.exit('Error : M-1 = %d is not prime !' % p)

N = 1+M*(M-1) # Total number of symbols

symbols = glob('%s/*png' % dir_symbols)

if len(symbols) < N:
    sys.exit('Error : expected at least %d symbols but got only %d' % (N, len(symbols)))

if len(symbols) > N:
    fprint('Warning : %d symbols will be unused...' % len(symbols)-N)


# Construction of the connectivity matrix
# A(i,j) = True iif the ith symbol belongs to the jth card...
A = np.zeros((N,N), dtype=bool)

x = np.repeat(np.arange(0,p),p)
y = np.tile(np.arange(0,p),p)

# Y=aX+b
a = np.repeat(np.arange(0,p), p)
b = np.tile(np.arange(0,p), p)

for k in range(0, p*p):
    A[k, 0:p*p] = (y == np.mod(a[k]*x+b[k], p))

# Special treatment of X=k lines
for k in range(0, p):
    A[p*p+k, 0:p*p] = (x == k)

# Line at infinity
A[-1, -p-1::] = True

for k in range(0,p+1):
    A[k*p:(k+1)*p, p*p+k] = True


rc('xtick', labelsize=24)
rc('ytick', labelsize=24)

plt.close('all')
plt.imshow(A, cmap='binary')
plt.title('Connectivity matrix', fontsize=24)


# Now we perform the classification

for k in range(0,N):
    print('- Creating card %02d/%02d...' % (k+1, N))
    symb_list = np.where(A[:,k]==True)[0]
    if not len(symb_list) == M: # Something went wrong...
        sys.exit('Error : expected %d symbols but got %d...' % (M, len(symb_list)))
    
    mkdir('%s/card_%02d' % (dir_cards, k+1))
    
    for (c, symb) in enumerate(symb_list, 1): 
        src = symbols[symb]
        dst = '%s/card_%02d/symbol_%02d.png' % (dir_cards, k+1, c)
        symlink(src, dst)

Hors ligne

#2 Le 06/06/2021, à 12:26

Vobul

Re : Un petit script Python pour assister la création d'un jeu de Dobble

Salut,

Il me semble très bien ton petit script, bien commenté en plus. Par contre, il faut que dir_symbols soit un chemin relatif, car tout le monde ne s'appelle pas "donut" wink


Vobul

Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.

Hors ligne

#3 Le 06/06/2021, à 17:00

DonutMan75

Re : Un petit script Python pour assister la création d'un jeu de Dobble

Ah oui exact bien vu smile

j'ai du utiliser des chemins absolu parce que sinon j'obtenais une erreur avec la fonction symlink() (le même genre de comportement qu'avec la commande ln en fait..).

C'est un peu dommage car du coup je ne suis plus en 100% relatif...

Merci pour le retour smile

D.

Hors ligne

#4 Le 06/06/2021, à 17:23

Vobul

Re : Un petit script Python pour assister la création d'un jeu de Dobble

Pour tout ce qui est "chemin", je t'invite fortement à utiliser Pathlib. En plus ça te permettra de faire tourner ça sous windows (où le séparateur est antislash).

Un autre truc sympa avec le python moderne ce sont les fstrings, elles sont je trouve plus lisibles que les fprint que tu utilises.


Vobul

Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.

Hors ligne

#5 Le 06/06/2021, à 17:28

kholo

Re : Un petit script Python pour assister la création d'un jeu de Dobble

salut...
en effet, très intéressant...
mais... ça mélange un peu le moteur et la carrosserie...

tu dois partir d'un nombre d'images modifiable...
donc une liste avec un range est un bon début...
une fois cela fait, tu peux travailler sur une liste générique...

ce n'est qu'ensuite, une fois le moteur fait, que tu connecterais à la carrosserie (les images puis les cartes)

as tu regardé la définition sur wikipedia... et les scripts en python qui y sont donnés ?
j'ai bien aimé l'explication des 2 cartes manquantes dans le jeu original !!

Hors ligne