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

📄 qiyuan3.c

📁 C实现的MUD,对大家基本入门网络游戏很有帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
			color=bd[(i-1)*bsize+j];			if(color==WQ_BLANK)  qi_flag=1;			  else  if(color==mycolor){				alist[aindex]=(i-1)*bsize+j;  aindex++;			}		}		if(i<bsize-1)  {			color=bd[(i+1)*bsize+j];			if(color==WQ_BLANK)  qi_flag=1;			    else  if(color==mycolor)  {				alist[aindex]=(i+1)*bsize+j;  aindex++;			}		}		if(j>0)  {			color=bd[i*bsize+j-1];			if(color==WQ_BLANK)  qi_flag=1;			    else  if(color==mycolor)  {				alist[aindex]=i*bsize+j-1;  aindex++;			}		}		if(j<bsize-1)  {			color  =  bd[i*bsize+j+1];			if(color==WQ_BLANK)  qi_flag=1;			    else  if(color==mycolor)  {				alist[aindex]=i*bsize+j+1;  aindex++;			}		}	}	while(bindex>0)  {  bd[blist[bindex-1]]  =  mycolor;  bindex--;  }	return(!qi_flag);}/*  This  routine  removes  a  block  of  stones  which  contains  (x,y).    It  returns  the  number  of  stones  removed.  */int  remove_block(int  *  bd,  int  x,  int  y){	int  i,j;	int  color;	int  *  alist=allocate(bsize*bsize);	int  *  blist=allocate(bsize*bsize);	int  aindex=0;	int  bindex=0;	int  num;	color=bd[x*bsize+y];  //  should  be  either  WQ_BLACK  or  WQ_WHITE	alist[0]=x*bsize+y;      aindex++;                while(aindex>0)  {                                i=alist[aindex-1]/bsize;                                j=alist[aindex-1]%bsize;                                aindex--;                                blist[bindex]=i*bsize+j;      bindex++;                                bd[i*bsize+j]=WQ_AUX_COLOR;                                  if(i>0  &&  color==bd[(i-1)*bsize+j])  {                                                alist[aindex]=(i-1)*bsize+j;  aindex++;                                }                                if(i<bsize-1  &&  color==bd[(i+1)*bsize+j])  {                                                alist[aindex]=(i+1)*bsize+j;  aindex++;                                }                                if(j>0  &&  color==bd[i*bsize+j-1])  {                                                alist[aindex]=i*bsize+j-1;  aindex++;                                }                                if(j<bsize-1  &&  color==bd[i*bsize+j+1])  {			alist[aindex]=i*bsize+j+1;  aindex++;		}	}	num=bindex;	while(bindex>0)  {  bd[blist[bindex-1]]=WQ_BLANK;  bindex--;  }	return(num);}		/*  Function  'eat'  returns  the  number  of  stones  eaten  by  move  (x,y),  according  to  the  data  of  bd[19][19]  with  move  (x,y)  set.  eat  modifies  bd[19][19]  by  removing  stones  eaten.    eat  also  stores  the  position  of  the  last  stone  eaten  in  *x_eat_ptr,  *  y_eat_ptr.*/  int  eat(int  *  bd,  int  x,  int  y,  int  *  x_eat_ptr,  int  *  y_eat_ptr){              	int  mycolor,  opcolor;	int  num=0;	mycolor=bd[x*bsize+y];	if(mycolor==WQ_BLACK)  opcolor=WQ_WHITE;	    else  opcolor=WQ_BLACK;	if(x>0  &&  bd[(x-1)*bsize+y]==opcolor  &&  no_qi(bd,x-1,y)  )  {		num  +=  remove_block(bd,x-1,y);  		x_eat_ptr[0]=x-1;  y_eat_ptr[0]=y;	}	if(x<bsize-1  &&  bd[(x+1)*bsize+y]==opcolor  &&  no_qi(bd,x+1,y)  )  {    		num  +=  remove_block(bd,x+1,y);		x_eat_ptr[0]=x+1;  y_eat_ptr[0]=y;	}	if(y>0  &&  bd[x*bsize+y-1]==opcolor  &&  no_qi(bd,x,y-1)  )  {  		num  +=  remove_block(bd,x,y-1);		x_eat_ptr[0]=x;  y_eat_ptr[0]=y-1;	}	if(y<bsize-1  &&  bd[x*bsize+y+1]==opcolor  &&  no_qi(bd,x,y+1)  )  {		num  +=  remove_block(bd,x,y+1);		x_eat_ptr[0]=x;  y_eat_ptr[0]=y+1;	}	return(num);}/*  Function  'weiqi_rule'  decides  if  the  move  (x,y)  is  legal  under  the  weiqi  rule.  Return  value  1(legal)  or  0(illegal).  */  int  weiqi_rule(int  x,  int  y){	int  i,j;	int  n;	int  *board  =  allocate(bsize*bsize);	int  *x_eat_ptr=allocate(1);	int  *y_eat_ptr=allocate(1);	if(x<0  ||  x>=bsize  ||  y<0  ||  y>=bsize)  return  0;		//  This  case  is  avoided  by  exact  matching  in  		//  translate_position().                if(game[x*bsize+y]  !=  WQ_BLANK)  		return(WQ_POS_OCCUPIED);		for(i=0;i<bsize;i++)  for(j=0;j<bsize;j++)  		board[i*bsize+j]  =  game[i*bsize+j];	if(turn  ==  "black")  board[x*bsize+y]  =  WQ_BLACK;	    else  board[x*bsize+y]  =  WQ_WHITE;	n  =  eat(board,x,y,x_eat_ptr,y_eat_ptr);	if(n>1)  {		for(i=0;i<bsize;i++)  for(j=0;j<bsize;j++)  			game[i*bsize+j]  =  board[i*bsize+j];		jie_flag  =  WQ_NO_JIE;		return  1;	}	else  if(n==1)  {		if(jie_flag==WQ_JIE_POSSIBLE  &&  x==jie_x_ban  &&  y==jie_y_ban)			return(WQ_JIE_BANNED);		for(i=0;i<bsize;i++)  for(j=0;j<bsize;j++)  			game[i*bsize+j]  =  board[i*bsize+j];		jie_flag  =  WQ_JIE_POSSIBLE;		jie_x_ban  =  x_eat_ptr[0];  		jie_y_ban  =  y_eat_ptr[0];		return  1;	}	else  {  //  (n==0)		if(no_qi(board,x,y))  			return(WQ_NO_QI_BANNED);		game[x*bsize+y]  =  board[x*bsize+y];		jie_flag  =  WQ_NO_JIE;		return  1;	}}int  wuzi_rule(int  x,  int  y){	int  i,j,  color;	int  count;	if(game[x*bsize+y]  !=  WQ_BLANK)		return(WQ_POS_OCCUPIED);	if(turn  ==  "black")  game[x*bsize+y]  =  WQ_BLACK;		else  game[x*bsize+y]  =  WQ_WHITE;	color=game[x*bsize+y];	for(count=1,i=x+1,j=y+1;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&		color==game[i*bsize+j];  i++,j++,count++);	for(i=x-1,j=y-1;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&		color==game[i*bsize+j];  i--,j--,count++);	if(count>=5)  return(WQ_WINNING);                for(count=1,i=x-1,j=y+1;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&                                color==game[i*bsize+j];  i--,j++,count++);                for(i=x+1,j=y-1;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&                                color==game[i*bsize+j];  i++,j--,count++);                if(count>=5)  return(WQ_WINNING);                for(count=1,i=x+1,j=y;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&                                color==game[i*bsize+j];  i++,count++);                for(i=x-1,j=y;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&                                color==game[i*bsize+j];  i--,count++);                if(count>=5)  return(WQ_WINNING);                for(count=1,i=x,j=y+1;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&                                color==game[i*bsize+j];  j++,count++);                for(i=x,j=y-1;  i>=0  &&  i<bsize  &&  j>=0  &&  j<bsize  &&                                color==game[i*bsize+j];  j--,count++);                if(count>=5)  return(WQ_WINNING);	return(1);}int  translate_position(string  s,  int  *x_ptr,  int  *y_ptr){	int  i,  match_flag=0;	string  sl,sn;	if  (strlen(s)>3  ||  strlen(s)<2)  return  0;	sl=s[0..0];	for(i=0;i<bsize;i++)  {		if(sl==Ucase[i]  ||  sl==lcase[i])  {			x_ptr[0]  =  i;			match_flag=1;		}	}	if(!match_flag)  return  0;	match_flag  =  0;	sn=s[1..strlen(s)-1];	for(i=0;i<bsize;i++)  {		if(sn==nindex[i])  {			y_ptr[0]  =  i;			match_flag=1;		}	}	if(match_flag)  return  1;	else  return  0;}	int  do_undo(){        int  *x_ptr=allocate(1);        int  *y_ptr=allocate(1);        object  me  =  this_player();        object  rm  =  environment(me);        object  player;        if(!me->query_temp("weiqi_seat"))                return  notify_fail("你是旁观者,怎么好意思瞎指挥?\n");        if(status==WQ_NOT_PLAYING)                  return  notify_fail("还没新开一局棋呐。\n");	if(status!=WQ_PLAYING_WUZI)		return  notify_fail("目前只提供五子棋的悔棋功能。\n");	if(!WQ_Started)		return  notify_fail("一步都没走,悔什么棋。\n");	if(me->query_temp("weiqi_seat") !=  turn)		return  notify_fail("要悔棋也得跟人家商量一下呀。\n");	if(WQ_Undoed)		return  notify_fail("一次只能悔一步棋。\n");	WQ_Undoed=1;	translate_position(lastmove,x_ptr,y_ptr);	if  (status==WQ_PLAYING_WUZI)		{			game[x_ptr[0]*bsize+y_ptr[0]]=WQ_BLANK;			if  (lastlastmove=="")				{					WQ_Started=0;					lastmove="";					}			else				{					lastmove=lastlastmove;				}		}	else		{		}	if  (turn=="black")  		{			turn="white";			if  (lastmove!="")				tell_room(rm,"\n黑棋上一步走在了"+lastmove+"\n");		}	else  {  		turn="black";		if  (lastmove!="")			tell_room(rm,"\n白棋上一步走在了"+lastmove+"\n");			}        tell_room(rm,show_game());        player  =  pl[turn];        if(turn=="black")	        tell_room(rm,"现在轮到黑方"+player->name()+"走棋。\n");        else  tell_room(rm,"现在轮到白方"+player->name()+"走棋。\n");	return  1;}			int  do_play(string  arg){	int  *x_ptr=allocate(1);	int  *y_ptr=allocate(1);	object  me  =  this_player();	object  rm  =  environment(me);	object  op;	int  rv;	int  wf=0;  //  winning  flag	if(!me->query_temp("weiqi_seat"))		return  notify_fail("你是旁观者,怎么好意思瞎指挥?\n");	if(status==WQ_NOT_PLAYING)  		return  notify_fail("还没新开一局棋呐。\n");	if(me->query_temp("weiqi_seat")  !=  turn)		return  notify_fail("还没轮到你走棋。\n");	if(!translate_position(arg,x_ptr,y_ptr))		return  notify_fail("你要下在哪里?\n");	if(status==WQ_PLAYING_WUZI)  {		rv  =  wuzi_rule(x_ptr[0],y_ptr[0]);		if(rv==WQ_POS_OCCUPIED)			return  notify_fail("这个位置上已经有子了!\n");		if(rv==WQ_WINNING)  wf=1;	}	  else  {		rv=weiqi_rule(x_ptr[0],y_ptr[0]);		if(rv==WQ_POS_OCCUPIED)			return  notify_fail("这个位置上已经有子了!\n");		if(rv==WQ_JIE_BANNED)			return  notify_fail("现在还没轮到你提劫!\n");		if(rv==WQ_NO_QI_BANNED)			return  notify_fail("这个位置是禁入点!\n");	}	WQ_Started=1;	WQ_Undoed=0;	lastlastmove=lastmove;	lastmove=arg;	if  (turn=="black")  {		tell_room(rm,  "\n黑棋上一步走在了"+arg+"\n");						}	else		tell_room(rm,  "\n白棋上一步走在了"+arg+"\n");	if(wf)  {		tell_room(rm,show_game());		if(turn=="black")  message_vision("黑方$N胜。\n",me);		  else  message_vision("白方$N胜。\n",me);		status=WQ_NOT_PLAYING;		return  1;	}	if(turn=="black")  {  turn  =  "white";  op  =  pl["white"];  }	    else  {  turn  =  "black";  op  =  pl["black"];  }	tell_room(rm,show_game());	if(turn=="black")  message_vision("现在轮到黑方$N走棋。\n",op);	  else  message_vision("现在轮到白方$N走棋。\n",op);	return  1;}int valid_leave(object me, string dir){        if ( me->query_temp("weiqi_seat") )                return notify_fail("你现在还坐着呢,怎么离开啊?\n");         return ::valid_leave(me, dir);}

⌨️ 快捷键说明

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