⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tank.c

📁 坦克大战,实现基本的游戏功能
💻 C
📖 第 1 页 / 共 2 页
字号:
    pTank->m_pPrev=NULL;
    pTank->m_pNext=NULL;

    if(g_pTHead==NULL)
    {
        g_pTHead=pTank;
        g_pTTail=g_pTHead;
    }
    else
    {
        g_pTTail->m_pNext=pTank;
        g_pTTail->m_pNext->m_pPrev=g_pTTail;
        g_pTTail=g_pTTail->m_pNext;
    }

    if(pThis==&g_PPlayer1)
    {
        g_pTank1=pTank;
        pTank->m_byDirect=1;
        pTank->m_byProtected=1;
        pTank->m_byTiming=600;
    }
    else if(pThis==&g_PPlayer2)
    {
        g_pTank2=pTank;
        pTank->m_byDirect=1;
        pTank->m_byProtected=1;
        pTank->m_byTiming=600;
    }
    else
    {
        pTank->m_byDirect=2;
        pTank->m_byProtected=0;
    }

    DrawTank(pTank);

    (pThis->m_nRestTanks)--;
}

void KillTank(CTank *pThis)  /* 消灭坦克 */
{
    if(pThis==NULL) return;

    if(pThis->m_pOwner==&g_PPlayer1)
    {
        g_pTank1=NULL;
    }
    else if(pThis->m_pOwner==&g_PPlayer2)
    {
        g_pTank2=NULL;
    }

    pThis->m_byTiming=0;
    pThis->m_byState=-1;
    ClearTank(pThis);
    ExplodeTank(pThis);
}

void DeleteTank(CTank *pThis)  /* 删除坦克 */
{
    if(pThis==NULL) return;

    if(pThis->m_pNext!=NULL) pThis->m_pNext->m_pPrev=pThis->m_pPrev;
    if(pThis->m_pPrev!=NULL) pThis->m_pPrev->m_pNext=pThis->m_pNext;
    if(pThis==g_pTHead) g_pTHead=pThis->m_pNext;
    if(pThis==g_pTTail) g_pTTail=pThis->m_pPrev;

    (pThis->m_pOwner->m_nTanks)--;

    free(pThis);
}

void ChangeTankDirect(CTank *pThis, char byDirect)  /* 改变坦克方向 */
{
    if(pThis==NULL) return;

    ClearTank(pThis);
    pThis->m_byDirect=byDirect;
    pThis->m_byState=3;
    DrawTank(pThis);
}

void GetGift(CTank *pThis)  /* 捡东西 */
{
    CTank *pTank;

    if(pThis==NULL) return;

    if(
        g_pGift[pThis->m_nX/8  ][pThis->m_nY/8  ]!=NULL||
        g_pGift[pThis->m_nX/8+1][pThis->m_nY/8  ]!=NULL||
        g_pGift[pThis->m_nX/8  ][pThis->m_nY/8+1]!=NULL||
        g_pGift[pThis->m_nX/8+1][pThis->m_nY/8+1]!=NULL
      )
    {
        switch(g_pTheGift->m_byType)
        {
        case 0:  /* 坦克     */
            (pThis->m_pOwner->m_nTanks)++;
            (pThis->m_pOwner->m_nRestTanks)++;
            break;
        case 1:  /* 手枪     */
            if(pThis->m_byLevel<9)
            {
                (pThis->m_byLevel)++;
                if(pThis->m_pOwner!=&g_PEnemy)
                {
                    (pThis->m_pOwner->m_byLevel)++;
                }
            }
            break;
        case 2:  /* 定时     */
            if(pThis->m_pOwner->m_bySide==1) g_byStopTank=1;
            else g_byStopTank=2;
            g_cntStopTank=1200;
            break;
        case 3:  /* 炸弹     */
            pTank=g_pTHead;
            while(pTank!=NULL)
            {
                if(pTank->m_pOwner->m_bySide!=pThis->m_pOwner->m_bySide)
                {
                    KillTank(pTank);
                }
                pTank=pTank->m_pNext;
            }
            break;
        case 4:  /* 船       */
            pThis->m_byHasBoat=1;
            if(pThis->m_pOwner!=&g_PEnemy)
            {
                pThis->m_pOwner->m_byHasBoat=1;
            }
            break;
        case 5:  /* 无敌     */
            pThis->m_byProtected=1;
            pThis->m_byTiming=1800;
            break;
        case 6:  /* 老家无敌 */
            if(pThis->m_pOwner->m_bySide==1) g_byProtectBase=1;
            else g_byProtectBase=2;
            g_cntProtectBase=1800;
            break;
        }
        DeleteGift(g_pTheGift);
    }
}

