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

📄 game.c

📁 坦克大战,实现基本的游戏功能
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
    game.c

    游戏主要程序文件
    最后修改: 2007-06-19
*/

#include <stdio.h>
#include <dos.h>
#include "graph.h"
#include "key.h"
#include "char.h"
#include "map.h"
#include "player.h"
#include "gift.h"
#include "tank.h"
#include "bullet.h"
#include "sound.h"

extern CPlayer g_PPlayer1, g_PPlayer2, g_PEnemy;
extern char g_byStopTank, g_byProtectBase;
extern int g_cntStopTank, g_cntProtectBase;
extern CTank *g_pTank[60][60];
extern CTank *g_pTHead, *g_pTTail, *g_pTank1, *g_pTank2;
extern CBullet *g_pBullet[60][60];
extern CBullet *g_pBHead, *g_pBTail;
extern CGift *g_pGift[60][60];
extern CGift *g_pTheGift;
extern char g_byBaseBombed;

typedef struct Config_Struct  /* 存储按键设置 */
{
    char m_byKeyUp1;
    char m_byKeyDown1;
    char m_byKeyLeft1;
    char m_byKeyRight1;
    char m_byKeyFire1;
    char m_byKeyUp2;
    char m_byKeyDown2;
    char m_byKeyLeft2;
    char m_byKeyRight2;
    char m_byKeyFire2;

} CConfig;

CConfig g_Config;
char g_nPlayers;
char g_nLv;
char g_szMapPath[12]="maps\\00.map";
int g_cntTiming=-1;

void Init()  /* 初始化 */
{
    int key;
    FILE *p;

    if(!OpenCharSet())
    {
        printf("Can't open file ASC16 or HZK16.\n");
        exit(0);
    }
    InitGraph();
    InstallKeyboard();

    p=fopen("tank.cfg", "rb");
    if(p!=NULL)
    {
        fread(&g_Config, sizeof(g_Config), 1, p);  /* 读入按键设置 */
        fclose(p);
    }
    else
    {   /* 默认按键 */
        g_Config.m_byKeyUp1    = KEY_UP;
        g_Config.m_byKeyDown1  = KEY_DOWN;
        g_Config.m_byKeyLeft1  = KEY_LEFT;
        g_Config.m_byKeyRight1 = KEY_RIGHT;
        g_Config.m_byKeyFire1  = KEY_SPACE;
        g_Config.m_byKeyUp2    = KEY_W;
        g_Config.m_byKeyDown2  = KEY_S;
        g_Config.m_byKeyLeft2  = KEY_A;
        g_Config.m_byKeyRight2 = KEY_D;
        g_Config.m_byKeyFire2  = KEY_WAVE;
    }

    /* 画提示框 */
    Box(160, 180, 479, 299, WHITE);
    Rect(161, 181, 478, 298, BLACK);
    Box(163, 183, 476, 198, BLUE);
    OutTextXY(163, 183, 477, 198, "游戏模式", WHITE, 13);
    OutTextXY(163, 212, 477, 227, "请选择游戏模式:", BLACK, 13);
    OutTextXY(163, 244, 477, 259, "    单人模式请按 F2 键", BLACK, 13);
    OutTextXY(163, 260, 477, 275, "    双人模式请按 F3 键", BLACK, 13);
    key=BIOSKey();
    while(key!=KEY_F2&&key!=KEY_F3) key=BIOSKey();  /* 等待用户按 F2 或 F3 */

    if(key==KEY_F2) g_nPlayers=1;
    else g_nPlayers=2;

    Box(160, 180, 479, 299, BLACK);  /* 清除提示框 */

    /* 画界面、初始化数据 */
    Rect(481, 0, 636, 479, YELLOW);
    OutTextXY(491, 400, 626, 480, "坦克大战\nv1.0 final\n作者: 溪流", WHITE, 13);

    g_nLv=1;
    
    g_PEnemy.m_bySide=-1;
    g_PEnemy.m_byLevel=1;
    g_PEnemy.m_byHasBoat=0;
    OutTextXY(540, 1, 572, 16, "敌方", WHITE, 13);
    OutTextXY(491, 17, 626, 32, "坦克数:", WHITE, 13);

    g_PPlayer1.m_bySide=1;
    g_PPlayer1.m_nTanks=4;
    g_PPlayer1.m_byLevel=1;
    g_PPlayer1.m_byHasBoat=0;
    OutTextXY(540, 41, 588, 56, "玩家一", WHITE, 13);
    OutTextXY(491, 57, 626, 88, "火力:\n坦克数:", WHITE, 13);

    if(g_nPlayers==2)
    {
        g_PPlayer2.m_bySide=1;
        g_PPlayer2.m_nTanks=4;
        g_PPlayer2.m_byLevel=1;
        g_PPlayer2.m_byHasBoat=0;
        OutTextXY(540, 97, 588, 112, "玩家二", WHITE, 13);
        OutTextXY(491, 113, 626, 144, "火力:\n坦克数:", WHITE, 13);
    }

    OutTextXY(491, 177, 626, 192, "    玩家一 玩家二", WHITE, 13);
    OutTextXY(491, 193, 626, 208, "上:", WHITE, 13);
    OutTextXY(491, 209, 626, 224, "下:", WHITE, 13);
    OutTextXY(491, 225, 626, 240, "左:", WHITE, 13);
    OutTextXY(491, 241, 626, 256, "右:", WHITE, 13);
    OutTextXY(491, 257, 626, 272, "火:", WHITE, 13);

    OutTextXY(523, 193, 626, 208, GetKeyName(g_Config.m_byKeyUp1), WHITE, 13);
    OutTextXY(523, 209, 626, 224, GetKeyName(g_Config.m_byKeyDown1), WHITE, 13);
    OutTextXY(523, 225, 626, 240, GetKeyName(g_Config.m_byKeyLeft1), WHITE, 13);
    OutTextXY(523, 241, 626, 256, GetKeyName(g_Config.m_byKeyRight1), WHITE, 13);
    OutTextXY(523, 257, 626, 272, GetKeyName(g_Config.m_byKeyFire1), WHITE, 13);

    OutTextXY(579, 193, 626, 208, GetKeyName(g_Config.m_byKeyUp2), WHITE, 13);
    OutTextXY(579, 209, 626, 224, GetKeyName(g_Config.m_byKeyDown2), WHITE, 13);
    OutTextXY(579, 225, 626, 240, GetKeyName(g_Config.m_byKeyLeft2), WHITE, 13);
    OutTextXY(579, 241, 626, 256, GetKeyName(g_Config.m_byKeyRight2), WHITE, 13);
    OutTextXY(579, 257, 626, 272, GetKeyName(g_Config.m_byKeyFire2), WHITE, 13);

    OutTextXY(491, 275, 626, 291, "音乐:F6 按键:F8", WHITE, 13);
    OutTextXY(491, 292, 626, 308, "暂停:P  退出:Esc", WHITE, 13);

    OutTextXY(528, 322, 592, 337, "第    关", YELLOW, BLACK);

    srand(clock());
    while(rand()%4!=1);  /* 让伪随机数来得更随机一些 */
}


int ReadTheMap(int n)  /* 读入某关地图 */
{
    FILE *p;

    if(n<=0||n>99) return 0;

    g_szMapPath[6]='0'+n%10;
    g_szMapPath[5]='0'+n/10;
    return ReadMap(g_szMapPath);
}

char str[3]="00";
char *Num2Str(int n)
{
    
    str[1]=n%10+'0';
    str[0]=(n/10)%10+'0';
    if(str[0]=='0')str[0]=' ';

    return str;
}

