Sujet n°9811
Posté par Misa-Xage le 27 Mai - 10:58 (2011)
Titre : Mon script de calcul donne toujours 0
Bonjour tout le monde, hier j'ai fais un script pour faire un calcul avec les stats du pokemon mais à chaque fois ça affiche 0 ; voici le script:
Code:

module POKEMON_S
  class Puissance
    def puissance
      if $pokemon_party.actors[0].dfe > $pokemon_party.actors[0].atk
        @dfe = $pokemon_party.actors[0].dfe - (($pokemon_party.actors[0].atk/2) + ($pokemon_party.actors[0].ats/2))
      else
        @dfe = $pokemon_party.actors[0].dfe
      end
      @puissance = ($pokemon_party.actors[0].atk * $pokemon_party.actors[0].ats)/(@dfe * $pokemon_party.actors[0].dfs)
      $game_variable[400] = @puissance
   end
 end
end


Merci d'avance.

M-X

Posté par Sphinx le 27 Mai - 16:02 (2011)
tu peux ajouter au début de ta méthode ce bout de code :
Code:
file = File.open("logPuissance.txt", "w")
file.write("#{$pokemon_party.actors[0].inspect}\n-----------------------------------------------------\n#{$pokemon_party.actors[0].atk.inspect}\n-----------------------------------------------------\n#{$pokemon_party.actors[0].dfe.inspect}")
file.close

puis me dire ce que contient le fichier logPuissance.txt stp ? =)

Posté par Misa-Xage le 27 Mai - 16:28 (2011)
Il va contenir cette fraction :

(attaque du premier pokemon + attaque spécial du premier pokemon) / (defence du premier pokemon + defense spécial du premier pokemon)

Posté par Nuri Yuri le 27 Mai - 16:29 (2011)
Lance le on veux juste les valeurs -_-'

Posté par Sphinx le 27 Mai - 17:03 (2011)
Misa-Xage a écrit:
Il va contenir cette fraction :

(attaque du premier pokemon + attaque spécial du premier pokemon) / (defence du premier pokemon + defense spécial du premier pokemon)


Clin d'œil foireux Non justement... Je récupère tes valeurs de base dans le fichier texte que je crée avec ce bout de code. Ainsi on saura plus facilement d'où vient le problème.

Posté par Misa-Xage le 27 Mai - 20:05 (2011)
Ca ne creer pas le fichier txt, je n'ai rien dans le répertoire...

Posté par Nuri Yuri le 27 Mai - 20:11 (2011)
Code:
module POKEMON_S
  class Puissance
    def puissance
      file = File.open("logPuissance.txt", "w")
file.write("#{$pokemon_party.actors[0].inspect}\n-----------------------------------------------------\n#{$pokemon_party.actors[0].atk.inspect}\n-----------------------------------------------------\n#{$pokemon_party.actors[0].dfe.inspect}")
file.close
      if $pokemon_party.actors[0].dfe > $pokemon_party.actors[0].atk
        @dfe = $pokemon_party.actors[0].dfe - (($pokemon_party.actors[0].atk/2) + ($pokemon_party.actors[0].ats/2))
      else
        @dfe = $pokemon_party.actors[0].dfe
      end
      @puissance = ($pokemon_party.actors[0].atk * $pokemon_party.actors[0].ats)/(@dfe * $pokemon_party.actors[0].dfs)
      $game_variable[400] = @puissance
   end
 end
end

Essaie avec ça si c'est pas déjà fait. (c'est ce que sphinx a dit)

Posté par Misa-Xage le 27 Mai - 20:28 (2011)
Et comment on fait pour l'activer?(Ca ne me créé rien...)

Posté par Nuri Yuri le 27 Mai - 20:36 (2011)
Bah appelle la méthode.

Posté par Misa-Xage le 27 Mai - 20:43 (2011)
$scene = Puissance.new ou Puissance ou Puissance.new?

Posté par Nuri Yuri le 27 Mai - 21:01 (2011)
Pas étonnant que ça retourne 0 si tu ne sait pas l'utiliser.
a=POKEMON_S::Puissance.new
p a.puissance

