Sujet n°11411
Posté par Masamune le 27 Avr - 20:19 (2012)
Titre : [Résolu] - Pokémon aléatoire dans une ball donnée
Bonjour,

J'aimerais que le prof au début du jeu remette au player un pokémon tiré au hasard parmi une liste définie dans un script. Pour cela, j'ai fait en event Insérer Script et j'ai ajouté :


Code
$list_poke = 
["BULBIZARRE","SALAMECHE","CARAPUCE","GERMIGNON","HERICENDRE","KAIMINUS","ARCKO","POUSSIFEU","GOBOU","TORTIPOUSS",
"OUISTICRAM","TIPOUF"]


$poke = $list_poke[rand(12)]


ajouter_pokemon($poke,5)



Il se passe que parfois le script fonctionne où j'obtiens bel et bien un pokémon parmi le tableau et d'autres fois, il plante... 
Et quand il plante, j'ai ceci dans Log.txt :


Code
---------- Erreur de script : Interpreter Bis ----------
----- Type
TypeError


----- Message
Section127:51:in `[]'no implicit conversion from nil to integer


----- Position dans Interpreter Bis
Ligne 445


----- Backtrace
Script : Interpreter Bis | Ligne : 445 | Méthode : in `command_355'
Script : Pokemon_Data | Ligne : 51 | Méthode : in `id_bis'
Script : Pokemon | Ligne : 275 | Méthode : in `temp_initialize'
Script : Pokemon_Custom | Ligne : 102 | Méthode : in `initialize'
Script : Interpreter | Ligne : 136 | Méthode : in `new'
Script : Interpreter | Ligne : 136 | Méthode : in `ajouter_pokemon'
Script : Loading | Ligne : 1 | Méthode : in `command_355'
Script : Interpreter 2 | Ligne : 215 | Méthode : in `eval'
Script : Interpreter Bis | Ligne : 445 | Méthode : in `command_355'
Script : Interpreter 2 | Ligne : 215 | Méthode : in `execute_command'
Script : Interpreter 1 | Ligne : 199 | Méthode : in `update'
Script : Interpreter 1 | Ligne : 113 | Méthode : in `loop'
Script : Interpreter 1 | Ligne : 204 | Méthode : in `update'
Script : Scene_Map | Ligne : 51 | Méthode : in `alias_update'
Script : Scene_Map | Ligne : 48 | Méthode : in `loop'
Script : Scene_Map | Ligne : 67 | Méthode : in `alias_update'
Script : MAPPANEL | Ligne : 90 | Méthode : in `old_update'
Script : TempsJourNuit | Ligne : 248 | Méthode : in `update_passminimap'
Script : Minimap | Ligne : 44 | Méthode : in `update'
Script : Scene_Map | Ligne : 25 | Méthode : in `old_main'
Script : Scene_Map | Ligne : 19 | Méthode : in `loop'
Script : Scene_Map | Ligne : 30 | Méthode : in `old_main'
Script : TempsJourNuit | Ligne : 237 | Méthode : in `main_passminimap'
Script : Minimap | Ligne : 31 | Méthode : in `main'
Script : Main | Ligne : 49


Ma version est PSP4G+ et je n'ai modifié aucun script après l'installation.
Quelqu'un a t-il une explication, une solution ? Merci d'avance.

Posté par Koya le 13 Mai - 10:52 (2012)
Bon, puisque personne ne semble vouloir s'en charger.

Les tableaux sont souvent numérotés en partant de 0, donc là ta première case est la 0e, et ta dernière case est la 11e, pas la 12e. Si il cherche une 12e case qui n'existe pas, il ne trouve rien, d'où le log avec nil.

Change rand(12) en rand(11) pour voir. =)

Et vérifie que tu peux bien obtenir tous les pokés, je sais plus si rand fait le 0 donc j'ai un petit doute pour Bulbizarre. :/

Posté par Masamune le 15 Mai - 12:12 (2012)
Bonjour Koya, je m'étais posé cette question pour les index tableau en rapport avec le traitement du rand() et l'erreur se produit toujours qu'il y ait 5, 6, 11 ou 12... dans rand(). 
Il me semble que la valeur du rand() correspond au nombre d'éléments dans un tableau sans tenir compte du fait que la première cellule soit indexée à 0.
Si bien que j'ai fait 'forcer_sauvegarde' en script juste avant de prendre la ball mais ça m'ennuie un peu de savoir que le plantage peut toujours survenir d'une partie à une autre.


Sinon oui, je peux obtenir tous les poké de la liste, du moins quand le script s'exécute sans faille. J'ai repris entre autre les tutos du système de pêche en collant la liste des pokemons et leur probabilités de rencontre dans un tableau à deux dimensions et ça fonctionne très bien. Mais là, je n'utilise pas de méthode rand(). Je vais refaire la même chose pour ma ball.


Mais je ne comprends pas d'où viendrait 'nil' car le plantage se fait même avec un rand(5) par exemple. Je me demande si une boucle pourrait résoudre le truc genre tant que $poke == nil, on recommence le tirage au hasard du pokemon. Faut que j'essaie ça.

Posté par Koya le 16 Mai - 18:26 (2012)
J'ai fait un petit tour sur google, et donc en fait obtenir un nombre aléatoire sous RMXP, c'est pas comme ça en script. Hélas. x)

Ce serait plutôt : max+rand(max - min)
Un peu étrange, m'enfin.
Essaye donc avec ça :

$poke = $list_poke[11+rand(11 - 0)]

Le lien de la solution complète --> ici =)

Posté par Masamune le 16 Mai - 19:05 (2012)
Ça ne fonctionne pas, RM me retourne l'erreur:


????? 'Pokemon_Data' ? 51 ??? TypeError ????????
no implicit conversion from nil to integer


J'ai pensé que la méthode ne pouvait pas traiter les chaînes des caractères comme "BULBIZARRE" etc, je les ai donc remplacées par leur ID, pour avoir un nombre entier soit un 'integer' et l'erreur reste la même.
Il faudrait mettre la version de Ruby à jour sur RM...
En définitive, voilà ce que j'ai fait pour remédier au problème, mon code est beaucoup moins propre en raison des multiples if mais au moins, ça fonctionne et il n'y a pas un certain temps d'attente avant que le script s'exécute comme j'avais avec rand() lorsqu'il ne plantait pas. Puis ici, j'ai le contrôle des probabilités :
Spoiler





Merci beaucoup Koya, je poste 'résolu' car je ne vais pas m’attarder à faire fonctionner rand() si RM n'en veut pas. 


Cordialement

Posté par Nuri Yuri le 16 Mai - 19:10 (2012)
C'est plutôt min+rand(max-min) soit simplement rand(11) sinon ça te donne comme résultats possibles : 11 12 13 14 15 16 17 18 19 20 21 au lieu de : 0 1 2 3 4 5 6 7 8 9 10.

Posté par Koya le 16 Mai - 19:23 (2012)
Solution beaucoup plus simple sinon, tu utilises dans ton événement "Gestion des variables --> Valeur aléatoire entre - et -"
Désolée de ne pas y avoir pensé plus tôt. u__u"
Et pour réutiliser la variable dans un script : $game_variables[ID DE VARIABLE]


Sinon, regarde dans le jeu PSP 4G+ "de base", avec le type qui donne des pokés : il y a cette portion de code intéressante
$list_poke = [["BULBIZARRE","SALAMECHE","CARAPUCE"],["GERMIGNON","HERICENDRE","KAIMINUS"],["ARCKO","POUSSIFEU","GOBOU"],["TORTIPOUSS","OUISTICRAM","TIPLOUF"]][rand(4)]

À tout hasard, essaye en enlevant ton $list_poke et en remplacant $poke par
$poke = [["BULBIZARRE"],["SALAMECHE"],["CARAPUCE"],["GERMIGNON"],["HERICENDRE"],["KAIMINUS"],["ARCKO"],["POUSSIFEU"],["GOBOU"],["TORTIPOUSS"],
["OUISTICRAM"],["TIPOUF"]][rand(12)]

Sinon, garde ta solution, même si ce n'est probablement pas la plus simple. Au moins ça marche. :/

#EDIT : Ah bon Yuri? Merci de l'info. :>
Et donc c'était pas rand le problème u__u"#

Posté par Masamune le 16 Mai - 19:35 (2012)
Ça ne change rien Yuki, l'erreur, la même, est persistante sous ce code. J'ai déjà retourné le truc dans tous les sens avant de poster la première fois. J'aime bien chercher et j'aime surtout bien trouver mais quand je ne peux pas, je poste et je demande un coup de main :/
Merci Koya, mais je sais comment réutiliser les variables, j'ai beaucoup parcouru le forum depuis mon inscription et les scripts R.Maker Imbécile heureux
Et portion de code déjà vue, je me suis basée dessus dès le départ ^^


Merci de vos réponses, je mets résolu au problème et je conserve ma méthode.