C语言之三子棋

来源:互联网 发布:方式和方法的区别知乎 编辑:程序博客网 时间:2024/06/03 18:51

要写一个三子棋游戏,首先分为5个函数。
1.初始化函数,将定义的数组arr初始化

void init(){    memset(arr,' ',rows*cols*(len+1));}

注意:memset函数的头文件是#include

void board(){    int i=0,j=0;    for(i=0;i<3;i++)    {        printf(" %c | %c | %c \n",arr[i][0],arr[i][1],arr[i][2]);        if(i<(3-1))            printf("---|---|---\n");    }}

这里可以自己设计一个想要的样子,随自己喜欢。
3.接下来就是主要的了,写一个player(),就是指玩家下,将玩家下的位置改成X。

void player(){    int a=0,b=0;    printf("请输入你要下的位置:");    scanf("%d%d",&a,&b);    if(arr[a][b] ==' ')    {        arr[a][b]='X';          num++;    }    else    {        printf("请输入你要下的位置:");        scanf("%d%d",&a,&b);    }}

这里要先判断玩家所下的位置是否为空格,若不是空格就需要重新输入。
4.接下来就是电脑下了,电脑下就是生成一个随机数,但这个随机数也需要判断是否为空格,若不是就需要重新生成,将电脑下的位置改成Q

srand((unsigned int)time (NULL));    int a ,b;begin:  a=rand()%3;    b=rand()%3;    if(arr[a][b]==' ' )    {        arr[a][b]='Q';        num++;    }    else    {        goto begin;    }

这里可以用一个goto语句,比较简单。
5.这是最重要的一个函数了,就是判断输赢。

int win(){                       //平局            3     int i=0,j=0;        //人赢就返回      2     for(i=0;i<rows;i++)//计算机赢就返回   0    {                 //继续输入就返回    1         if((arr[i][0] == arr[i][1]) && (arr[i][0] == arr[i][2]) && (arr[i][1] == arr[i][2]) && arr[i][0] != ' ')        {            if(arr[i][0] == 'Q')            {                return 0;            }            if(arr[i][0] == 'X')            {                return 2;            }        }    }    for(j=0;j<cols;j++)     {        if((arr[0][j] == arr[1][j]) &&(arr[0][j] == arr[2][j]) && (arr[1][j] == arr[2][j]) && arr[0][j] != ' ')        {            if(arr[0][j] == 'Q')            {                return 0;            }            if(arr[0][j] == 'X')            {                return 2;             }        }    }    if((arr[0][0] == arr[1][1]) &&(arr[0][0] == arr[2][2]) &&(arr[1][1] == arr[2][2]) && arr[0][0] != ' ')    {        if(arr[0][0] == 'Q')        {            return 0;        }        if(arr[0][0] == 'X')        {            return 2;        }    }    if((arr[2][0] == arr[1][1]) &&(arr[2][0] == arr[0][2]) && (arr[1][1] == arr[0][2]) && arr[0][2] != ' ')    {        if(arr[0][2] == 'Q')        {            return 0;        }        if(arr[0][2] == 'X')        {            return 2;        }    }    if(num == cols*rows)    {        return 3;    }     return 1;}

若是有一列或一行相同的字符,或者是斜的三个相同的字符,那就说明有人赢了,至于是电脑还是人,那就需要再进行判断了,如果没赢,就只剩下两种可能,一种是平局,还有一种是需要再进行一轮才能判断。
对于平局就是指棋盘都已经下满了还没有分出胜负,那么此时的期盼就没有一个空格了,可以重新写一个函数来判断若是还有空格,那就表明还没有平局,否则就平局了。
排除掉所有的情况之后就只剩下最后一种可能了,那就是还要再继续玩。
在写完所有的要用的函数后,就开始写主函数了。

int main(){    int n=1;    do    {        menu();        printf("请选择:");        scanf("%d",&n);         switch(n)        {            case 1:                 init();                while(1)                {                   if(win() == 1)                   {                        computer();                        board();                        if(win() == 1)                            player();                   }                   else                   {                        break;                   }                }                if(win()==0)                {                    printf("计算机赢了\n");                }                 if(win()==2)                {                    printf("人赢了\n");                }                if(win()==3)                {                    printf("平局\n");                }                break;            case 0:                break;            default:                printf("输入有误\n");                 break;        }    }    while(n==1);    return 0;} 

对于主函数,这个可以看个人的设计,我写的这个是可以重复玩的,在每次游戏结束后,若是想继续玩就选择1,退出就选择0。
其实也可以将switch1里的代码都放进一个函数,而这个函数就命名为game(),只需在switch里调用就行了。

0 0
原创粉丝点击