CTank *MoveTank(CTank *pThis)  /* 移动坦克 */
{
    int x, y, x1, y1, x2, y2;
    CTank *pNext;

    if(pThis==NULL) return NULL;

    pNext=pThis->m_pNext;

    switch(pThis->m_byState)
    {
    case -2:
        if(pThis->m_nBullets==0)
        {
            DeleteTank(pThis);
        }
        break;
    case -1:
        if((pThis->m_byTiming)++>=8)
        {
            CleanTankExplode(pThis);
        }
        break;
    case 0:
        break;
    case 3:
        /*ClearTank(pThis);
        DrawTank(pThis);*/
        pThis->m_byState=1;
    case 1:
        switch(pThis->m_byDirect)
        {
        case 1:
            x=pThis->m_nX;
            y=pThis->m_nY-1;
            x1=x;
            y1=y;
            x2=x+15;
            y2=y;
            break;
        case 2:
            x=pThis->m_nX;
            y=pThis->m_nY+1;
            x1=x;
            y1=y+15;
            x2=x+15;
            y2=y+15;
            break;
        case 3:
            x=pThis->m_nX-1;
            y=pThis->m_nY;
            x1=x;
            y1=y;
            x2=x;
            y2=y+15;
            break;
        case 4:
            x=pThis->m_nX+1;
            y=pThis->m_nY;
            x1=x+15;
            y1=y;
            x2=x+15;
            y2=y+15;
            break;
        }

        if(!IsInMap(x1, y1)||!IsInMap(x2, y2))
        {
            pThis->m_byState=2;
            break;
        }

        x1=x1/8;
        y1=y1/8;
        x2=x2/8;
        y2=y2/8;

        if((g_pTank[x1][y1]!=NULL&&g_pTank[x1][y1]!=pThis)||(g_pTank[x2][y2]!=NULL&&g_pTank[x2][y2]!=pThis))
        {
            /*
            if(pThis->m_nX%8!=0||pThis->m_nY%8!=0){
                Rect(pThis->m_nX, pThis->m_nY, pThis->m_nX+15, pThis->m_nY+15, YELLOW);
                        while(!GetKey(KEY_ENTER));}
            */
            pThis->m_byState=2;
            break;
        }

        if(
            ((GetMap(x1, y1)==0||GetMap(x1, y1)==3)&&(GetMap(x2, y2)==0||GetMap(x2, y2)==3))||
            ((GetMap(x1, y1)==4||GetMap(x2, y2)==4)&&pThis->m_byHasBoat==1)
            )
        {
            ClearTank(pThis);
            pThis->m_nX=x;
            pThis->m_nY=y;
            GetGift(pThis);
            DrawTank(pThis);
        }
        else
        {
            pThis->m_byState=2;
            break;
        }

        if((x%8==0&&y%8==0))
        {
            pThis->m_byState=0;
        }
        break;
    case 2:
        break;
    }
    
    if(pThis->m_byProtected==1)
    {
        (pThis->m_byTiming)--;
        if(pThis->m_byTiming<0)
        {
            pThis->m_byProtected=0;
            ClearTank(pThis);
            DrawTank(pThis);
        }
    }

    return pNext;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -