Je pense à faire un jeu de puzzle dont l'objectif est de remplir une grille avec des pièces de puzzle en forme (par exemple, les formes classiques de Tetris).
Comment puis-je créer un ensemble de pièces dont on peut garantir qu'elles seront utilisées pour remplir la grille, sans laisser de lacunes? Comment pourrais-je adapter cet algorithme pour mesurer la difficulté du puzzle résultant?
Réponses:
Il s'agit d'un problème difficile connu, qui détermine quels rectangles peuvent être carrelés avec certaines pièces.
Cependant, si vous construisez des puzzles et pouvez contrôler les pièces, c'est le problème opposé, constructif et plus facile ...
Construisez une solution de manière constructive. Prenez quelques pièces que vous aimez et remplissez le puzzle comme vous le souhaitez. Ajoutez ensuite suffisamment de carrés pour le remplir et vous avez la garantie qu'il y a au moins une solution. Ou plutôt, incluez quelques petits morceaux dans votre ensemble autorisé de morceaux.
En ce qui concerne la résolution / la disposition des pièces, une approche typique de la force brute consiste à la remplir de gauche à droite, puis de haut en bas. Trouvez la première cellule ouverte (numérotée LR, TB) et essayez de mettre vos pièces autorisées dans leurs orientations autorisées (8 orientations pour une pièce asymétrique si vous autorisez le retournement). Peut-être vérifiez d'abord les grandes pièces autorisées et recourez à de plus petites si nécessaire. Lorsque vous atteignez un état que vous n'aimez pas (cul-de-sac, trop de petits morceaux, etc.), revenez en arrière. Si un ensemble de grilles / pièces donné ne répond pas à vos critères, c'est-à-dire qu'il a fait marche arrière sans fin, essayez un autre ensemble de rectangles et de pièces.
Une façon de rendre un puzzle "plus facile" pourrait être d'échanger des pièces plus grandes contre des pièces plus petites comme les monominos et les dominos, car cela laissera plus de façons de combler les derniers trous. Ou, de manière équivalente, créez une solution qui favorise ces petites pièces.
Certains polyominologues notables comprennent:
==> http://ee.usc.edu/faculty_staff/faculty_directory/golomb.htm Golomb a inventé à l'origine le terme "Polyomino"
==> http://www.eklhad.net/polyomino/ Dahlke a résolu pas mal de rectangles remplis de pièces identiques (une forme de carrelage particulièrement rare)
la source
Cet article (page 11-13, avis de non-responsabilité: je suis l'un des auteurs) décrit un algorithme qui utilise la programmation dynamique pour générer uniformément des régions rectangulaires parfaitement carrelées de largeur w et de hauteur h , dans un temps qui est linéaire en h après un prétraitement qui prend environ 2 ( w . D ) temps / espace ( D étant la dimension la plus longue d'une forme individuelle, par exemple 4 dans le cas des pièces Tetris).
L'idée est similaire à celle décrite par David ci-dessus, et se concentre sur la bande supérieure , en plaçant des pièces qui ne créent pas de trous . L'essentiel ici est de commencer par précalculer les alternatives autorisées pour chaque état de la bande supérieure, afin de ne plus payer l'explosion combinatoire lorsque vous générez les régions.
L'algorithme fonctionne pour n'importe quel ensemble de formes (convexes).
De plus, un aspect intéressant d'une génération aléatoire uniforme est qu'elle garantit une diversité maximale entre les générations consécutives (mais vous pouvez également contraindre la génération comme vous le souhaitez). Voici quelques sorties typiques:
N'hésitez pas à demander si vous rencontrez des problèmes avec l'implémentation (je pourrais même avoir une implémentation rapide et sale Python quelque part ...)
la source
Voici une technique que nous avons utilisée dans le passé pour tricher un peu sur du matériel plus confiné. Ce n'est pas aussi pur que les solutions plus complexes, mais a l'avantage distinct d'être beaucoup plus facile à mettre en œuvre et fonctionne à chaque fois.
Plutôt que de vous concentrer sur l'ensemble du puzzle, divisez-le en unités plus petites et uniformes . Chacune de ces unités est composée d'un nombre défini de pièces qui s'emboîtent pour former des carrés ou des rectangles qui sont beaucoup plus faciles à remplir dans un puzzle. Choisissez au hasard parmi les différentes configurations pour remplir la largeur du puzzle (exemples ci-dessous, mais il existe de très nombreuses configurations). Vous trouverez ci-dessous des 4x4, un 5x4 et même un exemple 10x4.
L'idée est que vous "rayez" le puzzle ... choisissez les largeurs au hasard en fonction de la pièce restante disponible. Une fois qu'une "bande" est terminée, commencez une nouvelle bande.
Vous libérez des morceaux une bande à la fois en randomisant dans chaque ensemble de "bandes". Si vous souhaitez augmenter la difficulté, relâchez au hasard de deux bandes ou plus à la fois.
En utilisant cette technique, vous avez non seulement garanti que le puzzle est résoluble, mais vous avez également aidé à "tricher" l'ordre de libération pour qu'il soit plus facile de rester en vie. Bien sûr, dans la pratique, les joueurs ne sont pas en mesure de résoudre parfaitement chaque bande et le chaos s'ensuit.
Continuez à générer des rayures jusqu'à ce que le joueur perde. Bien sûr, mon exemple est une bande de 4 blocs de haut, mais vous pouvez choisir quelque chose de plus grand et de plus complexe:
la source