五子棋规则的判断:
byte CFive::Judge(byte num)
{
    byte len,chong4a,huo3,chong4,longl,i,x=movelog[num].x,y=movelog[num].y;
    int x1,y1,x2;
    rule line[4];
    huo3=chong4=longl=0;
    for(i=0;i<=16;i++)
    {
        line[0].r_line[i]=board[i][y];
        line[1].r_line[i]=board[x][i]; 
    }    
    line[0].r_current=x;
    line[1].r_current=y;
    //line[2]---------------------------
    i=0;
    while(board[x-i][y-i]!=6) //6:F_BIAN
        i++;
    x1=x-i;
    y1=y-i;
    i=0;
    while(board[x+i][y+i]!=6) //6:F_BIAN
        i++;
    x2=x+i;
    for(i=0;i<(x2-x1);i++)
        line[2].r_line[i]=board[x1+i][y1+i];
    line[2].r_current=x-x1;
    //line[3]---------------------------
    i=0;
    while(board[x-i][y+i]!=6) //6:F_BIAN
        i++;
    x1=x-i;
    y1=y+i;
    i=0;
    while(board[x+i][y-i]!=6) //6:F_BIAN
        i++;
    x2=x+i;
    for(i=0;i<(x2-x1);i++)
        line[3].r_line[i]=board[x1+i][y1-i];
    line[3].r_current=x-x1;
    for(i=0;i<4;i++)
    {
        len=Length(line[i].r_line,line[i].r_current);
        if(num%2==0) //now is black stone
        {            
            chong4a=four_4(line[i].r_line,line[i].r_current);
            if(len==5)
                return BLACK_WIN;
            if(len>5)
                longl++;
            if(chong4a>=1)
            {
                if(chong4a==2&&len==3)
                    chong4+=2;
                if(chong4a==1)
                    chong4++;
                if(chong4a==2&&len==4)
                    chong4++;
            }
            if(chong4a==0)
                huo3+=findhou3(line[i].r_line,line[i].r_current);
        }
        else //now is white stone
            if(len>=5)
                return WHITE_WIN;
    }
    if(huo3>=2&brvbar;&brvbar;chong4>=2&brvbar;&brvbar;longl>=1)
        return JIN_SHOU;
    if((huo3<2&&chong4<2)&brvbar;&brvbar;num%2!=0)
        return HE_FA;
}byte CFive::Length(byte aline[17], byte current)
{
    byte i,j,color,line[17];
    for(i=0;i<17;i++)
        line[i]=aline[i];
    i=j=0;
    color=line[current];
    while(line[current-i-1]==color)
        i++;
    while(line[current+j+1]==color)
        j++;
    return i+j+1;
}byte CFive::PutWhite(byte aline[17], byte current)
{
    byte i,j,left,right,line[17];
    for(i=0;i<17;i++)
        line[i]=aline[i];
    left=right=i=j=0;
    //left:
    while(line[current-i-1]==1) //1:F_BLACK
        i++;
    if(line[current-i-1]==0) //0:F_EMPTY
    {
        line[current-i-1]=F_WHITE;
        left=PutBlack(line,current);
        line[current-i-1]=F_EMPTY;
    }
    //right
    while(line[current+j+1]==1) //1:F_BLACK
        j++;
    if(line[current+j+1]==0) //0:F_EMPTY
    {
        line[current+j+1]=F_WHITE;
        right=PutBlack(line,current);
    }
    return left+right;
}byte CFive::PutBlack(byte aline[17], byte current)
{
    byte i,j,left,right,line[17];
    for(i=0;i<17;i++)
        line[i]=aline[i];
    left=right=i=j=0;
    //left:
    while(line[current-i-1]==1) //1:F_BLACK
        i++;
    if(line[current-i-1]==0) //0:F_EMPTY
    {
        line[current-i-1]=F_BLACK;
        if(Length(line,current)==5)
            left=1;
        else
            left=PutWhite(line,current);
        line[current-i-1]=F_EMPTY;
    }
    //right
    while(line[current+j+1]==1) //1:F_BLACK
        j++;
    if(line[current+j+1]==0) //0:F_EMPTY
    {
        line[current+j+1]=F_BLACK;
        if(Length(line,current)==5)
            right=1;
        else
            right=PutWhite(line,current);
    }
    return left+right;
}byte CFive::four_4(byte aline[17], byte current)
{
    byte i,j,num,m,n,line[17];
    for(i=0;i<17;i++)
        line[i]=aline[i];
    num=i=j=0;
    //left
    m=line[current-1];
    n=line[current];
    while(line[current-i-1]==1) //1:F_BLACK
        i++;
    if(line[current-i-1]==0) //0:F_EMPTY
    {
        line[current-i-1]=F_BLACK;
        if(Length(line,current)==5)
            num++;
        line[current-i-1]=F_EMPTY;
    }
    //right
    while(line[current+j+1]==1) //1:F_BLACK
        j++;
    if(line[current+j+1]==0) //0:F_EMPTY
    {
        line[current+j+1]=F_BLACK;
        if(Length(line,current)==5)
            num++;
    }
    return num;
}byte CFive::findhou3(byte aline[17], byte current)
{
    byte i,j,left,n,right,line[17];
    for(i=0;i<17;i++)
        line[i]=aline[i];
    left=right=i=j=n=0;
    //left:
    while(line[current-i-1]==1) //1:F_BLACK
        i++;
    if(line[current-i-1]==0) //0:F_EMPTY
    {
        line[current-i-1]=F_BLACK;
        left=PutWhite(line,current);
        line[current-i-1]=F_EMPTY;
    }
    //right
    while(line[current+j+1]==1) //1:F_BLACK
        j++;
    if(line[current+j+1]==0) //0:F_EMPTY
    {
        line[current+j+1]=F_BLACK;
        right=PutWhite(line,current);
    }
    if(left>=2&brvbar;&brvbar;right>=2)
        n++;
    return n;

解决方案 »

  1.   

    struct rule
    {
    byte r_current,r_line[17];
    };struct pos
    {
    byte x,y;
    };
    class CFive  
    {
    public:
        void InitValue();
    void Start();
    byte Repent();
    byte Put(byte x,byte y);
    CFive();
    virtual ~CFive();
    byte board[17][17];
    pos movelog[225];
    byte m_current;
    private:
    byte Judge(byte num);
    byte findhou3(byte aline[], byte current);
    byte four_4(byte aline[], byte current);
    byte PutBlack(byte aline[], byte current);
    byte PutWhite(byte aline[],byte current);
    byte Length(byte line[],byte current);
    };
      

  2.   

    cnss() :我服你了,向你表示敬意!
      

  3.   

    struct rule
    {
        byte r_current,r_line[17];  //r_current:当前子在串中的位置,r_line[17]:串
    };struct pos
    {
        byte x,y;  //不用说了
    };
    class CFive  
    {
    public:
        void InitValue();
        void Start();
        byte Repent();
        byte Put(byte x,byte y);
        CFive();
        virtual ~CFive();
        byte board[17][17]; //棋盘
        pos movelog[225];
        byte m_current;
    private:
        byte Judge(byte num); //判断,返回:禁手(对黑的而言),胜
        byte findhou3(byte aline[], byte current); //返回有几个活三
        byte four_4(byte aline[], byte current);  //有几个冲四
        byte PutBlack(byte aline[], byte current);  //放黑子(间接递归函数)
        byte PutWhite(byte aline[],byte current); //放白子(间接递归函数)
        byte Length(byte line[],byte current); //返回当前串的长度
    };