Posté par Misa-Xage le 27 Mai - 21:06 (2011)
Il a ceci dans le txt :

Fichier texte

Code:

#<POKEMON_S::Pokemon:0x83a9ee0 @envie=["Compliqué."], @atk_plus=0, @base_spd=100, @female_rate=-1, @trainer_id="10709", @form=0, @ability_token=nil, @status_count=0, @dv_spd=1, @type1=4, @ball_data=["POKé BALL", 1, "ball1", "ballopen1.png", (255.000000, 210.000000, 233.000000, 255.000000)], @battle_stage=[0, 0, 0, 0, 0, 0, 0], @status=0, @level=100, @dfs_plus=0, @ability=43, @skills_table=[[268, 1], [33, 5], [49, 8], [209, 12], [205, 15], [103, 19], [113, 22], [451, 26], [120, 29], [129, 33], [393, 36], [360, 40], [153, 43], [243, 47]], @ats=151, @nature=["Foufou", 100, 100, 100, 110, 90, "secs", "Aime les aliments "], @hp_plus=0, @base_dfe=50, @male_rate=101, @id_bis=100, @ability_active=false, @hp=192, @dfe=131, @skills_set=[#<POKEMON>, #<POKEMON>, #<POKEMON>, #<POKEMON>], @exp=1000000, @dv_dfe=26, @exp_type=1, @ats_plus=0, @battler_id=100, @base_dfs=55, @origine=["Rencontré au N. 100.", "Zone Mystère", "27 0 2011"], @loyalty=170, @dv_dfs=26, @rareness=190, @base_atk=30, @shiny=false, @egg=false, @effect_count=[], @atk=74, @given_name="VOLTORBE", @dv_atk=9, @skills_allow=[6, 10, 12, 16, 17, 18, 21, 24, 25, 27, 32, 34, 41, 42, 43, 44, 46, 57, 58, 64, 70, 73, 74, 82, 83, 87, 90], @dfs=126, @dfe_plus=0, @battle_list=[0, 0, 0, 1, 0, 0, 103], @base_ats=55, @code=3739097719, @trainer_name="", @step_remaining=0, @spd=206, @item_hold=0, @dv_ats=23, @type2=0, @base_hp=40, @gender=0, @id=100, @effect=[], @spd_plus=0, @dv_hp=2>
-----------------------------------------------------
74
-----------------------------------------------------
131

Posté par Sphinx le 28 Mai - 02:06 (2011)
Comment tu prévois de récupérer le résultat, Misa ?

Yuri-岼 a écrit:
a=POKEMON_S::Puissance.new
p a.puissance

Car si tu comptes utiliser ta fonction de la manière indiquée par Yuri, ton code n'est pas bon Imbécile heureux a.puissance retourne la valeur indiquée dans la commande return, commande que tu n'utilises pas. Ici, il faudrait remplacer $game_variable[400] = @puissance (d'ailleurs c'est $game_variables et non $game_variable ^^) par return @puissance
Enfin, je ne sais pas pourquoi tu as besoin de ce calcul, ni dans quel(s) endroit(s) mais était-ce indispensable de construire un objet, qui sont par nature assez lourds à utiliser, alors que celui ci ne contient qu'une seule fonction ? ^^"

Posté par Misa-Xage le 28 Mai - 08:13 (2011)
Alors pourquoi ça marche aussi quand je fais la commande de Yuri?
Aussi, je fais ce code pour par exemple un concours de capture de Voltobre où celui qui a la puissance la plus forte gagne, alors je voudrais aussi savoir comment on fait pour mettre dans la commande d'appel du script le pokemon que l'on doit avoir dans l'équipe pour qu'il prenne sa puissance et comment faire dans le script au lieu de choisir l'emplacement pour calculer la puissance du pokemon de l'emplacement choisi, je voudrais que l'on peut mettre le nom du pokemon que l'on doit avoir dans l'équipe mais pas l'emplacement mais je connais pas la commande, est ce que j'ai été assez clair?

