-static void InitTiles(void);
-static void DisplayTiles(void);
-static void MakeMove(int From, int To);
-static void AutoMove(int From, int To, int Num);
-static void Usage(void);
-static int Solved(int NumTiles);
-static int GetMove(int *From, int *To);
-static int InvalidMove(int From, int To);
-
-int
-main(int argc, char **argv)
-{
- int FromCol, ToCol;
-
- setlocale(LC_ALL, "");
-
- switch (argc) {
- case 1:
- NTiles = DEFAULTTILES;
- break;
- case 2:
- NTiles = atoi(argv[1]);
- if (NTiles > MAXTILES || NTiles < MINTILES) {
- fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
- ExitProgram(EXIT_FAILURE);
- }
- break;
- case 3:
- if (strcmp(argv[2], "a")) {
- Usage();
- ExitProgram(EXIT_FAILURE);
- }
- NTiles = atoi(argv[1]);
- if (NTiles > MAXTILES || NTiles < MINTILES) {
- fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
- ExitProgram(EXIT_FAILURE);
- }
- AutoFlag = TRUE;
- break;
- default:
- Usage();
- ExitProgram(EXIT_FAILURE);
- }
- initscr();
- if (has_colors()) {
- int i;
- short bg = COLOR_BLACK;
- start_color();
-#if HAVE_USE_DEFAULT_COLORS
- if (use_default_colors() == OK)
- bg = -1;
-#endif
- for (i = 0; i < 9; i++)
- init_pair((short) (i + 1), bg, TileColour[i]);
- }
- cbreak();
- if (LINES < 24) {
- endwin();
- fprintf(stderr, "Min screen length 24 lines\n");
- ExitProgram(EXIT_FAILURE);
- }
- if (AutoFlag) {
- curs_set(0);
- leaveok(stdscr, TRUE); /* Attempt to remove cursor */
- }
- InitTiles();
- DisplayTiles();
- if (AutoFlag) {
- do {
- noecho();
- AutoMove(0, 2, NTiles);
- } while (!Solved(NTiles));
- sleep(2);
- } else {
- echo();
- for (;;) {
- if (GetMove(&FromCol, &ToCol))
- break;
- if (InvalidMove(FromCol, ToCol)) {
- MvAddStr(STATUSLINE, 0, "Invalid Move !!");
- refresh();
- beep();
- continue;
- }
- MakeMove(FromCol, ToCol);
- if (Solved(NTiles)) {
- MvPrintw(STATUSLINE, 0,
- "Well Done !! You did it in %d moves", NMoves);
- refresh();
- sleep(5);
- break;
- }
- }
- }
- endwin();
- ExitProgram(EXIT_SUCCESS);
-}
-