Bonjour,

dans le cadre de mon stage je suis amenée à étudier le comportement de souris dans une cage ; de fait, je tente en amont de proposer un modèle basique, mais crédible.
En pratique, mon algo va faire un peu comme celui des Sims :
chaque souris a des besoins (dormir, manger, faire de la roue, sociabiliser) qui augmentent avec le temps où ils ne sont pas assouvis. Au tour par tour, mon algo doit décider de ce que fait chaque souris présente dans la cage (virtuelles, s'entend )
Pour info, je code en Perl. Pas idéal pour la POO, mais c'est faisable.
Et ma cage virtuelle dispose de 4 salles reliées par des tubes, une salle par activité, elles sont spécialisées (elles le seront dans la vraie cage). Elles doivent donc s'y rendre pour assouvir le besoin correspondant.

Je me demandais comment je pourrais m'y prendre pour mettre en place un truc pareil, tant sur le côté algorithmie, que mathématique, sur l'évolution des niveaux de besoin...

Pour le moment, j'ai codé un objet Souris, qui possède un nom et lesdits 4 besoins, avec des méthodes correspondant (manger, dormir, papoter, courir, ainsi que se déplacer et ne rien faire).
J'ai estimé très basiquement l'évolution des niveaux de besoin lors de la réalisation d'une action à chaque tour (par exemple, manger un tour diminue la faim de 4, augmente la fatigue de 1, etc)
J'ai récupéré un bout de code qu'il me faut adapter depuis un autre site (voir plus bas).

Auriez vous des idées, des conseils, ou autre? Ca me paraît assez énorme à mettre en place, du coup je prendrais volontiers tous les coups de main !
D'avance merci !


le code en question :
Code java : 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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
abstract Need
{
    numeric CurrentValue;        
    external function IncreasingRule;
 
    function Update()
    {
        IncreasingRule.Apply(this, Params);
    }
    ...
}
 
IncreasingRule HungerRule.Apply(HungerNeed, Subject)
{
     if (Subject.Eating)
     {
            HungerNeed.CurrentValue -= Subject.FoodBeingEaten.HungerValue;
     }
     else
     {
            //Linear development as time passes.
            HungerNeed.CurrentValue = Subject.TimeSinceLastMeal; 
     }
}
 
IncreasingRule FunRule.Apply(FunNeed, Subject)
{
     if (Subject.DoingSomethingThatCanBeFun)
     {
        //If the thing the subject is doing is among his favorites, the fun 
        //need goes down based on their favorite rank. If, instead, they're
        //doing something boring, or if they absolutely hate what they're doing,
        //the fun need goes up (return value of CalculateFun is negative).
        FunNeed.CurrentValue -= CalculateFunBasedOnListOfFavoriteThings(Subject.FunObjectInUse);
     }
     else
     {
        FunNeed.CurrentValue = Subject.TimeSinceLastDidSomething;
     }
}
 
//Similar to the one in The Sims.
IncreasingRule RoomRule.Apply(RoomNeed, Subject)
{
     if (Subject.JustEnteredRoom)
     {
         if (Subject.CurrentEnvironment.ContainsNewDecorations)
         {
             RoomNeed.CurrentValue -= CalculateBeautyBasedOnSubjectPreferences(Subject, Subject.CurrentEnvironment.NewDecorations);
         }
     }
     else
     {
         RoomNeed.CurrentValue = Subject.TimeSinceSeenSomethingNew;
     }
}

Mes estimations super basiques :
Code Perl : 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
my %eating_rates = {
	"faim" 		=> -8,
	"fatigue"	=> +1,
	"ennui"		=> +1,
	"solitude"	=> +2 	}
 
my %sleeping_rates = {
	"faim" 		=> +1,
	"fatigue"	=> -4,
	"ennui"		=> +2,
	"solitude"	=> +1 	}
 
my %running_rates = {
	"faim" 		=> +2,
	"fatigue"	=> +1,
	"ennui"		=> -8,
	"solitude"	=> +1 	}
 
my %chatting_rates = {
	"faim" 		=> +2,
	"fatigue"	=> +1,
	"ennui"		=> +1,
	"solitude"	=> -4 	}