mirror of
https://github.com/Swendude/Tortoise.git
synced 2026-03-10 08:51:17 +00:00
Drawing lines works, color needs to be implemented
This commit is contained in:
73
examples/circle.txt
Normal file
73
examples/circle.txt
Normal file
@@ -0,0 +1,73 @@
|
||||
PENDOWN
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
73
examples/spiral.txt
Normal file
73
examples/spiral.txt
Normal file
@@ -0,0 +1,73 @@
|
||||
PENDOWN
|
||||
FORWARD 0
|
||||
LEFT 10
|
||||
FORWARD 1
|
||||
LEFT 10
|
||||
FORWARD 2
|
||||
LEFT 10
|
||||
FORWARD 3
|
||||
LEFT 10
|
||||
FORWARD 4
|
||||
LEFT 10
|
||||
FORWARD 5
|
||||
LEFT 10
|
||||
FORWARD 6
|
||||
LEFT 10
|
||||
FORWARD 7
|
||||
LEFT 10
|
||||
FORWARD 8
|
||||
LEFT 10
|
||||
FORWARD 9
|
||||
LEFT 10
|
||||
FORWARD 10
|
||||
LEFT 10
|
||||
FORWARD 11
|
||||
LEFT 10
|
||||
FORWARD 12
|
||||
LEFT 10
|
||||
FORWARD 13
|
||||
LEFT 10
|
||||
FORWARD 14
|
||||
LEFT 10
|
||||
FORWARD 15
|
||||
LEFT 10
|
||||
FORWARD 16
|
||||
LEFT 10
|
||||
FORWARD 17
|
||||
LEFT 10
|
||||
FORWARD 18
|
||||
LEFT 10
|
||||
FORWARD 19
|
||||
LEFT 10
|
||||
FORWARD 20
|
||||
LEFT 10
|
||||
FORWARD 21
|
||||
LEFT 10
|
||||
FORWARD 22
|
||||
LEFT 10
|
||||
FORWARD 23
|
||||
LEFT 10
|
||||
FORWARD 24
|
||||
LEFT 10
|
||||
FORWARD 25
|
||||
LEFT 10
|
||||
FORWARD 26
|
||||
LEFT 10
|
||||
FORWARD 27
|
||||
LEFT 10
|
||||
FORWARD 28
|
||||
LEFT 10
|
||||
FORWARD 29
|
||||
LEFT 10
|
||||
FORWARD 30
|
||||
LEFT 10
|
||||
FORWARD 31
|
||||
LEFT 10
|
||||
FORWARD 32
|
||||
LEFT 10
|
||||
FORWARD 33
|
||||
LEFT 10
|
||||
FORWARD 34
|
||||
LEFT 10
|
||||
FORWARD 35
|
||||
LEFT 10
|
||||
@@ -17,10 +17,22 @@ type CommandList
|
||||
}
|
||||
|
||||
|
||||
type alias TortoiseLine =
|
||||
{ x1 : Int
|
||||
, y1 : Int
|
||||
, x2 : Int
|
||||
, y2 : Int
|
||||
, color : ( Int, Int, Int )
|
||||
}
|
||||
|
||||
|
||||
type alias TortoiseWorld =
|
||||
{ worldDimensions : ( Int, Int )
|
||||
, position : ( Int, Int )
|
||||
, heading : Int
|
||||
, pendown : Bool
|
||||
, color : ( Int, Int, Int )
|
||||
, lines : List TortoiseLine
|
||||
}
|
||||
|
||||
|
||||
@@ -35,6 +47,9 @@ initialize code =
|
||||
let
|
||||
parseResult =
|
||||
run tortoiseParser code
|
||||
|
||||
defaultTortoiseWorld =
|
||||
TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0 False ( 0, 0, 0 ) []
|
||||
in
|
||||
case parseResult of
|
||||
Ok commands ->
|
||||
@@ -42,17 +57,17 @@ initialize code =
|
||||
[] ->
|
||||
State
|
||||
(CommandList { before = [], current = END, after = [] })
|
||||
(TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0)
|
||||
defaultTortoiseWorld
|
||||
|
||||
head :: tail ->
|
||||
State
|
||||
(CommandList { before = [], current = head, after = tail })
|
||||
(TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0)
|
||||
defaultTortoiseWorld
|
||||
|
||||
Err parserError ->
|
||||
State
|
||||
(Error parserError)
|
||||
(TortoiseWorld ( 400, 400 ) ( 0, 0 ) 0)
|
||||
defaultTortoiseWorld
|
||||
|
||||
|
||||
stepCommand : CommandList -> CommandList
|
||||
@@ -91,7 +106,25 @@ executeCommand : TortoiseWorld -> Token -> Result () TortoiseWorld
|
||||
executeCommand world command =
|
||||
case command of
|
||||
FORWARD n ->
|
||||
Ok { world | position = takeSteps n world.heading world.position }
|
||||
let
|
||||
newPos =
|
||||
takeSteps n world.heading world.position
|
||||
|
||||
newLines =
|
||||
case world.pendown of
|
||||
True ->
|
||||
world.lines
|
||||
++ [ TortoiseLine (first world.position)
|
||||
(second world.position)
|
||||
(first newPos)
|
||||
(second newPos)
|
||||
world.color
|
||||
]
|
||||
|
||||
False ->
|
||||
world.lines
|
||||
in
|
||||
Ok { world | position = newPos, lines = newLines }
|
||||
|
||||
LEFT n ->
|
||||
Ok { world | heading = world.heading - n }
|
||||
@@ -99,6 +132,15 @@ executeCommand world command =
|
||||
RIGHT n ->
|
||||
Ok { world | heading = world.heading + n }
|
||||
|
||||
PENDOWN ->
|
||||
Ok { world | pendown = True }
|
||||
|
||||
PENUP ->
|
||||
Ok { world | pendown = False }
|
||||
|
||||
PENCOLOR r g b ->
|
||||
Ok { world | color = ( r, g, b ) }
|
||||
|
||||
END ->
|
||||
Ok world
|
||||
|
||||
|
||||
@@ -52,8 +52,9 @@ render tw =
|
||||
, fill "#eee"
|
||||
]
|
||||
[]
|
||||
, axis
|
||||
, renderAxis
|
||||
, renderTurtle tw
|
||||
, renderLines tw
|
||||
]
|
||||
]
|
||||
|
||||
@@ -96,8 +97,8 @@ triangle w h i =
|
||||
--"0,0 5,10, 10,0"
|
||||
|
||||
|
||||
axis : Svg msg
|
||||
axis =
|
||||
renderAxis : Svg msg
|
||||
renderAxis =
|
||||
g []
|
||||
[ line
|
||||
[ x1 "0"
|
||||
@@ -146,6 +147,25 @@ axis =
|
||||
]
|
||||
|
||||
|
||||
renderLines : TortoiseWorld -> Svg msg
|
||||
renderLines tw =
|
||||
g []
|
||||
(List.map
|
||||
(\tl ->
|
||||
line
|
||||
[ x1 (toString tl.x1)
|
||||
, y1 (toString tl.y1)
|
||||
, x2 (toString tl.x2)
|
||||
, y2 (toString tl.y2)
|
||||
, strokeWidth "1"
|
||||
, stroke "rgb(0,0,0)"
|
||||
]
|
||||
[]
|
||||
)
|
||||
tw.lines
|
||||
)
|
||||
|
||||
|
||||
|
||||
--rect
|
||||
-- [ Svg.Attributes.height "10"
|
||||
|
||||
@@ -7,6 +7,9 @@ type Token
|
||||
= FORWARD Int
|
||||
| LEFT Int
|
||||
| RIGHT Int
|
||||
| PENUP
|
||||
| PENDOWN
|
||||
| PENCOLOR Int Int Int
|
||||
| END
|
||||
|
||||
|
||||
@@ -33,6 +36,9 @@ move =
|
||||
[ forwardParser
|
||||
, leftParser
|
||||
, rightParser
|
||||
, pendownParser
|
||||
, penupParser
|
||||
, pencolorParser
|
||||
]
|
||||
|. oneOf [ newLine, Parser.end ]
|
||||
|
||||
@@ -57,11 +63,39 @@ rightParser : Parser Token
|
||||
rightParser =
|
||||
succeed RIGHT
|
||||
|. keyword "RIGHT"
|
||||
|. Parser.symbol " "
|
||||
|. space
|
||||
|= int
|
||||
|
||||
|
||||
penupParser : Parser Token
|
||||
penupParser =
|
||||
succeed PENUP
|
||||
|. keyword "PENUP"
|
||||
|
||||
|
||||
pendownParser : Parser Token
|
||||
pendownParser =
|
||||
succeed PENDOWN
|
||||
|. keyword "PENDOWN"
|
||||
|
||||
|
||||
pencolorParser : Parser Token
|
||||
pencolorParser =
|
||||
succeed PENCOLOR
|
||||
|. keyword "PENCOLOR"
|
||||
|. space
|
||||
|= int
|
||||
|. space
|
||||
|= int
|
||||
|. space
|
||||
|= int
|
||||
|
||||
|
||||
|
||||
-- |. space
|
||||
-- |= int
|
||||
-- |. space
|
||||
-- |= int
|
||||
-- DEBUG
|
||||
|
||||
|
||||
@@ -82,6 +116,15 @@ tokenToText token =
|
||||
RIGHT n ->
|
||||
"RIGHT " ++ toString n
|
||||
|
||||
PENUP ->
|
||||
"PENUP"
|
||||
|
||||
PENDOWN ->
|
||||
"PENDOWN"
|
||||
|
||||
PENCOLOR r g b ->
|
||||
"PENCOLOR " ++ toString r ++ " " ++ toString g ++ " " ++ toString b
|
||||
|
||||
END ->
|
||||
"END"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user