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

Smalltalk Discussion :

[Visual Works] Message d'état entre deux cellules voisines


Sujet :

Smalltalk

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 103
    Points : 38
    Points
    38
    Par défaut [Visual Works] Message d'état entre deux cellules voisines
    Bonjour,

    J'ai un programme en Smalltalk sous Visualwork qui actuellement fait ceci :

    Une cellule peut soit être en herbe soit être en feu.

    Ce que je voudrais obtenir, c'est qu'une cellule en herbe devienne automatiquement en feu si la cellule voisine se situant en amont est en feu.
    Sinon elle reste en herbe.

    En sachant que je travaille sur une grille de cellule où l'altitude est renseignée.

    Pour le moment j'ai écrit quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    transfo:= self neighbourhood contains:[:aCell | aCell  = #fire].
    (self = #tree and:[transfo])
    ifTrue:[self bufferState: #fire]
    ifFalse ....???
    Déjà le premier problème est que je ne sais pas comment faire pour choisir la cellule voisine la plus haute... et non tout le voisinage...

    Je vous remercie par avance pour votre aide.
    Bonne journée

    Julien

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 103
    Points : 38
    Points
    38
    Par défaut
    Bonjour

    J'ai un peu avancé mais je me demande si je vais dans la bonne direction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    | celltest transfo  |
     
    celltest := self neighbourhood contains: [:c1 :c2 | (c1 altitude ) < (c2 altitude )].
     
    transfo := self neighbourhood contains: [c2 = #fire].
    (c1 = #tree and:[transfo])
     
    ifTrue:[self bufferState: #fire]
    ifFalse: [self bufferState: self state].
    Merci pour vos conseils

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 103
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    vraiment personne pour m'aider, je ne m'en sors pas. Voici mon dernier code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    | celltest  transfo2  |
     
    celltest := self neighbourhood asSortedCollection: [:c1 :c2 | ((c1 altitude + (c1 niveauSurface / 1000)) < (c2 altitude + (c2 niveauSurface / 1000)))].
     
    transfo2 :=self neighbourhood asSortedCollection: [: c2 | c2 etatHydro = #fire].
     
    (self etatHydro = #tree and:[celltest & transfo2])
    	ifTrue: [self bufferetatHydro: #fire]
    	ifFalse:[ self bufferetatHydro: #tree]
    Merci

  4. #4
    Membre éprouvé

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 1 116
    Points
    1 116
    Par défaut
    Bonsoir,

    j'ai quelques questions.

    Nous sommes dans quel objet ?

    Il y a des appels à self, donc j'imagine que nous sommes dans une cellule ?

    Je reprend le code et y ajoute quelques annotations :

    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
    | celltest  transfo2  |
    
    celltest := self neighbourhood asSortedCollection:select: [:c1 :c2 | ((self altitude + (self niveauSurface / 1000)) < (c2 altitude + (c2 niveauSurface / 1000)))].
    
    Il vaut mieux faire un select pour ne garder que les cellules plus hautes (d'après le descriptif que tu as fait dans ton premier post).
    
    L'opération va renvoyer dans celltest une OrderedCollection avec uniquement les cellules qui répondront positivement à ton test, à l'intérieur du bloc.
    
    Attention : c'est quoi c1 et c2 ? J'ai l'impression que c1 est la cellule courante, donc il faut utiliser self pour y accéder.
    
    transfo2 := self neighbourhood  celltest asSortedCollection: select: [: c2 | c2 etatHydro = #fire].
    
    
    Il vaut mieux faire un select:, car on ne s'intéresse visiblement qu'aux cellules voisines en feu.
    
    De même, on sélectionne ces cellules sur celles déjà retenues dans cellTest, c'est à dire selon un critère d'altitude.
    
    (self etatHydro = #tree and:[celltest & transfo2])
    	ifTrue: [self bufferetatHydro: #fire]
    
    
    Le bloc ifFalse:[...] n'est pas nécessaire, puisque l'état de la cellule ne change pas si aucune cellule voisine se situant plus haut n'est en feu.
    
    J'aurais également apporté les modification suivantes :

    Dans la classe "cellule" (à supposer que ça soit son nom) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    isInFire
     "Renvoie true si la cellule est en feu, false sinon"
     ^self etatHydro = #fire
    
    isTree
      "Renvoie true si la cellule est faite d'herbe, false sinon"
     ^self etatHydro = #tree
    
    burn
       "On fait brûler la cellule courante"
     self etatHydro: #fire
    puis dans ton code précédent :
    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
    | neighborsInHigherPositions neighborsInFire |
    
    
    "Si la cellule est faite d''herbe, ça vaut le coup de continuer, sinon on ne se fatigue pas car elle est déjà en feu"
    self isTree ifTrue:[
    
    
    "On sélectionne les cellules plus hautes que la cellule courante"
    neighborsInHigherPositions := self neighbourhood select: [:aNeighborCell| ((self altitude + (self niveauSurface / 1000)) < (aNeighborCell altitude + (aNeighborCell niveauSurface / 1000)))].
    
    
    "Parmi les cellules sélectionnées, on sélectionne celles qui sont en feu."
    neighborsInFire := neighborsInFire select: [:aNeighborCell | neighbor isinFire].
    
    
    "Si la collection de cellules sélectionnées n'"est pas vide, alors c'est qu'au moins une cellule voisine plus haute que la cellule courante est en feu, donc la cellule courante brûle et est en feu."
    
    neighborsInFire isNotNil iftrue:[self burn]
    Voilà, j'espère que ça peut aider.

    Attention à essayer de nommer explicitement et judicieusement les variables locales et les méthodes (je le fais vite sur cet exemple mais on peut faire mieux).
    [|]

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 103
    Points : 38
    Points
    38
    Par défaut
    ok, merci

    ça m'a bien avancé, j'ai résolu mon probleme

    merci encore

  6. #6
    Membre éprouvé

    Homme Profil pro
    non
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : non

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Points : 1 116
    Points
    1 116
    Par défaut
    Super =)

    Je profite de l'occasion, ça me semble un bon sujet pour faire un petit tutorial sur Visual Works, est-ce que je peux réutiliser le sujet ?

    J'ai un petit trou dans mon emploi du temps ce week end, et étant donné que je dis depuis longtemps vouloir participer sur developpez.com en Smalltalk, j'y vois là une opportunité intéressante.
    [|]

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 103
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par maske Voir le message
    Super =)

    Je profite de l'occasion, ça me semble un bon sujet pour faire un petit tutorial sur Visual Works, est-ce que je peux réutiliser le sujet ?

    J'ai un petit trou dans mon emploi du temps ce week end, et étant donné que je dis depuis longtemps vouloir participer sur developpez.com en Smalltalk, j'y vois là une opportunité intéressante.
    Oui biens ur tu peux réutiliser le sujet, aucun probleme.

    En tout cas c'est une bonne idée, bon courage.

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

Discussions similaires

  1. [XL-2010] Lien hypertexte entre deux cellules via VBA
    Par gbbtt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/08/2012, 11h20
  2. [XL-2010] Copier un commentaire entre deux cellules
    Par Halukard dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/03/2011, 18h33
  3. Calcul entre deux cellules différentes à chaque fois
    Par thomasisajerk dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 13/08/2010, 08h05
  4. Réponses: 2
    Dernier message: 10/10/2008, 20h35
  5. Probleme de comparaison entre deux cellules identiques
    Par GlamIS dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/07/2008, 14h50

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