Nurmite (odorat)

Contenu du snippet

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.