Tu ne fais pas ce qui est demandé dans ennemis_en_vie. Tu es censé renvoyer la liste des ennemis encore vivant apparemment. Avec ça, ton jeu sera fini si cette liste est vide ou si le joueur est mort.
PS : autant poster tout le code, ça permettra de donner des conseils dessus aussi.
Quand tu dis une liste, tu veux dire un tableau contenant les instances de Ennemi ?
Edit : j'ai supprimé mon code, ta réponse m'a apporté suffisemment d'indice pour que je me débrouille. Je tente de créer une variable "ennemis_en_vie" dans la class "Monde", d'y push/delete mes monstres s'ils sont en vie, et ça devrait marcher ! Je serai de retour lundi, j'suis déçu de pas être arrivé à finir le jeu
Je viens de finir les deux parties de ce cour et j'entame l'activité de créer le jeu de console textuel
a mon plus grand regret je rencontre une erreur que j'arrive pas a comprendre d'ou sa viens (de plus mon anglais n'est pas expérimenté malheureusement)
voici mon erreur
et voici mon code complet
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 en_vie
puts " # { @nom } ( # { @points_de_vie } / 100) "
else
puts " # { @nom } (vaincu) "
end
end
def attaque(personne)
puts " # { @nom } attaque # { personne.nom } ."
if self .class == Joueur
puts " # { @nom } possède # { degats_bonus } de bonus d'attaque. "
end
personne.subit_attaque (degats)
end
def subit_attaque(degats_recus)
@points_de_vie -= degats_recus
@en_vie = @points_de_vie > 0
puts " # { @nom } subit # { degats_recus } points de dégâts! "
end
end
class Joueur < Personne
attr_accessor :degats_bonus
def initialize(nom)
@degats_bonus = 0
super(nom)
end
def degats
1 + aléatoire.rand(40) + @degats_bonus
end
def soin
if @points_de_vie >= 100
puts " # { @nom } ne peut se soigner n'étant pas blessé (e). "
else
s = 1 + aléatoire.rand(40)
if (@points_de_vie + s) > 100
s = 100 - @points_de_vie
@points_de_vie = 100
else
@points_de_vie += s
end
puts " # { @nom } un regargné # { s } points de vie ( # { @points_de_vie } / 100). "
end
end
def ameliorer_degats
b = 5 + aléatoire.rand(30)
@degats_bonus += b
puts " # { @nom } gagne # { b } points de bonus de dégât (pour un bonus total de # { @degats_bonus } ) " .
end
end
class Ennemi < Personne
def degats
1 + aléatoire.rand(10)
end
end
class Jeu
def self.actions_possibles(monde)
puts " ACTIONS POSSIBLES: "
puts " 0 - Se soigner "
puts " 1 - Améliorer son 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)
if monde.ennemis_en_vie.size == 0 || ! joueur.en_vie
vrai
else
faux
end
end
end
class Monde
attr_accessor :ennemis
def ennemis_en_vie
vivants = []
@ennemis .each do | e |
if e.en_vie
vivants << e
end
end
vivants
end
end
monde = Monde.new
monde.ennemis = [
Ennemi.new(" Balrog "),
Ennemi.new(" Goblin "),
Ennemi.new(" Squelette ")
]
joueur = Joueur.new(" Jean-Michel Paladin ")
puts " \ n \ n Ainsi débutent les aventures de # { joueur.nom } \ n \ n "
100 .times do | tour |
puts " \ n ------------------ Tour numéro # { tour } ------------------ "
Jeu.actions_possibles(monde)
puts " \ n QUELLE ACTION FAIRE? "
choix = obtient.chomp.to_i
if choix == 0
joueur.soin
elsif choix == 1
joueur.ameliorer_degats
elsif choix == 99
Pause
else
ennemi_a_attaquer = monde.ennemis [choix - 2 ]
joueur.attaque(ennemi_a_attaquer)
end
puts " \ n LES ENNEMIS RIPOSTENT! "
monde.ennemis_en_vie.each do | ennemi |
ennemi.attaque (joueur)
end
puts " \ n Etat du héro: # { joueur.info } \ n "
pause if Jeu.est_fini(joueur, monde)
end
puts " \ n Game Over! \ n "
if joueur.en_vie
puts " Vous avez gagné, # { joueur.info } ! "
else
puts " Vous avez perdu! "
end
Je viens de finir les deux parties de ce cour et j'entame l'activité de créer le jeu de console textuel
a mon plus grand regret je rencontre une erreur que j'arrive pas a comprendre d'ou sa viens (de plus mon anglais n'est pas expérimenté malheureusement)
voici mon erreur
Alors expecting keyword_end signifie que le code s'attend a un "end" a la fin de ton code
c'est fait, ensuite je fais "cd documents", ca fonctionne, seulement comment le dossier doit s'afficher dans mes documents ? ou alors c'est un document fictif ?
cd veut dire change directory, ça te permet de changer de répertoire, ls te permet de lister les fichiers et dossiers du dossier où te situe. Ce que tu veux faire, c'est aller dans le dossier où tu as créé le fichier ruby à l'aide de cd.
J'ai beaucoup de mal avec le dernier exercice. Il aurait plutôt fallu des exercices médians. Possible d'avoir accès à une correction/explication pas à pas?
On peut t'aider à le faire, poste ce que tu as déjà fait et on t'aidera. Effectivement, le tutoriel d'OC sur Ruby manque d'exemples et de pratique, et est plutôt léger.
Bonjour, j'ai commencé ruby il y a peut de temps et je suis arrivé à l'exercice final j'ai un petit problème qui sera sûrrement réglé rapidement, mais je ne comprend pas du tout cette erreur si quelqu'un pourrais m'aider je serais ravi merci d'avance
Pourrais tu m'éclairé un peux plus car je comprend bien ce qu'on me demande, mais je comprend pas ce qu'il faut que je lui donne a dégats_reçus et je ne comprend pas non plus ce que je doit faire exactement sur cette méthode
J'ai pas suivi le cours d'OC, mais il semble plutôt mal foutu sur ce point. De ce que je comprends après avoir vu passer plusieurs posts sur le sujet, tu peux gérer ça comme tu veux. La plupart des gens semblent le gérer en tirant un nombre de dégâts au hasard (entre un nombre minimum et un nombre maximum de dégâts). La méthode rand du module Random te permettra de tirer des nombres au hasard.
C'est normal, dans info tu fais un appel à puts, cet appel à puts est réalisé avant celui où tu demandes à afficher « <nim> - Attaquer <infos> ». La solution est de faire info renvoyer une chaîne de caractères plutôt que l'afficher. On pourrait même faire mieux et définir une méthode to_s ce qui permettra d'écrire puts ennemi et d'avoir les infos.
class Person
attr_reader :name, :hp
def initialize(name)
@name = name
@hp = 100
end
def alive?
@hp > 0
end
def to_s
"#{@name} : #{@hp}/100 pv"
end
end
p1 = Person.new("p1")
p2 = Person.new("p2")
puts p1
puts p2
Bonjour, j'ai fait le TP , mais je n'ai pas compris comment retourner que les ennemis en vie
J'ai vu que quelqu'un a fait ça, quelque peux m'expliquer svp ?
class Monde
attr_accessor :ennemis
def ennemis_en_vie
# A faire:
# - Ne retourner que les ennemis en vie
vivants = []
@ennemis .each do | e |
if e.en_vie
vivants << e
end
end
vivants
end
end
On créee une liste vide vivants, on parcourt les ennemis, et on rajoute à vivants les ennemis vivants. Et à la fin on retourne vivants. En fait, un code qui suit plus le style de Ruby serait @ennemis.select(&:en_vie). Note de plus, qu'en Ruby on préfère une indentation de deux espaces.
EDIT : éditeur d'OC totalement bugué, il faut remplacer & par &.
× 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.
Architecte logiciel - Software craftsmanship convaincu.
Architecte logiciel - Software craftsmanship convaincu.