基于MFC+vs 2003的人人对战五子核心算法

3 篇文章 0 订阅

自己写了一个五子棋的人人对战赢棋判断算法,写的时候由于比较匆忙,还存在一些bug,测试了几遍,好像在棋盘边缘下棋的时候会出错。

五子棋,棋盘为15X15,黑棋先下。

我的算法思想是:每走一步棋子,对其进行进行八个方向判断,然后对水平,垂直,两条对角线上的连子数进行相加,为五则当前玩家胜利。

下面是我的核心算法


/*
* 函数名称:GetWestSouthNum(CChess nCh,int i,int j)
* 函数介绍:判断右下方和左上方同一颜色相连棋子个数
* 输入参数:nCh,i,j(最后输入的一个棋子的对象,棋盘坐标)
* 输出参数:int
* 返回值  :t表示连子个数
*/
int CManagers::GetEastSouthNum(int state,int i,int j)
{
    int tempx,tempy;
    int t,t1,t2;//t为连子个数
    t1=0;
    t2=0;
    //bool flag = true;

    /右下方判断相连个数
    tempx = i+1;
    tempy = j+1;

    if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
    {
            for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
                {
                    if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
                    {
                        t1++;                                    //棋子相连一次t自增一次
                        tempx++;
                        tempy++;
                    }
                    else
                        break;
                }
    }

    tempx = i-1;
    tempy = j-1;
        //判断左上方棋子连续的个数
    if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
    {
        for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
        {
            if(state == map[tempx][tempy] && state != -1&&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
            {
                t2++;                //棋子相连一次t自加一次
                tempx--;
                tempy--;
            }
            else
                break;
        }
    }
        t = t1 + t2;
        return t;       
}



/*
* 函数名称:GetWestSouthNum(CChess nCh,int i,int j)
* 函数介绍:判断右上方和左下方同一颜色相连棋子个数
* 输入参数:nCh,i,j(最后输入的一个棋子的对象,棋盘坐标)
* 输出参数:int
* 返回值  :t表示连子个数
*/
int CManagers::GetWestSouthNum(int state,int i,int j)
{
    int tempx,tempy;
    int t,t1,t2;//t为连子个数
    t1=0;
    t2=0;
    //bool flag = true;

    /右上方判断相连个数
    tempx = i+1;
    tempy = j-1;

    if(tempx<15 && tempy<15 && tempx>=0 && tempy>=0)
    {
        for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
        {
            if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
            {
                t1++;                //棋子相连一次t自增一次
                tempx++;
                tempy--;
            }
            else
                break;
        }
    }

    tempx = i-1;
    tempy = j+1;
    //判断左下方棋子连续的个数
    if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
    {
        for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
        {
            if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
            {
                t2++;                //棋子相连一次t自减一次
                tempx--;
                tempy++;
            }
            else
                break;
        }
    }
    t = t1 + t2;
    return t;       
}

/判断水平方向连子个数
int CManagers::GetHorizontalNum(int state,int i,int j)
{
    int tempx,tempy;
    int t,t1,t2;//t为连子个数
    t1=0;
    t2=0;
    //bool flag = true;

    /左边水平方向判断相连个数
    tempx = i-1;
    tempy = j;

    if(tempx<15 && tempy<15 && tempx>=0 && tempy>=0)
    {
        for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
        {
            if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
            {
                t1++;                //棋子相连一次t自增一次
                tempx--;//左边水平方向x坐标不变,y坐标自减1
                //tempy--;
            }
            else
                break;
        }
    }

    tempx = i+1;
    tempy = j;
    //判断右边水平方向棋子连续的个数
    if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
    {
        for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
        {
            if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
            {
                t2++;                //棋子相连一次t自减一次
                //右边水平方向x++,y不变
                tempx++;
                //tempy++;
            }
            else
                break;
        }
    }
    t = t1 + t2;
    return t;       
}

/判断垂直方向连子个数
int CManagers::GetVerticaltalNum(int state,int i,int j)
{
    int tempx,tempy;
    int t,t1,t2;//t为连子个数
    t1=0;
    t2=0;
    //bool flag = true;

    /上面垂直方向判断相连个数
    tempx = i;
    tempy = j-1;

    if(tempx<15 && tempy<15 && tempx>=0 && tempy>=0)
    {
        for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
        {
            if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
            {
                t1++;                //棋子相连一次t自增一次
                //tempx--;//上边垂直方向x坐标不变,y坐标自减1
                tempy--;
            }
            else
                break;
        }
    }

    tempx = i;
    tempy = j+1;
    //判断下面垂直方向棋子连续的个数
    if(tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)
    {
        for(;tempx<15,tempy<15,tempx>=0,tempy>=0;)
        {
            if(state == map[tempx][tempy] && state != -1 &&tempx < 15 && tempy<15 && tempx>=0 && tempy>=0)//如果下一步棋子的颜色和第一个相同且不等于空
            {
                t2++;                //棋子相连一次t自减一次
                //右边水平方向x++,y不变
                tempy++;
            }
            else
                break;
        }
    }
    t = t1 + t2;
    return t;       
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值