Skip to content
Snippets Groups Projects
env.go 2.00 KiB
package simulation

import (
	"fmt"
	"sync"

)

type Environment struct {
	sync.RWMutex
	ags              []Agent
	agentCount       int
	station          [50][50]string
	agentsChan       map[AgentID]chan Request
	controlledAgents map[AgentID]bool
}

func NewEnvironment(ags []Agent, carte [50][50]string, agentsCh map[AgentID]chan Request) (env *Environment) {
	mapControlle := make(map[AgentID]bool)
	for _, ag := range ags {
		mapControlle[ag.id] = false
	}
	return &Environment{ags: ags, agentCount: len(ags), station: carte, agentsChan: agentsCh, controlledAgents: mapControlle}
}

func (env *Environment) AddAgent(agt Agent) {
	env.ags = append(env.ags, agt)
	env.agentCount++
}

func (env *Environment) RemoveAgent(agt Agent) {
	for i := 0; i < len(env.station); i++ {
		if env.ags[i].id == agt.id {
			// Utiliser la syntaxe de découpage pour supprimer l'élément
			env.ags = append(env.ags[:i], env.ags[i+1:]...)
			delete(env.agentsChan, agt.id)
			// Sortir de la boucle après avoir trouvé et supprimé l'élément
			break
		}
	}
	env.agentCount--
}

func (env *Environment) Do(a Action, c Coord) (err error) {
	env.Lock()
	defer env.Unlock()

	switch a {
	// case Mark:
	// 	if c[0] < 0 || c[0] > 1 || c[1] < 0 || c[1] > 1 {
	// 		return fmt.Errorf("bad coordinates (%f,%f)", c[0], c[1])
	// 	}

	// 	return nil

	case Noop:
		return nil
	}

	return fmt.Errorf("bad action number %d", a)
}

func (env *Environment) PI() float64 {
	env.RLock()
	defer env.RUnlock()

	return 4
}

func (env *Environment) Rect() Coord {
	return Coord{0, 0}
}

func (env *Environment) GetAgentChan(agt_id AgentID) chan Request {
	return env.agentsChan[agt_id]
}

func existAgent(c string) bool {
	return c != "X" && c != "E" && c != "S" && c != "W" && c != "Q" && c != "_" && c != "B"
}

func calculDirection(depart Coord, arrive Coord) int {
	if depart[0] == arrive[0] {
		if depart[1] > arrive[1] {
			return 3 //Gauche
		} else {
			return 1 //droite
		}
	} else {
		if depart[0] > arrive[0] {
			return 0 //haut
		} else {
			return 2 //bas
		}
	}
}