1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#include "hanoi.h"
static uint8_t st_tower_pop(t_tower *tower)
{
if (tower->len == 0)
abort();
uint8_t top = tower->data[tower->len - 1];
tower->len--;
return top;
}
static void st_tower_push(t_tower *tower, uint8_t top)
{
if (tower->len == MAX_HEIGHT)
abort();
tower->data[tower->len] = top;
tower->len++;
}
uint8_t tower_peek(t_tower *tower)
{
return (tower->data[tower->len - 1]);
}
void towers_init(t_tower towers[3], size_t disk_num)
{
memset(towers[0].data, 0, sizeof(t_tower));
memset(towers[1].data, 0, sizeof(t_tower));
memset(towers[2].data, 0, sizeof(t_tower));
for (size_t i = 0; i < disk_num; i++)
towers[0].data[i] = disk_num - i;
towers[0].len = disk_num;
towers[1].len = 0;
towers[2].len = 0;
}
void towers_move(t_tower towers[3], size_t from, size_t to)
{
if (from > 2 || to > 2)
abort();
st_tower_push(&towers[to], st_tower_pop(&towers[from]));
}
void tower_put(t_tower *tower, WINDOW *win, enum e_highlight highlight_level)
{
int height, width;
getmaxyx(win, height, width);
wclear(win);
if (highlight_level & HIGHLIGHT_FROM)
mvwaddstr(win, 1, 1, "SELECTED");
if (highlight_level & HIGHLIGHT_CURRENT)
wattron(win, A_REVERSE);
mvwvline(win, 1, width / 2, '|', height - 2);
for (size_t i = 0; i < tower->len; i++)
{
int disk_width = tower->data[i] * 2 + 1;
if (disk_width > width - 2)
{
disk_width = width - 5;
wattron(win, A_BOLD);
mvwprintw(win, height - i - 2, 0, "%2d", tower->data[i]);
wattroff(win, A_BOLD);
}
mvwhline(win, height - i - 2, width / 2 - disk_width / 2, '#', disk_width);
}
if (highlight_level & HIGHLIGHT_CURRENT)
wattroff(win, A_REVERSE);
wrefresh(win);
}
|