Posté le 26/07/2019 18:18
Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 100 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd
Citer : Posté le 26/07/2019 18:32 | #
Nice! J'ai hate d'en savoir plus!
Lien: https://www.planet-casio.com/Fr/forums/lecture_sujet.php?id=15779
Citer : Posté le 26/07/2019 18:58 | #
Eh bien, joli programme ! Bon courage avec le développement. Les images attirent beaucoup le regard donc n'hésite pas à en mettre quand tu en auras pour booster ton sujet.
Citer : Posté le 26/07/2019 19:25 | #
J'ai hâte de voir ce que ça va donner !
Bon courage en tout cas
Citer : Posté le 27/07/2019 12:18 | #
Cela vous intéresse t il que je vous joigne le programme de génération d'étape que je viens de finir ?
Lephenixnoir, lorsque je me serais déterminé à me mettre à la programmation graphique (qui ne me tente guerre), je vous dévoilerai les images
Merci pour cet engouement inespéré !
Citer : Posté le 27/07/2019 14:38 | #
Sympa comme projet!
Comment fonctionne ton système de seeds?
Personnellement pour implémenter ce genre de système, je remplace les fonctions aléatoires de la calculatrice que j'utilise dans la génération de maps par une fonction pseudo aléatoire initialisée par une seed, et la seed peut être un nombre de taille quelconque.
Citer : Posté le 27/07/2019 15:09 | #
Sympa comme projet!
Comment fonctionne ton système de seeds?
Personnellement pour implémenter ce genre de système, je remplace les fonctions aléatoires de la calculatrice que j'utilise dans la génération de maps par une fonction pseudo aléatoire initialisée par une seed, et la seed peut être un nombre de taille quelconque.
La liste des coordonnés des différentes salle disponible (donc adjacentes à une salle déjà existante) sont conservé dans les listes 8 pour les x et 9 pour y (au faite, ma map se situe au niveau de la matrice Y et fait 5x5(à augmenter si besoins)) avec un ordre de vérification bien précis :
1-salle au Nord
2-salle à l'Est
3-salle au Sud
4-salle à l'Ouest
Il y a d'abord une création d'une salle à partir des listes de coordonnées
vérification si une salle peut exister (ne pas dépasser les limites de la mat Y) autour de cette dite salle
Vérification si une salle existe déjà
Vérification si les coordonnées ne sont pas déjà existantes
Création de nouvelles coordonnées
Les seeds sont donc les emplacements aléatoire des coordonnées dans les listes 8 et 9
Par exemple :
Seed : 426381 (Avec cette seed, j'ai en tout 7 pièces (les 6 coordonnées plus la première))
Le programme va donc prendre les 4emes coordonnées de la liste, puis les 2emes, puis les 6emes ...
Sinon, j'ai encore réussi à optimiser mon programme, un peu fier de moi
Citer : Posté le 27/07/2019 16:31 | #
Donc tu as des maps générées aléatoirement ? C'est ingénieux ! De mémoire j'ai jamais vu de jeux qui faisaient ça !
Bon courage ! Si tu as des questions… hésite pas
Citer : Posté le 27/07/2019 16:52 | #
Ingénieux comme méthode!
Mais j'appellerais pas vraiment ça une seed, mais une méthode de compression. L'avantage de ta technique est qu'on peut créer soi même un niveau et récupérer sa version compressée sous forme de 6 chiffres, le désavantage c'est que la version finale risque de contenir plus de 6 chiffres, ce qui sera peut être un peu trop long. (D'ailleurs pour la version actuelle, arrive-t-il que les listes 8 et 9 dépassent une taille de 9 cases? Dans ce cas, ta "seed" pourrait contenir des nombres à 2 chiffres et donc faire plus de 6 chiffres (et ça induirait des confusions puisque des nombres à 2 chiffres et à 1 chiffre seraient collés sans séparation).
Je pense que tu pourrais utiliser ma technique sans trop modifier ce que tu as déjà fait pour avoir des seeds de n'importe quelle taille :
Dans ton algorithme de génération de salles, au moment où tu sélectionne des coordonnées au hasard dans les listes 8 et 9, au lieu de regarder le numéro dans la "seed" ou d'en tirer un au hasard avec ranInt ou ran#, utilise un algorithme de génération de nombre pseudo aléatoire : c'est un genre d'algorithme qui peut être initialisé par une seed, et qui génère une suite de nombres aléatoire, mais qui génère toujours la même suite pour une certaine seed.
J'ai par exemple cette formule assez courte qui te permet de générer des nombres pseudo aléatoirement :
Abs(Frac(1E4sin(A×B+B)))
Qui génère un réel dans l'intervalle [0,1[
Avec A la seed et B le numéro du nombre dans la suite de nombres que tu veux générer.
Le fonctionnement de cette formule est que le sinus d'un nombre a souvent plein de nombres qui paraissent aléatoires après la virgule, on multiplie donc ce nombre par un grand nombre tel que 10 000 pour récupérer des chiffres assez loin derrière la virgule et on prend la partie fractionnaire de ce nombre pour avoir un nombre entre 0 et 0,999999...
Ainsi, au début du programme tu prend le nombre que tu veux comme seed, prenons par exemple 42. Tu le stocke dans la variable que tu utilises dans la formule (ici A).
Tu initialise B (ou autre variable mais dans l'exemple c'est B) à 0.
Puis à chaque fois que tu tires un nouveau nombre aléatoire avec la formule, tu ajoute 1 à B.
Edit : dans ma formule, A*B + B est une manière de combiner A et B, mais il est possible de faire mieux. Premièrement pour A = -1, le résultat sera toujours le même pour tout B car -1*B + B = 0. On peut d'ailleurs mettre A*B tout court à la place de A*B + B, et ne jamais utiliser la seed 0, ce qui me semble plus naturel que ne jamais utiliser la seed -1. On peut aussi utiliser une autre formule telle une fonction d'appariement par exemple la fonction d'appariement de Cantor : 0.5*(A+B)*(A+B+1) permettant de générer un nombre unique à partir de deux nombres (pour A et B différents de C et D, cette fonction retournera un nombre différent).
Citer : Posté le 27/07/2019 17:40 | #
D'ailleurs pour la version actuelle, arrive-t-il que les listes 8 et 9 dépassent une taille de 9 cases? Dans ce cas, ta "seed" pourrait contenir des nombres à 2 chiffres et donc faire plus de 6 chiffres (et ça induirait des confusions puisque des nombres à 2 chiffres et à 1 chiffre seraient collés sans séparation)
Pour remédier à celà, tout les chiffres compris entre 10 et 35 seront des lettres
Ta méthode est très bien, mais peut-être un petit problème, si le nombre est supérieur au nombre de coordonnées différentes possibles, j'aurais donc un Dim Error (Peut-être que je me fais des films)
En parallèle, j'ai avancé sur les graphismes, on est maintenant dans une salle et une flèche indique les salles adjacentes, cependant, l'énorme problème, c'est qu'il est est plus lourd que ma génération de cartes (JUSTE POUR AFFICHER 4 FLECHES AVEC LOCATE !!!)
Citer : Posté le 27/07/2019 17:42 | #
Dans ce cas soit tu as des méthodes très compliquées pour afficher des flèches avec Locate, soit ta génération est tellement petite que tu n'as pas de soucis à te faire !
Même en mode texte c'est suffisant ! La valeur ajoutée est réelle dans tous les cas. Et je parle pas des GIFs animés !
Citer : Posté le 27/07/2019 17:42 | #
Si tu connais le nombre max, tu peux te débrouiller pour avoir assez de cases, quitte à avoir des 0 dans les cases inutilisées…
Citer : Posté le 27/07/2019 17:51 | #
Pour remédier à celà, tout les chiffres compris entre 10 et 35 seront des lettres
Bonne idée
Ta méthode est très bien, mais peut-être un petit problème, si le nombre est supérieur au nombre de coordonnées différentes possibles, j'aurais donc un Dim Error (Peut-être que je me fais des films)
Je pense qu'il n'y a pas de problème de ce côté là : le nombre généré est à la base entre 0 et 1, mais on peut le convertir en un nombre entre 1 et le nombre que tu veux.
Avec N un nombre aléatoire entre 0 et 0,9999..., pour passer à un nombre entre 1 et C compris, on peut faire :
Int (1+C×N) -> N
Citer : Posté le 27/07/2019 17:53 | #
Attention toutefois à ne pas prendre C trop grand car il n'y a pas plus de 12 chiffres d'information dans les nombres aléatoires générés, et de toute façon au-delà de 10¹² (environ) la calculatrice passe en notation exponentielle donc les chiffres les plus faibles disparaissent
Citer : Posté le 27/07/2019 17:55 | #
Tu as raison, mais comme il n'a besoin de cette fonction que pour choisir une coordonnée au hasard dans une liste, C est au maximum égal à 999 (la taille maximale d'une liste).
Citer : Posté le 27/07/2019 18:02 | #
Dans ce cas pourquoi pas RanInt() tout simplement ?
Bien sûr ça suffit pour cette application, mais on est d'accord que c'est pas à faire dans la vraie vie hein !
Les "vrais" générateurs aléatoires sont compliqués à définir ont des propriétés très bien définies qui les rendent aléatoires. Par exemple (simplifié), si tu regardes les nombres qui sortent d'un Mersenne Twister, les séquences de 32×k bits sont toutes équiprobables pour n'importe quel k jusqu'à 623 !
Et puis il y a plein d'autres choses cachées... le paradoxe avec les séquences aléatoires c'est qu'on ne peut pas en générer avec un programme car le programme devrait être infini !
Citer : Posté le 27/07/2019 18:13 | #
Dans ce cas soit tu as des méthodes très compliquées pour afficher des flèches avec Locate
Tu as tout juste
Génération de 5x5 ? C'est ça que tu demandais ?
Je vais y travailler
Si tu connais le nombre max, tu peux te débrouiller pour avoir assez de cases, quitte à avoir des 0 dans les cases inutilisées…
Je n'ai pas très bien compris...
Mon code ressemble à ça :
{5,5→Dim Mat Y
2→Mat Y[3,3
{3,4,3,2→List 8
{2,3,4,3→List 9
1→'coordonnées possibles
RanInt#(1, Dim List 8→A
...
Où A est le numéro des coordonnées
Les salles sont marqué avec le numéro 2, les coordonnées possibles avec 1 et 0 les emplacements vides
Les valeurs de A vont s'ajouter au fur et à mesure dans la liste 5 (SEED)
Citer : Posté le 27/07/2019 18:16 | #
Non, je plaisantais en suggérant que ton code de génération pouvait être plus court que quatre Locate. xD
Citer : Posté le 27/07/2019 18:18 | #
500o pour la génération et la seed et 812 pour les locate
Citer : Posté le 27/07/2019 18:27 | #
Dans ce cas pourquoi pas RanInt() tout simplement ?
Parce qu'on ne peut pas initialiser RanInt() avec une seed.
Bien sûr ça suffit pour cette application, mais on est d'accord que c'est pas à faire dans la vraie vie hein !
Oui, cette méthode est très approximative, j'aurais dû le préciser .
Mon code ressemble à ça :
{5,5→Dim Mat Y
2→Mat Y[3,3
{3,4,3,2→List 8
{2,3,4,3→List 9
1→'coordonnées possibles
RanInt#(1, Dim List 8→A
...
Si tu veux essayer ma méthode, tu peux remplacer RanInt#(1,Dim List 8 par
Int (1+(Dim List 8)×Abs(Frac(1E4sin(A×B))))
Puis en rajoutant à la ligne d'après B +1 -> B (ou Isz B).
Il faut aussi initialiser A et B au début du programme.
(Remplace A et B par des variables qui ne sont pas encore utilisées par ton programme.)
Citer : Posté le 27/07/2019 20:00 | # | Fichier joint
Je vous propose une version test de mon générateur de map (en pièce-jointe de cette réponse) !!!
Il utilise les variables A, B, C, D, E, J, K, L, Mais sont initialisé lorsque besoins.
Il utilise également les listes 5 à 9 et la Mat Y
Pour tester une map aléatoire, lancer "GOODDIM"
Il va commencer par vous afficher la mat Y (les 2 sont des salles) puis la list 5 (SEED)
Comme vous pourrez l’apercevoir, la taille de la matrice sera soit de 5x5, 7x7 ou 9x9, avec, respectivement, 7 salles, 10 salles et 13 salles
"GOODSEED" ne pourra fonctionner que si une seed valable est déjà inséré dans la liste 5, je vous conseillerai donc de commencer d'abord de lancer l'autre programme
Si bug rencontré, me prévenir !!!