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