连接4检查玩家是否获胜

时间:2014-08-13 14:57:34

标签: c

我在C上创建一个在终端上运行的连接4游戏,我在检查区域遇到困难,我会发布下面的功能代码,但是这足以检查所有可能性游戏?

int checkResult()
{

    int i,j,k,count;
    for(i=0;i<sizeWidth;i++)
    {
        for(j=0;j<sizeHeight-3;j++)
        {
            //checks horizontal win
            if(board[i][j] != 0 && board[i][j]==board[i][j+1] && board[i][j]==board[i][j+2] && board[i][j]==board[i][j+3])
                return 1;
            //checks vertical win
            if(board[i][j] != 0 && board[i][j]==board[i+1][j] && board[i][j]==board[i+2][j] && board[i][j]==board[i+3][j])
                return 1;

            //checks diagonal win
            count = 0;
            for(k=1;k<4;k++)
            {
                if(board[i][j] == board[i+k][j+k] && board[i][j]!=0)
                    count++;
                else
                    count = 0;
                if(count == 3)
                    return 1;
            }
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:1)

这还不够,因为如果4个点处于最大高度,您将无法检测到它。 另外,它可能是seg-fault(如果i=sizeWidth-1board[i+1][j]未定义)

在你的代码中,你忘记了一些垂直的可能性,而你只是看着一个对角线方向。

你可以做什么,以确保你没有忘记任何事情,正在做多个步骤:检测垂直,水平,然后对角线。在我看来,一次做所有事情都比较复杂。你可以有这样的东西

for(i=0;i<sizeWidth;i++)
    {
        for(j=0;j<sizeHeight-3;j++)
        {
            //checks horizontal win
            if(board[i][j] != 0 && board[i][j]==board[i][j+1] && board[i][j]==board[i][j+2] && board[i][j]==board[i][j+3])
                return 1;
        }
    }

for(i=0;i<sizeWidth-3;i++)
    {
        for(j=0;j<sizeHeight;j++)
        {
            //checks vertical win
            if(board[i][j] != 0 && board[i][j]==board[i+1][j] && board[i][j]==board[i+2][j] && board[i][j]==board[i+3][j])
                return 1;
        }
    }
// Check for both diagonals ...
return 0;

在那里,您可以确定每个解决方案都在查看。

答案 1 :(得分:0)

好吧,我想我现在知道了,我这样写:

int checkResult()
{

    int i,j,k,count;


    //checks horizontal win
    for(i=0;i<sizeWidth;i++)
        for(j=0;j<sizeHeight-3;j++)
            if(board[i][j] != 0 && board[i][j]==board[i][j+1] && board[i][j]==board[i][j+2] && board[i][j]==board[i][j+3])
                printf("\n1");
                //return 1;

    //checks vertical win
    for(i=0;i<sizeWidth-3;i++)
        for(j=0;j<sizeHeight;j++)
            if(board[i][j] != 0 && board[i][j]==board[i+1][j] && board[i][j]==board[i+2][j] && board[i][j]==board[i+3][j])
                printf("\n2");
                //return 2;

    //checks rigth diagonal win
    for(i=0;i<sizeWidth-3;i++)
        for(j=0;j<sizeHeight-3;j++)
            if(board[i][j] != 0 && board[i][j]==board[i+1][j+1] && board[i][j]==board[i+2][j+2] && board[i][j]==board[i+3][j+3])
                printf("\n3");

    //checks left diagonal win
    for(i=0;i<sizeWidth-3;i++)
        for(j=0;j<sizeHeight-3;j++)
            if(board[i][j] != 0 && board[i][j]==board[i+1][j-1] && board[i][j]==board[i+2][j-2] && board[i][j]==board[i+3][j-3])
                printf("\n4");

    return 0;
}

到目前为止,它通过了我的所有测试:)感谢帮助人员!

答案 2 :(得分:0)

不要左对角线检查,我试试这段代码:

//checks left diagonal win
    for(i=0;i<sizeWidth-3;i++)
        for(j=3;j<sizeHeight;j++)
            if(board[i][j] != 0 && board[i][j]==board[i+1][j-1] && board[i][j]==board[i+2][j-2] && board[i][j]==board[i+3][j-3])
                printf("\n4");

因为变量j是递减的,所以你必须将j被理论化为3并在条件中删除sizeHeight-3。