Posté par Nuri Yuri le 28 Mai - 12:13 (2011)
Sphinx, tu dis des conneries là.
Code:
def test
  6
end
p test

ça affiche 6.
Les méthodes retourne la dernière valeur.
Autre exemple :
Code:
def test2
  for i in 0...10
    6
  end
end
p test2

ça affiche 0...10.

Return sert à stopper la méthode et retourner les arguments.

Posté par Misa-Xage le 28 Mai - 14:23 (2011)
Yuri, sais-tu répondre à ma question de mon post précédent?

Posté par Nuri Yuri le 28 Mai - 14:31 (2011)
Code:
def verif_voltorbe
  a=nil
  for i in 0...6
    if a=$pokemon_party.actors[i]
      if a.id==100
        return a
      end
    end
  end
  false #Indique qu'il n'y a pas de voltorbe
end

Après tu fais voltorbe=verif_voltorbe si c'est différent de false il y un voltorbe dans la variable et tu lance ton script (que dois modifier pour prendre un autre pokémon que le premier).

Je n'ai pas trop envie de chercher dans le manuel la bonne méthode et j'ai pas vérifier le code.

Posté par Misa-Xage le 28 Mai - 15:09 (2011)
Voila j'y suis arrivé sans ton script :
Code:

module POKEMON_S 
  class Puissance

    def initialize(id_pokemon)
      @id_pokemon = id_pokemon
    end
   
    def puissance     
      case @id_pokemon
      when $pokemon_party.actors[0].id
        @index = 0
      when $pokemon_party.actors[1].id
        @index = 1
      when $pokemon_party.actors[2].id
        @index = 2
      when $pokemon_party.actors[3].id
        @index = 3
      when $pokemon_party.actors[4].id
        @index = 4
      when $pokemon_party.actors[5].id
        @index = 5
      end
     
        #Pour pas que ça rend toujours 0
        if $pokemon_party.actors[@index].dfe > $pokemon_party.actors[@index].atk 
          @dfe = $pokemon_party.actors[@index].dfe - (($pokemon_party.actors[@index].atk/2) + ($pokemon_party.actors[0].ats/2)) 
        else 
          @dfe = $pokemon_party.actors[@index].dfe 
        end
     
        #Pareil
        if $pokemon_party.actors[@index].dfs > $pokemon_party.actors[@index].ats
          @dfs = $pokemon_party.actors[@index].dfs - (($pokemon_party.actors[@index].atk/2) + ($pokemon_party.actors[0].ats/2))
        else
          @dfs = $pokemon_party.actors[@index].dfs
        end
     
        #Pour pas que ça bug si le résultat est plus petit que 0
        if ($pokemon_party.actors[@index].atk * $pokemon_party.actors[@index].ats)/(@dfe * @dfs) <= 0
          @puissance = 0
        else
          @puissance = ($pokemon_party.actors[@index].atk * $pokemon_party.actors[@index].ats)/(@dfe * @dfs)
        end
    end
  end 
end 


Par contre je ne sais pas comment faire pour appeler la def initialize, pouvez-vous m'aider svp?

Posté par Nuri Yuri le 28 Mai - 15:12 (2011)
POKEMON_S::Puissance.new(id)
La methode new fais deux choses : Elle créé l'objet et appelle la Methode initialise si elle existe.

Posté par Misa-Xage le 28 Mai - 15:15 (2011)
Merci beaucoup Yuri mon script va être fini maintenant ^^

Posté par Sphinx le 29 Mai - 11:39 (2011)
return permet de retourner une valeur Imbécile heureux Si ca marche sans, alors c'est une sacré faiblesse pour un langage de POO ^^" Faut toujours s'habituer à retourner ses valeurs avec un return, non seulement c'est plus propre, mais ca permet aussi de savoir ce qu'on retourne (là ca retourne le résultat du dernier calcul de la fonction, mais difficile de savoir lequel Clin d'œil foireux)