Skip to content
Snippets Groups Projects
Commit 998132ac authored by Jana Eltayeb El Rafei's avatar Jana Eltayeb El Rafei
Browse files

init_direction + ajout_fct_updateDirection

parent 3c2b89b3
No related branches found
No related tags found
1 merge request!14Merge v2
......@@ -77,7 +77,8 @@ func NewRequest(demandeur chan Request, decision int) (req *Request) {
func NewAgent(id string, env *Environment, syncChan chan int, vitesse time.Duration, force int, politesse bool, behavior Behavior, departure, destination Coord, width, height int) *Agent {
isOn := make(map[Coord]string)
return &Agent{AgentID(id), vitesse, force, politesse, departure, departure, destination, behavior, env, syncChan, Noop, isOn, false, width, height, 3, make([]alg.Node, 0), nil, 0}
direct := initDirection(departure, len(env.station[0]))
return &Agent{AgentID(id), vitesse, force, politesse, departure, departure, destination, behavior, env, syncChan, Noop, isOn, false, width, height, 3, make([]alg.Node, 0), nil, direct}
}
func (ag *Agent) ID() AgentID {
......@@ -248,8 +249,6 @@ func (ag *Agent) MoveAgent() {
if len(ag.isOn) > 0 {
RemoveAgent(&ag.env.station, ag)
}
rotateAgent(ag, or)
rotateAgent(ag, or) // mise à jour de l'orientation
//ag.env.station[ag.coordBasOccupation[0]][ag.coordBasOccupation[1]] = ag.isOn
......@@ -419,4 +418,77 @@ func (ag *Agent) findNearestExit() (Coord){
}
}
return nearest
}
/*
* Méthode qui met à jour la direction de l'agent en fonction de son mouvement
*/
func (ag * Agent) UpdateDirection() string{
switch {
case ag.direction == 0: // vers le haut
if (ag.position[0] - 1) < 0 {
return "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
return ag.env.station[ag.position[0]-1][ag.position[1]]
}
case ag.direction == 1: // vers la droite
if (ag.position[1] + 1) > 19 {
return "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
return ag.env.station[ag.position[0]][ag.position[1]+1]
}
case ag.direction == 2: // vers le bas
if (ag.position[0] + 1) > 19 {
return "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
return ag.env.station[ag.position[0]+1][ag.position[1]]
}
case ag.direction == 3: // vers la gauche
if (ag.position[1] - 1) < 0 {
return "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
return ag.env.station[ag.position[0]][ag.position[1]-1]
}
}
return "X"
}
func initDirection(depart Coord, length int) int {
n := rand.Intn(4) // direction aléatoire
for !verifyDirection(n,depart, length){
n = rand.Intn(4) // direction aléatoire
}
return n
}
func verifyDirection( n int ,depart Coord, length int) bool{
switch n {
case 0: // vers le haut
if (depart[0] - 1) < 0 {
return false
}else {
return true
}
case 1: // vers la droite
if (depart[1] + 1) > length {
return false
}else {
return true
}
case 2: // vers le bas
if (depart[0] + 1) > length{
return false
}else {
return true
}
case 3: // vers la gauche
if (depart[1] - 1) < 0 {
return false
}else {
return true
}
}
return false
}
\ No newline at end of file
......@@ -23,49 +23,12 @@ type Controleur struct {
isExpired bool // true si le controleur est expiré, false sinon
}
func (c *Controleur) startTimer() {
rand.Seed(time.Now().UnixNano()) // le générateur de nombres aléatoires
randomSeconds := rand.Intn(9) + 2 // Génère un entier aléatoire entre 2 et 10
//randomSeconds := 2
lifetime := time.Duration(randomSeconds) * time.Second
c.timer = time.NewTimer(lifetime)
//fmt.Println("[Controleur , startTimer] Le controleur est créé avec une durée de vie de ", lifetime)
go func() {
<-c.timer.C // attend que le timer expire
c.isExpired = true
}()
}
func (c *Controleur) Percept(ag *Agent) {
env := ag.env
//initialiser le faceCase
c.faceCase = ag.UpdateDirection()
switch {
case ag.direction == 0: // vers le haut
if (ag.position[0] - 1) < 0 {
c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
c.faceCase = env.station[ag.position[0]-1][ag.position[1]]
}
case ag.direction == 1: // vers la droite
if (ag.position[1] + 1) > 19 {
c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
c.faceCase = env.station[ag.position[0]][ag.position[1]+1]
}
case ag.direction == 2: // vers le bas
if (ag.position[0] + 1) > 19 {
c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
c.faceCase = env.station[ag.position[0]+1][ag.position[1]]
}
case ag.direction == 3: // vers la gauche
if (ag.position[1] - 1) < 0 {
c.faceCase = "X" // si le controleur est au bord de la station, alors il fait face à un mur
} else {
c.faceCase = env.station[ag.position[0]][ag.position[1]-1]
}
// comportement par défaut (comportement agent Lambda)
case ag.request != nil: //verifier si l'agent est communiqué par un autre agent (A VOIR SI IL EXISTE DEJA UN AGENT QUI COMMUNIQUE AVEC LE CONTROLEUR)
//print("Requete recue par l'agent lambda : ", ag.request.decision, "\n")
......@@ -147,4 +110,16 @@ func (c *Controleur) randomDestination(ag *Agent) Coord {
return Coord{randomRow, randomCol}
}
func (c *Controleur) startTimer() {
rand.Seed(time.Now().UnixNano()) // le générateur de nombres aléatoires
randomSeconds := rand.Intn(9) + 2 // Génère un entier aléatoire entre 2 et 10
//randomSeconds := 2
lifetime := time.Duration(randomSeconds) * time.Second
c.timer = time.NewTimer(lifetime)
//fmt.Println("[Controleur , startTimer] Le controleur est créé avec une durée de vie de ", lifetime)
go func() {
<-c.timer.C // attend que le timer expire
c.isExpired = true
}()
}
......@@ -8,19 +8,20 @@ import (
)
type MobiliteReduite struct {
faceCase string // case sur laquelle l'agent lambda est face à la porte
req *Request
}
func (ul *MobiliteReduite) Percept(ag *Agent) {
func (mr *MobiliteReduite) Percept(ag *Agent) {
mr.faceCase = ag.UpdateDirection()
switch {
case ag.request != nil: //verifier si l'agent est communiqué par un autre agent, par exemple un controleur lui a demandé de s'arreter
//print("Requete recue par l'agent lambda : ", ag.request.decision, "\n")
ul.req = ag.request
mr.req = ag.request
default:
ag.stuck = ag.isStuck()
if ag.stuck {
return
}
}
}
......
......@@ -12,8 +12,6 @@ type UsagerLambda struct {
}
func (ul *UsagerLambda) Percept(ag *Agent) {
// récupérer le channel de l'agent lambda
switch {
case ag.request != nil: //verifier si l'agent est communiqué par un autre agent, par exemple un controleur lui a demandé de s'arreter
//print("Requete recue par l'agent lambda : ", ag.request.decision, "\n")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment