|
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 c
Length: 1589 (0x635) Types: TextFile Names: »check.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Kriegspiel/check.c«
/* check.c */ #include "externs.h" moveintocheck (from, to) int from, to; { int victim, intocheck, color; LIST check (); color = whose [from]; /* make move on board */ victim = findvictim (from, to); if (victim) whose [victim] = EMPTY; whose [to] = color; whose [from] = EMPTY; if (occupant [from] == KING) kingloc [color] = to; intocheck = (check (color) != NIL); /* see if now in check */ if (occupant [from] == KING) /* restore board position */ kingloc [color] = from; whose [from] = color; whose [to] = EMPTY; if (victim) whose [victim] = 1 - color; return intocheck; } LIST check (color) int color; { LIST l, checkdirs, lmember (), linsert (); int direction, spot, dist, side; checkdirs = NIL; l = dirlist [QUEEN]; while (l != NIL) { direction = l->i; l = l->n; spot = kingloc [color]; for (dist = 1; TRUE; dist++) { spot += direction; if ((whose [spot] == 1 - color) && (lmember (-direction, dirlist [occupant [spot]]) && !(occupant [spot] == KING && dist > 1))) checkdirs = linsert (checkdirs, direction); if (whose [spot] != EMPTY) break; } } l = dirlist [KNIGHT]; while (l != NIL) { direction = l->i; l = l->n; spot = kingloc [color] + direction; if (whose [spot] == 1 - color && occupant [spot] == KNIGHT) checkdirs = linsert (checkdirs, direction); } for (side = -1; side <= 1; side += 2) { spot = kingloc [color] + pawndir [color] + side; if (whose [spot] == 1 - color && occupant [spot] == PAWN) checkdirs = linsert(checkdirs, pawndir [color] + side); } return checkdirs; }