IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Ruby Discussion :

Débutant en Ruby - Problème sur un programme


Sujet :

Ruby

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut Débutant en Ruby - Problème sur un programme
    Bonjour,

    Je débute en Ruby, et j'essaie de "traduire" un programme Java en Ruby. Je tiens à signalier que je ne suis pas non plus une foudre de guerre en Java ...

    Le programme crée un tableau de conversion entre Fahrenheit et Celsius (on sélectionne une température de début, une température de fin, un pas, et on obtient un tableau de conversion).

    Bref, rien d'exceptionnel, mais je rencontre des problèmes tout simples ...

    La seule aide que j'ai est des tutoriels sur le net. Et dans aucun, je n'ai pu trouver le moyen (sûrement tout bête) de mettre plusieurs expressions conditionnelles dans un if ... En d'autres termes, je ne sais pas comment faire le || du Java.

    Tant qu'à faire, je vais vous donner tout le code Java (que j'ai trouvé dans un tutoriel) et tout mon code Ruby. Si vous pouviez m'indiquer mes erreurs, ce serait cool Merci d'avance !


    PROGRAMME JAVA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    class Sdz1 {
        public static void main(String[] args) {
           //Notre objet Scanner
    Scanner sc = new Scanner(System.in);
     
    //initialisation des variables
            double c, f=0;
    int i,j=0;
    char reponse=' ';
     
    System.out.println(" ------------------------------------------------------------------------");
    System.out.println("|             CONVERSION DEGRES CELSIUS ET DEGRES FARENHEIT                |");
    System.out.println(" ------------------------------------------------------------------------");
     
    do{//tant que reponse = O//boucle principale
     
        do{//tant que l'imprimante n'est pas prête//boucle de test pour savoir si l'utilisateur est prêt
     
            do {// tant que valeur impossible rentrée
     
    //saisie des valeurs
                System.out.println("A partir de :");//affichage des directives et récupération des données
                c = sc.nextDouble();
     
                System.out.println("jusqu' à:");
                i = sc.nextInt();
     
                System.out.println("Par pas de :");
                j = sc.nextInt();
     
                if (c > i || j > i || j == 0)
                    System.out.println("Traitement impossible");
     
            }while(c > i || j > i || j == 0);
     
            do {//tant que la reponse n'est pas O ou N
     
                System.out.println("Assurez-vous que l'imprimante est prête");
                System.out.println("Si vous êtes prêt, tapez O, sinon tapez N");
                //sc.reset();
                reponse = sc.next().charAt(0);
     
            }while (reponse != 'O' && reponse != 'N');
     
        }while (reponse == 'N');
     
    //                                                                    Traitement des valeurs
        System.out.println("TABLE DE CONVERSION CELSIUS / FARENHEIT");
        System.out.println("---------------------------------------------");
        System.out.println("       Celsius      |       Farenheit       ");
        System.out.println("---------------------------------------------");
     
        do{//tant que l'affichage n'est pas fini, on boucle les données et les calculs
     
            f = ((9.0/5.0) * c) + 32.0;
            if (c < 10)//si le Celsius n'a qu'un chiffre, on affiche un certain nombre d'espaces
                System.out.println("         "+c+"        |         "+arrondi(f,1));
     
            else
            {
                if(c < 100)//S'il y a un chiffre en plus, on enlève un espace blanc...
                    System.out.println("        "+c+"        |         "+arrondi(f,1));
                else
                    System.out.println("        "+c+"       |         "+arrondi(f,1));
            }
     
            c = c + j;//On incrémente le degré Celsius avec le pas
     
        }while (c <= i);
     
        do{
     
            System.out.println("Souhaitez-vous éditer une autre table ?(O/N)");
            reponse = sc.next().charAt(0);
     
        }while(reponse != 'O' && reponse != 'N');
     
    }while(reponse == 'O');
     
    System.out.println("Au revoir !");
     
    //Fin de programme
    }
     
    public static double arrondi(double A, int B) {
            return (double) ( (int) (A * Math.pow(10, B) + .5)) / Math.pow(10, B);
    }
     
     
     
    }

    PROGRAMME RUBY :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    class Celfar
      conversion = Celfar.new
     
      puts "Tableau de conversion Fahrenheit - Celsius"
     
      begin
     
        begin
     
          begin
     
            puts "A partir de :"
            c = gets.chomp.to_i
            puts c
     
            puts "Jusqu'à :"
            i = gets.chomp.to_i
            puts i
     
            puts "Par pas de :"
            j = gets.chomp.to_i
            puts j
     
            if (c>i & j>i & j == 0)
              puts "Traitement impossible"
            end
     
          end while (c>i & j>i & j == 0)
     
          begin
     
            puts "Si vous êtes prêts, tapez O, sinon tapez N"
            reponse = gets.chomp.to_s
     
          end while (reponse != O & reponse != N)
     
        end while (reponse == N)
     
      puts "Tableau de conversion"
      puts "Celsius | Fahrenheit"
     
      begin
     
        f = ((9.0/5.0) * c) + 32.0
        puts c + " | " + f
        c=c+j
     
      end while (c<=i)
     
      begin
     
        puts "Souhaitez-vous éditer une autre table ?"
        reponse = gets.chomp.to_s
     
      end while (reponse != O & reponse != N)
     
    end while (reponse == O)
     
    puts "Au revoir !"
     
     
    end
    Je précise que mes begin ... end while *** sont le seul moyen que j'ai trouvé pour faire des do ... while (et non pas des while ... do)

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Salut,

    Le ou-logique s'écrit aussi || comme en Java. Par ailleur, toujours comme en Java, le et-logique s'écrit &&, l'opérateur & est un et-binaire.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (machin && truc || bidule) {
     
    }
     
    devient:
     
    if machin && truc || bidule
     
    end
    Note que Ruby possède aussi "and" et "or" qui sont équivalents ... c'est une question de style de programmation, je pense que la plupart des rubyistes utilisent && et ||


    Quant aux begin ... end while, ça fait très moche en effet
    Mais do { ... } while n'était pas très joli non plus... Je ne sais pas si il y a mieux pour valider des entrées dans une interface interactive en ligne de commande
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Celfar
    conversion = Celfar.new
    puts "Tableau de conversion Fahrenheit - Celsius"
    [...]
    puts "Au revoir !"
    end
    Je n'ai pas compris à quoi sert la classe Celfar. De plus, il me semble bizarre de créer une instance (conversion = Celfar.new) à l'intérieur même de la définition de la classe. Je ne vois pas l'utilité de cette classe qui n'a aucune méthodes (constantes...) définies.
    ZiK un lecteur audio et son blog.

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Oui, après tout, c'est vrai que je n'ai pas besoin de classe ...
    En fait, pour un projet dans mon école, je dois comparer le Java et le Ruby.
    Mais le programme Java que j'ai choisi n'est pas bon du tout parce qu'en fait il n'y a pas du tout d'objet dedans ... Donc ça ne sert à rien, j'ai abandonné !
    Maintenant, je prends le problème à l'envers : je pars d'un programme Ruby et je le code en Java ^^

    Mais je vais avoir besoin une nouvelle fois de vous pour m'aider à résoudre un petit problème ...
    Je cherche à mesurer les temps d'exécution de mes programmes Ruby et Java afin de les comparer. J'arrive à obtenir le temps d'exécution du programme Java par le biais de System.nanoTime(), mais je ne trouve pas l'équivalent sur Ruby ...

    Codant sur Eclipse (à la fois pour le Ruby et le Java), je me demande d'ailleurs s'il n'est pas possible d'obtenir les temps d'exécution des programmes directement depuis Eclipse.

    Merci de vos renseignements !

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    pour un projet dans mon école
    Une école d'ingénieur ?


    je prends le problème à l'envers : je pars d'un programme Ruby et je le code en Java ^^
    D'une manière générale, ça peut-être facile (si le code Ruby n'utilise que des concepts de POO existants en Java) où très compliqué (si tu utilises les aspects dynamiques de Ruby qui manquent à Java).
    Quel est ton but, est-ce que tu cherches à montrer les différences qui existent au niveau des langages, ou bien tu es juste interessé par les performances ?


    J'arrive à obtenir le temps d'exécution du programme Java par le biais de System.nanoTime(), mais je ne trouve pas l'équivalent sur Ruby ...
    Avec Ruby, tu peux utiliser la différence entre deux objets Time (qui mesurent l'heure jusqu'à la microseconde).

    Tu peux aussi penser à utiliser la commande time sur Linux/Unix, pour avoir le temps total que consomme un processus (temps processeur & temps réel).
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Je savais bien que j'avais déjà vu un Taum quelque part =)

    Bref oué, c'est un PT avec Templemore, et le sujet à la base c'était "Etude du Ruby" et il nous a fait changer ça en "Etude comparative du Ruby avec Java / C / C++". On est 3 dans le groupe, et moi j'fais la partie Java donc !

    Donc le but, c'est pas de comparer qu'en termes de performances, mais faut pas se leurrer, notre groupe on est pas des foudres de guerre en code, donc on va comparer genre en termes de performances, taille du code, possibilités, avantages / inconvénients, etc, mais on ira pas bien plus loin ... Surtout qu'il ne reste qu'une semaine, et faut faire le poster aussi

    En gros, on reprend des programmes C / C++ / Java qu'on a fait en TP les années précédentes, et on les réécrit en Ruby. Cette aprèm, je m'attaque au Chercheur d'Or (projet Java de l'année dernière) :p

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Olala, j'ai un autre souci maintenant ...

    J'ai un programme Java, avec plusieurs classes, donc plusieurs fichiers .java

    Je veux faire la même chose en Ruby, et donc avoir plusieurs .rb mais ca me met "menu.rb:49: uninitialized constant Menu::InfoJeu (NameError)" (je veux lancer une classe InfoJeu à partir de la classe Menu).

    J'ai donc regardé un peu sur Internet, et j'ai vu qu'il fallait faire un load ou un require, mais ca ne marche pas ... Est-ce que quelqu'un pourrait m'en dire un peu plus ? Quelle est la syntaxe exacte ? Les fichiers doivent-ils être dans un répertoire spécial (c'est ce qu'il me semble comprendre d'après ce que j'ai lu sur Internet) ?

    Si c'est le cas, y'a pas un moyen de faire autrement ? ... Parce que je suis sur Eclipse, et changer de Workspace, c'est chiant ...

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Pfff Ruby, c'est bien comme programme, mais ca manque de ressources et d'aides en ligne quand même ... Je rencontre plein de problèmes basiques mais impossible de trouver des solutions même en passant du temps sur Google ...

    La j'ai un tableau à 2 dimensions rempli de * , et je voudrais l'afficher, mais avec puts, je reviens à la ligne à chaque case ... Un dessin valant mieux qu'un long discours, imaginons que je voudrais que ca affiche :

    123
    456
    789

    Mais ca affiche :

    1
    2
    3
    4
    5
    6
    7
    8
    9

    Càd qu'en mémoire, mon tableau est bien fait et bien représenté, mais c'est juste l'affichage qui n'est pas bon ... :/

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Pour charger un autre fichier, utilise require. Ensuite tu as simplement à utiliser la classe que tu as défini dans l'autre fichier.


    Pour afficher des infos en sortie, Ruby à plusieurs fonctions:
    - print(str) affiche str
    - puts(str) affiche str et un retour à la ligne
    - p(obj) affiche obj.inspect + retour à la ligne, très utile pour débugger (même si c'est un peu à l'arrach).


    Ruby est un language qui peut paraître assez complexe au début, mais qui se base en fait sur quelques concepts, exploités à fond. Par exemple pour afficher ton tableau, j'imagine qu'en Java tu boucles dessus. En Ruby tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >> tab = [[1,2,3],[4,5,6],[7,8,9]]
    => [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    >> puts tab.map { |row| row.join }.join("\n")
    123
    456
    789
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup pour ton aide en tous cas

    Là je suis pas devant mon PC, donc je peux pas tester, mais de mémoire, j'avais tenté le require "nomfichier" et le require "cheminabsoludufichier" mais ca me mettait la même erreur : uninitialized constant Menu::InfoJeu (le nom de mes 2 classes) :/
    Mais je retesterai !

    Et merci pour le tip pour le tableau
    Je sais que le Ruby est hyper pratique pour plein de trucs, mais le truc que j'ai à lui reprocher, c'est le manque de ressources donc ^^
    Y'a plein de fonctionnalités, mais quand on est un débutant, 1/ pour les trouver, et 2/ pour comprendre comment elles fonctionnent exactement, c'est pas évident du tout ^^

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Ca serait bien si tu pouvais réessayer et poster un exemple de code qui ne marche pas

    Au niveau des ressources, je suis d'accord avec toi. Il y a quand même des lectures interessantes sur ruby-doc.org, Programming Ruby: the Pick-Axe Book est une référence par exemple. 10 Things Every Java Programmer Should Know About Ruby t'intéressera aussi sûrement.

    Mais Ruby est un language riche, il faut de toute façon un certain temps pour maîtriser ses subtilités. Je pense qu'utiliser un framework comme Ruby on Rails, voire jeter un coup d'œil à la façon dont il est codé, peut aider énormément dans ce sens.
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  12. #12
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Hier ca marchait, et aujourd'hui, ca ne marche plus ... Incompréhensible ...

    Bon en gros, je veux faire démarrer mon programme sur une classe Menu, qui me donne le choix entre afficher les règles du jeu, lancer le jeu, et quitter.

    Les règles du jeu et le démineur en lui-même sont 2 autres classes.

    J'ai mis require demineur et require infojeu en haut de ma classe menu, et quand j'exécute mon menu.rb, le programme passe directement sur demineur.rb, sans lancer le menu. Si j'enlève la ligne require demineur, alors le menu se lance, mais si je demande les règles du jeu (il y a toujours le require infojeu en haut), ca me met :

    C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\menu.rb:34: uninitialized constant Menu::InfoJeu (NameError)
    from c:/Program Files/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
    from c:/Program Files/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
    from C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\info_jeu.rb:1
    from c:/Program Files/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
    from c:/Program Files/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
    from menu.rb:1


    De même si je lance le infojeu.rb, au moment où je veux revenir sur le menu, ca me met le même message d'erreur (mais pour menu.rb cette fois-ci).

    Voici les codes des programmes :

    menu.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\info_jeu.rb'
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\demineur.rb'
     
    class Menu
     
      begin
     
       puts "========="  
       puts "DEMINEUR"
       puts "=========\n"
       puts "MENU"
       puts "1/ Jouer"
       puts "2/ Règles du jeu"
       puts "3/ Quitter"
     
       entree = gets.chomp.to_i
     
       if (entree < 1 || entree > 3)
        raise "Entrez un chiffre entre 1 et 3"
       end
     
       rescue
       puts "Erreur : #{$!}"
       retry
     
      end
     
      case entree
     
       when 1
        demineur = Demineur.new    
     
       when 2
        infojeu = InfoJeu.new
     
     
      end
     
    end
    info_jeu.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\menu.rb'
     
    class InfoJeu
     
      puts "==============="
      puts " REGLES DU JEU "
      puts "===============\n\n"
      puts "Version allégée du Démineur"
      puts "Tout d'abord, choisissez la taille de la grille, et le nombre de mines à découvrir"
      puts "Ensuite, entrez les coordonnées des cases à découvrir"
      puts "S'il y a une mine sous la case que vous avez découvert, alors c'est perdu !"
      puts "Vous gagnez une fois que vous avez découvert toute la carte sans tomber sur une seule mine\n\n"
     
      puts "Appuyez sur une touche pour revenir au menu d'accueil"
     
      test = gets.chomp
     
      menu = Menu.new
     
    end
    demineur.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    class Demineur
     
     compteur = 0
     score = 0
     defaite = 0
     
      puts "DEMINEUR\n\n"
     
      begin
        puts "Entrez le nombre de lignes (min. 5)"
        lignes = gets.chomp.to_i
      if (lignes < 5)
        raise "Il faut au moins 5 lignes !"
      end
      rescue
        puts "Erreur : #{$!}\n\n"
      retry
      end
     
      lignes += 1
     
      begin
        puts "Entrez le nombre de colonnes (min. 5)"
        colonnes = gets.chomp.to_i
      if (colonnes < 5)
        raise "Il faut au moins 5 colonnes !"
      end
      rescue
        puts "Erreur : #{$!}\n\n"
      retry
      end
     
      colonnes += 1
     
      begin
        puts "Entrez le nombre de mines à découvrir (n'en mettez pas trop !)"
        mines = gets.chomp.to_i
      if (mines < 1 || mines > ((lignes-3)*(colonnes-3)))
        raise "Nombre de mines incohérent !"
      end
      rescue
        puts "Erreur : #{$!}\n\n"
      retry
      end
     
      grille = Array.new(lignes) {|i| Array.new(colonnes) {|j| 
       if (i==0)
        format("%3.0i", j)
       elsif (j==0)
        format("%3.0i", i)
       else
        '  *'
       end } 
      }
     
      grilleCachee = Array.new(lignes) {|i| Array.new(colonnes) {|j| 
       if (i==0)
        format("%3.0i", j)
       elsif (j==0)
        format("%3.0i", i)
       else
        '   '
       end } 
      }
     
      while (compteur<mines)
        a=rand(lignes-1)+1
        b=rand(colonnes-1)+1
        if (grilleCachee[a][b] == '  X')
        else
          grilleCachee[a][b] = '  X'
          compteur += 1
        end
      end 
     
     while((score<(lignes*colonnes)) && defaite !=1)  
     
      puts grille.map { |row| row.join(" ")}.join("\n")  
     
      puts "Ligne de la case à dévoiler :"
      x = gets.chomp.to_i
      puts "Colonne de la case à dévoiler :"
      y = gets.chomp.to_i
     
      if (grilleCachee[x][y] == '  X')
        grille[x][y] = '  X'
        defaite = 1
      else 
        grille[x][y] = '   '
        score += 1
      end
     
     end
     
     if (defaite == 1)
      puts grille.map { |row| row.join(" ")}.join("\n")
      puts "YOU LOSE"
     else
      puts grille.map { |row| row.join(" ")}.join("\n")
      puts "YOU WIN"
     end
     
    end

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Ton code devrait être défini dans la méthode initialize, méthode appelée lors de la création d'un objet (objet=Ma _class.new).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    require ...
     
    class Menu
    def initialize
    [...]
    end
    end
     
    Menu.new
    Il faut faire de même pour toutes les classes.
    ZiK un lecteur audio et son blog.

  14. #14
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    J'ai essayé, et ca ne marche pas ... :/

    J'ai même essayé de virer le class Menu et le end à la fin, pour laisser juste du code Ruby, mais ca me fait la meme chose : le programme part directement sur demineur.rb ...

    Edit : En fait, ce sont les require qui envoient directement sur les autres programmes. Càd que j'ai mis les require à d'autres endroits dans le code, et dès qu'on tombe dessus, alors le fichier qui est dans le require est lancé, sans plus de considération. Je n'ai même pas besoin de créer de nouvel objet ! O_O

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Quand tu utilises require, l'interpreteur execute tout le code contenu dans le fichier, je pense que c'est pour ca que tu as le comportement que tu decrits.

    Le mieux dans ton cas, a mon avis, c'est de ne pas utiliser d'objet, mais juste des fonctions. Ton code n'est pas oriente objet de toute facon

    Tu peux definir des fonctions comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def foo()
      # code de la fonction
    end
     
    foo() # appelle la fonction
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  16. #16
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Ok, merci pour la réponse, j'y vois un peu plus clair !
    Depuis la dernière fois, j'ai pas mal modifié mon code pour le rendre plus objet justement, et je comprends un peu mieux le problème avec les classes et les require.

    J'ai donc modifié mon code, encore une fois ^___^
    Le fichier que j'exécute maintenant est demineurallege.rb
    En théorie, ce programme doit me lancer le menu (menu.rb), où je pourrai choisir de quitter, d'afficher les règles (info_jeu.rb) ou de jouer (retour à demineurallege.rb qui continue son exécution).
    Ensuite, le démineur à proprement parler se lance.

    Je vais vous copier / coller le code, mais cette fois-ci, le problème est le suivant : le programme se lance bien sur le menu, mais si je choisis 2 (càd que je veux afficher les règles), il me met l'erreur suivante :
    demineurallege.rb:8: warning: already initialized constant Menu
    demineurallege.rb:11: uninitialized constant Infojeu (NameError)
    Et les règles ne s'affichent pas.
    Et si je choisis 1 ou 3, alors il me met :
    demineurallege.rb:8: warning: already initialized constant Menu
    Mais le jeu continue à fonctionner. Pas de problème ensuite pour tout ce qui est demineurallege / grille / jeu.

    Je comprends pas trop parce qu'en fait, le Menu s'exécute dès la ligne 3, pourtant ce n'est qu'une classe avec juste un constructeur ... Normalement, il ne devrait s'exécuter qu'à la ligne 8, mais vu qu'il s'est déjà exécuté à la ligne 3, ca me met que la variable a été déjà initialisée.
    Et je comprends pas non plus le problème avec Infojeu ...

    Voilà le code

    demineurallege.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\grille.rb'
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\info_jeu.rb'
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\jeu.rb'
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\menu.rb'
     
     #On crée une nouvelle partie
     
     Menu = Menu.new
     InfoJeu = Infojeu.new
     
     while(Menu.debut != 1)
      Menu.affichage 
      if (Menu.debut == 2)
      Infojeu.affichage
      elsif (Menu.debut == 1)
     
      Demineur=Jeu.new
     
      #Entrée des infos sur la grille
     
      Demineur.entrerlignes
      Demineur.entrercolonnes
      Demineur.entrermines
     
      #Création des grilles (celle visible, et celle cachée, avec les mines)
     
      visible = Grille.new(Demineur.lignes,Demineur.colonnes)
      cache = Grille.new(Demineur.lignes,Demineur.colonnes,Demineur.mines)
     
      #Lancement de la partie, qui ne s'arrêtera que si toutes les cases vides sont dévoilées (victoire)
      #ou si le joueur tombe sur une mine (défaite)
     
      while((Demineur.score.to_i < ((Demineur.lignes*Demineur.colonnes)-Demineur.mines).to_i) && Demineur.defaite !=1)  
     
       #Affichage de la grille
     
       Demineur.affichage(visible.tableau)
     
       #Entrée des infos sur la case à dévoiler
     
       Demineur.entrerx
       Demineur.entrery
     
       #Vérification du contenu de la case à dévoiler
     
       resultat = Demineur.verification(visible.tableau,cache.tableau)
     
      end
     
      #Résultat du jeu (victoire / défaite)
     
      Demineur.finjeu(visible.tableau)
     
      end
     end
    menu.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    class Menu
     
     #Menu d'accueil, permettant d'accéder au démineur, aux règles du jeu, ou de quitter le jeu
     
     attr_accessor :debut
     
     def initialize(debut=0)
        @debut
     end
     
     def affichage  
     
      begin
     
       puts "========="  
       puts "DEMINEUR"
       puts "=========\n"
       puts "MENU"
       puts "1/ Jouer"
       puts "2/ Règles du jeu"
       puts "3/ Quitter"
     
       entree = gets.chomp.to_i
     
       if (entree < 1 || entree > 3)
        raise "Entrez un chiffre entre 1 et 3"
       end
     
       rescue
       puts "Erreur : #{$!}"
       retry
     
      end
     
      case entree
     
       when 1
        @debut = 1
     
     
       when 2
        @debut = 2
     
      end
     
     end
     
    end
    info_jeu.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    require 'C:\Documents and Settings\ThiB\Bureau\PT\Prog Java\BatailleNavaleRuby\menu.rb'
     
    class InfoJeu
     
      def initialize(test=0)
        @test
      end
     
      def affichage
     
      puts "==============="
      puts " REGLES DU JEU "
      puts "===============\n\n"
      puts "Version allégée du Démineur"
      puts "Tout d'abord, choisissez la taille de la grille, et le nombre de mines à découvrir"
      puts "Ensuite, entrez les coordonnées des cases à découvrir"
      puts "S'il y a une mine sous la case que vous avez découvert, alors c'est perdu !"
      puts "Vous gagnez une fois que vous avez découvert toute la carte sans tomber sur une seule mine\n\n"
      puts "Cette version allégée du démineur n'affiche pas le nombre de mines avoisinantes de la case que vous venez de découvrir"  
     
      puts "Appuyez sur une touche pour revenir au menu d'accueil"
     
      @test = gets.chomp
     
      end
     
    end
    jeu.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    class Jeu
     
      #Déclaration des accesseurs (pas besoin de get et de set)
     
      @@score = 0
     
      attr_accessor :score, :defaite, :lignes, :colonnes, :mines, :x, :y
     
      #Initialisation de la classe
     
      def initialize(score=0,defaite=0,lignes=0,colonnes=0,mines=0,x=0,y=0)
        @score
        @defaite
        @lignes
        @colonnes
        @mines
        @x
        @y
        puts "DEMINEUR"
      end
     
      #Fonction demandant à l'utilisateur le nombre de lignes de la grille
     
      def entrerlignes
       begin
        puts "Entrez le nombre de lignes (min. 5)"
        lignes = gets.chomp.to_i
       if (lignes < 5)
        raise "Il faut au moins 5 lignes !"
       end
       rescue
        puts "Erreur : #{$!}\n\n"
       retry
       end
       lignes += 1
       @lignes = lignes
      end
     
      #Fonction demandant à l'utilisateur le nombre de colonnes de la grille
     
      def entrercolonnes
       begin
        puts "Entrez le nombre de colonnes (min. 5)"
        colonnes = gets.chomp.to_i
       if (colonnes < 5)
        raise "Il faut au moins 5 colonnes !"
       end
       rescue
        puts "Erreur : #{$!}\n\n"
       retry
       end
       colonnes += 1
       @colonnes = colonnes
      end
     
      #Fonction demandant à l'utilisateur le nombre de mines sur la grille (avec un maximum pour ne pas
      #surcharger la grille de mines)
     
      def entrermines
       begin
        puts "Entrez le nombre de mines à découvrir (maximum : " + ((@lignes-3)*(@colonnes-3)).to_s + ")"
        mines = gets.chomp.to_i
       if (mines < 1 || mines > ((@lignes-3)*(@colonnes-3)))
        raise "Mauvais nombre de mines !"
       end
       rescue
        puts "Erreur : #{$!}\n\n"
       retry
       end
      @mines = mines
      end
     
      #Fonction demandant à l'utilisateur l'abscisse de la case à dévoiler
     
      def entrerx
       begin
        puts "Ligne de la case à dévoiler :"
        x = gets.chomp.to_i
       if (x < 1 || x > @lignes)
        raise "Coordonnée mauvaise !"
       end
       rescue
        puts "Erreur : #{$!}\n\n"
       retry
       end
       @x = x
      end
     
      #Fonction demandait à l'utilisateur l'ordonnée de la case à dévoiler
     
      def entrery
       begin
        puts "Colonne de la case à dévoiler :"
        y = gets.chomp.to_i
       if (y < 1 || y > @colonnes)
        raise "Coordonnée mauvaise !"
       end
       rescue
        puts "Erreur : #{$!}\n\n"
       retry
       end
       @y = y
      end
     
      #Fonction permettant de vérifier le contenu de la case à dévoiler (présence ou absence de mine)
     
      def verification(tableau,tableaucache)
       if (tableaucache[@x][@y] == '  X')
        tableau[@x][@y] = '  X'
        @defaite = 1
       else 
        tableau[@x][@y] = '   '
        @@score += 1
        @score = @@score
       end
      end 
     
      #Fonction permettant d'afficher la grille demandée
     
      def affichage(tableau)
        puts tableau.map { |row| row.join(" ")}.join("\n")
        puts "Score : " + @score.to_s
        puts "Mines : " + @mines.to_s
      end
     
      #Fonction de fin du jeu (victoire / défaite)
     
      def finjeu(tableau)
       self.affichage(tableau)
       if (@defaite == 1)
        puts "YOU LOSE"
       else
        puts "YOU WIN"
       end
      end
     
    end
    grille.rb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    class Grille
     
      attr_accessor :tableau
     
      #Fonction de création des grilles
     
      def initialize(lignes, colonnes, mines=0)
     
        #On crée une grille remplie de *, sauf les 1e ligne et colonne qui sont remplies avec leur numéro
     
        tableau = Array.new(lignes) {|i| Array.new(colonnes) {|j| 
        if (i==0)
         format("%3.0i", j)
        elsif (j==0)
         format("%3.0i", i)
        else
         '  *'
        end } 
        }
     
        #S'il doit y avoir des mines sur la grille (autrement dit, sur la grille cachée), alors on place
        #aléatoirement ces mines
     
        if(mines!=0)
         compteur = 0
         while (compteur<mines)
          a=rand(lignes-1)+1
          b=rand(colonnes-1)+1
          if (tableau[a][b] != '  X')
           tableau[a][b] = '  X'
           compteur += 1
          end
         end     
        end
     
        @tableau = tableau
     
      end
     
    end
    Voilà voilà, merci d'avance une fois de plus ^___^

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2007
    Messages : 552
    Points : 1 058
    Points
    1 058
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Menu = Menu.new
     InfoJeu = Infojeu.new
    Pour ruby, une "variable" qui commence par une majuscule est une constante. Ici, Menu est une constante qui représente la classe Menu. Il ne faut pas redéfinir cette constante!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     menu = Menu.new
    info=Infojeu.new
    J'ai pas regardé le code mais j'ai vu une autre erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Menu
    attr_accessor :debut
     def initialize(debut=0)
        @debut=debut
     end
    [...]
    end
    @debut est une variable d'instance initialisée avec la valeur début (et non à nil).
    ZiK un lecteur audio et son blog.

  18. #18
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Youhou, ca marche !!
    Tout ca à cause de ces majuscules donc ^^
    Merci beaucoup

Discussions similaires

  1. Petit problème sur petit programme
    Par tamerla dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 19/01/2014, 11h32
  2. [bash] Problème sur un programme en bash
    Par nekcorp dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 22/02/2013, 05h49
  3. Problème sur un programme
    Par Hunshy dans le forum Débuter
    Réponses: 5
    Dernier message: 19/09/2012, 21h33
  4. [Débutant] Critères de requete sur dates - Programmation VBA
    Par Sofie109 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/01/2007, 15h35
  5. [Graphisme][Débutant(e)] Problème sur repaint()
    Par Katyucha dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 08/10/2004, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo