Aller au contenu
blueblasterz

Placement de bloc aléatoire

Messages recommandés

Bonjour/Bonsoir à tous.

Aujourd'hui je m'en remet à la communauté skript pour m'aider sur l'un de mes projet, le skript Random Zone.

Voici mon problème : Je cherche à ajouter un moyen simple de modifier le nombre de blocs de chaque type devant apparaître, sous forme de pourcentage. Par exemple, la commande /rz apply 70%stone,20%coal ore, 10%iron ore doit signifier "on rempli 70% de la zone avec de la stone, 20% avec du minerai de charbon, et 10% avec du minerai de fer". Et en fait mon problème ne se situe pas là. La commande est déjà prête, les pourcentages sont pris en compte, mais voici 4 résultats sur un carré de 10*10 avec cette commande:

[ATTACH=full]3192[/ATTACH] [ATTACH=full]3193[/ATTACH] [ATTACH=full]3194[/ATTACH] [ATTACH=full]3195[/ATTACH]

Vous voyez bien le soucis, les bloc ayant un petit pourcentage apparraîssent tout en bas, ratatinés.

Voici le code concerné (si vous voulez le reste allez voir sur le post de la ressource):

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

Voici les explication (de là ou j'ai mis que j'expliquai plus bas): en gros quelque soit le nombre de bloc de chaque type, le code va :

- compter combien il y a de type de bloc,

- attribuer à chacun de ces blocs un nombre, qui correspond à leur pourcentage d'apparition

- un fois ceci fait, lance une boucle qui fait défiler tous les blocs de la zone,

- pour chaque loop-block, il choisis un type de bloc aléatoire, et le pose si son nombre d'apparition n'est pas nul.

 

Le soucis c'est que le choix de ce bloc aléatoire n'est pas pondéré selon le nombre d'apparition : c'est donc logique que les blocs ayant une faible apparition apparraîssent en bas du carré.

Ma question est donc, avez vous une idée de comment régler ce soucis, et faire apparaître régulièrement tout les blocs ??

Et merci d'avance à ceux qui ont eu le courage de lire mon pavé, et encore plus merci à ceux qui m'aideront :)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

 

Avant de te répondre, sache que tu pourrais utiliser la commande WorldEdit qui existe déjà pour cela :)

 

Mais sinon, c'est un sujet assez intéressant.

 

Déjà tu as un gros problème : tous les block pris en compte dans le pourcentage d'apparition on la même chance d'apparaître au début de ton skript, ce qui est donc totalement faux d'un point de vue probabilités.

 

Je m'explique : au tout début tu as 4 types de blocks possible. Tu vas faire un random entre 1 et 4 ... chacun des block à donc 25℅ de chance d'apparaître ! Et ce n'est pas ce que tu veux.

Si les blocks ont respectivement 70%, 20%, 5% et 5% de chance d'apparaître il faut que ce soit le cas dès le tirage au début.

Tu dois donc modifier ton algorithme. Pour que ce soit déjà plus juste, il faut qu'a chaque tirage de block tu y appliques la probabilité de chaque block d'être tiré.

 

Bonne chance :)

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Le but est de ne pas utiliser World Edit ;)

Je suis bien conscient du problème de ce pourcentage d'apparition, j'ai même déjà fais le skript que tu me dis avec un "chance of %le pourcentage%:"

Le problème est visible en regardant les résultat avec, disons ne serai-ce que 2 blocs, l'un avec 70% et l'autre avec 30%, en inversant le 30% et le 70%:

 

 

[ATTACH=full]3198[/ATTACH]

 

[ATTACH=full]3199[/ATTACH]

Avec ce code:

 

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

On voit bien que le résultat est différent, même si je ne saisi pas tout à fait pourquoi.

Merci de ton aide, tout de même :)

Partager ce message


Lien à poster
Partager sur d’autres sites

En effet, je vais te détailler l'algo que je pensais .

Le but et de transformer le carré en matrice.

 

Je ferais dans cet ordre :

- enregistrer les coordonnées de chaque blocks de la zone dans une liste

- en même temps, compter le nombre de block total

- tu enregistres le pourcentages de blocks correspondants au total des block (ex: 70% blue = 140 blocks, 30% red = 60 blocks)

- tu prends un nombre aléatoire dans ta liste de tes coordonnées entre 1 et la taille de ta liste (200)

- tu le met dans la catégorie d'un des totaux (ici le choix importe peu), par exemple au 140 blocks donc ce sera un blue

- tu enlèves donc un block du total (tu auras 139 blocks blue à poser)

- tu enlèves la coordonnée de la liste, et sa taille passe à 199

 

Tu auras donc exactement le nombre de block que tu veux à un emplacement aléatoire.

J'espère que c'est plus clair (ou pas) xD

 

PS : bonne chance pour gérer la liste ;)

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai peut-être une idée pour t'aider:

 

- Pour chaque pourcentage tu fais ceci:

loop (ton pourcentage) times:

add (item du pourcentage correspondant) to {_liste::*}

 

- Puis lorsque tu places tes blocs, pour le choix de l'item, tu fais ça:

set {_item} to random string from {_liste::*}

 

Je ne sais pas si tu comprend ce que je dis ;) Mais ducoup meme si le totale des pourcentage n'est pas égal à 100, ca marchera :)

  • J'aime 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@EdwinnSs et @minouis55, merci de votre aide à tout les 2, je vais tester vos solutions ^^

 

EDIT : la solution de @minouis55 semble marcher, son seul inconvénient est qu'elle n'est pas très précise ^^ Par exemple si je met 1%de bloc de diamant et 99% de pierre sur une zone de 100 blocs, je peut me retrouver avec 2 ou 3 bloc de diamant ou même aucun ^^ néanmoins elle nécessite beaucoup moins de travail que tout ce que j'avais écrit jusqu'alors. Je teste quand même la solution de EdwinnSs et je reviens ^^

 

EDIT 2 : Je testerai cette 2eme solution demain ^^

Partager ce message


Lien à poster
Partager sur d’autres sites
- Puis lorsque tu places tes blocs, pour le choix de l'item, tu fais ça:

set {_item} to random string from {_liste::*}

Dans ce cas il faut faire en sorte de ne pas prendre deux fois le même block, sinon ça fausse ^^

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour ta solution @EdwinnSs, je me confronte à un problème au niveau de cette instruction :

- tu enlèves la coordonnée de la liste, et sa taille passe à 199

Mais après quelques tests ratés, j'ai testé ce petit code :

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

Et e, voici le résultat :

 

[ATTACH=full]3213[/ATTACH]

Skript considère apparemment que la variable garde la même taille. Donc évidemment ton code ne marche pas (du moins de la manière dont je l'ai appliqué). Le seul moyen que je verrai pour résoudre ce problème serai de loop la variable et de l'ajouter toutes ces valeurs à une nouvelle variable, sauf celles qui sont "<none>". Mais dans ce cas bonjour les lags...

Je te passe le code que j'ai fais selon tes instructions, dis moi si tu vois quelque chose de mal fait :

Contenu masqué

    Réagissez ou répondez à ce message afin de consulter le contenu masqué.

Le code n'est pas complet, la variable {_blocks1::*} est de la forme "<pourcentage>%|<bloc>".

Voilà, merci de ton aide, et puis si on arrive pas à corriger ça je prendrai la solution de minouis55, qui marche quand même très bien ^^

Partager ce message


Lien à poster
Partager sur d’autres sites

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.