纯C语言实现五子棋
正在考虑增加一个MFC界面。不是人机对战的。
五子棋.c
//date2014年7月7日09:53:24 //willows //五子棋 #define_CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<assert.h> //棋盘初始化函数 //Chessboard棋盘数组,ln=棋盘大小,成功返回Chessboard,不成功NULL voidinit_Chessboard(charChessboard[][7],intln) { if((Chessboard!=NULL)&&(ln>0)){ inti=0,j=0; for(i=0;i<ln;++i){ for(j=0;j<ln;++j){ Chessboard[i][j]='\t'; } } //returnChessboard; } //returnNULL; } //显示棋盘函数 voidshow_Chessboard(charChessboard[][7],intln) { assert((Chessboard!=NULL)&&(ln>0)); inti=0,j=0; for(i=0;i<ln;++i){ putchar('\t'); putchar(i+'0'); }//endfor1 putchar('\n'); putchar('\n'); for(i=0;i<ln;++i){ putchar(i+'0'); for(j=0;j<ln;++j){ if('\t'==Chessboard[i][j]){ putchar(Chessboard[i][j]); } else { putchar('\t'); putchar(Chessboard[i][j]); } } putchar('\n'); putchar('\n'); }//endfor2 } //棋子下子函数 //下子成功返回1,不成功返回0 intplay(charChessboard[][7],intln,intx,inty,charChessPieces) { assert(Chessboard);//ChessPieces=NULL跳出 if((x<ln)&&(y<ln)&&(x>=0)&&(y>=0)){ if('\t'==Chessboard[x][y]){ Chessboard[x][y]=ChessPieces; return1;//成功 } else { return0; }//endif2 }//endif1 return0; } //满盘判断 //棋盘满了判断//满了就返回-1 intfull_Chess(charChessboard[][7],intln) { inti=0,j=0; for(i=0;i<ln;++i){ for(j=0;j<ln;++j){ if('\t'==Chessboard[i][j]){ return0;//棋盘未满 }//endif }//endforj }//endfori return1;//棋盘满了 } //是否连成五子线判断函数 //Chessboard=棋盘数组,ln=棋盘宽度,(XS,YS)方向判断起点坐标,(dx,dy)方向增量标记 //连成线返回1,没有返回0 intjudga_line(charChessboard[][7],intln,intXS,intYS,intdx,intdy) { assert((Chessboard!=NULL)&&(ln>0)); if((XS<ln)&&(YS<ln)//起点坐标在棋盘内 &&(XS>=0)&&(YS>=0) &&(dx!=0||dy!=0))//坐标增量不为同时0 { if(((XS+dx*4)>ln)||((XS+dx*4)<0)||//判断终点坐标 ((YS+dy*4)>ln)||((YS+dy*4)<0)||//在棋盘外 ('\t'==Chessboard[XS][YS])) { return0;//不在棋盘内,或者起点是没下子 } else { inti=0; for(i=1;i<5;++i){ if(Chessboard[XS][YS]!=Chessboard[XS+(dx*i)][YS+(dy*i)]) { return0;//如果不是连续5个一样的 }//endif3 }//endfor1 return1;//五个都一样,且都在棋盘内 }//endif2 } return0;//其他情况 } //裁判函数 //Chessboard棋盘数组,ln=棋盘宽度 //赢了返回1,否则返回0 intjudga(charChessboard[][7],intln) { assert((NULL!=Chessboard)&&(ln>0)); inti=0,j=0; //纵向成五子连线判断 for(i=0;i<(ln-4);++i){ for(j=0;j<ln;++j){ if(judga_line(Chessboard,ln,i,j,1,0)){ return1; } }//endfor_j }//endfor_i //横向成五子连线判断 for(i=0;i<ln;++i){ for(j=0;j<(ln-4);++j){ if(judga_line(Chessboard,ln,i,j,0,1)){ return1; } }//endfor_j }//endfor_i //左上到右下成五子连线判断 for(i=0;i<(ln-4);++i){ for(j=0;j<(ln-4);++j){ if(judga_line(Chessboard,ln,i,j,1,1)){ return1; } }//endfor_j }//endfor_i //左下到右上成五子连线判断 for(i=ln-1;i>(ln-4);--i){ for(j=0;j<(ln-4);++j){ if(judga_line(Chessboard,ln,i,j,-1,1)){ return1; } }//endfor_j }//endfor_i return0;//没能赢 } //主函数 intmain() { charCB[7][7]; charnameA[50]="玩家A"; charnameB[50]="玩家B"; intx=-1,y=-1; //初始化 init_Chessboard(CB,7); printf("请输入玩家A的名字:"); scanf("%s",nameA); printf("请输入玩家B的名字:"); scanf("%s",nameB); //显示棋盘 show_Chessboard(CB,7); while(1){ //判断是否棋盘已满 if(full_Chess(CB,7)){ puts("\n棋盘已满,下次再战!"); break;//跳出最外层while }//endif //玩家A下子 while(1){ printf("\n请玩家%s下子@\n",nameA); printf("棋子行坐标X="); scanf("%d",&x); printf("棋子列坐标Y="); scanf("%d",&y); if(play(CB,7,x,y,'@')){//@ascii=64 break;//下子成功 } else { puts("下子失败,请重新选定位置下子"); continue;//下子不成功,重新下子 }//endif }//endwhileA //显示棋盘 show_Chessboard(CB,7); //判断玩家A是否胜利 if(judga(CB,7)){ printf("\n恭喜玩家%s成功取得胜利!!鲜花\n",nameA); getchar(); getchar(); break;//跳出最外层while }//不用下了 //玩家B下子 while(1){ printf("\n请玩家%s下子O\n",nameB); printf("棋子行坐标X="); scanf("%d",&x); printf("棋子列坐标Y="); scanf("%d",&y); if((play(CB,7,x,y,'O'))){//Oascii=79 break;//下子成功 } else { puts("下子失败,请重新选定位置下子"); continue;//下子不成功,重新下子 }//endif }//endwhileB //显示棋盘 show_Chessboard(CB,7); //判断玩家B是否胜利 if(judga(CB,7)){ printf("\n恭喜玩家%s成功取得胜利!!鲜花\n",nameA); getchar(); getchar(); break;//跳出最外层while }//不用下了 } return0; }
以上所述就是本文的全部内容了,希望大家能够喜欢。