summaryrefslogtreecommitdiff
path: root/examples/spiral_snake.lua
diff options
context:
space:
mode:
Diffstat (limited to 'examples/spiral_snake.lua')
-rw-r--r--examples/spiral_snake.lua72
1 files changed, 72 insertions, 0 deletions
diff --git a/examples/spiral_snake.lua b/examples/spiral_snake.lua
new file mode 100644
index 0000000..84a2040
--- /dev/null
+++ b/examples/spiral_snake.lua
@@ -0,0 +1,72 @@
+local sys = require "system"
+
+print [[
+
+This example will draw a snake like spiral on the screen. Showing ANSI escape
+codes for moving the cursor around.
+
+]]
+
+-- backup term settings with auto-restore on exit
+sys.autotermrestore()
+
+-- setup Windows console to handle ANSI processing
+sys.setconsoleflags(io.stdout, sys.getconsoleflags(io.stdout) + sys.COF_VIRTUAL_TERMINAL_PROCESSING)
+
+-- start drawing the spiral.
+-- start from current pos, then right, then up, then left, then down, and again.
+local x, y = 1, 1 -- current position
+local dx, dy = 1, 0 -- direction after each step
+local wx, wy = 30, 30 -- width and height of the room
+local mx, my = 1, 1 -- margin
+
+-- commands to move the cursor
+local move_left = "\27[1D"
+local move_right = "\27[1C"
+local move_up = "\27[1A"
+local move_down = "\27[1B"
+
+-- create room: 30 empty lines
+print(("\n"):rep(wy))
+local move = move_right
+
+while wx > 0 and wy > 0 do
+ sys.sleep(0.01) -- slow down the drawing a little
+ io.write("*" .. move_left .. move )
+ io.flush()
+ x = x + dx
+ y = y + dy
+
+ if x > wx and move == move_right then
+ -- end of move right
+ dx = 0
+ dy = 1
+ move = move_up
+ wy = wy - 1
+ my = my + 1
+ elseif y > wy and move == move_up then
+ -- end of move up
+ dx = -1
+ dy = 0
+ move = move_left
+ wx = wx - 1
+ mx = mx + 1
+ elseif x < mx and move == move_left then
+ -- end of move left
+ dx = 0
+ dy = -1
+ move = move_down
+ wy = wy - 1
+ my = my + 1
+ elseif y < my and move == move_down then
+ -- end of move down
+ dx = 1
+ dy = 0
+ move = move_right
+ wx = wx - 1
+ mx = mx + 1
+ end
+end
+
+io.write(move_down:rep(15))
+print("\nDone!")