aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-06-28 09:40:47 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-28 09:40:47 +0200
commit15e690e0dc9f539ca0e8e9c98c3fdc9105ec9d74 (patch)
treed60e39bdac9d2447b89e56dac88b8877b5005378 /src/main.c
parentfeae9f442000cf218c249e6e163e8b5137771857 (diff)
downloadhanoi-master.tar.gz
hanoi-master.tar.bz2
hanoi-master.zip
Added solveHEADmaster
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c123
1 files changed, 69 insertions, 54 deletions
diff --git a/src/main.c b/src/main.c
index a7ed674..60f2fa8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,15 +2,18 @@
int main(int argc, char **argv)
{
+ bool solve_arg = false;
t_tower towers[3];
size_t disk_num = 3;
- if (argc == 2)
- if (sscanf(argv[1], "%lu", &disk_num) != 1)
+ if (argc >= 2)
+ if (sscanf(argv[1], "%lu", &disk_num) != 1 || disk_num > MAX_HEIGHT - 1)
{
fprintf(stderr, "%s: error: `%s` is not a valid number of disk", argv[0], argv[1]);
return (1);
}
towers_init(towers, disk_num);
+ if (argc == 3 && strcmp(argv[2], "-s") == 0)
+ solve_arg = true;
initscr();
noecho();
@@ -32,69 +35,81 @@ int main(int argc, char **argv)
abort();
}
- enum e_mode mode = MODE_SELECT_FROM;
- int from_selection = 0;
- int current = 0;
- bool running = true;
- while (running)
+
+ if (!solve_arg)
{
- for (int i = 0; i < 3; i++)
+ enum e_mode mode = MODE_SELECT_FROM;
+ int from_selection = 0;
+ int current = 0;
+ bool running = true;
+ while (running)
{
- enum e_highlight highlight = HIGHLIGHT_NONE;
- if (mode == MODE_SELECT_TO && i == from_selection)
- highlight |= HIGHLIGHT_FROM;
- if (i == current)
- highlight |= HIGHLIGHT_CURRENT;
- tower_put(&towers[i], wins[i], highlight);
- }
-
- int c;
- c = getch();
+ for (int i = 0; i < 3; i++)
+ {
+ enum e_highlight highlight = HIGHLIGHT_NONE;
+ if (mode == MODE_SELECT_TO && i == from_selection)
+ highlight |= HIGHLIGHT_FROM;
+ if (i == current)
+ highlight |= HIGHLIGHT_CURRENT;
+ tower_put(&towers[i], wins[i], highlight);
+ }
- switch (c)
- {
- case 'q':
- running = false;
- break;
- case 'j':
- case KEY_LEFT:
- current--;
+ if (towers[0].len == 0 &&
+ towers[1].len == 0)
break;
- case 'k':
- case KEY_RIGHT:
- current++;
- break;
- case '\n':
- if (mode == MODE_SELECT_FROM)
- {
- if (towers[current].len == 0)
- mvprintw(0, 0, "Tower %d is empty");
- else
+
+ int c;
+ c = getch();
+
+ switch (c)
+ {
+ case 'q':
+ running = false;
+ break;
+ case 'j':
+ case KEY_LEFT:
+ current--;
+ break;
+ case 'k':
+ case KEY_RIGHT:
+ current++;
+ break;
+ case '\n':
+ if (mode == MODE_SELECT_FROM)
{
- from_selection = current;
- mode = MODE_SELECT_TO;
+ if (towers[current].len == 0)
+ mvprintw(0, 0, "Tower %d is empty");
+ else
+ {
+ from_selection = current;
+ mode = MODE_SELECT_TO;
+ }
}
- }
- else if (mode == MODE_SELECT_TO)
- {
- if (!towers[current].len == 0 &&
- tower_peek(&towers[current]) < tower_peek(&towers[from_selection]))
+ else if (mode == MODE_SELECT_TO)
{
- mvprintw(0, 0, "Top disk of %d is smaller than top disk of %d",
- current, from_selection);
+ if (!towers[current].len == 0 &&
+ tower_peek(&towers[current]) < tower_peek(&towers[from_selection]))
+ {
+ mvprintw(0, 0, "Top disk of %d is smaller than top disk of %d",
+ current, from_selection);
+ }
+ else
+ towers_move(towers, from_selection, current);
+ mode = MODE_SELECT_FROM;
}
- else
- towers_move(towers, from_selection, current);
- mode = MODE_SELECT_FROM;
- }
- break;
+ break;
+ }
+ if (current < 0)
+ current = 2;
+ else if (current > 2)
+ current = 0;
}
- if (current < 0)
- current = 2;
- else if (current > 2)
- current = 0;
}
+ else
+ solve(towers, wins, disk_num, 0, 1, 2);
+ mvaddstr(0, 0, "FINISHED: press any key to quit");
+ getch();
for (int i = 0; i < 3; i++)
delwin(wins[3]);
endwin();