C语言2048游戏

www.zhaoch.top > 项目

用C实现了2048游戏

windows上运行的纯C命令行项目

代码 2048.c

说明 https://www.cnblogs.com/GhostZCH/p/3634244.html

界面

方向键控制,r键重启,esc退出。

img

代码简要说明

移动一个格子的代码

//********************************************
// Method      :  MoveOneStep
// Description :  尝试从(i1,j1)移动到(i2,j2),返回移动结果,更新uData
//********************************************
BOOL MoveOneStep(int i1, int j1, int i2, int j2, UINT32* uData)
{
    UINT32 uNextData = GetByPosition( i2, j2 );

    if( 0 == uNextData )
    {
        SetAddMatByPosition( i2, j2, GetAddMatByPosition( i1, j1 ) );
        SetAddMatByPosition( i1, j1, FALSE );

        SetByPosition( i1, j1, 0 );
        SetByPosition( i2, j2, (*uData) );
        
        return TRUE;
    }
    
    if ( FALSE == GetAddMatByPosition( i1, j1 ) &&
        FALSE == GetAddMatByPosition( i2, j2 ) &&
        (*uData) == uNextData )
    {
        (*uData) *= 2;
        
        SetByPosition( i1, j1, 0 );
        SetByPosition( i2, j2, (*uData) );

        SetAddMatByPosition( i2, j2, TRUE );
    
        return TRUE;
    }
    
    return FALSE;
}

然后在这个函数中调用上面的函数,每次移动一块到不能移动为止

//********************************************
// Method      :  MoveOneUp
// Description :  向上移动一块
//********************************************
BOOL MoveOneUp(int i, int j)
{
    BOOL bHasMoved = FALSE;
    UINT32 uData = GetByPosition( i, j );
    
    if ( 0 == uData )
    {
        return FALSE;
    }

    while ( i > 0 )
    {
        if( FALSE == MoveOneStep( i, j, i-1, j, &uData) )
        {
            break; // 此次没有移动结束循环
        }
        else
        {
            bHasMoved = TRUE; // 此次移动更新状态
            i--;
        }
    }

    return bHasMoved;
}

这个函数的被一个接受用户输入的函数调用,当按方向键时执行,调用上面的函数,逐块移动:

//******************************************** 
// Method      :  cmdUp
// Description :  ↑
//********************************************
void cmdUp()
{
    int i,j;
    BOOL bHasMoved = FALSE;

    if ( FALSE == BeforeMove() )
    {
        return ;
    }
    
    for ( i = 0; i < SIZE ; i ++)
    {
        for ( j = 0; j < SIZE ; j ++)
        {
            bHasMoved = (TRUE == MoveOneUp(i,j) ? TRUE : bHasMoved);
        }
    }

    if ( TRUE == bHasMoved)
    {
        AfterMove();
    }
}

The End