Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Smalltalk
Smalltalk Forum d'entraide sur la programmation en Smalltalk
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/04/2011, 15h10   #1
Invité régulier
 
Inscription : septembre 2009
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 56
Points : 7
Points : 7
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 :
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
youchlure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 11h08   #2
Invité régulier
 
Inscription : septembre 2009
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 56
Points : 7
Points : 7
Bonjour

J'ai un peu avancé mais je me demande si je vais dans la bonne direction
Code :
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
youchlure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 10h11   #3
Invité régulier
 
Inscription : septembre 2009
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 56
Points : 7
Points : 7
Bonjour,

vraiment personne pour m'aider, je ne m'en sors pas. Voici mon dernier code :
Code :
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
youchlure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 21h17   #4
Membre éclairé
 
Avatar de maske
 
Homme
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 204
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mai 2008
Messages : 204
Points : 398
Points : 398
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 :
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 :
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 :
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).
__________________
[|]
maske est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 00h18   #5
Invité régulier
 
Inscription : septembre 2009
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 56
Points : 7
Points : 7
ok, merci

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

merci encore
youchlure est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 20h40   #6
Membre éclairé
 
Avatar de maske
 
Homme
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 204
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mai 2008
Messages : 204
Points : 398
Points : 398
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.
__________________
[|]
maske est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 10h20   #7
Invité régulier
 
Inscription : septembre 2009
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 56
Points : 7
Points : 7
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.
youchlure est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h12.


 
 
 
 
Partenaires

Hébergement Web