package hamster_tycoon import ( "errors" "fmt" "math/rand" ) const ( Full = iota AlmostFull Middle AlmostEmpty Empty ) const ( TotalGestationPeriod = 15 MinChild = 5 MaxCild = 9 GestationCooldown = (3*7) + 2 GestationMinAge = 10*6 MaxAge = 365*2 GestationLuck = 70 FEMALE = "F" MALE = "M" ) var GlobalHamsterNumber = 1 type Hamster struct { Name string Number int Sexe string Age int Father *Hamster Mother *Hamster HungerLevel int8 ThirstLevel int8 Weight float64 Height float64 Alive bool Selled bool Gestation bool GestationPeriod int8 GestationCooldown int8 Child []*Hamster } func(h *Hamster) Die(){ h.Alive = false } func (h *Hamster) Fuck(another *Hamster) (bool,error){ if h.Sexe == another.Sexe { return false, errors.New("can't fuck together") } if h.Age <= GestationMinAge || another.Age <= GestationMinAge { return false, errors.New("one of the hamster is too young") } rand := randNumber(1,100) if rand <= GestationLuck { female := func() *Hamster{if h.Sexe == FEMALE {return h } else {return another}}() female.Gestation = true female.GestationPeriod = 0 female.GestationCooldown = TotalGestationPeriod + GestationCooldown } return rand <= GestationLuck, nil } func Born(father *Hamster, mother *Hamster)([]*Hamster,error){ if !mother.Alive || mother.Selled { return nil, errors.New("the mother is not here") } if mother.GestationPeriod != TotalGestationPeriod { return nil, errors.New("not the time to make child") } mother.GestationCooldown = 0 mother.Gestation = false mother.GestationPeriod = 0 numberOfChild := randNumberChild() child := make([]*Hamster,numberOfChild) for i := 1; i <= numberOfChild; i++{ child[i] = &Hamster{ Name: fmt.Sprintf("Hamster %d",GlobalHamsterNumber), Number: GlobalHamsterNumber, Age : 1, Sexe: randSexe(), Father: father, Mother: mother, HungerLevel: Full, ThirstLevel: Full, Alive: true, Selled: false, Gestation: false, GestationPeriod: 0, GestationCooldown: 30, } } mother.Child = append(mother.Child, child...) father.Child = append(father.Child, child...) return child,nil } func randNumberChild() int { return randNumber(MinChild,MaxCild) } func randSexe() string { return func () string{ if randNumber(1,2) == 2 { return MALE } else { return FEMALE } }() } func randNumber(min int ,max int) int { return min + rand.Intn(max-min) }