enum{ /* Colouring of stones */ /* marked for dead are tolower of normal*/ Hcapplay='A', //Hcap Emptystone='e', //empty stone Wmarked='w', //marked white Bmarked='b', //marked black Lstone='l', //Mark for the last stone Kou='k', //Kou Cntstone='c', //Count point Bstone='B', //Black stone Wstone='W', //White stone Nop='N', //Nop /* Special moves */ Chplayer='O', //Change player Resignmv='F', //Resign Chmode='C', //Change mode to end, count Mdead='D', //Mark dead, count }; extern char *emptytype; extern int verbose; #define dprint if(verbose)print enum { Stacksz = 1024*1024, }; enum { Bansz=19, }; typedef struct Move Move; struct Move{ Point; /* this is i,j in goban in Go coordinates, starting in 1,1 */ char type; Move *next; }; // move.c void fillmov(Move *m, Point pos, char type); void freegrp(Move *m); int opgrp(Move *grp, char type, void (*op)(Move *m, char type)); Move* clonegrp(Move *grp); Move* addlast(Move *g,Move *m); Move* pushmov(Move *g, Move *m); Move* popmov(Move **m, Move *g); void opprint(Move *m, char); void opdebug(Move *m,char); void opplace(Move *m, char type); void opsend(Move *mv,char); void opsettype(Move *m, char c); void opnop(Move *,char); Move* freelast(Move *g); Move* takelast(Move **grp); // rules.c void cleangoban(void); Move* getmove(Point pos); int nlibert(Move *m); int move(Move *m, Move **mdead); int countpos(Move *m, Move **terr, char *type); Move* getgrp(Move *m, char *neightype); void opplace(Move *m, char type); int markdead(Move *m,Move **mdead); int trycount(int *nw, int *nb); int isvalidpos(Point pos); void cleartype(char type); enum { Hcapsz=9 }; void inthread(void *); void ifcthread(void *); extern Point hcap[Hcapsz]; extern Point hcapord[Hcapsz][Hcapsz]; extern char goban[Bansz+1][Bansz+1]; extern Move lkou; extern Move lstone; extern Move *moves;