about summary refs log tree commit diff stats
path: root/hanoi.lua
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-10-23 22:27:17 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-10-23 22:28:00 -0700
commit36ef0c236ec840ca1ffdd634df9d967b12c8f7d1 (patch)
treefbbd8305a53af880b05acef67a3e8158cd3f98f1 /hanoi.lua
parent8d8580089f177192b895b302275677d25af4e629 (diff)
downloadteliva-36ef0c236ec840ca1ffdd634df9d967b12c8f7d1.tar.gz
a simple test "app": towers of hanoi
Currently it works with stock Lua and lcurses. Our job now is to build
in the bindings to make it work here.
Diffstat (limited to 'hanoi.lua')
-rw-r--r--hanoi.lua78
1 files changed, 78 insertions, 0 deletions
diff --git a/hanoi.lua b/hanoi.lua
new file mode 100644
index 0000000..543849b
--- /dev/null
+++ b/hanoi.lua
@@ -0,0 +1,78 @@
+local curses = require "curses"
+
+
+tower = {{5, 4, 3, 2, 1}, {}, {}}
+
+
+local function len(array)
+  local result = 0
+  for k in pairs(array) do
+    result = result+1
+  end
+  return result
+end
+
+
+local function pop(array)
+  return table.remove(array)
+end
+
+
+local function render_tower(screen, line, col, tower_index, tower)
+  screen:attron(curses.A_BOLD)
+  screen:mvaddch(line+2, col, string.char(96+tower_index))
+  screen:attroff(curses.A_BOLD)
+  screen:mvaddstr(line+1, col-3, "-------")
+  for i, n in ipairs(tower) do
+    screen:mvaddstr(line, col, n)
+    line = line - 1
+  end
+  for i=1,5-len(tower) do
+    screen:mvaddstr(line, col, "|")
+    line = line - 1
+  end
+end
+
+
+local function render(screen)
+  screen:clear()
+  local lines = curses.lines()
+  local cols = curses.cols()
+  local line = math.floor(lines/2)
+  local col = math.floor(cols/4)
+  for i,t in ipairs(tower) do
+    render_tower(screen, line, i*col, i, t)
+  end
+end
+
+
+local function make_move(from, to)
+  local disk = pop(tower[from])
+  table.insert(tower[to], disk)
+end
+
+
+local function update(screen)
+  screen:mvaddstr(curses.lines()-2, 5, "tower to remove top disk from? ")
+  local from = string.byte(curses.getch()) - 96
+  curses.refresh()
+  screen:mvaddstr(curses.lines()-1, 5, "tower to stack it on? ")
+  local to = string.byte(curses.getch()) - 96
+  curses.refresh()
+  make_move(from, to)
+end
+
+
+local function main()
+  local screen = curses.initscr()
+
+  while 1 do
+    render(screen)
+    update(screen)
+  end
+
+  curses.endwin ()
+end
+
+
+main()