当前位置:文档之家› 三子棋c代码

三子棋c代码

三子棋问题一目的运用所学课程的知识来研究、解决一些具有一定综合性问题的专业课题。

通过课程设计提高学生综合运用所学知识来解决实际问题及进行科学实验或技术设计的初步能力。

二需求分析1、该程序主要为设计简单的三子棋游戏;2、三子棋问题即在3 * 3的二维数组上下棋,只要有棋子在行、列或对角线连成一线即取得胜利。

3、可实现玩家与电脑对弈。

三概要设计1、主函数模块int main(){do{开始新的对弈;}while(玩家选择停止游戏);return 0;}2、调用函数模块①int chess();/*函数功能:开始对弈函数参数:无函数返回值:return 0*/{初始化棋局;选择玩家或电脑先行;do{ //开始下棋输出当前棋局;if(该玩家走棋){do{玩家输出走棋位置;检查走棋位置的合法性;}while(玩家输入合法的位置);}else if(电脑走棋){调用函数使电脑走棋}判断是否有一方胜出;}while(有一方胜出或平局);printf("最终棋局:\n");输出最终棋局;if(平局)输出平局;}②int check(char *chess,char sign);/*函数功能:使用了指针,判断位置可行则走棋,不可行则返回值为1 函数参数:使用指针传递棋局,以及欲走棋的位置函数返回值:0代表可以走棋,1代表不可走棋 */{判断走棋位置是否合法;不合法则返回1;否则返回0;}③int judge(char *chess);/*函数功能:判断是否有胜出函数参数:当前棋局函数返回值:0代表未有胜出,1代表玩家胜出,2代表电脑胜出*/ {for(行检查){if(某行三子连线){if(连线棋子为‘O’)玩家胜出;else电脑胜出;}}for(列检查)//思想同上if(对角三字连线检查)//思想同上}④int computer(char *chess);/*函数功能:电脑走棋函数参数:当前棋局函数返回值:return 0*/{for(某行出现两个同样的棋)在该行第三个位置走棋;for(某列出现两个同样的棋)在该列第三个位置走棋;if(对角线出现两个相同的棋)在该对角线第三个位置走棋;抢占中心位置;寻找可走位置;}整个程序的流程图如下所示:四详细设计//功能:简易三子棋。

三子连线即成功。

可选择人先行或电脑先行//system("cls")实现刷屏功能#include <stdio.h>#include <stdlib.h>int chess();int check(char *chess,char sign);int judge(char *chess);int computer(char *chess);int main(){char order;do{chess();printf("1:再来一次\n");printf("2:退出\n");scanf(" %c",&order); //scanf(" %c\n",&order)时出现错误}while(order=='1');return 0;}int chess(){int i,j;char sign;int loc;char choose;int count;int result;float peo,com;char chess[3][3]={{'1','2','3'},{'4','5','6'},{'7','8','9'}};count=0;printf("请选择:\n");printf("1:玩家先行\n");printf("2:电脑先行\n");scanf(" %c",&choose);while((choose!='1')&&(choose!='2')){ //人脑或电脑先行printf("请输入1或2:");scanf(" %c",&choose);}if(choose=='1'){peo=0;com=0.5;}else{peo=0.5;com=0;}do{ //开始下棋system("cls"); //刷屏printf("------------------------\n");for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%5c",chess[i][j]);printf("\n\n");}printf("------------------------\n");if(peo<com){printf("玩家走棋:\n");printf("请走棋\n");do{printf("输入想要走棋位置的标号:");scanf(" %c",&sign);while((((int)sign)<49)||(((int)sign)>57)){printf("输入错误,请重新输入:");scanf(" %c",&sign);}loc=check(*chess,sign); //走棋位置检查}while(loc!=0);peo=peo+1;}else if(peo>com){printf("电脑走棋:\n");computer(*chess); //电脑走棋com=com+1;}else{printf("com和peo计算出错\n");return 0;}result=judge(*chess); //判断是否有一方胜出count++;}while((count<9)&&(result==0));printf("最终棋局:\n");printf("------------------------\n");for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%5c",chess[i][j]);printf("\n\n");}printf("------------------------\n");if(count==9)printf("平局\n");return 0;}int computer(char *chess){int i,j,sign;sign=1;for(i=0;i<3;i++) //行内是否有两个相同{if((chess[i*3+0]==chess[i*3+1])&&(chess[i*3+2]!='O')&&(chess[i*3+2]!='X')){chess[i*3+2]='X';return 0;}elseif((chess[i*3+1]==chess[i*3+2])&&(chess[i*3+0]!='O')&&(chess[i*3+0]!='X')){chess[i*3+0]='X';return 0;}elseif((chess[i*3+0]==chess[i*3+2])&&(chess[i*3+1]!='O')&&(chess[i*3+1]!='X')){chess[i*3+1]='X';return 0;}else;}for(j=0;j<3;j++) //列内是否有个相同{if((chess[0*3+j]==chess[1*3+j])&&(chess[2*3+j]!='O')&&(chess[2*3+j]!='X')){chess[2*3+j]='X';return 0;}elseif((chess[0*3+j]==chess[2*3+j])&&(chess[1*3+j]!='O')&&(chess[1*3+j]!='X')){chess[1*3+j]='X';return 0;}elseif((chess[1*3+j]==chess[2*3+j])&&(chess[0*3+j]!='O')&&(chess[0*3+j]!='X')){chess[0*3+j]='X';return 0;}else;}//关于对角的判断if(((chess[0]==chess[8])||(chess[2]==chess[6]))&&(chess[4]!='O')&&(chess[4]!='X')) chess[4]='X';else if((chess[0]==chess[4])&&(chess[8]!='O')&&(chess[8]!='X'))chess[8]='X';else if((chess[8]==chess[4])&&(chess[0]!='O')&&(chess[0]!='X'))chess[0]='X';else if((chess[2]==chess[4])&&(chess[6]!='O')&&(chess[6]!='X'))chess[6]='X';else if((chess[6]==chess[4])&&(chess[2]!='O')&&(chess[2]!='X'))chess[2]='X';else if((chess[4]!='X')&&(chess[4]!='O')) //抢占中心位置chess[4]='X';else{for(i=0;i<3;i++)for(j=0;j<3;j++)if((chess[i*3+j]!='O')&&(chess[i*3+j]!='X')){chess[i*3+j]='X';sign=0;return 0;}if(sign==1){printf("电脑走棋错误\n"); //无子可落exit(0);}}return 0;}int check(char *chess,char sign) //使用了指针,判断位置可行则走棋,不可行则返回值为1//int check(char chess[3][3],char sign) //未使用指针,则不可在方法内走棋{int i,j;int check;check=0;switch(sign){case '1':i=0;j=0;break;case '2':i=0;j=1;break;case '3':i=0;j=2;break;case '4':i=1;j=0;break;case '5':i=1;j=1;break;case '6':i=1;j=2;break;case '7':i=2;j=0;break;case '8':i=2;j=1;break;case '9':i=2;j=2;break;default:check=1;}if((chess[i*3+j]=='O')||(chess[i*3+j]=='X')){printf("输入位置无法走棋\n");check=1;}else{chess[i*3+j]='O';}return check;}int judge(char *chess){int i,j;int result;result=0;for(i=0;i<3;i++){if((chess[i*3+0]==chess[i*3+1])&&(chess[i*3+1]==chess[i*3+2])&&(chess[i*3+0]==ch ess[i*3+2]))//行判断{if(chess[i*3+0]=='O')result=1;elseresult=2;break;}else;}for(j=0;j<3;j++){if((chess[0*3+j]==chess[1*3+j])&&(chess[1*3+j]==chess[2*3+j])&&(chess[0*3+j]==ch ess[2*3+j]))//列判断{if(chess[0*3+j]=='O')result=1;elseresult=2;break;}else;}if(((chess[0]==chess[4])&&(chess[4]==chess[8])&&(chess[0]==chess[8]))||((chess[2]==chess[4])&&(chess[4]==chess[6])&&(chess[2]==chess[6])))//对角判断{if(chess[4]=='O')result=1; //人胜出elseresult=2;}if(result==1){printf("玩家胜出\n");}else if(result==2){printf("电脑胜出\n");}else;return result;}五测试结果。

相关主题