Le @ indique qu’il s’agit d’une variable d’instance. Elles sont spécifique à chaque instance de la classe. Dans ton code, @points_de_vie est une variable d’instance (chaque personnage a ses points_de_vie).
Voici un exemple.
class Contact
attr_reader :nom
attr_accessor :numero
def initialize(nom, numero)
# @nom est le nom du contact qu’on est en train d’initialiser ici.
# Chaque personnage a son nom et son numéro.
@nom = nom
@numero = numero
end
def to_s
return "#{@nom} : #{@numero}"
end
end
lui = Contact.new("Elle", "123456789")
elle = Contact.new("Lui", "002345678")
puts lui
puts elle
contacts = []
puts "Voici la liste des contacts."
contacts << lui
contacts << elle
puts contacts
Mais quand je met les commandes d'exemple, sa me dit que ma commande n'est pas reconnu en tant que commande externe ou interne, un programme exécutable ou un fichier de commande.
irb singifie Interactive Ruby et permet d’entrer une instruction Ruby et de l’exécuter tout de suite. Regarde ici. Quand tu ouvres ta console, tu tapes irb et tu appuies sur Entrée pour lancer irb. Et là, tu peux entrer du code Ruby.
Il faut donc que je mette irb dans ma console avant de rentrer les commandes?
Tu as regardé le lien que j’ai donné plus haut. Je cite.
Une fois l’invite de commande ouverte, il faut taper irb. Nous avons maintenant une magnifique console qui interprète ce que nous écrivons en Ruby.
En lançant IRB, nous nous retrouvons face au symbole >. Ce chevron signifie une chose : IRB est à nos ordres, il attend nos instructions. Lorsqu’il nous « répond », sa réponse est située après le signe => sur une nouvelle ligne. Par exemple, en tapant 2 il répond 2 (oui, il répond bien 2).
Donc oui, tu ouvre ta console, tu tape irb et tu valides en appuyant sur Entrée.
Dans n'importe quel console ou il en faut une spécifique ?
Ça marche normalement dans n’importe quelle console si Ruby est installé et que son chemin est ajouté aux variable d’environnements de Windows (on te le propose à l’installation).
j'ai fait la 1ère partie du cours et j'ai un soucis pour le défi n°2 du TP, n'arrivant pas à trouver la solution après plusieurs essais, je voulais regarder l'aide idem pour la solution, une fenêtre noire s'affiche et s'en va en 1 seconde.
je précise que je travaille avec SublimeText3 et la console Cmder, tout fonctionne de ce côté puisque j'ai réussi à suivre le 1ère partie.
J'aurais voulu juste une aide pour le déni n°2 : je n'arrive pas à savoir comment afficher les valeurs d'une ville et de la durée.
J'imagine qu'on doit lire le tableau Voyages avec each puis utiliser un puts pour l'affichage. Mais mon problème est comment afficher les valeurs de villes et de durée ?
est-il possible aussi d'entrer deux variables après do ? comme ceci |ville,duree| ?
j'ai un problème à comprendre comment on peut déduire le nombre de dégâts q'un personne subit
ce nombre est random ou quoi ?
je parle de l'activité qu'on doit faire pour terminé le tuto de Ruby
Merci
Salut,
Je crois bien que c’est laissé à ton appréciation. Pour le hasard, voir la classe Random. Avec Random.rand(10), tu tires un nombre au hasard entre 0 et 10, mais tu peux aussi donner à rand un intervalle en paramètre (Random.random(2..10) te renverra un nombre entre 2 et 10).
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
if @en_vie
"#{@nom} (#{@points_de_vie}/100 pv)"
# - Renvoie le nom et "vaincu" si la personne a été vaincue
else
"#{@nom} (vaincu)"
end
end
def attaque(personne)
# A faire:
# - Fait subir des dégats à la personne passée en paramètre
subit_attaque(rand(25..50))######A refaire
# - Affiche ce qu'il s'est passé
puts "#{@nom} attaque #{personne}"
end
def subit_attaque(degats_recus)
# A faire:
# - Réduit les points de vie en fonction des dégats reçus
@points_de_vie-=degats_recus
# - Affiche ce qu'il s'est passé
puts "#{@nom} subit #{degats_recus}hp de dégats!"
# - Détermine si la personne est toujours en_vie ou non
puts "#{@nom} a été vaincu" unless @en_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é
end
def soin
# A faire:
# - Gagner de la vie
# - Affiche ce qu'il s'est passé
end
def ameliorer_degats
# A faire:
# - Augmenter les dégats bonus
# - Affiche ce qu'il s'est passé
end
end
class Ennemi < Personne
def degats
# A faire:
# - Calculer les dégats
100-points_de_vie
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 += 1
end
puts '99 - Quitter'
end
def self.est_fini(joueur, monde)
# A faire:
# - Déterminer la condition de fin du jeu
!joueur.en_vie && !monde.ennemis_en_vie.empty?
end
end
class Monde
attr_accessor :ennemis
# A faire:
# - Ne retourner que les ennemis en vie
def ennemis_en_vie
ennemis.select { |e| e.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
ici un problème s'affiche et il s'ffiche dans des déférent place dans ce code
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 += 1
end
puts '99 - Quitter'
end
il me dit que la table ennemis n'existe pas est la même chose pour les methodes
Je n’ai pas compris ton problème, peux-tu copier-coller l’erreur que tu obtiens. Sinon, par rapport au code.
Ce serait mieux de définir la méthode to_s à la place de la méthode infos (pour pouvoir écrire puts joueur).
On préfère les variables et méthodes du genre vivant? à la place de en_vie. D’ailleurs, ce serait mieux de faire une méthode vivant? plutôt que d’utiliser une variable. Cette méthode renverrait juste @points_de_vie > 0.
C’est plutôt #{@nom} attaque #{personne.nom}.
Si Jeu n’a pas vocation à être instancié, autant en faire un module.
Dans les actions possibles, on ne doit pouvoir attaquer que les ennemis encore en vie.
Tu es sûr que c’est exactement le code plus haut que tu utilises ? Je viens de le tester et je n’obtiens pas l’erreur que tu donnes (et monde.ennemis existe bien).
Avis perso, l'exercice proposé n'est pas très motivant.
Il aurait fallut un exercice guidé étape par étape.
C’est vrai que l’exercice final ne motive pas tout le monde et généralement ceux qui suivent le tutoriel trouvent qu’il n’est pas assez guidé et est d’un niveau trop élevé par rapport au reste du cours. Personnellement, j’ai juste survolé le tutoriel pour voir les points qu’il abordait et il est vrai que le tutoriel est assez léger. Tu trouveras d’autres ressources sur Internet (ou avec des livres) et tu peux poster sur le forum si tu as besoin d’aide.
× 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.