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 :

Jeu de la vie


Sujet :

Ruby

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Jeu de la vie
    Bonjour à tous,

    J'ai un petit, peut-être un gros soucis, dans mon code. Bon, je code depuis très peu de temps en ruby. Et je n'ai le réflexe qui me dit, tiens comment je pourrais corriger ça dans ce cas.

    Failure/Error: neighbours.map{ |e| neighbours_cells_values << @grid[cell_position + e[0]][line_position + e[1]] if @grid[cell_position + e[0]] >= 0} NoMethodError:
    undefined method `>=' for [0, 0, 0]:Array
    J'ai ce message d'erreur 6 fois, pour mes 6 cas de tests en Rspec sur 9. Les 6 cas se ressemblant fortement puisqu'il s'agit de mes divers cas de grilles. Il ne semble pas reconnaître les opérateurs. C'est arrivé en voulant rajouter une condition après avoir "mappé" ma variable contenant mon tableau de position de cellules voisines. Car, j'avais avant ça une erreur
    undefined method `[]' for nil:NilClass
    donc sortant de ma grille, j'ai voulu ajouté une condition. Voici mon code. Ça cloche à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    neighbours_cells_values << neighbours.map{ |e| @grid[cell_position + e[0]][line_position + e[1]] if @grid[cell_position + e[0]] >= 0 }
    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
    class JeuDeLaVie  EMPTY_GRID = [[0,0,0],[0,0,0],[0,0,0]]
     
      def initialize(grid = EMPTY_GRID)
        @grid = grid
      end
     
      def grid
        new_grid = @grid
     
        @grid.each_with_index do |line, line_position|
          line.each_with_index do |cell, cell_position|
            if cell == 0
              alive_neighbours_cells = neighbours_cells(cell_position, line_position).select{ |e| alive?(e)}
              if alive_neighbours_cells == 3
                new_grid[line_position][cell_position] = 1
              end
            else
              alive_neighbours_cells = neighbours_cells(cell_position, line_position).select{ |e| alive?(e)}
              if alive_neighbours_cells.length < 2 || alive_neighbours_cells.length > 3
                new_grid[line_position][cell_position] = 0
              end
            end
          end
        end
        return new_grid
      end
     
      def neighbours_cells(cell_position, line_position)
        neighbours = [[-1,-1], [-1, 0], [-1,1], [0,1], [1,1], [1,0], [1,-1],[0,-1]]
        neighbours_cells_values = []
     
        neighbours_cells_values << neighbours.map{ |e| @grid[cell_position + e[0]][line_position + e[1]] if @grid[cell_position + e[0]] >= 0 } 
      end
     
      def alive?(cell_value)
        cell_value == 1
      end
     
    end
    Une idée d'où vient le problème ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    C'est normal car les instances d'Array n'implémentent pas la méthode :>=
    http://ruby-doc.org/core-2.2.0/Array.html

    En gros ton expression renvoie une instance d'Array [0, 0, 0] et il cherche la méthode :>= mais ne la trouve pas car elle n'est pas définie.
    Je pense qu'il te manque une dimension supplémentaire pour comparer une valeur du tableau [0,0,0] à la valeur 0.

    J'éviterai aussi d'appeller la variable local "grid" dans la méthode :initialize comme la méthode d'instance :grid.
    Ça peut être confus même si c'est valable

    @+

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci,

    Désolé de répondre tardivement. J'avais mis de côté le jeu de la vie. J'ai décidé de le reprendre de zéro. Sur une bonne base. Voici le résultat :

    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
    class JeuDeLaVie
     
      EMPTY_GRID=[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
     
      attr_reader :grid
     
      def initialize(grid=EMPTY_GRID)
        @grid = grid
      end 
     
      def update!
        new_grid = Array.new(@grid.length){ Array.new(@grid[0].length) }
     
        @grid.each_with_index do |line, i|
          line.each_with_index do |cell, j|
            if still_alive?(i, j) || born?(i, j)
              new_grid[i][j] = 1
            else
              new_grid[i][j] = 0
            end
          end
        end
     
        @grid = new_grid
      end
     
      def born?(x, y)
        alive_neighbours_cells(x, y) == 3
      end
     
      def still_alive?(x, y)
        alive_neighbours_cells(x, y) >= 2 && alive_neighbours_cells(x, y) <= 3
      end
     
      def alive_neighbours_cells(x, y)
        alive_cells = 0
        coordinates = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]
        coordinates.each do |c|
          xpos = (x + c[0]) % @grid.length
          ypos = (y + c[1]) % @grid.length
          cell = @grid[xpos][ypos]
          alive_cells += 1 if cell == 1
        end
        alive_cells
      end
     
    end

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème jeu de la vie de Wolfram
    Par romromp dans le forum Pascal
    Réponses: 14
    Dernier message: 11/03/2007, 19h58
  2. algorithme d'évolution du "jeu de la vie" en caml
    Par nono88 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 13/12/2006, 00h56
  3. Conway's life (jeu de la vie) pour images
    Par O( N ) dans le forum C
    Réponses: 1
    Dernier message: 26/09/2006, 02h13
  4. [Conception] Jeu de la vie
    Par deuscapser dans le forum Général Java
    Réponses: 16
    Dernier message: 09/03/2006, 12h47
  5. [VB] projet à réaliser: Jeu de la vie
    Par mauriiice dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 02/12/2005, 20h06

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