about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--hanoi.lua4
-rw-r--r--src/hanoi.lua76
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()