|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 4938 (0x134a) Types: TextFile Names: »display.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Othello/display.c«
/* * display.c */ # include "reversi.h" # include <curses.h> # include <ctype.h> # define toscrx(x) ((x) * 5 - 1) # define toscry(y) ((y) * 3 - 2) # define LINEX (toscrx(10)-2) # define LINEY (toscry(5)+1) static helpShown; dispInit () { register int i, j; int dispEnd(); initscr (); savetty(); noecho (); crmode (); helpShown = 0; for (i = 1; i <= SIZE; i++) { move (toscry(i), 0); printw ("%1d", i); move (0, toscrx(i)); printw ("%1d", i); } refresh (); } dispGrid () { register int i, j; for (i = 1; i <= SIZE; i++) { for (j = 1; j <= SIZE + 1; j++) { if (i <= SIZE) { move (toscry(i)+1, toscrx(j)-2); addch ('|'); move (toscry(i), toscrx(j)-2); addch ('|'); move (toscry(i)-1, toscrx(j)-2); } if (j <= SIZE) { if (i == 1) printw ("+-%1d--", j); else addstr ("+----"); } else addstr ("+"); } } refresh (); } dispNoGrid () { register int i, j; for (i = 1; i <= SIZE; i++) { for (j = 1; j <= SIZE + 1; j++) { move (toscry(i)+1, toscrx(j)-2); addch (' '); move (toscry(i), toscrx(j)-2); addch (' '); move (toscry(i)-1, toscrx(j)-2); if (j <= SIZE) { if (i == 1) printw (" %1d ", j); else addstr (" "); } else addstr (" "); } } refresh (); } dispEnd () { clearok(stdscr, 1); erase (); refresh (); resetty(); endwin (); exit (0); } boardT old; display (board) boardT board; { register int i,j; extern int showScore; for (i = 1; i <= SIZE; i++) for (j = 1; j <= SIZE; j++) if (board[i][j] != old[i][j]) { dispOne (i, j, board[i][j]); old[i][j] = board[i][j]; } refresh (); if (showScore) dispScore (board); } dispOne (y, x, who) { move (toscry (y), toscrx (x)); switch (who) { case BLACK: addstr ("/\\"); break; case WHITE: addstr ("**"); break; case EMPTY: addstr (" "); break; } move (toscry(y) + 1, toscrx (x)); switch (who) { case BLACK: addstr ("\\/"); break; case WHITE: addstr ("**"); break; case EMPTY: addstr (" "); break; } } dispScore (board) register boardT board; { register int i,j; register int ws, bs; ws = bs = 0; for (i = 1; i <= SIZE; i++) for (j = 1; j <= SIZE; j++) switch (board[i][j]) { case WHITE: ws++; break; case BLACK: bs++; break; } move (LINEY - 3, LINEX); printw ("white: %-2d black: %-2d", ws, bs); refresh (); } dispNoScore () { move (LINEY - 3, LINEX); clrtoeol (); refresh (); } static char *helpText[] = { "y, x [no] grid", "[no] help hint", "play quit", "restart record", "replay save", "[no] score undo", "level", "white|black first", "white|black second", 0, }; dispTurn (player) { static displayed = EMPTY; if (displayed == player) return; move (LINEY-1, LINEX); switch (player) { case WHITE: addstr ("white's turn"); break; case BLACK: addstr ("black's turn"); break; case EMPTY: clrtoeol (); } displayed = player; refresh (); } dispHelp () { register int i; register char **h; if (helpShown) return; i = 0; for (h = helpText; *h; ++h) { move (i, LINEX); addstr (*h); ++i; } move (LINEY+4, LINEX); printw ("white pieces are **"); move (LINEY+5, LINEX+18); printw ("**"); move (LINEY+7, LINEX); printw ("black pieces are /\\"); move (LINEY+8, LINEX+18); printw ("\\/"); refresh (); ++helpShown; } dispNoHelp () { register int i; register char **h; if (!helpShown) return; i = 0; for (h = helpText; *h; ++h) { move (i, LINEX); clrtoeol (); ++i; } move (LINEY+4, LINEX); clrtoeol (); move (LINEY+5, LINEX+18); clrtoeol (); move (LINEY+7, LINEX); clrtoeol (); move (LINEY+8, LINEX+18); clrtoeol (); refresh (); helpShown = 0; } static char lexbuf[256]; static char *lexpnt; readLine () { int ch, x, y; move (LINEY, LINEX); addstr ("-> "); loop: x = LINEX+3; y = LINEY; move (y, x); clrtoeol (); refresh (); lexpnt = lexbuf; for (;;) { ch = getch (); if (ch == -1) ch = '\004'; *lexpnt++ = ch; if (isprint (ch)) { addch (ch); ++x; refresh (); } else switch (ch) { case '\f': clearok (stdscr, 1); case '\030': case '\025': goto loop; case '\004': *lexpnt++ = -1; case '\r': case '\n': move (LINEY+1, LINEX); refresh (); *lexpnt++ = '\0'; goto done; case '\b': if (lexpnt >= lexbuf + 2) { lexpnt -= 2; --x; move (y,x); delch (); refresh (); } else --lexpnt; break; default: --lexpnt; write (1, "\007", 1); break; } } done: lexpnt = lexbuf; dispError (""); } lexgetc () { int c; extern int yylineno; c = *lexpnt++; if (c == -1) c = 4; c &= 0177; if (c == '\r') c = '\n'; if (c == '\n') ++yylineno; return c; } lexungetc (c) { --lexpnt; } dispError (s) char *s; { move (LINEY+1, LINEX); clrtoeol (); addstr (s); refresh (); }