CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Algorithme de taux d'apparition

lelouchvx
lelouchvx
Niveau 4
23 septembre 2020 à 14:16:04

Yo, pour un projet scolaire je dois coder un rpg old-school simple avec des évènements généré aléatoirement

Dans un de ses évènements, il y a l'apparition de monstre sachant que j'en est plusieurs j'ai créer plusieurs monstre dans ma base de données :

id : 1
name : Orc
...
SpawnRate : 10

id : 2
name : Loup
...
spawnRate : 25

Donc là par exemple, il y a 10% de chance que le combat sera contre un Orc et 25% de chance contre un loup. Sauf qu'au niveau du code je ne sais pas trop comment je dois le faire.

J'avais l'idée de remplir un array de 10 string Orc et 25 String Loup et de récupérer le nom du monstre que je dois faire apparaitre avec un indice random

Mais si j'ai 100 monstres différents, je risque à chaque fois de devoir créer un tableau avec X fois chaque monstre ça risque d'être super super lourd. Il n'y aurait pas un moyen plus simple ?

Zebuh
Zebuh
Niveau 7
23 septembre 2020 à 14:56:58

Et bien tu peux faire plus simple oui.
Tu tires un nombre aléatoire entre 0 et 100, et ensuite tu vois ce que tu fais avec ce nombre.
Par exemple, disons que tu as 10% de chances pour un orc, 25% pour un loup, et le reste (donc 65%) c'est pour un corbeau.
Si ton nombre est compris entre 0 et 10 c'est un orc, si c'est entre 11 et 25 c'est un loup, et si c'est entre 26 et 100 c'est un corbeau.
Ainsi tu as seulement un nombre a tiré puis récupérer ce que tu veux en fonction de resultat.

lelouchvx
lelouchvx
Niveau 4
23 septembre 2020 à 15:03:16

Tu m'as donné une idée !

Disons que je n'ai que des orcs et des loups (pour simplifier) 10% pour l'un et 25% pour l'autre.

Je fais en sorte d'avoir un random qui va de 0 jusqu'à MaxProba ... Et MaxProba est égale à la somme des pourcentages donc 10+25 = 35.

rand entre 0 et 35

0 à 9 = Orc
10 à 35 = Loup

Pour ça je vais initialiser un tableau avec toutes les données qu'il me faut et je ferais en sorte qu'il sois garder en mémoire pour ne pas le réinitialiser à chaque combat. Je pense qu'un tableau ne doit pas bouffer beaucoup de mémoire même s'il est de taille 10 000.

En tout cas merci.

Zebuh
Zebuh
Niveau 7
23 septembre 2020 à 15:10:28

Pourquoi faire un tableau qui contient autant de données quand un simple if/else suffirait ?

monster = null;
mynumber = random();
if (mynumber < 10)
monster = "Orc";
else if (mynumber < 35)
monster = "Loup";

Ce n'est évidemment pas un code qui compile, mais c'est plus pour te donnée une idée générale.
Tu te passes complètement de tableau comme ça.
Ou alors tu défini un tableau qui contient toutes tes données (sans doubons) et au lieu de set une string comme montré ci dessus, tu défini juste un index qui correspond a ton tableau :

monster[] = { "Orc", "Loup" };
indexMonster = -1;
mynumber = random();
if (mynumber < 10)
indexMonster = 0;
else if (mynumber < 35)
indexMonster = 1;

// pense a vérifier que ton index ne vaut pas -1
MyMonster = monster[indexMonster ];

Message édité le 23 septembre 2020 à 15:13:16 par Zebuh
lelouchvx
lelouchvx
Niveau 4
23 septembre 2020 à 18:42:15

Oui mais le soucis, c'est qu'à chaque modification de la base de données des monstres, je vais devoir créer ou supprimer un autre if/else ce qui rend le code non maintenable.

Le tableau se remplis dynamiquement par rapport aux données de la BDD. Si j'ajoute 200 monstres puis le lendemain j'en enlève 10 puis j'en rajoute 20 ça changera rien. De plus, si jamais je veux modifier le taux d'apparition, je vais devoir modifier manuellement tous les if/else. Alors qu'avec le tableau j'écris une fois le code et j'y toucherai plus à moins de changement majeur dans la manière de générer l'apparition.

Ça devient vite du code statique et ça va finir en usine à gaz. Du coup, je vais rester sur le tableau.

Zebuh
Zebuh
Niveau 7
23 septembre 2020 à 18:56:35

Il suffit de faire par exemple un tableau de structure qui contient le nom du monstre et son taux d'apparition.
Tu tires ton nombre, tu itère sur ton tableau en comparant le taux d'apparition avec ton nombre et si ca correspond a ce que tu veux, tu retournes le nom qui est contenu dans la structure a ce même index.
Et si tu as une BDD, rien ne t'empêche au démarage du jeu de remplir dynamiquement cette même structure avec les données de ta BDD.
Ou alors tu lis directement dans ta BDD.

Quoi qu'il en soit faire un tableau qui contient X fois la même valeur reste une mauvaise idée.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware