📄 qiyuan3.c
字号:
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 + -