treasure/main.nim

67 lines
1.4 KiB
Nim

import strutils
import json
import random
import times
import os
import input_type
import map_type
import turtle
import turtle_type
import score
import select
import mutate
import display
let now = getTime()
var seed = now.toUnix * 1_000_000_000 + now.nanosecond
if paramCount() > 0:
seed = parseInt(paramStr(1))
randomize(seed)
# first, get the inputs
let input = readFile("input.json").parseJson().to(Input)
if input.bits < 4 or input.bits > 32:
raise newException(Defect, "bits in input json must be between 4 and 32 (inclusive).")
# get a map
let map = input.generateMap()
# get population turtles
var turtles: seq[Turtle]
for i in 0..input.population-1:
turtles.add(input.genTurtle())
var lastTime = cpuTime()
proc generation(generationNumber: int) =
# does a whole generation
# gets the path of the turtles
for turtle in turtles:
turtle.execute(map, input)
score(turtle, map, input)
# display generation
if generationNumber mod 500 == 0:
let newTime = cpuTime()
let timeSeconds = newTime - lastTime
lastTime = newTime
displayGeneration(generationNumber, timeSeconds, seed.int(), input, map, turtles)
turtles.select(input)
# add mutated turtles from previous generation
let prevGenCount = turtles.high()
while turtles.len() < input.population:
let basis = turtles[rand(prevGenCount)]
turtles.add(mutate(basis, input))
var i = 0
while true:
generation(i)
inc i