Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème mini jeu

    10 novembre 2017 à 22:53:22

    Bonjour je fais la formation sur le Ruby et je suis à rien de terminer le dernier exercice, voila ca fait un moment que je tourne en rond je n'arrive pas à trouver une solution pour infliger les dégâts je vous pose la partie du code qui le gère, jai déjà essayé des tas de choses mais pas moyen de trouver il est fort possible que je passe à coté d'un énorme bêtise :D

     def attaque(personne)
    	
    	personne.subit_attaque
    	
    	puts "\n#{nom} attaque et inflige #{degats} à #{personne.nom}"
    	
    	# A faire:
        # - Fait subir des dégats à la personne passée en paramètre
        # - Affiche ce qu'il s'est passé
    
      end
    
      def subit_attaque(degats_recus)
      
      points_de_vie =- degats
      
      if points_de_vie >= 1
    	en_vie = true
    	puts "points de vie restants : " + points_de_vie
      end
      end



    • Partager sur Facebook
    • Partager sur Twitter
      11 novembre 2017 à 2:00:33

      Salut,

      Dans ta méthode subit_attaque, tu dois retirer degats_recus (et non degats) à @points_de_vie (et pas à points_de_vie). De plus, je te conseille de plutôt avoir une méthode vivant? plutôt qu’un booléen en_vie et d’utiliser l’interpolation pour afficher une variable (à la place de la concaténation ligne 19).

      • Partager sur Facebook
      • Partager sur Twitter
      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        11 novembre 2017 à 10:53:41

        Salut, Merci pour tes conseils même si mon problème n'est pas encore résolu ils ont tout de même étés utiles :) 

        • Partager sur Facebook
        • Partager sur Twitter
          11 novembre 2017 à 11:15:00

          Poste le reste de ton code, et dis-nous le problème que tu as.

          • Partager sur Facebook
          • Partager sur Twitter
          Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
            11 novembre 2017 à 11:17:34

            Le voila , j'ai quelques petites choses a retoucher en dehors de mon problème mais rien de très important, le problème est que le jeu fonctionne et se déroule normalement sauf que les dégats ne s'appliquent pas.

            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
              
            	 if points_de_vie >= 1
            	puts "\n#{nom} (#{points_de_vie}/100pv)"
            	
            	else
            	puts nom + " (mort)"
            	end
            
              end
            
              def attaque(personne)
            	
            	subit_attaque(personne)
            	
            	puts "\n#{nom} attaque et inflige #{degats} à #{personne.nom}"
            
              end
            
              def subit_attaque(degats_recus)
              
                degats_recus= points_de_vie - degats 
              
              if points_de_vie >= 1
            	en_vie = true
            	puts "points de vie restants : #{points_de_vie}"
              end
              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
            	
            	rand(30 .. 50) + degats_bonus  
              end
            
              def soin
            
            	if points_de_vie == 100
            	puts "\nVous avez déjà toute votre vie"
            	end
            	
              end
            
              def ameliorer_degats
            	
            	degats_bonus = 20
            	puts "\n ↑↑ dégats augnmentés de #{degats_bonus} ↑↑"
            	
              end
            end
            
            class Ennemi < Personne
              def degats
              
               rand(5 .. 15)
              end
            end
            
            class Jeu
              def self.actions_possibles(monde)
                puts "ACTIONS POSSIBLES :"
            
                puts "0 - Se soigner"
                puts "\n1 - 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 "\n99 - Quitter"
              end
            
              def self.est_fini(joueur, monde)
            	
              end
            end
            
            class Monde
              attr_accessor :ennemis
            
              def ennemis_en_vie
                # A faire:
                # - Ne retourner que les ennemis 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
            
            	puts "Jean-Michel Paldin, vie: 100pv"
            	
            100.times do |tour|
              puts "\n------------------ Tour numéro #{tour} ------------------"
              
              # Affiche les différentes actions possibles
              Jeu.actions_possibles(monde)
            
              puts "\nQUELLE ACTION FAIRE ?\n\n"
              # 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.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
            
            
            
            
            



            • Partager sur Facebook
            • Partager sur Twitter
              11 novembre 2017 à 11:42:50

              Regarde ce que subit_degat prend en paramètre, c’est le nombre de dégâts et pas la personne. Donc c’est plutôt personne.subit_degat(nombre_degats).

              • Partager sur Facebook
              • Partager sur Twitter
              Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                11 novembre 2017 à 12:01:38

                Je vois bien ce que tu veux dire je suis d'accord mais dans tout les cas la console dit que personne est une méthode ou une variable indéfinie pour Joueur

                -
                Edité par TheFlexingPickle 11 novembre 2017 à 12:01:59

                • Partager sur Facebook
                • Partager sur Twitter
                  11 novembre 2017 à 12:08:37

                  Regarde essaye avec ça.

                    def attaque(personne)
                      personne.subit_attaque(10)
                      puts "\n#{nom} attaque et inflige #{degats} à #{personne.nom}"
                    end
                   
                    def subit_attaque(degats_recus)  
                      @points_de_vie -= degats_recus
                      if @points_de_vie &gt;= 1
                        en_vie = true
                        puts "points de vie restants : #{@points_de_vie}"
                      end
                    end
                  

                  Tu comprends ce code ? Là, il te reste à trouver par quoi remplacer 10 pour retirer le bon nombre de dégâts.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                    11 novembre 2017 à 12:21:53

                    C'est bon j'ai trouvé merci beaucoup, il y a juste ce petit morceau que je ne comprends pas alors je l'ai remplacé.

                    Merci à toi pour ta patience. :D

                    &gt;= 1
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 novembre 2017 à 12:41:46

                      Bonne continuation. Pour le morceau que tu ne comprends pas, c’est juste l’éditeur d’OpenClassrooms qui est bugué...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                        12 novembre 2017 à 19:56:45

                        Ah d'accord , encore merci à toi.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 février 2018 à 14:20:28

                          Bonjour

                          Vu que ce topic a été ouvert, j'en profite :)

                          Je rencontre de sérieux problèmes avec le TP du mini jeu.

                          Non seulement le programme ne fonctionne pas, mais je ne comprend pas pourquoi...

                          Voici le code... (désole, je ne sais pas copier coller du sublimetext avec l'effet qui va bien).

                          Merci d'avance

                          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
                              if personne.points_de_vie > 0
                                      # - Renvoie le nom et les points de vie si la personne est en vie
                                puts "\n#{nom} a encore #{points_de_vie}"
                              else
                                  # - Renvoie le nom et "vaincu" si la personne a été vaincue
                                puts "\n#{nom} est décédé"
                              end
                            end

                            def attaque(personne)
                              # A faire:
                              # - Fait subir des dégats à la personne passée en paramètre
                              subit_attaque(personne)
                              # - Affiche ce qu'il s'est passé
                                puts "\n#{nom} à infligé #{degats} à #{personne.nom}"
                            end

                            def subit_attaque(degats_recus)
                              # A faire:
                              # - Réduit les points de vie en fonction des dégats reçus
                              points_de_vie == points_de_vie - degats_reçus

                              # - Affiche ce qu'il s'est passé
                                puts "\n#{nom} a subi #{degats_reçus}"
                              # - Détermine si la personne est toujours en_vie ou non
                               if points_de_vie > 0
                                en_vie = true
                                puts "\n#{nom} a encore #{points_de_vie}"
                               end
                            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
                              degat_joueur == degats + degats_bonus
                              # - Affiche ce qu'il s'est passé
                              puts "\n#{nom} a encore #{points_de_vie}"
                            end

                            def soin
                              # A faire:
                              # - Gagner de la vie
                              if personne.points_de_vie == 100
                                 puts "\n{nom} est full PV"
                              else
                                soins == 20 + "PV"
                                personnes.point_de_vie == point_de_vie + soins
                              end
                              
                              soins == 20 + "PV"
                              # - Affiche ce qu'il s'est passé
                              puts "\n{nom} a #{points_de_vie}"
                            end

                            def ameliorer_degats
                              # A faire:
                              # - Augmenter les dégats bonus
                                  degats_bonus = 20
                              # - Affiche ce qu'il s'est passé
                                  puts "\n{nom} inflige #{degats_bonus} dégats supplémentaires!"
                            end
                          end

                          class Ennemi < Personne
                            def degats
                              # A faire:
                              # - Calculer les dégats
                              rand(1 .. 20)
                            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
                            end
                          end

                          class Monde
                            attr_accessor :ennemis

                            def ennemis_en_vie
                              # A faire:
                              # - Ne retourner que les ennemis en vie
                              if ennemi.points_de_vie == 0
                                puts ennemi " est décédé "
                            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("Bob le trolliste")

                          # 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

                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 février 2018 à 15:20:35

                            Salut,

                            Utilise les balises de code (le bouton < / > de l’éditeur) pour poster du code. Quand tu dis qu’il ne fonctionne pas, ça veut dire quoi ? Si tu obtiens une erreur, laquelle, s’il ne fait pas ce qui est attendu, que fait-il ?

                            -
                            Edité par yo@n97one 24 février 2018 à 15:48:21

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                              24 février 2018 à 15:52:06

                              La console signale des points de blocage (variables vides, etc...) notamment aux lignes 23, 31, et 214.

                              Apparement, mes méthodes attaque, subit attaque, et ennemis_en_vie ne fonctionnent pas.

                              Mais je ne sais pas pourquoi...

                              par exemple, la ligne 29 :

                                points_de_vie -= degats_recus

                              me donne le résultat suivant :

                              Bob le trolliste inflige 0 dégats supplémentaires !
                              TP_jeu_RChazal.rb:29:in `subit_attaque': undefined method `-' for nil:NilClass (NoMethodError)
                                      from TP_jeu_RChazal.rb:23:in `attaque'
                                      from TP_jeu_RChazal.rb:171:in `block in <main>'
                                      from TP_jeu_RChazal.rb:147:in `times'
                                      from TP_jeu_RChazal.rb:147:in `<main>'

                              C:\Users\Richard\Desktop\Projets informatiques\Open Classroom Ruby\C1_RubyBase>

                              yo@n97one a écrit:

                              Salut,

                              Utilise les balises de code (le bouton < / > de l’éditeur) pour poster du code. Quand tu dis qu’il ne fonctionne pas, ça veut dire quoi ? Si tu obtiens une erreur, laquelle, s’il ne fait pas ce qui est attendu, que fait-il ?

                              -
                              Edité par yo@n97one il y a moins de 30s



                              -
                              Edité par RichardChazal1 24 février 2018 à 16:42:16

                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 février 2018 à 11:59:36

                                Tu dois toujours lire toutes les erreurs. Je lance ton programme, premier problème à la ligne 11, ce que tu veux c’est @points_de_vie, pas personne.points_de_vie.

                                Tu dois régler les problèmes un par un. Après avoir réglé ce premier problème, j’essaye l’action « se soigner », problèmes à la ligne 72 à cause de plusieurs == à la place de =, etc.

                                Je te laisse essayer de régler tous les problèmes, si certains points te bloquent, n’hésite pas à revenir. :)

                                -
                                Edité par yo@n97one 25 février 2018 à 12:08:43

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                                  25 février 2018 à 14:41:34

                                  Merci !

                                  J'ai pu enfin créer le mini jeu fonctionnel.

                                  Bon, c'est pas la panacée, mais au moins il tourne !

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Problème mini jeu

                                  × 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