treasure/turtle.nim

76 lines
2.0 KiB
Nim

import input_type
import map_type
import sequtils
import turtle_type
#import instruction_sets/eight_bit
#import instruction_sets/ten_bit
import instruction_sets/any_bit
proc compareTurtles*(left, right: Turtle): int =
-cmp(left.score, right.score)
# general:
proc genTurtle*(input: Input): Turtle =
if input.instruction_set == "anybit":
return genAnybitTurtle(input, input.bits)
else:
raise newException(Defect, "Unknown instruction set.")
proc executeInstruction(instructionIndex: int, turtle: Turtle, map: Map, input: Input): int =
if input.instruction_set == "anybit":
return executeAnybit(instructionIndex.uint32, turtle, map, input, input.bits)
else:
raise newException(Defect, "Unknown instruction set.")
proc execute*(turtle: Turtle, map: Map, input: Input) =
let treasures = map.getTreasures()
# back to start
turtle.y = input.size div 2
turtle.x = input.size div 2
turtle.path.xs = @[]
turtle.path.ys = @[]
turtle.score = 0
turtle.found = repeat(false, treasures.len())
# save turtle original code
let turtleOriginalCode = turtle.memory
template tpath: Path =
turtle.path
proc markLocation: bool =
tpath.xs.add(turtle.x)
tpath.ys.add(turtle.y)
if map[turtle.y][turtle.x] == tileTreasure:
for i in 0..treasures.high():
let treasure = treasures[i]
if treasure[0] == turtle.x and treasure[1] == turtle.y:
turtle.found[i] = true
if turtle.found.allIt(it):
return true
return false
discard markLocation()
var instructionNumber = 0
var instructionIndex = 0
while instructionNumber < input.lifetime:
instructionIndex = executeInstruction(instructionIndex, turtle, map, input)
if instructionIndex == -1:
# out of bounds of map
break
if turtle.y != tpath.ys[tpath.ys.high()] or turtle.x != tpath.xs[tpath.xs.high()]:
if markLocation():
break
inc instructionNumber
turtle.steps = instructionNumber
# restore original code
turtle.memory = turtleOriginalCode