diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-10-23 22:27:17 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-10-23 22:28:00 -0700 |
commit | 36ef0c236ec840ca1ffdd634df9d967b12c8f7d1 (patch) | |
tree | fbbd8305a53af880b05acef67a3e8158cd3f98f1 | |
parent | 8d8580089f177192b895b302275677d25af4e629 (diff) | |
download | teliva-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.
-rw-r--r-- | hanoi.lua | 78 |
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() |