Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de code (jeu de l'activité du cours Ruby)

Sujet résolu
    3 juillet 2019 à 13:32:53

    Bonjour,

    J'ai un problème avec mon code lors de la riposte des ennemis, et je galère depuis quelques heures là-dessus. Je ne comprends pas vraiment d'où vient le problème... Enfin, je pense que cela vient de mes classes mais bon, j'ai beau cherché je ne trouve pas l'erreur en question !

    Voici un screenshot du terminal lors du problème :

    Et voici mon code :

    class Personne
      attr_accessor :nom, :points_de_vie, :en_vie
    
      def initialize(nom)
        @nom = nom
        @points_de_vie = 100
        @en_vie = true
      end
    
      def info
        # A faire:
        # - Renvoie le nom et les points de vie si la personne est en vie
        # - Renvoie le nom et "vaincu" si la personne a été vaincue
    	 if en_vie
    		nom + " (#{points_de_vie}/100 hp)"
    	 else
    		nom + " (vaincu)"
    	 end
      end
    
      def attaque(personne)
        # A faire:
        # - Fait subir des dégats à la personne passée en paramètre
        # - Affiche ce qu'il s'est passé
    	puts nom + " attaque #{personne.nom}"
    	personne.subit_attaque(degats)
      end
    
      def subit_attaque(degats_recus)
        # A faire:
        # - Réduit les points de vie en fonction des dégats reçus
        # - Affiche ce qu'il s'est passé
        # - Détermine si la personne est toujours en_vie ou non
    	   @points_de_vie -= degats_recus
         @en_vie = @points_de_vie > 0
    	    puts nom + " a perdu #{degats_recus} points de vie."
       end
    end
    
    class Joueur < Personne
      attr_accessor :degats_bonus
    
      def initialize(nom)
        # Par défaut le joueur n'a pas de dégats bonus
        @degats_bonus = 0
    
        # Appelle le "initialize" de la classe mère (Personne)
        super(nom)
      end
    
      def degats
        # A faire:
        # - Calculer les dégats
        # - Affiche ce qu'il s'est passé
    	degats = rand(5..25) + degats_bonus
    	puts nom + " inflige #{degats} points de dégats"
      end
    
      def soin
        # A faire:
        # - Gagner de la vie
        # - Affiche ce qu'il s'est passé
    	soin = rand(10..15)
    	 if points_de_vie < 100
    	    points_de_vie += soin
    		  puts "Vous récupéré #{soin} points de vie"
    	 else
    		  puts "Vous avez déjà tous vos points de vie"
    	 end
      end
    
      def ameliorer_degats
        # A faire:
        # - Augmenter les dégats bonus
        # - Affiche ce qu'il s'est passé
    	@degats_bonus += rand(5..20)
    	puts "#{nom} a augmenté ses dégats de #{degats_bonus} points"
      end
    end
    
    class Ennemi < Personne
      def degats
        # A faire:
        # - Calculer les dégats
    	rand(5..15)
      end
    end
    
    class Jeu
      def self.actions_possibles(monde)
        puts "ACTIONS POSSIBLES :"
    
        puts "0 - Se soigner"
        puts "1 - Améliorer son attaque"
    
        # On commence à 2 car 0 et 1 sont réservés pour les actions
        # de soin et d'amélioration d'attaque
        i = 2
        monde.ennemis.each do |ennemi|
          puts "#{i} - Attaquer #{ennemi.info}"
          i = i + 1
        end
        puts "99 - Quitter"
      end
    
      def self.est_fini(joueur, monde)
        # A faire:
        # - Déterminer la condition de fin du jeu
    	if joueur.en_vie != true || monde.ennemis_en_vie.size == 0
      end
    end
    
    class Monde
      attr_accessor :ennemis
    
      def ennemis_en_vie
        # A faire:
        # - Ne retourner que les ennemis en vie
    	encore_en_vie = []
    	ennemis.each do |ennemi|
    	   if ennemi.en_vie
        encore_en_vie << ennemis
        end
      end
      encore_en_vie
      end
    end
    
    ##############
    
    # Initialisation du monde
    monde = Monde.new
    
    # Ajout des ennemis
    monde.ennemis = [
      Ennemi.new("Balrog"),
      Ennemi.new("Goblin"),
      Ennemi.new("Squelette")
    ]
    
    # Initialisation du joueur
    joueur = Joueur.new("Jean-Michel Paladin")
    
    # Message d'introduction. \n signifie "retour à la ligne"
    puts "\n\nAinsi débutent les aventures de #{joueur.nom}\n\n"
    
    # Boucle de jeu principale
    100.times do |tour|
      puts "\n------------------ Tour numéro #{tour} ------------------"
    
      # Affiche les différentes actions possibles
      Jeu.actions_possibles(monde)
    
      puts "\nQUELLE ACTION FAIRE ?"
      # On range dans la variable "choix" ce que l'utilisateur renseigne
      choix = gets.chomp.to_i
    
      # En fonction du choix on appelle différentes méthodes sur le joueur
      if choix == 0
        joueur.soin
      elsif choix == 1
        joueur.ameliorer_degats
      elsif choix == 99
        # On quitte la boucle de jeu si on a choisi
        # 99 qui veut dire "quitter"
        break
      else
        # Choix - 2 car nous avons commencé à compter à partir de 2
        # car les choix 0 et 1 étaient réservés pour le soin et
        # l'amélioration d'attaque
        ennemi_a_attaquer = monde.ennemis[choix - 2]
        joueur.attaque(ennemi_a_attaquer)
      end
    
      puts "\nLES ENNEMIS RIPOSTENT !"
      # Pour tous les ennemis en vie ...
      monde.ennemis_en_vie.each do |ennemi|
        # ... le héro subit une attaque.
        ennemi.attaque(joueur)
      end
    
      puts "\nEtat du héro: #{joueur.info}\n"
    
      # Si le jeu est fini, on interompt la boucle
      break if Jeu.est_fini(joueur, monde)
    end
    
    puts "\nGame Over!\n"
    
    # A faire:
    # - Afficher le résultat de la partie
    
    if joueur.en_vie
      puts "Vous avez gagné !"
    else
      puts "Vous avez perdu !"
    end
    end
    

    Merci d'avance pour votre aide ! Je continue à chercher de mon côté mais un peu d'aide serait le bienvenu !

    • Partager sur Facebook
    • Partager sur Twitter
      3 juillet 2019 à 15:17:25

      Salut,

      degats devrait renvoyer un entier, ce n'est pas le cas de la méthode définie à la ligne 51. C'est d'ailleurs ce que te dis l'erreur, il faut savoir lire les erreurs et les remonter.

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        3 juillet 2019 à 16:08:32

        yo@n97one a écrit:

        Salut,

        degats devrait renvoyer un entier, ce n'est pas le cas de la méthode définie à la ligne 51. C'est d'ailleurs ce que te dis l'erreur, il faut savoir lire les erreurs et les remonter.


        Merci beaucoup c'est bon pour cette erreur du coup ! Effectivement, j'ai un peu de mal à comprendre les erreurs affichées pour le moment, mais je commence à m'y faire. 

        • Partager sur Facebook
        • Partager sur Twitter

        Problème de code (jeu de l'activité du cours Ruby)

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown