Concrètement, cela signifie que si je suis votre cours sur Ruby, a la fin du cours, je serais capable un jeu tel que Call of Duty (pour ne citer que lui) ?
Concrètement, a la fin de votre cours, on est capable de faire quoi sur Ruby ?
Concrètement, cela signifie que si je suis votre cours sur Ruby, a la fin du cours, je serais capable un jeu tel que Call of Duty (pour ne citer que lui) ?
Concrètement, a la fin de votre cours, on est capable de faire quoi sur Ruby ?
Merci d'avance.
Bonjour,
A la fin du cours, tu seras capable de comprendre les concepts de programmation orienté objet, et donc améliorer ton style général de programmation. En terme de ce que tu peux réaliser concrètement, tu pourras créer de petits programmes simples (ouvrir un fichier, manipuler des données...). Le cours te permettra surtout d'avoir une bonne base pour apprendre plus sur le sujet, et te lancer dans le developpement d'app web complexes avec Ruby on Rails.
Tu pourras également créer de petits jeux simples, sous forme de texte. En poussant plus loin, tu pourras utiliser ce langage pour des projets plus compliqués. Par contre Ruby ne te permettra pas de faire un jeu tel call of duty, principalement parce qu'un tel jeu demande des équipes de centaines de personnes. Si tu veux être capable de réaliser des jeux, peut être que tu pourrais jeter un oeil du côté du cours sur Unity: https://openclassrooms.com/courses/realisez-votre-premier-jeu-video-avec-unity
Bonjour! Tout d'abord, bravo Marc! J'ai longtemps cherché le langage qui était fait pour moi, et grâce à vous, je l'ai trouvé! J'apprécie particulièrement la facultée de Ruby à être mis en place très rapidement! Cependant, je n'arrive pas à passer la première étape de ce chapitre (https://openclassrooms.com/courses/lancez-vous-dans-la-programmation-avec-ruby/faites-de-belles-boucles-avec-les-iterateurs). Comment mettre le DOS et l'éditeur de texte (en l’occurrence Notepad++) dans le même fichier? Et comment nettoyer la console? Le Ctrl+L ne fonctionne pas. J'ai pourtant bien vérifié que le DOS soit paramétré pour.
Je bloque sur l'activité. Dans le code de base, je remplis les
# A faire
mais la méthode
def degats
n'est même pas utiliser dans la boucle de jeu principa.
Est-ce qu'on doit coder même quand ce n'est pas préciser de le faire? Ou peut-on appeler une méthode dans une autre méthode ? (j'avoue que je sais pas trop quoi faire)
attr_accessor :nom, :points_de_vie, :en_vie
attr_accessor :degats_bonus
J'appelle ça personnellement les propriétés d'un objet (ou d'une instance de classe si vous préférez) mais quand dans dans les méthodes soin et degats_bonus, je tente de modifier une propriété tel que:
def soin
# A faire:
# - Gagner de la vie
points_de_vie += 25
# - Affiche ce qu'il s'est passé
puts nom + " regagne de la vie"
end
def ameliorer_degats
# A faire:
# - Augmenter les dégats bonus
degats_bonus += 30
# - Affiche ce qu'il s'est passé
puts nom + " gagne en puissance !"
end
Il y a une erreur du genre:
undefined method '+' for nil:NilClass (NoMethodError)
...quand je tape 0 pour Se soigner ou 1 pour Améliorer son attaque. Why ?
remarque supplémentaire: on peut utiliser les accents comme ça sans préciser l'encodage ?
- Edité par Quentin Saison le 24 août 2015 à 13:16:40
Le DOS et ton éditeur de texte dans la même console ?
Si tu regardes ce qui t'est demandé, tu dois créer un fichier Ruby vide. Ensuite, tu ouvres ce fichier dans ton éditeur de texte, et dans un même temps, ta console est ouverte pour pouvoir tester et exécuter ton code. Je ne vois pas ou est le problème (?).
Ensuite, qu'entends tu par nettoyer la console ? Si tu veux effacer ce qui a été affiché précédemment, tu peux tout simplement utiliser la commande
- Edité par Quentin Saison le 24 août 2015 à 13:16:40
Le DOS et ton éditeur de texte dans la même console ?
Si tu regardes ce qui t'est demandé, tu dois créer un fichier Ruby vide. Ensuite, tu ouvres ce fichier dans ton éditeur de texte, et dans un même temps, ta console est ouverte pour pouvoir tester et exécuter ton code. Je ne vois pas ou est le problème (?).
Ensuite, qu'entends tu par nettoyer la console ? Si tu veux effacer ce qui a été affiché précédemment, tu peux tout simplement utiliser la commande
cls
Merci pour la commande Et j'ai eu ma réponse sur un autre sujet, je faisais le ruby boucles.rb dans irb.
Je bloque sur l'activité. Dans le code de base, je remplis les
# A faire
mais la méthode
def degats
n'est même pas utiliser dans la boucle de jeu principa.
Est-ce qu'on doit coder même quand ce n'est pas préciser de le faire? Ou peut-on appeler une méthode dans une autre méthode ? (j'avoue que je sais pas trop quoi faire)
attr_accessor :nom, :points_de_vie, :en_vie
attr_accessor :degats_bonus
J'appelle ça personnellement les propriétés d'un objet (ou d'une instance de classe si vous préférez) mais quand dans dans les méthodes soin et degats_bonus, je tente de modifier une propriété tel que:
def soin
# A faire:
# - Gagner de la vie
points_de_vie += 25
# - Affiche ce qu'il s'est passé
puts nom + " regagne de la vie"
end
def ameliorer_degats
# A faire:
# - Augmenter les dégats bonus
degats_bonus += 30
# - Affiche ce qu'il s'est passé
puts nom + " gagne en puissance !"
end
Il y a une erreur du genre:
undefined method '+' for nil:NilClass (NoMethodError)
...quand je tape 0 pour Se soigner ou 1 pour Améliorer son attaque. Why ?
remarque supplémentaire: on peut utiliser les accents comme ça sans préciser l'encodage ?
La raison pour laquelle on définit cette méthode est pour une gestion plus simple du calcul des dégâts. Tu comprendra l'utilité quand tu voudras envoyer des dégâts à un personnage...
- Edité par Jimvy 28 août 2015 à 23:50:05
Avant de poser une question sur les forums : Let me Google that for you (ou Google si vous préférez être direct).Lisez aussi les différents messages d'un sujet avant de poser une question qui pourrait déjà y avoir été répondu...
je suis arrivé sur l'activité à faire à la fin du cours mais je bloque un peu sur la logique et je vois pas trop quoi faire. Dans la méthode attaque doit-je définir le nombre de dégât à effectuer puis faire appelle dans cette méthode de la méthode subit_attaque pour les retirer?
voici le code que j'ais fais :
def attaque(personne)
degat = rand(30..40)
puts "#{nom} attaque #{personne.nom}"
personne.subit_attaque(degat)
# 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)
personne.points_de_vie -= degats_recus
puts "#{personne.nom} a subit #{degats_recus}hp de degat "
# 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
end
Déjà fais gaffe aux variables : utilise self.points_de_vie ou @points_de_vie pour désigner les PV de ton personnage.
Avant de poser une question sur les forums : Let me Google that for you (ou Google si vous préférez être direct).Lisez aussi les différents messages d'un sujet avant de poser une question qui pourrait déjà y avoir été répondu...
C'est justement ce que je voulais dire (même si c'était mal exprimé ) :
Le problème, c'est que dans le bloc de code qui contient la ligne 11, tu n'as aucune variable nommée "personne" : tu as juste ta classe nommée "Personne".
Dans "def attaque" (lignes 1 à 8), tu peux utiliser ta variable personne car tu as une variable nommée personne : l'argument reçue dans ta fonction.
Mais dans "def subit_attaque" (lignes 10 à 17), tu n'as aucune variable nommée personne. Ici, les points_de_vie sont ceux de l'objet actuel, auquel tu appliques la méthode.
Aussi, tu dois appeler la variable points_de_vie relatif à l'objet actuel, et cela se fait en utilisant @points_de_vie, ou en utilisant self.points_de_vie.
(Oui, ça n'a pas été dit dans le cours ^^.)
Avant de poser une question sur les forums : Let me Google that for you (ou Google si vous préférez être direct).Lisez aussi les différents messages d'un sujet avant de poser une question qui pourrait déjà y avoir été répondu...
class Exemple
attr_accessor :nom, :age
def initialize(nom, age)
@nom = nom
@age = age
end
def sePresenter
puts "Je suis #{@nom} et j'ai #{@age} ans."
end
end
toto = Exemple.new("Toto", 10)
toto.sePresenter #affiche "Je suis Toto et j'ai 10 ans."
@nom permet d'accéder à la variable nom de l'objet que l'on crée (ici, l'objet toto), de la même manière que self.age accède à la variable age de toto.
(En réalité, c'est encore plus compliqué que ça, mais bon.)
Avant de poser une question sur les forums : Let me Google that for you (ou Google si vous préférez être direct).Lisez aussi les différents messages d'un sujet avant de poser une question qui pourrait déjà y avoir été répondu...
Jimvy je vois pas pourquoi on doit mettre @ ou self. avant d'utiliser nom et age. Ce sont des propriétés de ta classe exemple et sePresenter est une méthode de cette même classe donc tes variables nom et age sont reconnus normalement et dans le cours le professeur réutilise bien les attr_accessor dans les méthodes sans ajouter @ ou self. Il n'utilise le @ que pour la méthode initialise.
Moi avec ruby j'ai toujours du mal à trouver comprendre les erreurs qu'il me renvoit.
J'ai été obligé d'utiliser des méthodes dans des objets que je passais en paramètre je sais mêmepas si on peut le faire. On me renvoit des erreurs dans des lignes où il y a rien de spécial:
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
return nom + " (#{points_de_vie}/100 pv)" if en_vie == true
# - Renvoie le nom et "vaincu" si la personne a été vaincue
return nom + " (vaincu)"
end
def attaque(personne)
# A faire:
# - Fait subir des dégats à la personne passée en paramètre
personne.points_de_vie -= 15
# - Affiche ce qu'il s'est passé
puts nom + " attaque " + 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 -= 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
if points_de_vie <= 0
en_vie = false
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
# - Affiche ce qu'il s'est passé
end
def soin
# A faire:
# - Gagner de la vie
points_de_vie += 25
# - Affiche ce qu'il s'est passé
puts nom + " regagne de la vie"
end
def ameliorer_degats
# A faire:
# - Augmenter les dégats bonus
degats_bonus += 30
# - Affiche ce qu'il s'est passé
puts nom + " gagne en puissance !"
end
end
class Ennemi < Personne
def degats
# A faire:
# - Calculer les dégats
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
i = 0
monde.ennemis.each do |ennemi|
if ennemi.en_vie == false
i += 1
if i == 3
return true
elsif joueur.en_vie == false
return true
else
return false
end
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
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)
puts joueur.nom + " profite de #{joueur.degats_bonus} points de dégats bonus"
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
Ah oui c'est vrai j'avais oublié que Ruby était un de ces langages interprétés où la syntaxe change à chaque ligne.
En théorie, on doit mettre les @ partout, mais Ruby est intelligent, ce qui fait qu'on ne doit pas en mettre partout.
Je m'explique. Dans la méthode initialize, on a accès à deux variables nom : la première est la propriété nom de l'objet/classe, la deuxième est l'argument de la méthode. Dans ce cas, on différencie les deux en utilisant self.nom ou @nom (plus court) pour désigner la propriété.
Normalement, on devrait mettre des @ un peu partout. Mais, comme Ruby est assez flexible, il est capable de comprendre tout seul si nom réfère à la propriété, ou à une variable, ce qui fait qu'en effet, on n'en a pas besoin tout le temps.
Concrètement, il faut utiliser @ chaque fois que Ruby est susceptible de se méprendre, c'est-à-dire chaque fois qu'une propriété et une autre variable ont le même nom.
Néanmoins, mettre des @ permet aussi de voir directement les endroits où on utilise des propriétés, ça permet d'augmenter un peu la lisibilité du code.
(J'avais fait un magnifique exemple basé sur l'emploi d'une méthode changerNom dans le cas où on utiliserait un attr_reader à la place d'un attr_accessor, mais ça me semble un peu complexe. )
Pour tes erreurs : 2 end manquant à la ligne +/- 106 pour clore le monde.ennemis.each do et son if. La première erreur veut dire que tu déclares une classe dans une méthode, ce qui est interdit (encore que, je trouve que ça pourrait avoir son sens), et ça vient sans doute d'un end oublié quelque part... Pour bien voir ces types d'erreurs, tu peux utiliser un éditeur comme Notepad++ (encore lui, eh oui) qui indique dans la marge la hiérarchie dedef/do/if - end.
Ça élimine tes erreurs, mais en crée d'autres (entre autre, ton programme boucle).
Aussi, évite de mettre ton code en entier sur le site, pour éviter de donner une solution toute faite aux flemmards.
Par contre, je n'ai pas compris
« J'ai été obligé d'utiliser des méthodes dans des objets que je passais en paramètre je sais mêmepas si on peut le faire. »
Tu voulais dire quoi par là ?
Avant de poser une question sur les forums : Let me Google that for you (ou Google si vous préférez être direct).Lisez aussi les différents messages d'un sujet avant de poser une question qui pourrait déjà y avoir été répondu...
est-ce que comme le Python, Ruby est un langage... comment on dit déjà? Ceux qui sont compatibles avec tous les OS sans modification du code Et peut-on lire un programme en Ruby si on a pas installé IRB? Et, dernière question, peut-on créer une interface graphique?
Ruby est un langage interprété, ce qui signifie qu'il n'est compilé et exécuté que sur la machine de l'utilisaheur final. Il a donc le potentiel d'être exécuté sur différents systèmes d'exploitation. Je dis bien qu'il a le potentiel, car il faut que ton programme n'utilise pas de fonctionnalités spécifiques à l'OS, et il faut que l'interpréteur soit disponible sur l'OS cible.
Non, Ruby nécessite un interpréteur pour fonctionner. Mais coup de chance, en général, sur GNU/Linux et sur Mac OS X, c'est déjà compris dans l´OS même. Il n'y a que sur Windows, ou presque, où il faut en installer un.
Il y a différentes bibliothèques permettant de réaliser une GUI avec Ruby, dont Shoes et QtRuby (ils ont été énoncé plus haut ; ce serait bien de lire tout le sujet avant de demander :-p ). Concernant Shoes, je n'ai pas réussi à le faire fonctionner chez moi.
- Edité par Jimvy 5 septembre 2015 à 12:45:14
Avant de poser une question sur les forums : Let me Google that for you (ou Google si vous préférez être direct).Lisez aussi les différents messages d'un sujet avant de poser une question qui pourrait déjà y avoir été répondu...
Ruby est un langage interprété, ce qui signifie qu'il n'est compilé et exécuté que sur la machine de l'utilisaheur final. Il a donc le potentiel d'être exécuté sur différents systèmes d'exploitation. Je dis bien qu'il a le potentiel, car il faut que ton programme n'utilise pas de fonctionnalités spécifiques à l'OS, et il faut que l'interpréteur soit disponible sur l'OS cible.
Non, Ruby nécessite un interpréteur pour fonctionner. Mais coup de chance, en général, sur GNU/Linux et sur Mac OS X, c'est déjà compris dans l´OS même. Il n'y a que sur Windows, ou presque, où il faut en installer un.
Il y a différentes bibliothèques permettant de réaliser une GUI avec Ruby, dont Shoes et QtRuby (ils ont été énoncé plus haut ; ce serait bien de lire tout le sujet avant de demander :-p ). Concernant Shoes, je n'ai pas réussi à le faire fonctionner chez moi.
- Edité par Jimvy il y a environ 1 heure
Merci beaucoup Et désolé, je n'ai pas eu le courage de lire les 5 pages ^-^
× 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.
mais la méthode