⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 backgammon.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
int *mover,*movee;{	int	k;	for(i = 0; i <= 24; i++){		count = 0;		if(mover[i] == 0)			continue;		if((k=25-i-die1) > 0 && movee[k] >= 2)			if(mover[0] > 0)				break;		else			continue;		if(k <= 0){			if(piececount(mover, 0, 18) != 0)				break;			if((i+die1) != 25 && piececount(mover,19,i-1) != 0)				break;		}		mover[i]--;		mover[i+die1]++;		count = 1;		for(j = 0; j <= 24; j++){			if(mover[j]==0)				continue;			if((k=25-j-die2) > 0 && movee[k] >= 2)				if(mover[0] > 0)					break;			else				continue;			if(k <= 0){				if(piececount(mover,0,18) != 0)					break;				if((j+die2) != 25 && piececount(mover,19,j-1) != 0)					break;			}			mover[j]--;			mover[j+die2]++;			count = 2;			if(die1 != die2){				moverecord(mover);				if(mover[0] > 0)					break;				else					continue;			}			for(l = 0; l <= 24; l++){				if(mover[l] == 0)					continue;				if((k=25-l-die1) > 0 && movee[k] >= 2)					if(mover[0] > 0)						break;				else					continue;				if(k <= 0){					if(piececount(mover, 0, 18) != 0)						break;					if((l+die2) != 25 && piececount(mover,19,l-1) != 0)						break;				}				mover[l]--;				mover[l+die1]++;				count=3;				for(m=0;m<=24;m++){					if(mover[m]==0)						continue;					if((k=25-m-die1) >= 0 && movee[k] >= 2)						if(mover[0] > 0)							break;					else						continue;					if(k <= 0){						if(piececount(mover,0,18) != 0)							break;						if((m+die2) != 25 && piececount(mover,19,m-1) != 0)							break;					}					count=4;					moverecord(mover);					if(mover[0] > 0)						break;				}				if(count == 3)					moverecord(mover);				else{					mover[l]++;					mover[l+die1]--;				}				if(mover[0] > 0)					break;			}			if(count == 2)				moverecord(mover);			else{				mover[j]++;				mover[j+die1]--;			}			if(mover[0] > 0)				break;		}		if(count == 1)			moverecord(mover);		else{			mover[i]++;			mover[i+die1]--;		}		if(mover[0] > 0)			break;	}}moverecord(mover)int *mover;{	int	t;	if(imoves < MAXIMOVES) {		for(t = 0; t <= 3; t++)			moves[imoves].pos[t] = NIL;		switch(count) {		case 4:			moves[imoves].pos[3]=m;			moves[imoves].mov[3]=die1;		case 3:			moves[imoves].pos[2]=l;			moves[imoves].mov[2]=die1;		case 2:			moves[imoves].pos[1]=j;			moves[imoves].mov[1]=die2;		case 1:			moves[imoves].pos[0]=i;			moves[imoves].mov[0]=die1;			imoves++;		}	}	switch(count) {	case 4:		break;	case 3:		mover[l]++;		mover[l+die1]--;		break;	case 2:		mover[j]++;		mover[j+die2]--;		break;	case 1:		mover[i]++;		mover[i+die1]--;	}}strategy(player,playee)int *player,*playee;{	int	k, n, nn, bestval, moveval, prob;	n = 0;	if(imoves == 0)		return(NIL);	goodmoves[0] = NIL;	bestval = -32000;	for(k = 0; k < imoves; k++){		if((moveval=eval(player,playee,k,&prob)) < bestval)			continue;		if(moveval > bestval){			bestval = moveval;			n = 0;		}		if(n<MAXGMOV){			goodmoves[n]=k;			probmoves[n++]=prob;		}	}	if(level=='e' && n>1){		nn=n;		n=0;		prob=32000;		for(k = 0; k < nn; k++){			if((moveval=probmoves[k]) > prob)				continue;			if(moveval<prob){				prob=moveval;				n=0;			}			goodmoves[n]=goodmoves[k];			probmoves[n++]=probmoves[k];		}	}	return(goodmoves[(rand()>>4)%n]);}eval(player,playee,k,prob)int *player,*playee,k,*prob;{	int	newtry[31], newother[31], *r, *q, *p, n, sum, first;	int	ii, lastwhite, lastbrown;	*prob = sum = 0;	r = player+25;	p = newtry;	q = newother;	while(player<r){		*p++= *player++;		*q++= *playee++;	}	q=newtry+31;	for(p = newtry+25; p < q; p++)		/* zero out spaces for hit pieces */		*p = 0;	for(n = 0; n < 4; n++){		if(moves[k].pos[n] == NIL)			break;		newtry[moves[k].pos[n]]--;		newtry[ii=moves[k].pos[n]+moves[k].mov[n]]++;		if(ii<25 && newother[25-ii]==1){			newother[25-ii]=0;			newother[0]++;			if(ii<=15 && level=='e')		/* hit if near other's home */				sum++;		}	}	for(lastbrown = 0; newother[lastbrown] == 0; lastbrown++);		;	for(lastwhite = 0; newtry[lastwhite] == 0; lastwhite++)		;	lastwhite = 25-lastwhite;	if(lastwhite<=6 && lastwhite<lastbrown)		sum=1000;									/* experts running game. */									/* first priority is to */									/* get all pieces into */									/* white's home */	if(lastwhite<lastbrown && level=='e' && lastwhite>6) {		for(sum = 1000; lastwhite > 6; lastwhite--)			sum = sum-lastwhite*newtry[25-lastwhite];	}	for(first = 0; first < 25; first++)		if(newother[first] != 0)		/*find other's first piece*/			break;	q = newtry+25;	for(p = newtry+1; p < q;)			/* blocked points are good */		if(*p++ > 1)			sum++;	if(first > 5) {					/* only stress removing pieces if */							/* homeboard cannot be hit */		q = newtry+31;		p=newtry+25;		for(n = 6; p < q; n--)			sum += *p++ * n;			/*remove pieces, but just barely*/	}	if(level != 'b'){		r = newtry+25-first;	/*singles past this point can't be hit*/		for(p = newtry+7; p < r; )			if(*p++ == 1)		/*singles are bad after 1st 6 points if they can be hit*/				sum--;		q = newtry+3;		for(p = newtry; p < q; )	   /*bad to be on 1st three points*/			sum -= *p++;	}	for(n = 1; n <= 4; n++)		*prob += n*getprob(newtry,newother,6*n-5,6*n);	return(sum);}instructions(){	register fd, r;	char	 buf[BUFSIZ];	if((fd = open(RULES, 0)) < 0) {		fprintf(stderr, "back: cannot open %s\n", RULES);		return;	}	while(r = read(fd, buf, BUFSIZ))		write(1, buf, r);}getprob(player,playee,start,finish)int *player,*playee,start,finish;{			/*returns the probability (times 102) that any			  pieces belonging to 'player' and lying between			  his points 'start' and 'finish' will be hit			  by a piece belonging to playee			*/	int	k, n, sum;	sum = 0;	for(; start <= finish; start++){		if(player[start] == 1){			for(k = 1; k <= 12; k++){				if((n=25-start-k) < 0)					break;				if(playee[n] != 0)					sum += probability[k];			}		}	}	return(sum);}prtbrd(){	int	k;	static char undersc[]="______________________________________________________";	fprintf(stdout, "White's Home\n%s\r",undersc);	for(k = 1; k <= 6; k++)		fprintf(stdout, "%4d",k);	fprintf(stdout, "    ");	for(k = 7; k <= 12; k++)		fprintf(stdout, "%4d",k); 	putchar('\n');	numline(brown, white, 1, 6);	fprintf(stdout, "    ");	numline(brown, white, 7, 12);	putchar('\n');	colorline(brown, 'B', white, 'W', 1, 6);	fprintf(stdout, "    ");	colorline(brown, 'B', white, 'W', 7, 12);	putchar('\n');	if(white[0] != 0)		fprintf(stdout, "%28dW\n",white[0]);	else		putchar('\n');	if(brown[0] != 0)		fprintf(stdout, "%28dB\n", brown[0]);	else		putchar('\n');	colorline(white, 'W', brown, 'B', 1, 6);	fprintf(stdout, "    ");	colorline(white, 'W', brown, 'B', 7, 12);	fprintf(stdout, "\n%s\r",undersc);	numline(white, brown, 1, 6);	fprintf(stdout, "    ");	numline(white, brown, 7, 12);	putchar('\n');	for(k = 24; k >= 19; k--)		fprintf(stdout, "%4d",k);	fprintf(stdout, "    ");	for(k = 18; k >= 13; k--)		fprintf(stdout, "%4d",k);	fprintf(stdout, "\nBrown's Home\n\n\n\n\n");}numline(upcol,downcol,start,fin)int *upcol,*downcol,start,fin;{	int	k, n;	for(k = start; k <= fin; k++){		if((n = upcol[k]) != 0 || (n = downcol[25-k]) != 0)			fprintf(stdout, "%4d", n);		else			fprintf(stdout, "    ");	}}colorline(upcol,c1,downcol,c2,start,fin)int *upcol,*downcol,start,fin;char c1,c2;{	int	k;	char 	c;	for(k = start; k <= fin; k++){		c = ' ';		if(upcol[k] != 0)			c = c1;		if(downcol[25-k] != 0)			c = c2;		fprintf(stdout, "   %c",c);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -