about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-11-05 12:10:53 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-11-05 12:12:16 -0700
commit048abcfbc2ac3440f9b9d8febd9d5656c567aad8 (patch)
tree622c7791616b1f341703720ac445a5fa395320e3 /src
parentd1c9bff73716b6772f56e3e899e36997ab33ab12 (diff)
downloadteliva-048abcfbc2ac3440f9b9d8febd9d5656c567aad8.tar.gz
ok, what do we need next for hanoi.lua?
Diffstat (limited to 'src')
-rw-r--r--src/hanoi.lua76
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()