diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-11-05 12:10:53 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-11-05 12:12:16 -0700 |
commit | 048abcfbc2ac3440f9b9d8febd9d5656c567aad8 (patch) | |
tree | 622c7791616b1f341703720ac445a5fa395320e3 /src | |
parent | d1c9bff73716b6772f56e3e899e36997ab33ab12 (diff) | |
download | teliva-048abcfbc2ac3440f9b9d8febd9d5656c567aad8.tar.gz |
ok, what do we need next for hanoi.lua?
Diffstat (limited to 'src')
-rw-r--r-- | src/hanoi.lua | 76 |
1 files changed, 76 insertions, 0 deletions
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() |