2010-01-26 2 views
2

Je fais un jeu qui utilise des niveaux générés de façon procédurale, et quand je teste, je veux souvent reproduire un niveau. À l'heure actuelle, je n'ai fait aucun moyen de sauvegarder les niveaux, mais je pensais qu'une solution plus simple serait de simplement réutiliser la graine utilisée par le module aléatoire de Python. Cependant, j'ai essayé d'utiliser à la fois random.seed() et random.setstate() et aucun ne semble reproduire de manière fiable les résultats. Bizarrement, j'aurai parfois le même niveau plusieurs fois de suite si je réutilise une graine, mais ce n'est jamais complètement fiable à 100%. Dois-je simplement sauvegarder le niveau normalement (en tant que fichier contenant ses informations)?Quel est le moyen le plus simple de reproduire un niveau généré de façon aléatoire en Python?

Edit:

Merci pour l'aide tout le monde. Il s'est avéré que mon problème venait du fait que je sélectionnais aléatoirement des sprites de groupes dans Pygame, qui sont récupérés dans des vues de dictionnaire non ordonnées. J'ai modifié mon code pour éviter d'utiliser les groupes de sprites de Pygame pour cette partie et cela fonctionne parfaitement maintenant.

Répondre

7

random.seed devrait fonctionner, mais rappelez-vous qu'il n'est pas thread-safe - si des nombres aléatoires sont utilisés ailleurs en même temps, vous pouvez obtenir des résultats différents entre les exécutions.

Dans ce cas, vous devez utiliser une instance de random.Random() pour obtenir un générateur de nombres aléatoires privé

>>> import random 
>>> seed=1234 
>>> n=10 
>>> random.Random(seed).sample(range(1000),n) 
[966, 440, 7, 910, 939, 582, 671, 83, 766, 236] 
>>> 

retourne toujours le même résultat pour une graine donnée

1

Le mieux serait de créer une classe de levelRandom avec un espace de données pour chaque résultat généré de manière aléatoire lors de la génération d'un niveau. Ensuite, séparez le code de génération aléatoire du code de construction de niveau. Lorsque vous voulez un nouveau niveau, commencez par générer un nouvel objet levelRandom, puis passez cet objet au générateur de niveau pour produire votre niveau. Plus tard, pour retrouver le même niveau, vous pouvez simplement réutiliser l'instance levelRandom.

1

Les nombres générés par une fonction aléatoire sont déterministes. Ainsi, semez avec la valeur connue et enregistrez-le. Créez un niveau à partir des nombres aléatoires suivants. Pour charger le niveau, il suffit de semer à nouveau avec la même valeur connue et d'utiliser à nouveau les nombres "aléatoires", qui se reproduiront dans la même séquence. C'est un langage agnostique mais pour Python, ne faites pas attention à l'enfilage comme l'a souligné gnibbler.

Cette technique exacte a été utilisée pour créer le monde gigantesque du jeu légendaire Elite. Si vous êtes courageux, allez simplement vérifier comment Ian Bell did it. ;)

Questions connexes