|
|
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 u
Length: 7730 (0x1e32)
Types: TextFile
Names: »user.y«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Othello/user.y«
%{
/*
* ex:set ts=8 sw=8:
* user interface
*/
# include "reversi.h"
# include <stdio.h>
# include <signal.h>
boardT board, saveBoard;
int saved;
int savePlayer;
int atend;
int atbegin;
int level;
int player;
extern int maxlev, movex, movey;
int com;
int gotsignal;
char sbuf[80];
char ebuf[80];
int sdebug = 0, mdebug = 0;
int record = 0;
FILE *rfile;
int first = WHITE;
int defcom = BLACK;
int showScore = 1;
struct move {
int p, x, y;
};
struct move saveGame[64];
struct move *saveP;
%}
%token MOVE LEVEL COMPUTER UNDO HINT PLAY
%token RECORD REPLAY SAVE
%token RESTART NEW GAME QUIT
%token GRID NOGRID HELP NOHELP SCORE NOSCORE
%token DEBUG EVAL
%token FROM INTO TO FILEe NO
%token NUMBER COMMA NL STRING SEMI EOG ERR
%token WH BL HUMAN BOTH NEITHER NONE FIRST SECOND
%%
game : game commands NL prompt
| prompt
;
prompt :
{
if (!atend) {
loop: ;
dispTurn (player);
if (!hasmove (player, board)) {
if (!hasmove (-player, board)) {
fini (board);
if (com == 0)
com = BLACK;
++atend;
dispTurn (EMPTY);
goto nomove;
} else {
if (player == WHITE)
dispError ("white has no move");
else
dispError ("black has no move");
player = -player;
}
}
if (com == 0 || com == player) {
dispError ("thinking...");
if (computer (player, board, level)) {
atbegin = 0;
sprintf (ebuf, "I move to %d, %d\n",
movex, movey);
dispError (ebuf);
saveP->x = movex;
saveP->y = movey;
saveP->p = player;
++saveP;
if (record)
fprintf (rfile, "%d: %d,%d\n",
player, movex, movey);
player = -player;
display (board);
if (gotsignal && com != 0)
gotsignal = 0;
}
if (gotsignal && com == 0) {
com = -player;
gotsignal = 0;
}
goto loop;
}
}
nomove: ;
readLine ();
}
;
commands: commands SEMI command
| command
| error oerror
{
dispHelp ();
}
;
command :
| EOG
{
YYACCEPT;
}
| omove NUMBER ocomma NUMBER
{
if (1 <= $2 && $2 <= SIZE &&
1 <= $4 && $4 <= SIZE &&
legal (player, $2, $4, board)) {
copy (saveBoard, board);
savePlayer = player;
++saved;
move (player, $2, $4, board);
atbegin = 0;
if (record)
fprintf (rfile, "%d: %d,%d\n",
player, $2, $4);
saveP->x = $2;
saveP->y = $4;
saveP->p = player;
++saveP;
player = -player;
display (board);
} else {
sprintf (ebuf, "illegal move: %d, %d", $2, $4);
dispError (ebuf);
}
}
| DEBUG STRING
{
register char *s;
register int v;
v = 1;
for (s = sbuf; *s; ++s)
switch (*s) {
case 'm':
mdebug = v;
break;
case 's':
sdebug = v;
break;
case '!':
v = !v;
break;
}
}
| GRID
{
dispGrid ();
}
| NO GRID
{
dispNoGrid ();
}
| NOGRID
{
dispNoGrid ();
}
| SCORE
{
showScore = 1;
dispScore (board);
}
| NOSCORE
{
showScore = 0;
dispNoScore ();
}
| NO SCORE
{
showScore = 0;
dispNoScore ();
}
| LEVEL NUMBER
{
level = $2;
}
| LEVEL oerror
{
sprintf (ebuf, "current level is %d", level);
dispError (ebuf);
}
| PLAY whichp
{
if ($2 == WHITE || $2 == BLACK)
defcom = $2;
com = $2;
}
| PLAY oerror
{
dispError ("play (white black both none)");
}
| whichp FIRST
{
if ($1 == WHITE || $1 == BLACK)
first = $1;
if (atbegin)
player = first;
}
| FIRST oerror
{
dispError ("(white black you me) first");
}
| whichp SECOND
{
if ($1 == WHITE || $1 == BLACK)
first = - $1;
if (atbegin)
player = first;
}
| SECOND oerror
{
dispError ("(white black you me) second");
}
| HELP
{
dispHelp ();
}
| NOHELP
{
dispNoHelp ();
}
| NO HELP
{
dispNoHelp ();
}
| QUIT
{
YYACCEPT;
}
| UNDO
{
if (saved) {
copy (board, saveBoard);
player = savePlayer;
saved = 0;
display (board);
}
}
| NEW ogame eoc
{
YYABORT;
}
| RESTART eoc
{
YYABORT;
}
| EVAL
{
sprintf (ebuf, "score: %d\n", score (board, WHITE));
dispError (ebuf);
}
| RECORD ointo ofile STRING
{
if ((rfile = fopen (sbuf, "w")) == NULL) {
sprintf (ebuf, "could not open %s", sbuf);
dispError (ebuf);
record = 0;
} else
++record;
}
| RECORD oerror
{
dispError ("record \"file\"");
}
| REPLAY whichp ofrom ofile STRING
{
replay ($2, sbuf);
}
| REPLAY oerror
{
dispError ("replay (both white black) \"file\"");
}
| SAVE ointo ofile STRING
{
struct move *m;
if ((rfile = fopen (sbuf, "w")) == NULL) {
sprintf (ebuf, "could not open %s", sbuf);
dispError (ebuf);
} else {
m = saveGame;
fprintf (rfile, "%d: -1,-1\n", m->p);
for (; m != saveP; m++)
fprintf (rfile, "%d: %d,%d\n",
m->p, m->x, m->y);
fclose (rfile);
rfile = 0;
}
}
| SAVE oerror
{
dispError ("save \"file\"");
}
| HINT
{
if (hasmove (player, board)) {
char buf[80];
hint (player, board, level);
sprintf (buf, "I suggest %d, %d", movex, movey);
dispError (buf);
}
}
;
eoc : SEMI
| NL
;
omove : MOVE
|
;
ogame : GAME
|
;
ocomma : COMMA
|
;
oerror : oerror error
{
yyerrok;
}
| oerror ERR
|
;
ointo : TO
| INTO
|
;
ofrom : FROM
|
;
ofile : FILEe
|
;
whichp : WH
{ $$ = WHITE; }
| BL
{ $$ = BLACK; }
| COMPUTER
{ $$ = com==WHITE?WHITE:BLACK; }
| HUMAN
{ $$ = com==WHITE?BLACK:WHITE; }
| BOTH
{ $$ = 0; }
| none
{ $$ = 2; }
;
none : NONE
| NEITHER
;
%%
yyerror (s)
char *s;
{
dispError (s);
}
caught ()
{
gotsignal++;
signal (SIGINT, caught);
}
main (argc, argv)
char **argv;
{
signal (SIGINT, caught);
level = 2;
dispInit ();
srand (getpid());
while (**++argv == '-') {
while (*++*argv) {
switch (**argv) {
case 'b':
defcom = BLACK;
break;
case 'w':
defcom = WHITE;
break;
case '1':
if (!*++*argv)
continue;
if (**argv == WHITE)
first = WHITE;
else
first = BLACK;
break;
case 'g':
dispGrid ();
break;
case 's':
showScore = 1;
}
}
}
do {
if (rfile)
fclose (rfile);
rfile = 0;
player = first;
com = defcom;
atend = 0;
atbegin = 1;
setup ();
saved = 0;
saveP = saveGame;
display (board);
if (*argv) {
replay (0, *argv);
++argv;
}
} while (yyparse ());
dispEnd ();
}
yywrap ()
{
return 1;
}
setup ()
{
register int i,j;
for (i = 1; i <= SIZE; i++)
for (j = 1; j <= SIZE; j++)
board[i][j] = 0;
board[4][4] = WHITE;
board[4][5] = BLACK;
board[5][4] = BLACK;
board[5][5] = WHITE;
}
replay (who, file)
char *file;
{
int x, y, p;
if (rfile)
fclose (rfile);
if ((rfile = fopen (file, "r")) == NULL) {
sprintf (ebuf, "could not open %s", file);
dispError (ebuf);
return;
}
while (fscanf (rfile, "%d: %d, %d\n", &p, &x, &y) == 3) {
if (x == -1 && y == -1) {
player = p;
continue;
}
if (!hasmove (player, board)) {
player = -player;
if (!hasmove (player, board))
return;
}
if (p != player) {
sprintf (ebuf, "not %s's turn\n",
player == WHITE? "white":"black");
dispError (ebuf);
return;
}
if (who == 0 || p == who) {
if (!legal (p, x, y, board)) {
sprintf(ebuf, "illegal move: %d, %d\n", x, y);
dispError (ebuf);
return;
}
move (p, x, y, board);
atbegin = 0;
player = -player;
display (board);
}
else if (player == com) {
if (hasmove (player, board)) {
dispError ("thinking...");
dispTurn (EMPTY);
if (computer (player, board, level)) {
dispError ("");
atbegin = 0;
player = -player;
display (board);
}
}
}
}
fclose (rfile);
rfile = 0;
}