您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > C/C++资料 > C语言编写的五子棋源代码
#includestdio.h#includestdio.h#includestdio.h#includestdio.h//插入输入输出头文件#includestring.h//字符数组的函数定义的头文件#includestdlib.h//stdlib头文件即standardlibrary标准库头文件stdlib头文件里包含了C、C++语言的最常用的系统函数该,文件包含了C语言标准库函数的定义.#defineSPA0//在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。“define”为宏定义命令。#defineMAN1#defineCOM2/*空位置设为0,玩家下的位置设为1,电脑下的位置设为2*/#defineORDEX15intqipan[ORDEX][ORDEX];//自己定义的预处理函数,以二维数组形式构建棋盘/*15*15的棋盘*/typedefstruct//typedef的作用是在C中定义一个结构体类型{intiFlag;intiX,iY;}ScmPiece;intg_iPieceLen;ScmPieceg_ScmGame1,g_ScmGame2;voidstart();/*程序的主要控制函数*/voiddraw();/*画棋盘*/intVictory(ScmPiece*pScmPiece);/*判断胜利pq为判断点坐标*/voidAI(int*p,int*q);/*电脑下子pq返回下子坐标*/intvalue(intp,intq);/*计算空点pq的价值*/intqixing(intn,intp,intq);/*返回空点pq在n方向上的棋型n为1-8方向从右顺时针开始数*/voidyiwei(intn,int*i,int*j);/*在n方向上对坐标ij移位n为1-8方向从右顺时针开始数*/voidInitGame(){inti;g_iPieceLen=ORDEX*ORDEX;g_ScmGame1.iX=0;g_ScmGame1.iY=0;g_ScmGame1.iFlag=COM;g_ScmGame2.iX=7;g_ScmGame2.iY=7;g_ScmGame2.iFlag=MAN;for(i=0;iORDEX*ORDEX;++i)*((int*)qipan+i)=SPA;}voidmain(){chark;do{InitGame();start();printf(还要再来一把吗?输入y或n:);getchar();scanf(%c,&k);while(k!='y'&&k!='n'){printf(输入错误,请重新输入\n);scanf(%c,&k);}system(cls);}while(k=='y');printf(谢谢使用!\n);}voidMakePiece(ScmPiece*pScmPiece,intiGameFlag){if(iGameFlag){printf(请下子:);while(scanf(%d%d,&pScmPiece-iX,&pScmPiece-iY)){if((pScmPiece-iX0||pScmPiece-iXORDEX-1)||(pScmPiece-iY0||pScmPiece-iYORDEX-1))printf(坐标错误!请重新输入:);elseif(qipan[pScmPiece-iX][pScmPiece-iY])printf(该位置已有子!请重新输入:);elsebreak;}}qipan[pScmPiece-iX][pScmPiece-iY]=pScmPiece-iFlag;--g_iPieceLen;system(cls);draw();if(iGameFlag==0)printf(电脑下在%d%d\n,pScmPiece-iX,pScmPiece-iY);}voidstart(){intchoice;//ScmPieceScmGameTemp1,ScmGameTemp2;/*a1b1储存玩家上手坐标c1d1储存电脑上手坐标*/printf(\t╔═══════════════════════════════╗\n);printf(\t║║\n);printf(\t║欢迎使用五子棋对战程序祝您玩的愉快挑战无极限║\n);printf(\t║║\n);printf(\t║._______________________.║\n);printf(\t║|_____________________|║\n);printf(\t║|II|║\n);printf(\t║|II|║\n);printf(\t║|I五子棋I|║\n);printf(\t║|II|║\n);printf(\t║|I___________________I|║\n);printf(\t║!_______________________!║\n);printf(\t║._[__________]_.║\n);printf(\t║.___|_______________|___.║\n);printf(\t║|:::____|║\n);printf(\t║|~~~~[CD-ROM]|║\n);printf(\t║!_____________________!║\n);printf(\t║║\n);printf(\t║║\n);printf(\t║寒星溪月疏星首,花残二月并白莲。║\n);printf(\t║雨月金星追黑玉,松丘新宵瑞山腥。║\n);printf(\t║星月长峡恒水流,白莲垂俏云浦岚。║\n);printf(\t║黑玉银月倚明星,斜月明月堪称朋。║\n);printf(\t║二十六局先弃二,直指游星斜彗星。║\n);printf(\t║║\n);printf(\t║║\n);printf(\t║1.人机对战2.人人对战║\n);printf(\t║║\n);printf(\t╚═══════════════════════════════╝\n);printf(\t\t\t请输入1或2:);while(scanf(%d,&choice),choice!=1&&choice!=2)printf(输入错误,请重新输入:);system(cls);if(choice==1){/*人机模式*/printf(\t\t\t欢迎使用五子棋人机对战!\n\t\t下子请输入坐标(如136)中间以空格分隔。\n\n\n);draw();printf(先下请按1,后下请按2:);while(scanf(%d,&choice),choice!=1&&choice!=2)printf(输入错误,请重新输入:);if(choice==2)MakePiece(&g_ScmGame2,0);choice=1;}else{printf(欢迎使用五子棋人人对战!下子请输入坐标(如136)。悔棋请输入1515。\n\n\n);draw();}while(g_iPieceLen){MakePiece(&g_ScmGame1,1);if(Victory(&g_ScmGame1)){printf(电脑神马的都是浮云!!!\n);return;}/*玩家赢*/if(choice==1){AI(&g_ScmGame2.iY,&g_ScmGame2.iX);MakePiece(&g_ScmGame2,0);if(Victory(&g_ScmGame2)){/*电脑赢*/intiChoice;printf(要悔棋吗?请输入y或n:);STARTFLAGE:setbuf(stdin,NULL);scanf(%c,&iChoice);switch((char)iChoice){case'y':case'Y':g_iPieceLen+=2;qipan[g_ScmGame2.iX][g_ScmGame2.iY]=SPA;qipan[g_ScmGame1.iX][g_ScmGame1.iY]=SPA;system(cls);draw();break;case'n':case'N':printf(下不过电脑很正常,请不要灰心!!!\n);return;default:printf(输入错误,请重新输入:);gotoSTARTFLAGE;}}}else{MakePiece(&g_ScmGame2,1);if(Victory(&g_ScmGame2)){printf(电脑神马的都是浮云!!!\n);return;}}}printf(和局\n);}voiddraw()/*画棋盘*/{inti,j;charp[15][15][4];for(j=0;j15;j++)for(i=0;i15;i++){if(qipan[j][i]==SPA)strcpy(p[j][i],\0);if(qipan[j][i]==MAN)strcpy(p[j][i],●\0);if(qipan[j][i]==COM)strcpy(p[j][i],◎\0);}printf(01234567891011121314\n);printf(┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐\n);for(i=0,j=0;i14;i++,j++){printf(%2d│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%d\n,j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],j);printf(├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤\n);}printf(14│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│0\n,p[14][0],p[14][1],p[14][2],p[14][3],p[14][4],p[14][5],p[14][6],p[14][7],p[14][8],p[14][9],p[14][10],p[14][11],p[14][12],p[14][13],p[14][14]);printf(└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘\n);printf(01234567891011121314\n);}staticintDirectionValue(int*piX,int*piY,intiDirection){switch(iDirection){case0:--*piX;break;case4:++*piX;break;case1:--*piY;break;case5:++*piY;break;case2:--*piX;--*piY;break;case6:++*piX;++*piY;break;case3:--*piX;++*piY;break;case7:++*piX;--*piY;break;}if((*piX=0&&*piX=ORDEX-1)&&(*piY=0&&*piY=ORDEX-1))return1;elsereturn0;}staticintSubVictory(ScmPiece*pScmPiece,intiDirection){intiX=pScmPiece-iX;intiY=pScmPiece-iY;intiPieceCount=1;while(DirectionValue(&iX,&iY,iDirection)&&qipan[iX][iY]==pScmPiece-iFlag)++iPieceCount;iX=pScmPiece-iX;iY=pScmPiece-iY;while(DirectionValue(&iX,&iY,iDirection+4)&&qipan[iX][iY]==pScmPiece-
本文标题:C语言编写的五子棋源代码
链接地址:https://www.777doc.com/doc-4941425 .html