diff options
-rw-r--r-- | hanoi.lua | 4 | ||||
-rw-r--r-- | src/hanoi.lua | 76 |
2 files changed, 78 insertions, 2 deletions
diff --git a/hanoi.lua b/hanoi.lua index 543849b..42f6c5e 100644 --- a/hanoi.lua +++ b/hanoi.lua @@ -66,12 +66,12 @@ end local function main() local screen = curses.initscr() - while 1 do + while true do render(screen) update(screen) end - curses.endwin () + curses.endwin() end diff --git a/src/hanoi.lua b/src/hanoi.lua new file mode 100644 index 0000000..6a2311d --- /dev/null +++ b/src/hanoi.lua @@ -0,0 +1,76 @@ +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.stdscr() + + while true do + render(screen) + update(screen) + end +end + + +main() |