diff options
Diffstat (limited to 'examples/spiral_snake.lua')
-rw-r--r-- | examples/spiral_snake.lua | 72 |
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!") |