37 lines
881 B
Nim
37 lines
881 B
Nim
import random
|
|
import math
|
|
import algorithm
|
|
|
|
import turtle
|
|
import turtle_type
|
|
import input_type
|
|
|
|
proc select*(turtles: var seq[Turtle], input: Input) =
|
|
# sort turtles according to score
|
|
turtles.sort(compareTurtles)
|
|
|
|
var scoreSum = 0
|
|
for turtle in turtles:
|
|
scoreSum += turtle.score
|
|
let avgScore = scoreSum div turtles.len()
|
|
|
|
var survivors: seq[Turtle] = @[]
|
|
|
|
for i in 0..turtles.high():
|
|
let turtle = turtles[i]
|
|
const smoothness = 0.08
|
|
const chanceRandomLive = 0.02
|
|
const chanceRandomDie = 0.0
|
|
let chanceExp = exp(smoothness * float(turtles[i].score - avgScore))
|
|
let chance = chanceRandomLive + (1-chanceRandomDie-chanceRandomLive) * chanceExp / (chanceExp + 1)
|
|
if rand(1.0) < chance:
|
|
survivors.add(turtle)
|
|
|
|
var i = 0
|
|
while i < turtles.len():
|
|
if turtles[i] notin survivors:
|
|
turtles.del(i)
|
|
else:
|
|
inc i
|
|
|