Nurmite (odorat)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 090 fois - Téléchargée 58 fois

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.

A voir également

Ajouter un commentaire

Commentaires

Ehhh, dites moi, je veux savoir si c'est bien ou si c'est nul. Si il faut modifier des choses. Eh, El Manipulator, est-ce que le module correspond à ce que tu demandes?

Pour une fois que je dis pas unr bourde =)
Ouais Flint, t'as raison, je me suis cassé le cul, alors pour remedier à ça, j'ai modifie cette fonction et elle ne renvoie qu'une valeur et elle traite toujours les diagonales:
Elle renvoie 1,2,4,8 pour les directions et 1+4,1+8 pour la diagonales droitehaut par exmple


'Definit la direction de la provenance de l'odeur
Public Function DirectionOdeur(ByRef Nurmite As Nurm)
DirectionOdeur = 0
Hor = Nurmite.XPos - Nurmite.Odorat.LocationOdeur.X
Ver = Nurmite.YPos - Nurmite.Odorat.LocationOdeur.Y

'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
Remarque : pr le type direction, tu t'es cassé le cul.
Un simple dim CurrentD as Byte aurait suffit
> 1 haut
> 2 bas
> 3 gauche
> 4 droite
Parcequ'avec son système de boolean, tu vas devoir à chaque chaque fois remettre tou

Bon alors... C'est super, tu as programmé dans la même optique que les autres modules, avec des nouveaux types de données et une matrice. Ce que je vais faire : Reprendre ce que tu as fait pour la spec du module ( tu m'a déja tout praparé bravo! ) modifier le type Nurm pour ajouter tes types ainsi que ta carte des odeurs ( qui sera dimmensionné dynamiquement pour gagner de la mémoire, à force de rajouter et rajouter faudra un pc de la NSA pour faire tourner nos nurms :) ). Bravo, tu as fait un boulot super! Maintenant ce que je propose c'est qu'on décide qu'est ce qui pourra générer une odeur. Vla...

El Manipulator [ Rock'n'blues ]
Afficher les 6 commentaires

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.