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
|
#include "tower.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++;
}
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, int highlight_level)
{
int height, width;
getmaxyx(win, height, width);
if (highlight_level == 1)
wattron(win, A_BOLD);
mvwvline(win, 1, width / 2, '|', height - 2);
for (size_t i = 0; i < tower->len; i++)
{
int disk_width = tower->data[i] * 2 + 1;
mvwhline(win, height - i - 2, width / 2 - disk_width / 2, '#', disk_width);
}
if (highlight_level == 1)
wattroff(win, A_BOLD);
wrefresh(win);
}
|