tic-tac-toe连珠游戏(井棋游戏)的算法

一、tic-tac-toe连珠游戏的介绍

在3行3列的九宫格上进行的连珠游戏,只需用笔在白纸上画两条横线和两条竖线构成九宫格,

形似汉字"井"。两名游戏选手分别代表X和O,这两名选手轮流在"井"字棋盘的格子内画X和O。

第一个把相同的符号(X或O)连成一条直线的选手获胜。 

二、本文的目的

判断一个3行3列的二维数组是否存在获胜方。

三、本文展示的算法的突出特点

使用一个二重循环实现行检查和列检查

四、C语言代码

#include<stdio.h>

/*程序采用单一出口,根据不同情况下的返回值ret去判断获胜一方的符号*/
int main()
{
    /* 数组的行数、列数  */
    int row=3,column=3;
    int a[row][column];
    
    /* 行下标(索引)、列下标(索引)  */
    int i,j;
    
    /* 每一行所有元素之和、每一列所有元素之和  */
    int sum_row,sum_column;
    
    /* 返回值初始化为2
       如果不存在三个相同的符号连成一条直线的情况,返回值默认是2*/
    int ret=2;
    
    /* 提示信息  */
    printf("Enter a two dimensional array.\n");
    printf("For example:\t1\t 0\t 1\n");
    printf("\t\t1\t 0\t 1\n");
    printf("\t\t0\t 1\t 0\n");
    printf("\n\nPlease enter a two dimensional array.\n");
    
    /* 输入一个二维数组  */
    for(i=0;i<row;i++)
    {
        for(j=0;j<column;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    
    /* 一个二重循环实现行检查和列检查
    
       数学原理:第一行所有元素的行下标(i)和列下标(j)交换之后,

                        表示第一列的所有元素。
               
          同理,第二行所有元素的行下表(i)和列下标(j)交换之后,
                    表示第二列的所有元素。 
               
         同理,第三行所有元素的行下表(i)和列下标(j)交换之后,
                   表示第三列的所有元素。*/

    for(i=0;i<row;i++)
    {
        sum_row=0;
        sum_column=0;
        
        for(j=0;j<column;j++)
        { 
            /* 第i行的所有元素之和  */
            sum_row+=a[i][j];
            
            /* 第i列的所有元素之和  */
            sum_column+=a[j][i];
        }
        
        /* 检查行  */ 
        if(sum_row==0 || sum_row==3)
        {
            /* 返回值是第i行第0列的元素的值  */
            ret=a[i][0];
        }
        
        /* 检查列  */
        else if(sum_column==0 || sum_column==3)
        {
              /* 返回值是第0行第i列的元素的值  */
            ret=a[0][i];
        }
        
        /* 检查对角线 */
        else if(a[0][0]+a[1][1]+a[2][2]==0 || a[0][0]+a[1][1]+a[2][2]==3 || a[0][2]+a[1][1]+a[2][0]==0 || a[0][2]+a[1][1]+a[2][0]==3)
        {
            ret=a[1][1];
        }
        
        if(ret==2)
        {
            continue;
        }
        else
        {
            break;
        }
    }
    
    /* 判断返回值
       如果返回值是0或1,输出获胜者的符号。
       否则,输出"No one wins"  */
    switch(ret)
    {
        /* 利用switch-case多分支语句的性质
           执行某个case语句,如果这个case语句中没有设置break语句, 
           那么执行完这个case语句后会继续执行后面的case语句,
           直到遇到break语句或者执行完所有剩余语句才结束  */ 
        case 0:
        case 1:
            {
                printf("The winner is %d\n",ret);
                break;
            }
        default:
            {
                printf("no one wins\n");
            }    
    }

    return 0;
}

五、测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值