int StartGame(int n)  /* 进入某关 */
{
    int i, j;
    CTank *pt=g_pTHead, *pt1;
    CBullet *pb=g_pBHead, *pb1;

    OutTextXY(552, 322, 568, 337, Num2Str(n), YELLOW, BLACK);

    /* 初始化数据 */
    g_PEnemy.m_nTanks=20;
    g_PEnemy.m_nRestTanks=20;
    g_PPlayer1.m_nRestTanks=g_PPlayer1.m_nTanks;
    if(g_nPlayers==2)
    {
        g_PPlayer2.m_nRestTanks=g_PPlayer2.m_nTanks;
    }
    g_pTHead=NULL;
    g_pBHead=NULL;
    g_pTank1=NULL;
    g_pTank2=NULL;

    for(i=0;i<60;i++)
    {
        for(j=0;j<60;j++)
        {
            g_pTank[i][j]=NULL;
            g_pBullet[i][j]=NULL;
            g_pGift[i][j]=NULL;
        }
    }
 
    while(pt!=NULL)
    {
        pt1=pt;
        pt=pt->m_pNext;
        free(pt1);
    }

    while(pb!=NULL)
    {
        pb1=pb;
        pb=pb->m_pNext;
        free(pb1);
    }
    
    g_pTheGift=NULL;
    g_byStopTank=0;
    g_byProtectBase=0;

    if(ReadTheMap(n))
    {
        DrawMap();
        SetMap(29, 59, 100);
        SetMap(30, 59, 100);

        return 1;
    }
    return 0;
}


void UpdateMessage()  /* 更新提示信息 */
{
    int f;

    OutTextXY(555, 17, 571, 32, Num2Str(g_PEnemy.m_nRestTanks), WHITE, BLACK);

    f=(g_pTank1!=NULL)?g_pTank1->m_byLevel:0;
    OutTextXY(555, 57, 571, 72, Num2Str(f), WHITE, BLACK);
    OutTextXY(555, 73, 571, 88, Num2Str(g_PPlayer1.m_nRestTanks), WHITE, BLACK);
    if(g_nPlayers==2)
    {
        f=(g_pTank2!=NULL)?g_pTank2->m_byLevel:0;
        OutTextXY(555, 113, 571, 128, Num2Str(f), WHITE, BLACK);
        OutTextXY(555, 129, 571, 144, Num2Str(g_PPlayer2.m_nRestTanks), WHITE, BLACK);
    }
}

int CheckWin()  /* 是否胜利 */
{
    if(g_byBaseBombed==1) return -1;

    switch(g_nPlayers)
    {
    case 1:
        if(g_PPlayer1.m_nTanks==0) return -1;
    case 2:
        if(g_PPlayer1.m_nTanks==0&&g_PPlayer2.m_nTanks==0) return -1;
    }

    if(g_PEnemy.m_nTanks==0) return 1;

    return 0;

}

int GameAction(int count)  /* 游戏动作 */
{
    CTank *pt;
    CBullet *pb;

    if(count%8==0)  /* 每八周期产生动作 */
    {
        /* 创建玩家坦克 */
        if(g_PPlayer1.m_nRestTanks>0&&g_pTank1==NULL)
        {
            CreateTank(26, 58, &g_PPlayer1);
        }

        if(g_PPlayer2.m_nRestTanks>0&&g_pTank2==NULL)
        {
            CreateTank(32, 58, &g_PPlayer2);
        }

        /* 玩家动作 */
        /* 玩家1 */
        if(g_pTank1!=NULL)
        {
            if(g_byStopTank!=2)
            {
                if(GetKeyState(g_Config.m_byKeyUp1))
                {
                    if(g_pTank1->m_byDirect==1)
                    {
                        g_pTank1->m_byState=1;
                    }
                    else
                    {
                        ChangeTankDirect(g_pTank1, 1);
                    }
                }
                if(GetKeyState(g_Config.m_byKeyDown1))
                {
                    if(g_pTank1->m_byDirect==2)
                    {
                        g_pTank1->m_byState=1;
                    }
                    else
                    {
                        ChangeTankDirect(g_pTank1, 2);
                    }
                }
                if(GetKeyState(g_Config.m_byKeyLeft1))
                {
                    if(g_pTank1->m_byDirect==3)
                    {
                        g_pTank1->m_byState=1;
                    }
                    else
                    {
                        ChangeTankDirect(g_pTank1, 3);
                    }
                }
                if(GetKeyState(g_Config.m_byKeyRight1))
                {
                    if(g_pTank1->m_byDirect==4)
                    {
                        g_pTank1->m_byState=1;
                    }
                    else
                    {
                        ChangeTankDirect(g_pTank1, 4);
                    }
                }
            }
            if(GetKeyState(g_Config.m_byKeyFire1))
            {
                if(g_pTank1->m_nBullets<g_pTank1->m_byLevel+1) CreateBullet(g_pTank1);
            }
        }

⌨️ 快捷键说明

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