diff options
| author | Peter Wemm <peter@FreeBSD.org> | 1999-08-30 07:58:08 +0000 |
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 1999-08-30 07:58:08 +0000 |
| commit | 99af2e21c73f07587da16d34eb6795f4a46cc5be (patch) | |
| tree | 5df591f7e443330146099aa76e2f474a81669ebf /lib/libncurses/TESTS/knight.c | |
| parent | 02e1576966f0a3b9300a7269c3e6894e62b1f3ba (diff) | |
Notes
Diffstat (limited to 'lib/libncurses/TESTS/knight.c')
| -rw-r--r-- | lib/libncurses/TESTS/knight.c | 320 |
1 files changed, 0 insertions, 320 deletions
diff --git a/lib/libncurses/TESTS/knight.c b/lib/libncurses/TESTS/knight.c deleted file mode 100644 index 73f7b42f9d93..000000000000 --- a/lib/libncurses/TESTS/knight.c +++ /dev/null @@ -1,320 +0,0 @@ -/* Knights Tour - a brain game */ - -#include <ncurses.h> -#include <signal.h> -#include <ctype.h> -#include <stdlib.h> - -#ifdef __FreeBSD__ -#define srand48 srandom -#define lrand48 random -#endif - -short board [64]; /* the squares */ -char row, column; /* input characters */ -int rw,col; /* numeric equivalent of row and column */ -int curow,curcol; /* current row and column integers */ -int rdif, cdif; /* difference between input and current */ -int j; /* index into board */ - -char script[]={"'_)//,/(-)/__/__(_<_(__),|/|/_///_/_<//_/_)__o__o'______///_(--_(_)___,(_/,_/__(_\0"}; - -int ypos[] ={1,0,1,2,3,0,1,2,2,3,3,2,2,3,2,2,3,3,3,3,3,2,3,3,2,4,5,5, - 4,3,3,2,1,2,3,3,3,2,1,3,3,2,3,3,3,2,1,1,0,1,4,4,4,4,4,4,5,6,7,7, - 7,6,6,6,7,7,7,6,6,6,6,7,7,7,6,7,7,6,6,7,7}; - -int xpos[]={0,1,2,1,0,5,4,3,2,4,6,7,8,8,9,10,10,11,12,13,14,15,15,16, - 16,16,15,14,15,17,18,19,20,20,20,21,22,23,24,23,25,26,27,26,28, - 13,23,25,27,27,2,3,4,5,6,7,4,3,2,1,0,1,2,5,4,5,6,6,7,8,9,8,9,10, - 11,11,12,13,14,14,15}; - -static char *instructions[] = -{ -" Knight's Tour is a board game for one player. It is played on", -"an eight by eight board and is based on the allowable moves that a knight", -"can make in the game of chess. For those who are unfamiliar with the", -"game, a knight may move either on a row or a column but not diagonally.", -"He may move one square in any direction and two squares in a perpendicular", -"direction >or< two squares in any direction and one square in a", -"perpendicular direction. He may not, of course, move off the board.", -"", -" At the beginning of a game you will be asked to either choose a", -"starting square or allow the computer to select a random location.", -"Squares are designated by a letter-number combination where the row is", -"specified by a letter A-H and the numbers 1-8 define a column. Invalid", -"entries are ignored and illegal moves produce a beep at the terminal.", -"", -" The objective is to visit every square on the board. When you claim", -"a square a marker is placed on it to show where you've been. You may", -"not revisit a square that you've landed on before.", -"", -" After each move the program checks to see if you have any legal", -"moves left. If not, the game ends and your squares are counted. If", -"you've made all the squares you win the game. Otherwise, you are told", -"the number of squares you did make.", -"END" -}; - -void init(void); -int play(void); -void drawboard(void); -void dosquares(void); -void getfirst(void); -void getrc(void); -void putstars(void); -int evalmove(void); -int chkmoves(void); -int endgame(void); -int chksqr(int, int); -void instruct(void); -void title(int, int); - -int -main () -{ - init (); - for (;;) - if (!play ()) { - endwin (); - exit (0); - } -} - -void -init () -{ - - srand48 (getpid()); - initscr (); - cbreak (); /* immediate char return */ - noecho (); /* no immediate echo */ - title (1,23); - mvaddstr (23, 25, "Would you like instructions? "); - refresh(); - if ((toupper(getch())) == 'Y') - instruct(); - clear (); -} - -int -play () -{ - drawboard (); /* clear screen and drawboard */ - for (j = 0; j < 64; j++) board[j]=0; - getfirst (); /* get the starting square */ - for (;;) { - getrc(); - if (evalmove()) { - putstars (); - if (!chkmoves()) - return (endgame ()); - } - else beep(); - } -} - -void -drawboard () -{ - erase (); - dosquares (); - refresh (); - mvaddstr (0, 7, "1 2 3 4 5 6 7 8"); - for (j = 0; j < 8; j++) mvaddch (2*j+2, 3, j + 'A'); - refresh (); - mvaddstr (20, 5, "ROW:"); - mvaddstr (20, 27, "COLUMN:"); - mvaddstr (14, 49, "CURRENT ROW"); - mvaddstr (16, 49, "CURRENT COL"); - mvaddstr (22, 5, "A - H or Q to quit"); - mvaddstr (22, 27, "1 - 8 or ESC to cancel row"); - refresh (); - title (1,40); -} - -void -dosquares () -{ - mvaddstr (1, 6, "-------------------------------"); - for (j = 1; j < 9; j++){ - mvaddstr (2*j, 5, "| | | | | | | | |"); - mvaddstr (2*j+1, 6, "-------------------------------"); - } -} - -void -getfirst () /* get first square */ -{ - mvaddstr (23, 25, "(S)elect or (R)andom "); refresh (); - do { - row = toupper(getch()); - } while ((row != 'S') && (row != 'R')); - if (row == 'R') { - rw = lrand48() % 8; - col = lrand48() % 8; - j = 8* rw + col; - row = rw + 'A'; - column = col + '1'; - } - else { - mvaddstr (23, 25, "Enter starting row and column"); - refresh (); - getrc(); /* get row and column */ - } - putstars (); - move (23, 0); - clrtobot(); -} - -void -getrc () /* get row and column */ -{ - noecho (); - do { - mvaddstr (20, 35, " "); - refresh (); - do { - mvaddch (20, 11, ' '); - move (20, 11); - refresh (); - row=toupper(getch()); - if (row == 'Q') { - endwin (); - exit (1); - } - } while ((row < 'A') || (row > 'H')); - addch (row); - move (20, 35); - refresh (); - do { - column=getch(); - if (column == '\033') break; - } while ((column < '1') || (column > '8')); - if (column != '\033') addch (column); - } while (column == '\033'); - refresh(); - rw = row - 'A'; - col= column - '1'; - j = 8 * rw + col; -} - -void -putstars () /* place the stars, update board & currents */ -{ - mvaddch (2*curow+2, 38, ' '); - mvaddch (2*rw+2, 38, '<'); - mvaddch (18, curcol*4+7, ' '); - mvaddch (18, col*4+7, '^'); - curow = rw; - curcol= col; - mvaddstr (2 * rw + 2, 4*col+6, "***"); - mvaddch (14, 61, row); - mvaddch (16, 61, column); - refresh (); - board[j] = 1; -} - -int -evalmove() /* convert row and column to integers */ - /* and evaluate move */ -{ - rdif = rw - curow; - cdif = col - curcol; - rdif = abs(rw - curow); - cdif = abs(col - curcol); - refresh (); - if ((rdif == 1) && (cdif == 2)) if (board [j] == 0) return (1); - if ((rdif == 2) && (cdif == 1)) if (board [j] == 0) return (1); - return (0); -} - -int -chkmoves () /* check to see if valid moves are available */ -{ - if (chksqr(2,1)) return (1); - if (chksqr(2,-1)) return (1); - if (chksqr(-2,1)) return (1); - if (chksqr(-2,-1)) return (1); - if (chksqr(1,2)) return (1); - if (chksqr(1,-2)) return (1); - if (chksqr(-1,2)) return (1); - if (chksqr(-1,-2)) return (1); - return (0); -} - -int -endgame () /* check for filled board or not */ -{ - rw = 0; - for (j = 0; j < 64; j++) if (board[j] != 0) rw+=1; - if (rw == 64) mvaddstr (20, 20, "Congratulations !! You got 'em all"); - else mvprintw (20, 20, "You have ended up with %2d squares",rw); - mvaddstr (21, 25, "Play again ? (y/n) "); - refresh (); - if ((row=tolower(getch())) == 'y') return (1); - else return (0); -} - -#ifndef abs -abs(num) -int num; -{ - if (num < 0) return (-num); - else return (num); -} -#endif - -int -chksqr (int n1, int n2) -{ -int r1, c1; - - r1 = rw + n1; - c1 = col + n2; - if ((r1<0) || (r1>7)) return (0); - if ((c1<0) || (c1>7)) return (0); - if (board[r1*8+c1] == 0) return (1); - else return (0); -} - -void -instruct() -{ -int i; - - clear (); - for (i=0;;i++) { - if ((strcmp(instructions[i],"END"))) mvaddstr (i, 0, instructions[i]); - else { - mvaddstr (23, 25, "Ready to play ? (y/n) "); - refresh(); - if (toupper(getch()) == 'Y') { - clear (); - return; - } else { - clear (); - refresh (); - endwin (); - exit (0); - } - } - } -} - -void -title (y,x) -int y,x; -{ -char c; - - j = 0; - do { - c = script[j]; - if (c == 0) break ; - mvaddch (ypos[j]+y, xpos[j]+x, c); - j++; - } while (c != 0); - refresh (); -} - - |
