基于C语言实现五子棋游戏完整实例代码
本文实例讲述了基于C语言实现五子棋游戏的方法,代码备有比较完整的注释,可以帮助读者更好的加以理解。
五子棋游戏代码如下:
/* *使用键盘的上下左右键移动棋盘,空格键表示下棋,ESC键退出程序 */ #include<stdio.h> #include<stdlib.h> #include<bios.h> #include<graphics.h> #include<malloc.h> /* *对应键盘键的十六进制数字 */ #defineESC0x11b #defineUP0x4800 #defineDOWN0x5000 #defineLEFT0x4b00 #defineRIGHT0x4d00 #defineBLANK0x3920 #definePLAYER11 #definePLAYER22 #defineCOMPUTER2 #defineLENGTH15 #defineSEARCH_DEEP2 /* *用来在函数can_expand()查找可以扩展的节点步长 */ #defineSTEP1 /************全局变量定义***************/ intx1=240, y1=240, oldx=240, oldy=240; intkey_mode; intkey_net; intstep_sum=0; intchessman[LENGTH][LENGTH]; intdepth=2;/*搜索的深度*/ inta=0, b=0; intflag_run; intwin_flag=0; typedefstructfive_chess*point; structfive_chess{ intx; inty; intlayer; doublevalue; doublescore; intchess[LENGTH][LENGTH]; intrecord[LENGTH][LENGTH]; }A; intstack_deep0=0; pointstack_c[10]; pointclose[600]; void push(points0) { if(stack_deep0<10) stack_c[stack_deep0++]=s0; } point top() { if(stack_deep0>0) returnstack_c[stack_deep0-1]; /*elsereturn一个什么样的东西?*/ } void pop() { if(stack_deep0>0) stack_deep0--; } int is_empty() { if(stack_deep0!=0) return1; else return0; } /************函数的声明**************/ voidfive(); voidshow(); intwin_or_not(intx0,inty0,intwho, intchessman[LENGTH][LENGTH],inta); voidset_chessman(); voidprint_result(); /************评价函数部分************/ doublescore_row(inti,intj,intchessman[LENGTH][LENGTH]); doublescore_col(inti,intj,intchessman[LENGTH][LENGTH]); doublescore_diag_45(inti,intj,intchessman[LENGTH][LENGTH]); doublescore_diag_135(inti,intj,intchessman[LENGTH][LENGTH]); doubletotal_score(intwho_running,intchessman[LENGTH][LENGTH]); doublescore(intchessman[LENGTH][LENGTH]); introwdt(inti,intj,intchessman[LENGTH][LENGTH]); intcoldt(inti,intj,intchessman[LENGTH][LENGTH]); intdiadt(inti,intj,intchessman[LENGTH][LENGTH]); intvdiadt(inti,intj,intchessman[LENGTH][LENGTH]); intcan_expand(inti,intj,intchessman[LENGTH][LENGTH]); voidcopy(points1,points0); int POW(ints,intt) { intsum=s, i; if(t<=0) return1; for(i=0;i<t;i++) sum*=sum; returnsum; } /* *定义computer先手 */ point expand(points0) { intflag; inti, j; pointnew_chess=(point)malloc(sizeof(structfive_chess)); /*************************这里出错***********************************/ for(i=0;i<LENGTH;i++) for(j=0;j<LENGTH;j++) new_chess->chess[i][j]=s0->chess[i][j]; for(i=0;i<LENGTH;i++) for(j=0;j<LENGTH;j++) new_chess->record[i][j]=s0->chess[i][j]; /*************************这里出错***********************************/ if(s0->layer%2==0) flag=COMPUTER; else flag=PLAYER1; for(i=0;i<LENGTH;i++) for(j=0;j<LENGTH;j++){ if(s0->record[i][j])/*如果有棋子*/ continue; if(can_expand(i,j,s0->chess)==0)/*如果有棋子,而且沿水平,树直,左上—右下,右上—左下,四个方向可以扩展*/ continue; s0->record[i][j]=flag; new_chess->chess[i][j]=flag; new_chess->layer=s0->layer+1; new_chess->x=i; new_chess->y=j; new_chess->record[i][j]=flag; returnnew_chess; } /* *for(i=5;i<10;i++)for(j=5;j<10;j++){if(s0->record[i][j])continue; *if(can_expand(i,j,s0->chess)==0)continue;s0->record[i][j]=flag; *new_chess->x=i;new_chess->y=j;new_chess->record[i][j]=flag; *new_chess->layer=s0->layer+1;new_chess->chess[i][j]=flag;return *new_chess;}for(i=2;i<12;i++)for(j=2;j<12;j++){ *if(i>4&&i<10&&j>4&&j<10)continue;if(s0->record[i][j])continue; *if(can_expand(i,j,s0->chess)==0)continue;s0->record[i][j]=flag; *new_chess->x=i;new_chess->y=j;new_chess->record[i][j]=flag; *new_chess->layer=s0->layer+1;new_chess->chess[i][j]=flag;return *new_chess; * *}for(i=0;i<LENGTH;i++)for(j=0;j<LENGTH;j++){ *if(i>1&&i<12&&j>1&&j<12)continue;if(s0->record[i][j])continue; *if(can_expand(i,j,s0->chess)==0)continue;s0->record[i][j]=flag; *new_chess->chess[i][j]=flag;new_chess->layer=s0->layer+1; *new_chess->x=i;new_chess->y=j;new_chess->record[i][j]=flag;return *new_chess;} */ new_chess->layer=-1; returnnew_chess; } void computer() { inti, j, k, num=0; intbreak_now=0; intbreak_then=0; intgo_on=0; points0=NULL, s1=NULL, s2=NULL, max_chess=NULL; pointtemps=NULL, s01; /* *堆栈的初始化 */ stack_deep0=0; s0=malloc(sizeof(structfive_chess)); for(i=0;i<600;i++)/*为什么是600*/ close[i]=NULL;/*close是一个point数组*/ close[num++]=s0; for(i=0;i<LENGTH;i++) for(j=0;j<LENGTH;j++){ s0->chess[i][j]=chessman[i][j]; s0->record[i][j]=chessman[i][j]; } s0->layer=0; s0->value=-3000000; s0->score=-3000000; push(s0); while(is_empty()!=0){/*看是栈否为空*/ s01=top();/*如果不是空*/ s1=expand(s01);/*从栈顶开始展开*/ close[num++]=s1; if(s1->layer==-1){ pop(); continue; } go_on= win_or_not((s1->x+1)*30,(s1->y+1)*30,2,s1->chess, 1); if(go_on==2){ a=(s1->x+1)*30; b=(s1->y+1)*30; break_then=1; break; } go_on= win_or_not((s1->x+1)*30,(s1->y+1)*30,1,s1->chess, 1); if(go_on==1){ a=(s1->x+1)*30; b=(s1->y+1)*30; break_then=1; break; } s1->value=30000; push(s1); while(1){ s1=top(); s2=expand(s1); if(s2->layer==-1){ pop(); if(s1->value>top()->value){ top()->value=s1->value; max_chess=s1; } free(s2); break; }/*endofif*/ s2->score=score(s2->chess); temps=top(); if(s2->score<temps->value) temps->value=s2->score; free(s2); }/*endofwhiile(1)*/ } if(break_then==0){ for(i=0;i<LENGTH;i++){ for(j=0;j<LENGTH;j++) if(max_chess->chess[i][j]!=chessman[i][j]){ a=i*30+30; b=j*30+30; break_now=1; break; } if(break_now==1) break; } } for(i=0;i<600;i++){ if(close[i]==NULL) continue; free(close[i]); } } /**********************************************************/ void main() { intkey; intplay_with_who=1; printf("1.Playwithhuman\n2.Playwithcomputer\nPleasechoice:"); scanf("%d",&play_with_who); five();/*显示棋盘*/ show(); if(play_with_who==1){/*人与人玩*/ while(1){/*设置人与人玩的界面*/ settextstyle(0,0,2); if((step_sum+1)%2){ setcolor(1); outtextxy(500,180,"Player2"); setcolor(4); outtextxy(500,180,"Player1"); }else{ setcolor(1); outtextxy(500,180,"Player1"); setcolor(10); outtextxy(500,180,"Player2"); } if(bioskey(1)) /* *按了一次键盘那么就true,执行下面代码,这是bios。h */ { key=bioskey(0); /* *返回一个键盘值,如没有按键,则一直等待 */ switch(key){ caseESC: exit(0); caseLEFT: if(x1>30){ x1-=30; show();/*显示方框*/ } break; caseUP: if(y1>30){ y1-=30; show(); } break; caseRIGHT: if(x1<450){ x1+=30; show(); } break; caseDOWN: if(y1<450){ y1+=30; show(); } break; caseBLANK:/*按下空格键后放置棋子*/ { if(chessman[x1/30][y1/30]) break;/*如果当前位置有棋子,不能放置,退出*/ step_sum++;/*如果没有棋子,下一步谁走加1*/ /* *P1设置棋子 */ if(step_sum%2){ setcolor(15);/*画棋子*/ setfillstyle(SOLID_FILL,15);/*封闭图形,进行实体填充*/ circle(x1,y1,10);/*画圆*/ floodfill(x1,y1,15);/*填充圆*/ chessman[x1/30][y1/30]=PLAYER1;/*设置棋盘状态*/ win_flag=win_or_not(x1,y1,1,chessman,0);/*分析游戏是否结束,谁胜谁败*/ if(win_flag==1) outtextxy(480,240,"P1Win"); elseif(win_flag==3) outtextxy(480,240,"DOGFALL"); if(win_flag!=0){/*如果没人胜,游戏继续*/ while(bioskey(1)==0); closegraph();/*whatthismean?*/ } }else{/*P2设置棋子*/ setcolor(12); setfillstyle(SOLID_FILL,12); circle(x1,y1,10); floodfill(x1,y1,12); chessman[x1/30][y1/30]=PLAYER2; win_flag=win_or_not(x1,y1,2,chessman,0); if(win_flag==2) outtextxy(480,240,"P2Win"); elseif(win_flag==3) outtextxy(480,240,"DOGFALL"); if(win_flag!=0){ while(bioskey(1)==0); closegraph(); } } } break; } } } }else{ chessman[7][7]=COMPUTER;/*人和电脑玩,电脑先走一步*/ setcolor(12); setfillstyle(SOLID_FILL,12); circle(240,240,10); floodfill(240,240,12); flag_run=0;/*有什么用?*/ step_sum++;/*下一步谁走?*/ while(1){ while(1){ if(flag_run==1) break; if(bioskey(1)){ key=bioskey(0); /* *返回一个键盘值,如没有按键,则一直等待 */ switch(key){ caseESC: exit(0); caseLEFT: if(x1>30){ x1-=30; show(); } break; caseUP: if(y1>30){ y1-=30; show(); } break; caseRIGHT: if(x1<450){ x1+=30; show(); } break; caseDOWN: if(y1<450){ y1+=30; show(); } break; caseBLANK: { if(chessman[x1/30-1][y1/30-1]) break;/*有棋子了不走*/ setcolor(15); setfillstyle(SOLID_FILL,15);/*封闭图形,进行实体填充 */ circle(x1,y1,10); floodfill(x1,y1,15);/*画棋子*/ chessman[x1/30-1][y1/30-1]=PLAYER1; flag_run=1;/*有什么用?*/ step_sum++;/*下一步谁走*/ win_flag=win_or_not(x1,y1,1,chessman,0);/*谁胜谁负*/ if(win_flag==1) outtextxy(480,240,"P1Win"); elseif(win_flag==3) outtextxy(480,240,"DOGFALL"); if(win_flag!=0){ while(bioskey(1)==0);/*没有人胜则继续等待下棋*/ closegraph(); } } }/*switch*/ } } computer();/*调用智能体*/ /* *a,b存放的是现在电脑准备下的位置 *返回一个a,b的结构体不是更好,用全局变量不爽啊 *struct{ *inta; *intb; *} */ setcolor(12); setfillstyle(SOLID_FILL,12); circle(a,b,10); floodfill(a,b,12); chessman[a/30-1][b/30-1]=COMPUTER; flag_run=0; step_sum++; win_flag=win_or_not(a,b,2,chessman,0); if(win_flag==2) outtextxy(480,240,"ComputerWin"); elseif(win_flag==3) outtextxy(480,240,"DOGFALL"); if(win_flag!=0){ while(bioskey(1)==0); closegraph(); } } } } void five() { inti, j; /* *画棋盘的过程 */ intgdriver=DETECT, gmode; registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,""); /* *对显示适配器进行配置 */ setbkcolor(1); for(i=0;i<30;i++){ setcolor((i>=2)?9:i); rectangle(i,i,479-i,479-i);/*画矩形边框*/ } /* *画棋盘 */ for(i=1;i<14;i++) for(j=1;j<14;j++){ setcolor(14); line(30+30*i,30,30+30*i,449); line(30,30+30*i,449,30+30*i); } /* *画整个图的边框 */ for(i=0;i<15;i++){ setcolor(i); rectangle(i,i,640-i,480-i); line(480-i,15,480-i,465); } /* *输出屏幕右侧的信息 */ setcolor(4); settextstyle(0,0,2); outtextxy(500,45,"GOBANG"); setcolor(10); settextstyle(0,0,1); outtextxy(500,90,"DesignedBy"); outtextxy(514,118,"YeBinbin"); outtextxy(480,140,"fromclassAofCS"); } /* *移动光标 */ void show() { setcolor(1); if(oldx<450){ if(oldy>30) line(oldx+7,oldy-15,oldx+15,oldy-15); if(oldy>30) line(oldx+15,oldy-15,oldx+15,oldy-7); if(oldy<450) line(oldx+15,oldy+7,oldx+15,oldy+15); if(oldy<450) line(oldx+15,oldy+15,oldx+7,oldy+15); } if(oldx>30){ if(oldy<450) line(oldx-7,oldy+15,oldx-15,oldy+15); if(oldy<450) line(oldx-15,oldy+15,oldx-15,oldy+7); if(oldy>30) line(oldx-15,oldy-7,oldx-15,oldy-15); if(oldy>30) line(oldx-15,oldy-15,oldx-7,oldy-15); } setcolor(12); if(x1<450){ if(y1>30) line(x1+7,y1-15,x1+15,y1-15); if(y1>30) line(x1+15,y1-15,x1+15,y1-7); if(y1<450) line(x1+15,y1+7,x1+15,y1+15); if(y1<450) line(x1+15,y1+15,x1+7,y1+15); } if(x1>30){ if(y1<450) line(x1-7,y1+15,x1-15,y1+15); if(y1<450) line(x1-15,y1+15,x1-15,y1+7); if(y1>30) line(x1-15,y1-7,x1-15,y1-15); if(y1>30) line(x1-15,y1-15,x1-7,y1-15); } oldx=x1; oldy=y1; } void set_chessman() { /* *棋子有三种状态,0是未初始状态,1是控制方棋子,2是对方棋子 */ inti, j; for(i=0;i<15;i++) for(j=0;j<15;j++) chessman[i][j]=0; } /* *0表示没有赢,1表示p1胜利,2表示p2胜利,3表示平局 */ int win_or_not(intx0,inty0,intwho,intchessman[LENGTH][LENGTH],inta) { inti=x0/30-1, j=y0/30-1; intwho_run=who; intline_sum=-1; inttmp_i=i, tmp_j=j; intc; if(a==1){ /* *测试第一层扩展是否满足赢的条件 */ c=chessman[i][j]; chessman[i][j]=who_run; } while(1){/*查找共行的棋子是否连接了五个*/ while(tmp_i>=0&&line_sum!=4){ if(chessman[tmp_i--][j]==who_run) line_sum++; else break; } if(line_sum==4) line_sum++; tmp_i=i; while(tmp_i<=15&&line_sum!=5){ if(chessman[tmp_i++][j]==who_run) line_sum++; else break; } if(line_sum==5){ if(a==1) chessman[i][j]=c; returnwho_run; } line_sum=-1; tmp_i=i; break; } while(1){/*查找共列的棋子是否连接了五个*/ while(tmp_j>=0&&line_sum!=4){ if(chessman[i][tmp_j--]==who_run) line_sum++; else break; } if(line_sum==4) line_sum++; tmp_j=j; while(tmp_j<=15&&line_sum!=5){ if(chessman[i][tmp_j++]==who_run) line_sum++; else break; } if(line_sum==5){ if(a==1) chessman[i][j]=c; returnwho_run; } line_sum=-1; tmp_j=j; break; } while(1){/*查找上对角线上是否连接了五个*/ while(line_sum!=4&&tmp_i<=15&&tmp_j>=0){ if(chessman[tmp_i++][tmp_j--]==who_run) line_sum++; else break; } tmp_i=i; tmp_j=j; if(line_sum==4) line_sum++; while(line_sum!=5&&tmp_i>=0&&tmp_j<=15){ if(chessman[tmp_i--][tmp_j++]==who_run) line_sum++; else break; } if(line_sum==5){ if(a==1) chessman[i][j]=c; returnwho_run; } tmp_i=i; tmp_j=j; line_sum=-1; break; } while(1){/*查找下对角线上是否连接了五个*/ while(line_sum!=4&&tmp_i>=0&&tmp_j>=0){ if(chessman[tmp_i--][tmp_j--]==who_run) line_sum++; else break; } tmp_i=i; tmp_j=j; if(line_sum==4) line_sum++; while(line_sum!=5&&tmp_i<=15&&tmp_j<=15){ if(chessman[tmp_i++][tmp_j++]==who_run) line_sum++; else break; } if(line_sum==5){ if(a==1) chessman[i][j]=c; returnwho_run; } break; } if(step_sum==225){ if(a==1) chessman[i][j]=c; return3; } if(a==1) chessman[i][j]=c; return0; } double score_row(inti,intj,intchessman[LENGTH][LENGTH]) { intsum_chessmen=0; doublescore=0; intmid_j; intwho_running=chessman[i][j]; if(j==LENGTH){ while(chessman[i][j]==who_running){ j--; sum_chessmen++; } if(sum_chessmen>=5) score=200000; else{ if(chessman[i][j]==0)/*没有下子,活的情况*/ score=2000/POW(10,4-sum_chessmen); else score=0;/*死的情况*/ } }else{ while(chessman[i][j]==who_running&&j!=LENGTH){ j++; sum_chessmen++; } mid_j=j; j=j-sum_chessmen-1; while(chessman[i][j]==who_running&&j!=-1){ j--; sum_chessmen++; } if(j>=0&&mid_j<LENGTH){ if(chessman[i][j]==0&&chessman[i][mid_j]==0) score=18000/POW(50,4-sum_chessmen); elseif((chessman[i][j]!=0&&chessman[i][mid_j]==0) ||(chessman[i][j]==0&&chessman[i][mid_j]!=0)) score=2000/POW(10,4-sum_chessmen); else score=0; } if(j<0&&mid_j<LENGTH){ if(chessman[i][mid_j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } if(j>=0&&mid_j>=LENGTH){ if(chessman[i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } if(j<0&&mid_j>=LENGTH) score=0; } returnscore; } double score_col(inti,intj,intchessman[LENGTH][LENGTH]) { intsum_chessmen=0, mid_i; doublescore=0; intwho_running=chessman[i][j]; if(i==LENGTH){ while(chessman[i][j]==who_running){ i--; sum_chessmen++; } if(sum_chessmen>=5) score=200000; if(chessman[i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; }else{ while(chessman[i][j]==who_running){ i++; sum_chessmen++; } mid_i=i; if(i==LENGTH||chessman[i][j]!=who_running){ i=i-sum_chessmen; while(chessman[i-1][j]==who_running){ i--; sum_chessmen++; } if(i>=0){ if(chessman[i][j]==0&&chessman[mid_i][j]==0) score=18000/POW(50,4-sum_chessmen); elseif((chessman[i][j]!=0&&chessman[mid_i][j])==0 ||(chessman[i][j]==0 &&chessman[mid_i][j]!=0)) score=2000/POW(10,4-sum_chessmen); else score=0; } if(i<0&&mid_i<LENGTH){ if(chessman[mid_i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } if(i<0&&mid_i<LENGTH){ if(chessman[mid_i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } if(i>=0&&mid_i>=LENGTH){ if(chessman[i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } } } returnscore; } double score_diag_45(inti,intj,intchessman[LENGTH][LENGTH]) { intsum_chessmen=0; doublescore=0; intmid_i, mid_j; intwho_running=chessman[i][j]; if(i==LENGTH||j==LENGTH){ while(chessman[i][j]==who_running&&i>1&&j>1){ i--; j--; sum_chessmen++; } if(sum_chessmen>=5) score=200000; else{ if(chessman[i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } }else{ while(chessman[i][j]==who_running&&i<=LENGTH&&j<=LENGTH){ i++; j++; sum_chessmen++; } mid_i=i; mid_j=j; i=i-sum_chessmen; j=j-sum_chessmen; while(chessman[i-1][j-1]==who_running){ i--; j--; sum_chessmen++; } if(sum_chessmen>=5) score=200000; if(i>=0&&j>=0&&mid_i<LENGTH&&mid_j<LENGTH){ if(chessman[mid_i][mid_j]==0&&chessman[i][j]==0) score=18000/POW(50,4-sum_chessmen); elseif((chessman[mid_i][mid_j]==0&&chessman[i][j]!=0) ||(chessman[mid_i][mid_j]!=0 &&chessman[i][j]==0)) score=2000/POW(10,4-sum_chessmen); else score=0; }else{ if(i>=0&&j>=0){ if(chessman[i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; }elseif(mid_i<LENGTH&&mid_j<LENGTH){ if(chessman[mid_i][mid_j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; }else score=0; } } returnscore; } double score_diag_135(inti,intj,intchessman[LENGTH][LENGTH]) { intsum_chessmen=0; doublescore=0; intmid_i, mid_j; intwho_running=chessman[i][j]; while(chessman[i][j]==who_running&&j!=-1&&i<LENGTH){ i++; j--; sum_chessmen++; } mid_i=i; mid_j=j; j+=sum_chessmen; i-=sum_chessmen; j++; i--; while(chessman[i][j]==who_running&&j!=LENGTH){ i--; j++; sum_chessmen++; } if(sum_chessmen>=5) score=200000; else{ if(i>=0&&j<LENGTH&&mid_j>=0&&mid_i<LENGTH){ if(chessman[i][j]==0&&chessman[mid_i][mid_j]==0) score=18000/POW(50,4-sum_chessmen); else{ if((chessman[i][j]==0&&chessman[mid_i][mid_j]!=0) ||(chessman[i][j]!=0 &&chessman[mid_i][mid_j]==0)) score=2000/POW(10,4-sum_chessmen); else score=0; } }else{ if(i>=0&&j<LENGTH){ if(chessman[i][j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } if(mid_j>=0&&mid_i<LENGTH){ if(chessman[mid_i][mid_j]==0) score=2000/POW(10,4-sum_chessmen); else score=0; } } } returnscore; } double total_score(intwho_running,intchessman[LENGTH][LENGTH]) { /* *统计出在该点上的得分,who_running=1表示人的棋子,2为电脑的棋子 */ inti, j; doublescore=0; for(i=0;i<LENGTH;i++) for(j=0;j<LENGTH;j++){ if(chessman[i][j]==who_running){ score+=score_row(i,j,chessman); score+=score_col(i,j,chessman); score+=score_diag_45(i,j,chessman); score+=score_diag_135(i,j,chessman); } } returnscore; } double score(intchessman[LENGTH][LENGTH]) { /* *计算最终的得分数,分别考虑了在这个位置放对方棋子跟自己棋子的综合 */ doublesum1, sum2; sum1=total_score(COMPUTER,chessman); sum2=total_score(PLAYER1,chessman); returnsum1-sum2; } /* *扩展-----剪枝过程 */ int rowdt(inti,intj,intchessman[LENGTH][LENGTH])/*在树直方向*/ { intk; intmidjl=j-STEP,/*当前棋子的上方*/ midjr=j+STEP+1;/*当前棋子的下方棋子的下方??????*/ if(midjl<0) midjl=0; if(midjr>LENGTH) midjr=LENGTH; for(k=midjl;k<midjr;k++)/**/ if(chessman[i][k]!=0)/*如果有棋子*/ return1; return0; } int coldt(inti,intj,intchessman[LENGTH][LENGTH])/*水平方向*/ { intk; intmidil=i+STEP+1,/*当前的右边棋子的右一个*/ midiu=i-STEP;/*当前棋子的左一个*/ if(midiu<0) midiu=0; if(midil>LENGTH) midil=LENGTH; for(k=midiu;k<midil;k++) if(chessman[k][j]!=0) return1; return0; } int diadt(inti,intj,intchessman[LENGTH][LENGTH])/*右上到左下方向*/ { intk, midi, midj; midi=i; midj=j; for(k=0;k<STEP;k++){ midi++; midj--; if(midj<0||midi>=LENGTH) break; if(chessman[midi][midj]!=0) return1; } for(k=0;k<STEP;k++){ i--; j++; if(i<0||j>=LENGTH) break; if(chessman[i][j]!=0) return1; } return0; } int vdiadt(inti,intj,intchessman[LENGTH][LENGTH])/*左上到右下方向*/ { intk, midi, midj; midi=i; midj=j; for(k=0;k<STEP;k++){ midi--; midj--; if(midi<0||midj<0) break; if(chessman[midi][midj]!=0) return1; } for(k=0;k<STEP;k++){ i++; j++; if(j>=LENGTH||i>=LENGTH) break; if(chessman[i][j]!=0) return1; } return0; } int can_expand(inti,intj,intchessman[LENGTH][LENGTH]) { if(rowdt(i,j,chessman)) return1; if(coldt(i,j,chessman)) return1; if(diadt(i,j,chessman)) return1; if(vdiadt(i,j,chessman)) return1; /* *如果不能扩展,返回0 */ return0; } /************************************************************/