Mise à jour de ma version de l'odorat du nurm.
Bon, je l'ai fait assez vite, et vu que je peux pas le tester puisque je sais pas comment l'integrer dans le projet, il se peut qu'il ne marche pas du tout, mais bon, ça peut servir de structure de depart pour ce module. J'ai essayé de reprendre toute les fonctions demandées, j'espere que ça marche.
Source / Exemple :
'DetectOdeur(nurmite as nurm).IntensiteOdeur
'******Intensité de l'odeur de l'endroit où se trouve le nurmite
'DetectOdeur(nurmite as nurm).GenreOdeur
'******Type de l'odeur de l'endroit où se trouve le nurmite
'DetectOdeur(nurmite as nurm).LocationOdeur
'******Location de la source qui émet l'odeur de l'endroit où se trouve le nurmite
'La fonction DirectionOdeur renvoie les valeurs suivantes
'DirectionOdeur(Nurmite as nurm).Gauche Si l'odeur vient de cette direction,
'DirectionOdeur(Nurmite as nurm).Droite renvoie true, sinon, renvoie False.
'DirectionOdeur(Nurmite as nurm).Bas Ainsi, on peut diriger le nurmite
'DirectionOdeur(Nurmite as nurm).Haut vers cette odeur
'La fonction OdeurEstConnu renvoie la valeur suivante
'OdeurEstConnu(Nurmite As Nurm, Genre As Integer)
'******True si l'odeur est connue, False si non
'******A noter que genre est le type d'odeur
Public Type Odeur
MinOdeur As Integer
'******Intensité odeur détectable minimale
OdeurConnu(10) As Integer
'******Echelle de connaissance des odeurs. O : inconnue, >0 connue
End Type
Public Type Direction
Haut As Boolean
Bas As Boolean
Droite As Boolean
Gauche As Boolean
End Type
'Là, c'est la definition de la map des odeurs
Public Type Odeurs
IntensiteOdeur As Integer
'******Intensité de l'odeur à ce point
GenreOdeur As Integer
'******Type d'odeur
End Type
Dim MapOdeur(100, 100) As Odeurs
' .: Retourne si une odeur est connue
Public Function OdeurEstConnu(ByRef Nurmite As Nurm, ByVal Genre As Integer) As Boolean
If Nurmite.Odorat.OdeurConnu(Genre) > 0 Then
OdeurEstConnu = True
Else
OdeurEstConnu = False
End If
End Function
'Definit la direction de la provenance de l'odeur
Public Function DirectionOdeur(Hor As Integer, Ver As Integer)
DirectionOdeur = 0
'Le resultat peut être soit horizontale, soit verticale, soit diagonale
'donc, on verifie quelle est la distance la plus grande, horizontale ou verticale
'Si l'écart est faible, alors on renvoie diagonale
If Int(Abs(Hor / Ver)) <= 2 Then
Select Case Hor
Case Is > 0: DirectionOdeur = DirectionOdeur + 1
Case Is < 0: DirectionOdeur = DirectionOdeur + 2
End Select
Select Case Ver
Case Is > 0: DirectionOdeur = DirectionOdeur + 4
Case Is < 0: DirectionOdeur = DirectionOdeur + 8
End Select
ElseIf Abs(Hor) > Abs(Ver) Then
Select Case Hor
Case Is > 0: DirectionOdeur = DirectionOdeur + 1
Case Is < 0: DirectionOdeur = DirectionOdeur + 2
End Select
Else
Select Case Ver
Case Is > 0: DirectionOdeur = DirectionOdeur + 4
Case Is < 0: DirectionOdeur = DirectionOdeur + 8
End Select
End If
End If
End Function
'Ajoute une odeur à la carte olfactive
Public Sub AddOdeur(PosX As Integer, PosY As Integer, Intensity As Integer, Odeur As Integer)
MapOdeur(PosX, PosY).GenreOdeur = Odeur
MapOdeur(PosX, PosY).IntensiteOdeur = Intensity
End Sub
'Enleve une odeur à la carte olfactive
Public Sub RemoveOdeur(PosX As Integer, PosY As Integer)
MapOdeur(PosX, PosY).GenreOdeur = Null
MapOdeur(PosX, PosY).IntensiteOdeur = Null
End Sub
'renvoie la direction de la source d'odeur recherchée la plus proche
Public Sub FindNearestOdeur(Nurmite As Nurm, Odeur As Integer)
Dim DepHor, DepVer As Integer
Dim FinHor, FinVer As Integer
Changement = False
i = -1
Do
i = i + 1
DepHor = Nurmite.XPos - i
DepVer = Nurmite.YPos - i
FinHor = Nurmite.XPos + i
FinVer = Nurmite.YPos + i
If DepVer <= 1 Then DepVer = 1
If DepHor <= 1 Then DepHor = 1
If FinVer >= Ysize Then DepVer = Ysize
If FinHor >= Xsize Then DepHor = Xsize
For i = DepVer To FinVer
If Changement = True Then Exit For
If MapOdeur(DepHor, i).GenreOdeur = Odeur Then
Hor = DepHor
Ver = i
Changement = True
End If
If MapOdeur(FinHor, i).GenreOdeur = Odeur Then
Hor = FinHor
Ver = i
Changement = True
End If
For i = DepHor To FinHor
If Changement = True Then Exit For
If MapOdeur(i, DepVer).GenreOdeur = Odeur Then
Hor = i
Ver = DepVer
Changement = True
End If
If MapOdeur(i, FinVer).GenreOdeur = Odeur Then
Hor = i
Ver = FinVer
Changement = True
End If
Next i
Loop
If Changement = True Then FindNearestOdeur = DirectionOdeur(Hor, Ver) Else FindNearestOdeur = Null
End Sub
'renvoie la direction de l'odeur inconnue la plus proche
Public Sub DetectNouvelleOdeur(Nurmite As Nurm)
Public Sub FindNearestOdeur(Nurmite As Nurm, Odeur As Integer)
Dim DepHor, DepVer As Integer
Dim FinHor, FinVer As Integer
Changement = False
i = -1
Do
i = i + 1
DepHor = Nurmite.XPos - i
DepVer = Nurmite.YPos - i
FinHor = Nurmite.XPos + i
FinVer = Nurmite.YPos + i
If DepVer <= 1 Then DepVer = 1
If DepHor <= 1 Then DepHor = 1
If FinVer >= Ysize Then DepVer = Ysize
If FinHor >= Xsize Then DepHor = Xsize
For i = DepVer To FinVer
If Changement = True Then Exit For
If OdeurEstConnu(MapOdeur(DepHor, i).GenreOdeur) Then
Hor = DepHor
Ver = i
Changement = True
End If
If OdeurEstConnu(MapOdeur(FinHor, i).GenreOdeur) Then
Hor = FinHor
Ver = i
Changement = True
End If
For i = DepHor To FinHor
If Changement = True Then Exit For
If OdeurEstConnu(MapOdeur(i, DepVer).GenreOdeur) Then
Hor = i
Ver = DepVer
Changement = True
End If
If OdeurEstConnu(MapOdeur(i, FinVer).GenreOdeur) Then
Hor = i
Ver = FinVer
Changement = True
End If
Next i
Loop
If Changement = True Then FindNearestOdeur = DirectionOdeur(Hor, Ver) Else FindNearestOdeur = Null
End Sub
End Sub
Conclusion :
Si il y a des trucs à changer, à modifier, dîtes le moi, et faite moi savoir toutes les erreurs, si c'est trop lent et qu'il faut l'ameliorer pour augmenter les performances, et enfin, si vous comprenez pas ma façon de programmer. Hesitez pas à me donner votre avis.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.