145 lines · 2.2 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h>#include <event.h>#include "game.h" char *mbuttons[] ={	"pass",	"undo",	"restart scoring",	"resign",	0}; char *rbuttons[] ={	"exit",	0}; Menu mmenu ={	mbuttons,}; Menu rmenu ={	rbuttons,}; void game(int);static char* move2coord(int);static int coord2move(char*); static void removedeadgroup(int); voidgame(int sg){	int move;	char s[] = "";	Mouse m; 	sprint(s, "goban %d", getpid());	newwindow(0);	if(initdraw(0, 0, s) < 0)		sysfatal("initdraw failed: %r");	einit(Emouse); 	initgoban(sg != 0 ? sg : Maxgobansize);	drawgoban(); 	for(;; m = emouse()){		if(m.buttons&1){			move = px2move(m.xy);			if(move == -1){				print("error: %r\n");				continue;			}			if(isgameover == 0 && playmove(move) == -1){				print("error: %r\n");				continue;			}else if(isgameover == 1){				if(goban[move] == Black || goban[move] == White)					removedeadgroup(group[move]);			}			drawgoban();		}else if(m.buttons&2){			switch(emenuhit(2, &m, &mmenu)){			case 0:				playmove(Pass);				break;			case 1:				/* call igs undoplease */				break;			case 2:				/* call igs undo when scoring */				break;			case 3:				isgameover = 1;				print("Winner: %d\n", -turn);				exits(0);			}		}else if(m.buttons&4){			switch(emenuhit(3, &m, &rmenu)){			case 0:				isgameover = 1;				exits(0);			}		}	}} static char*move2coord(int move){	char coord[4]; 	/* There is no I in coordinates: it goes from H to J. */	if(move % sgoban < 'I' - 'A' + 1)		coord[0] = 'A' + move % sgoban;	else		coord[0] = 'A' + move % sgoban + 1;	sprint(coord + 1, "%d", sgoban - move / sgoban); 	return coord;} static intcoord2move(char* coord){	int move; 	/* There is no I in coordinates: it goes from H to J. */	if(coord[0] < 'I')		move = coord[0] - 'A';	else		move = coord[0] - 'A' - 1;	move += (sgoban - atoi(coord + 1)) * sgoban;	return move;} static voidremovedeadgroup(int grp){	int i; 	for(i = 0; i < sgoban * sgoban; i++){		if(group[i] == grp){			/* telnet enter dead group: coord */			print("%s\n", move2coord(i));		}	}	capture(grp);} voideresized(int new){	if(new)		if(getwindow(display, Refnone) < 0)			sysfatal("eresized failed: %r");	drawgoban();}