aboutsummaryrefslogtreecommitdiff
path: root/src/tower.c
blob: a92a201ba4811839fc450fff6d52465b4d841d9b (plain)
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);
}