微型技术报告

坦克大战C++代码

借鉴了前辈的部分代码和思想,菜鸟的第一篇

include<Windows.h> 
#pragma comment(lib,"winmm.lib") 
#pragma comment(lib,"Msimg32.lib") 
#include<time.h> 
#include<fstream> 
#include<string> 
#include<list> 
#include<math.h> 
/*********/ 
#include "process.h" 
#include "winsock.h" 
#include "string.h" 
 
 
 
#define MAX_LOADSTRING 100 
 
#pragma comment(lib,"Msimg32.lib") 
#pragma comment(lib,"ws2_32.lib") 
 
//********************************************* 
#define Max_Player 2        //最多玩家个数 
//服务器发送给客户端 
#define Msg_GameBegin   1 
#define Msg_Info        2 
#define Msg_GameEnd     3 
//客户端到服务器 
#define Msg_Move        4           //移动         初始X Y 已知  
#define Msg_Tag_UP  5 
#define Msg_Tag_DOWN 8 
#define Msg_Tag_LEFT  7 
#define Msg_Tag_RIGHT 6 
// { 0, 3, 2, 1 };   
#define Msg_Stop   9 
void DrawThread(void* param); 
void DrawAll(); 
void ConnectServer(); 
void OnKeyUp(WPARAM wParam); 
//void MusicThread(void* param); 
 
HWND g_hWnd; 
 
SOCKET g_sock; 
 
int Speech[2] = { 5, 5 };//速度 
int Winner = -1; 
 
wchar_t g_strTip[100] = { 0 };  //提示信息 
int code = -1; 
/****************************/ 
using namespace std; 
#define WINDOW_WIDTH 1200 
#define WINDOW_HEIGHT 760 
#define CHERK_S     4       //关卡总数 
#define BULLETS_  10                                        //子弹数 
#define HEADP_V       5                             //头像运动速度 
#define MAP_WIDTH 30                                    //地图宽 
#define MAP_HEIGHT 19                               //地图高 
#define G_TANKSPEED 5                               //坦克速度 
#define G_ASPEED 0                      //额外的移动速度 
#define G_TANKBULLETCD 3                            //坦克攻击CD 
#define TANKSIZE   40                                       //坦克大小 
#define BULLETSPEED   13                                //子弹速度 
#define BULLETPOWER 2                               //后坐力 
#define PLAYER_S        2               //玩家数量 
#define ENEMY_S   2                             //敌人数量 
#define ENEMY1_S  1                                 //同 
#define POINT_2_ENEMY_S      7 
#define POINT_2_ENEMY1_S    5 
#define BULLET_EXPLAST 10           //子弹爆炸粒子持续时间 
#define BULLET_EXP_S  30                //子弹爆炸粒子个数 
#define BULLET_EXP_V  15 //     粒子爆炸的速度 
#define CAODI  1   //草地 
#define LUDI   0        //空路 
#define TU  2       //土墙 
#define TIE 3   //铁墙 
#define BASE 9 
#define WEATHER_NUMBER 50       //天气粒子个数 
#define ENEMY_BULLETCD      5                       //敌人子弹cd 
#define BLOCK_SIZE  40                          //墙的大小 
#define DETECTION_LEVEL         6           //     检测与墙相撞的级别 越低要求越高  不得小于0 
#define BULLET_DETECTION_LE  10   //子弹碰撞检测 越大 越靠近坦克中心 
#define ENEMY_MOVEHOLD 20                   //敌人持续向一个方向移动时间 
#define TEXT_X         500  //杀敌显示文字的X坐标 
#define POINT_1_F        "image\\level"     //关卡保存文件名 
#define PLAYER_POINET_F  "image\\Playerdata"        //双人对抗      玩家进度保存文件名 
#define PLAYER_SAVE_MAP "image\\PlayerMap" 
#define PLAYER_SELF_MAP "image\\SelfMap" 
#define PLAYER_VS_PLAYER "image\\PlayerVsPlayer"                //玩家对抗战 
#define P_P_GAME            "image\\PPGame"         //碰碰车 
#define PLAYER_SPEECH_F  "image\\speechgame" 
#define SURIVE_GAME      "image\\Surivetext"       //求生考验 
#define RUNNINGTANKER_GAME "image\\RunningTanker" //你追我赶 
#define WINDOW_TITLE L"坦克世界" 
#define IP "10.255.125.228" 
//#define IP "127.0.0.1" 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 
void DrawThread(void* param); 
VOID Game_Paint(HWND hwnd); 
BOOL Game_Init(HWND hwnd); 
VOID Game_Bmp(HWND hwnd); 
void OnKeyUp(WPARAM wParam); 
BOOL Game_ClearUp(HWND hwnd); 
//BOOL Game_Pointer(HWND hwnd); 
VOID SaveMap(int, char *name); 
VOID DrawBulletExp(); 
VOID LoadMap(int, char *name); 
VOID DrawMap(int); 
VOID Checkpoint_1(); 
VOID Checkpoint_2(); 
 
VOID CheckppGame();//碰碰车; 
VOID CheckSpeechGame();//生死时速 
VOID CheckSuriveGame();//求生考验 
VOID CheckRunningGame();//你追我赶 
VOID LButtonDown(LPARAM); 
VOID MessageSend(int x, int y, wchar_t * str); 
VOID Editmap(); 
VOID NewTank(int); 
VOID NetWork(); 
VOID ClearMap(); 
VOID Weather_System(int Type); 
 
BOOL upJudge(int x, int y, int type); 
BOOL downJudge(int x, int y, int type); 
BOOL rightJudge(int x, int y, int type); 
BOOL leftJudge(int x, int y, int type); 
VOID SavePlayerData(int, char*); 
BOOL ReadPlayerData(int, char*); 
bool g_Stop = true;             //我是否停下 
bool g_OStop = true;            //他是否停下 
BOOL isgameover; 
wchar_t g_str[100]; 
int g_fram = 0; 
bool isnew = true; 
bool swappp = false;        //交换闪烁 
 
int g_NowEnemy_s = 0;   //敌人数量剩余标记 
int g_NowEnemy_1 = 0; 
int g_NowEnemy_2 = 0; 
 
int g_offset = 0; 
int g_stage = 0; 
bool NetWorkOk = false; 
int mode = 0; 
int tankertag[4] = { VK_UP, VK_LEFT, VK_DOWN, VK_RIGHT }; 
int  g_id = 0;   //用于分配的 ID  分配一次 ++ 
int g_holdType = 3; 
int g_color = 0; 
int g_tankFlash;            //小 
char fileName[35]; 
int g_CherkPoint = 1; 
HPEN g_hPen[7] = { 0 }; 
int map[MAP_HEIGHT][MAP_WIDTH] = { 0 }; 
int pos[2][4] = { 'W', 'S', 'A', 'D', VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT }; 
POINT ptMove[][4] = { 0, -G_TANKSPEED - G_ASPEED, 0, G_TANKSPEED + G_ASPEED, -G_TANKSPEED - G_ASPEED, 0, G_TANKSPEED + G_ASPEED, 0, 
0, -G_TANKSPEED, 0, G_TANKSPEED, -G_TANKSPEED, 0, G_TANKSPEED, 0, 
0, -TANKSIZE, 0, TANKSIZE, -TANKSIZE, 0, TANKSIZE, 0 
}; 
typedef struct position 

    int x; 
    int y; 
    int vx; 
    int vy; 
    int tag; 
    int id; 
    position() { x = 100; y = 100; } 
}Pos; 
class Weather :public Pos 

public: 
    bool exist; 
}; 
Weather Wearther[3][50]; 
 
int g_WeartherNum = 0; 
class BulletExp :public Pos { 
public: 
    int last; 
    bool isexit; 
}; 
list<BulletExp>g_BulletExpList; 
class Bullet : public Pos 

private: 
    BulletExp exp[BULLET_EXP_S]; 
public: 
    VOID BulletExplosion(); 
    bool isfire; 
    int firetime; 
    bool isexit; 
    Bullet() { vx = BULLETSPEED; vy = BULLETSPEED; tag = 0; isexit = false;  firetime = 15; isfire = false; } 
    void Shot(int _x, int _y, int _tag, int _id) { 
        isexit = true; 
        id = _id; 
        tag = _tag; 
        if (tag == 0 || tag == 3) 
        { 
            if (tag == 0) 
                y = _y - 10; 
            else 
                y = _y + 10; 
            x = _x; 
        } 
        else 
        { 
            if (tag == 1) 
                x = _x + 10; 
            else 
                x = _x - 10; 
            y = _y; 
        } 
    } 
}; 
class Tanker :public Pos { 
private: 
    int bulletcd; 
    int bulletcount; 
    int movecd; 
 
    int quality; 
public: 
    void AddQuilty(); 
    int GetMotion(); 
    void DrawBullet2(); 
    int kill_s; 
    bool isexist; 
    bool isout(int, int); 
    bool ismeet(int _x, int _y); 
    void setcount(int c) { bulletcount += c; } 
    int getcount() { return bulletcount; } 
    Bullet bullets[BULLETS_]; 
    Tanker() { bulletcount = 0; bulletcd = 10; movecd = -10; isexist = true; vx = 5; vy = 5; kill_s = 0; } 
    VOID Shot(int user, int  cd); 
    void MoveTank(int _x, int _y); 
    void setmap(); 
    VOID DrawBullet(); 
}; 
 
class ETank :public Tanker 

public: 
    static int count1; 
    static int count; 
 
    int movehold; 
    bool HeadpReturn(); 
    ETank() { x = 100; y = 50; vx = 5; vy = 5; movehold = ENEMY_MOVEHOLD; isexist = false; } 
}; 
ETank g_HeadP[4]; 
int  ETank::count = ENEMY_S; 
int  ETank::count1 = ENEMY1_S; 
BOOL g_isGameStart = true; 
HDC g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL; 
 
DWORD g_tNow = 0, g_tPre = 0; 
Pos g_Pointer;                      //开始界面选项指针 
Tanker g_Tanker[2];                 //玩家坦克 
ETank g_ETank[ENEMY_S + 100]; 
ETank g_ETank1[ENEMY1_S + 100]; 
RECT g_rect; 
Pos g_textPos; 
int g_tag = 0;      //方向 
int g_tagbuf[] = { 0, 3, 2, 1 };            //方向数组 
int g_WearthType = 0; 
HBITMAP g_hBackGround = NULL, g_hBackStart = NULL, g_hTanker[2] = { NULL }, g_hPointer = NULL; 
HBITMAP g_hBullet[3] = { NULL }, g_hBlock[3] = { NULL }, g_hFire = NULL; 
HBITMAP  g_hTank1 = NULL, g_hTank2 = NULL, g_hFAIL = NULL, g_hWin = NULL; 
HBITMAP g_hBase = NULL, g_hNohurt[2] = { NULL }, g_hSmallMenu = NULL; 
HBITMAP g_hExp[7] = { NULL }, g_hBlock1[10] = { NULL }, g_hWearther[3][4] = { NULL }; 
HBITMAP g_hHead_P[4] = { NULL }; 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 

    WNDCLASSEX wndclass = { 0 }; 
    wndclass.cbSize = sizeof(WNDCLASSEX); 
    wndclass.cbClsExtra = 0; 
    wndclass.cbWndExtra = 0; 
    wndclass.style = CS_HREDRAW | CS_VREDRAW; 
    wndclass.lpfnWndProc = WndProc; 
    wndclass.hInstance = hInstance; 
    wndclass.hIcon = (HICON)::LoadImage(NULL, L"image\\icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); 
    wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 
    wndclass.lpszMenuName = NULL; 
    wndclass.lpszClassName = L"Tank"; 
    wndclass.hCursor = (HCURSOR)::LoadImage(NULL, L"image\\Normal Select.cur", IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); 
    if (!RegisterClassEx(&wndclass)) 
        return -1; 
    HWND hwnd = CreateWindow(L"Tank", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT + 40, NULL, NULL, hInstance, NULL);                                          //返回地址 
    g_hWnd = hwnd; 
    MoveWindow(hwnd, 100, 20, WINDOW_WIDTH + 28, WINDOW_HEIGHT + 40, true); 
    ShowWindow(hwnd, nShowCmd); 
    UpdateWindow(hwnd); 
    g_NowEnemy_s = ENEMY1_S + ENEMY_S; 
    //  g_NowEnemy_1 = ENEMY_S; 
    //  g_NowEnemy_2 = ENEMY1_S; 
    g_Pointer.x = 60; 
    g_Pointer.y = 310; 
 
    PlaySound(L"image\\0BGM.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); 
 
    Game_Init(hwnd); 
    Game_Bmp(hwnd); 
    //BGM       PlaySound(L"LOG.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); 
    MSG msg = { 0 }; 
    while (msg.message != WM_QUIT) 
    { 
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
        { 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
        else 
        { 
            g_tNow = GetTickCount(); 
            if (g_tNow - g_tPre >= 30)           //33帧 
                Game_Paint(hwnd); 
        } 
    } 
 
    UnregisterClass(L"Tank", wndclass.hInstance); 
 
    return 0; 
 

// 
int g_time = 0; 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 

    PAINTSTRUCT paintStruct; 
    static   int sta = 0; 
    static   int sta1 = 0; 
    char buf[25] = { 0 }; 
    switch (message) 
    { 
 
    case WM_TIMER: 
        switch (wParam) 
        { 
        case 1:     KillTimer(hwnd, 1); break; 
        case 2:     KillTimer(hwnd, 2); break; 
        case 8:     g_time++; 
            if (g_time >= 60 && g_stage != 1) 
            { 
                isgameover = true; 
                KillTimer(hwnd, 8); 
            }break; 
        default:isnew = false; break; 
        } 
        isnew = false; 
        break; 
    case WM_KEYDOWN: 
        if (wParam == VK_BACK) 
        { 
            sta = 0; 
            ShowCursor(false); 
            sta1 = 0; 
            NetWorkOk = false; 
            g_Pointer.y = 310; 
            g_Pointer.x = 60; 
            g_stage = 0; 
        } 
        if (wParam == VK_ESCAPE) 
        { 
            DestroyWindow(hwnd); 
        } 
        switch (g_stage) 
        { 
        case 0: 
        { 
            switch (wParam) 
            { 
            case 87: 
            case VK_UP:                 if (sta == 0)break; sta--;      g_Pointer.y -= 70; 
                /*  char s[25];
                sprintf(s, "%d_%d(%d,%d",2,4, 700, 600);
                wchar_t t[30];
                swprintf(t, L"%d", strlen(s));
                MessageBox(NULL, t, L"错误", MB_OK); */break; 
            case 83: 
            case VK_DOWN:           if (sta == 4)break; sta++;  g_Pointer.y += 70;                                              break; 
            case VK_RETURN: 
                switch (sta) 
                { 
                case 0: //MessageBox(NULL, L"单人游戏", L"开始", MB_OK);       
                    g_stage = 1; 
                    g_CherkPoint = 1; 
                    LoadMap(g_CherkPoint, POINT_1_F); 
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时 
                    SetTimer(hwnd, 8, 1000, NULL); 
                    Game_Init(hwnd); 
                    break; 
                case 1: 
                    g_Pointer.y -= 70; g_Pointer.x = 30; 
 
                    sta = 0; g_stage = 2; 
                    Game_Init(hwnd); 
                    break; 
                case 2: 
                    ConnectServer(); 
                    g_stage = 4; 
                    break; 
                case 3: 
                    LoadMap(1, POINT_1_F); 
                    g_Tanker[0].x = 280; 
                    g_Tanker[0].y = 600; 
                    g_stage = 9; 
                    break; 
                case 4: 
                    SaveMap(1, POINT_1_F);  PostQuitMessage(0); 
                    break; 
 
                default:break; 
                }break; 
            }       break; 
        case 1: 
            if (wParam == 'l' || wParam == 'L') 
                if (MessageBox(NULL, L"是否保存进度", L"保存", MB_OKCANCEL) != IDCANCEL) 
                { 
                    SavePlayerData(0, PLAYER_POINET_F); 
                    SaveMap(0, PLAYER_SAVE_MAP); 
                    g_stage = 0; 
                } 
            if (wParam == 't' || wParam == 'T') 
            { 
                if (ReadPlayerData(0, PLAYER_POINET_F)) 
                { 
                    LoadMap(0, PLAYER_SAVE_MAP); 
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时 
                    Game_Init(hwnd); 
                } 
            } 
            if (wParam == 'U' || wParam == 'u') 
            { 
                if (g_CherkPoint < CHERK_S) 
                { 
                    g_CherkPoint++; 
                    LoadMap(g_CherkPoint, POINT_1_F); 
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时 
                    Game_Init(hwnd); 
                } 
            /*  else
                {
                    LoadMap(0, PLAYER_SELF_MAP);
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时
                    Game_Init(hwnd);
                }*/ 
            } 
 
            break; 
        case 2: 
            switch (wParam) 
            { 
            case 87: 
            case VK_UP:                 if (sta1 == 0)break; sta1--;        g_Pointer.y -= 70;                          break; 
            case 83: 
            case VK_DOWN:           if (sta1 == 4)break; sta1++;    g_Pointer.y += 70;                          break; 
            case VK_RETURN: 
                switch (sta1) 
                { 
                case 0: 
                    g_stage = 3; 
                    LoadMap(1, POINT_1_F); 
                    SetTimer(hwnd, 2, 3000, NULL); 
                    Game_Init(hwnd); 
                    break; 
                case 1: 
                    //  g_stage = 5; 
                    g_Pointer.y -= 70; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 5; 
                    LoadMap(1, P_P_GAME); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"碰碰车", L"开始", MB_OK); 
                    break; 
                case 2: 
                    g_Pointer.y -= 140; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 6; 
                    LoadMap(1, PLAYER_SPEECH_F); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"生死时速", L"开始", MB_OK); 
                    break; 
                case 3: 
                    g_Pointer.y -= 210; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 7; 
                    LoadMap(1, SURIVE_GAME); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"求生考验", L"开始", MB_OK); 
                    break; 
                case 4: 
                    g_Pointer.y -= 280; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 8; 
                    LoadMap(1, RUNNINGTANKER_GAME); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"你追我赶", L"开始", MB_OK); 
                    break; 
                default: 
                    break; 
                } 
            }break; 
        case 3:     break; 
        case 4: 
 
            OnKeyUp(wParam); break; 
        case 5:  break; 
        case 6:  break; 
        case 7:  break; 
        case 8:  break; 
        case 9: 
            if (mode == 0) 
                switch (wParam) 
                { 
                case 87: 
                case VK_UP:             g_Tanker[0].MoveTank(0, -TANKSIZE);         break; 
                case 83: 
                case VK_DOWN:       g_Tanker[0].MoveTank(0, TANKSIZE);              break; 
                case 'A':case 'a': 
                case VK_LEFT:           g_Tanker[0].MoveTank(-TANKSIZE, 0);         break; 
                case 'd':case 'D': 
                case VK_RIGHT:      g_Tanker[0].MoveTank(TANKSIZE, 0);              break; 
                case VK_SPACE:          g_Tanker[0].setmap();                           break; 
                case 'p':case 'P':      mode = 1; break; 
                default:break; 
                } 
            if (wParam == 'o' || wParam == 'O') 
                mode = 0; 
            if (wParam == 'i' || wParam == 'I') 
                ClearMap(); 
            if (wParam == 'l' || wParam == 'L') 
                if (MessageBox(NULL, L"是否保存地图", L"保存", MB_OKCANCEL) != IDCANCEL) 
                { 
                    SaveMap(0, PLAYER_SELF_MAP); 
                    g_stage = 0; 
                } 
 
        } 
        g_Tanker[0].tag = 0; 
        } 
        break; 
    case WM_LBUTTONDOWN: 
        if (!NetWorkOk) 
            LButtonDown(lParam); 
        break; 
    case WM_DESTROY: 
        PostQuitMessage(0); 
        break; 
    default: 
        return DefWindowProc(hwnd, message, wParam, lParam); 
        break; 
    } 
    return 0; 

VOID Game_Paint(HWND hwnd) 

    //BG 
    if (g_stage != 4) 
    { 
        SelectObject(g_bufdc, g_hBackGround); 
        BitBlt(g_mdc, 0, 0, g_offset, WINDOW_HEIGHT, g_bufdc, WINDOW_WIDTH - g_offset, 0, SRCCOPY); 
        BitBlt(g_mdc, g_offset, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
    } 
    if (g_offset >= WINDOW_WIDTH) 
        g_offset = 0; 
    g_offset += 1; 
 
    if (!isgameover) { 
        if (!g_NowEnemy_s&&g_stage!=5&&g_stage!=6&&g_stage!=7&&g_stage!=8) 
        {//胜利 
            SelectObject(g_bufdc, g_hWin); 
            TransparentBlt(g_mdc, 100, 100, 424, 174, g_bufdc, 0, 0, 424, 174, RGB(0, 0, 0)); 
            BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
 
            if (g_CherkPoint < CHERK_S) 
            { 
                MessageBox(NULL, L"很好这很骚,你赢了,是否开始下一局", L"胜利", MB_OKCANCEL); 
                LoadMap(++g_CherkPoint, POINT_1_F); 
            } 
            else { 
                MessageBox(NULL, L"看来我的关卡挡不住你了", L"通关", MB_OKCANCEL); 
                g_stage = 0; 
            } 
            Game_Init(hwnd); 
        } 
        if (g_stage == 1 || g_stage>2) 
            if (g_stage != 4) 
                Weather_System(g_WearthType); 
        switch (g_stage) 
        { 
        case 0: 
            if (g_Pointer.x > 310) 
                g_Pointer.x -= 5; 
            else 
                g_Pointer.x += 5; 
            SelectObject(g_bufdc, g_hBackStart); 
            BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
            SelectObject(g_bufdc, g_hPointer); 
            TransparentBlt(g_mdc, g_Pointer.x, g_Pointer.y, 75, 50, g_bufdc, 0, 0, 75, 50, RGB(27, 27, 27)); 
 
            //BitBlt(g_mdc, g_Pointer.x, g_Pointer.y, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
            break; 
        case 1: 
            Checkpoint_1(); 
            break; 
        case 2: 
            if (g_Pointer.x > 310) 
                g_Pointer.x -= 5; 
            else 
                g_Pointer.x += 5; 
            SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
            Rectangle(g_mdc, WINDOW_WIDTH, 0, 200, WINDOW_HEIGHT); 
            SelectObject(g_bufdc, g_hSmallMenu); 
            BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
            SelectObject(g_bufdc, g_hPointer); 
            TransparentBlt(g_mdc, g_Pointer.x, g_Pointer.y, 75, 50, g_bufdc, 0, 0, 75, 50, RGB(27, 27, 27)); 
            //Checkpoint_2(); 
            break; 
        case 3:Checkpoint_2(); break; 
        case 4: NetWork();  break; 
        case 5:CheckppGame(); break; 
        case 6:CheckSpeechGame(); 
            break; 
        case 7:CheckSuriveGame();   break; 
        case 8:CheckRunningGame();   break; 
        case 9: 
            Editmap(); 
            break; 
        default:break; 
        } 
        if (!NetWorkOk) 
            BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
    } 
 
    else 
    { 
        if (g_stage == 5) 
        { 
            if (Speech[1] > Speech[0]) 
            { 
                MessageBox(NULL, L"2P玩家胜利", L"1P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
                return; 
            } 
            else //if (g_Tanker[1].x <= 0 || g_Tanker[1].y <= 0 || g_Tanker[1].x >= 28 || g_Tanker[1].y >= 17) 
            { 
                MessageBox(NULL, L"1P玩家胜利", L"2P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
                return; 
            } 
 
            /*SelectObject(g_bufdc, g_hFAIL);
            TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0));
            BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);*/ 
        } 
        if (g_stage == 6||g_stage==7||g_stage==8) 
        { 
            if (Winner == 0) 
            { 
                MessageBox(NULL, L"1P玩家胜利", L"2P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
            } 
            else 
            { 
                MessageBox(NULL, L"2P玩家胜利", L"1P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
            } 
        } 
        else 
        { 
            if (g_stage != 4) 
            { 
                SelectObject(g_bufdc, g_hFAIL); 
                TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0)); 
                BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
            } 
            if (MessageBox(NULL, L"菜鸡被打爆了,是否从新开始?", L"失败", MB_OKCANCEL) != IDCANCEL) 
            { 
                SetTimer(hwnd, 1, 3000, NULL); 
                isnew = true; 
                LoadMap(g_CherkPoint, POINT_1_F); 
 
            } 
            else 
            { 
                g_stage = 0; 
            } 
        } 
        Game_Init(hwnd); 
 
    } 
    g_tPre = GetTickCount(); 
 
 

 
BOOL Game_Init(HWND hwnd) 

    //  g_WearthType = rand() % 2; 
    g_textPos.x = 0; 
    g_textPos.y = 150; 
    isgameover = false; 
    g_time = 0; 
    isnew = true; 
    srand((unsigned)time(NULL)); 
    g_tankFlash = -10; 
    g_NowEnemy_s = ENEMY1_S + ENEMY_S + g_CherkPoint * 8; 
    for (int i = 0, k = 480; i < 2; i++, k += 160)       //玩家坦克数组 
    { 
        g_Tanker[i].x = k; 
        g_Tanker[i].y = WINDOW_HEIGHT - 40; 
        g_Tanker[i].kill_s = 0; 
        for (int k = 0; k < BULLETS_; k++) 
            g_Tanker[i].bullets[k].isexit = false; 
    } 
    ShowCursor(true); 
    if (g_stage == 5||g_stage==6||g_stage==7||g_stage==8) 
    { 
        g_NowEnemy_1=50; 
    } 
    else 
    { 
      g_NowEnemy_1 = ENEMY_S + g_CherkPoint * 5; 
    } 
    for (int i = 0; i <ENEMY_S + 100; i++)                   //第一类敌人坦克数组 
    { 
        if (i >= g_NowEnemy_1) 
        { 
            g_ETank[i].isexist = false; 
            continue; 
        } 
        g_ETank[i].x = rand() % 1000 + 50; 
        g_ETank[i].y = rand() % 50 + 150; 
        g_ETank[i].isexist = true; 
        for (int k = 0; k < BULLETS_; k++) 
            g_ETank[i].bullets[k].isexit = false; 
    } 
    if (g_stage == 5||g_stage==6||g_stage==7||g_stage==8) 
    { 
        g_NowEnemy_2 = 30; 
    } 
    else 
    { 
        g_NowEnemy_2 = ENEMY1_S + g_CherkPoint * 3; 
    } 
     
    for (int i = 0; i < ENEMY1_S + 100; i++)             //第二类敌人坦克 
    { 
        if (i >= g_NowEnemy_2) 
        { 
            g_ETank1[i].isexist = false; 
            continue; 
        } 
        g_ETank1[i].x = rand() % 1000 + 50; 
        g_ETank1[i].y = rand() % 100 + 50; 
        g_ETank1[i].isexist = true; 
        for (int k = 0; k < BULLETS_; k++) 
            g_ETank1[i].bullets[k].isexit = false; 
    } 
    return TRUE; 

 
VOID Game_Bmp(HWND hwnd) 

 
    for (int i = 0; i < 2; i++) 
    { 
        g_Tanker[i].id = g_id++; 
    } 
    for (int i = 0; i < ENEMY_S + 100; i++) 
    { 
        g_ETank[i].id = g_id++; 
    } 
    for (int i = 0; i < ENEMY1_S + 100; i++) 
    { 
        g_ETank1[i].id = g_id++; 
    } 
    HBITMAP bmp; 
    g_hdc = GetDC(hwnd); 
    g_mdc = CreateCompatibleDC(g_hdc); 
    g_bufdc = CreateCompatibleDC(g_hdc); 
    bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT); 
    SelectObject(g_mdc, bmp); 
    g_hBackGround = (HBITMAP)LoadImage(NULL, L"image\\bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE); 
    g_hBackStart = (HBITMAP)LoadImage(NULL, L"image\\start.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE); 
    g_hTanker[0] = (HBITMAP)LoadImage(NULL, L"image\\tank1.bmp", IMAGE_BITMAP, 160, 40, LR_LOADFROMFILE); 
    g_hTanker[1] = (HBITMAP)LoadImage(NULL, L"image\\tank2.bmp", IMAGE_BITMAP, 160, 40, LR_LOADFROMFILE); g_hPointer = (HBITMAP)LoadImage(NULL, L"image\\pointer.bmp", IMAGE_BITMAP, 75, 50, LR_LOADFROMFILE); 
    g_hBullet[0] = (HBITMAP)LoadImage(NULL, L"image\\bullet1.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE); 
    g_hBullet[1] = (HBITMAP)LoadImage(NULL, L"image\\bullet2.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE); 
    g_hBullet[2] = (HBITMAP)LoadImage(NULL, L"image\\bullet3.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE); 
 
    g_hSmallMenu = (HBITMAP)LoadImage(NULL, L"image\\menu1.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE); 
    g_hBlock[0] = (HBITMAP)LoadImage(NULL, L"image\\block1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hBlock[1] = (HBITMAP)LoadImage(NULL, L"image\\block2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hBlock[2] = (HBITMAP)LoadImage(NULL, L"image\\block3.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hFire = (HBITMAP)LoadImage(NULL, L"image\\fire.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hTank1 = (HBITMAP)LoadImage(NULL, L"image\\Enemy1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hTank2 = (HBITMAP)LoadImage(NULL, L"image\\Enemy2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hFAIL = (HBITMAP)LoadImage(NULL, L"image\\gameover.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hWin = (HBITMAP)LoadImage(NULL, L"image\\win.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hBase = (HBITMAP)LoadImage(NULL, L"image\\base.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hNohurt[0] = (HBITMAP)LoadImage(NULL, L"image\\noHurt.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hNohurt[1] = (HBITMAP)LoadImage(NULL, L"image\\noHurt1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
 
    for (int i = 1; i <= 7; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\exp%d.bmp", i); 
        g_hExp[i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    for (int i = 1; i <= 4; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\rain%d.bmp", i); 
        g_hWearther[0][i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    for (int i = 1; i <= 4; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\writer%d.bmp", i); 
        g_hHead_P[i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    for (int i = 1; i <= 3; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\snow%d.bmp", i); 
        g_hWearther[1][i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    GetClientRect(hwnd, &g_rect); 
 
    Game_Paint(hwnd); 

BOOL Game_ClearUp(HWND hwnd) 

 
    return TRUE; 

 
 
 
void DrawMap(int level) 

    for (int i = 0; i < 19; i++) 
        for (int j = 0; j < 30; j++) 
        { 
            if (map[i][j] == 0) 
                continue; 
 
            if (map[i][j] == TIE) 
            { 
                SelectObject(g_bufdc, g_hBlock[0]); 
                BitBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, SRCCOPY); 
            } 
            else if (map[i][j] == TU) 
            { 
                SelectObject(g_bufdc, g_hBlock[1]); 
                BitBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, SRCCOPY); 
            } 
            else if (map[i][j] == CAODI) 
            { 
                SelectObject(g_bufdc, g_hBlock[2]); 
                BitBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, SRCCOPY); 
            } 
            else if (map[i][j] == 9) 
            { 
                SelectObject(g_bufdc, g_hBase); 
                TransparentBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
            } 
        } 

 
 
void SaveMap(int level, char *name) 

    ofstream out; 
    if (level != 0) 
        sprintf_s(fileName, "%s%d.txt", name, level); 
    else 
        sprintf_s(fileName, "%s.txt", name); 
    out.open(name, ios::out); 
    for (int i = 0; i <MAP_HEIGHT; i++) 
    { 
        for (int j = 0; j < MAP_WIDTH; j++) 
            out << map[i][j] << " "; 
        out << endl; 
    } 
    out.close(); 

BOOL ReadPlayerData(int level, char*name) 

    /*if (level != 0)
    sprintf_s(fileName, "%s%d.txt", name, level);
    else
    sprintf_s(fileName, "%s", name);*/ 
    ifstream in; 
    in.open("image\\PlayerData.txt", ios::in); 
    if (in.fail()) 
    { 
        MessageBox(NULL, L"尚未保存进度", L"错误", MB_OK); 
        //g_stage = 0; 
        return false; 
    } 
    in >> g_Tanker[0].x; 
    in >> g_Tanker[0].y; 
    in >> g_Tanker[0].tag; 
    in >> g_NowEnemy_s; 
    in >> g_CherkPoint; 
    LoadMap(0, PLAYER_SAVE_MAP); 
    in.close(); 

VOID SavePlayerData(int level, char*name) 

    ofstream out; 
    /*if (level != 0)
    sprintf_s(fileName, "%s%d.txt", name, level);
    else
    sprintf_s(fileName, "%s", name);*/ 
    out.open("image\\PlayerData.txt", ios::out); 
    out << g_Tanker[0].x << " "; 
    out << g_Tanker[0].y << " "; 
    out << g_Tanker[0].tag << " "; 
    out << g_NowEnemy_s << " "; 
    out << g_CherkPoint; 
    out.close(); 

 
 
 
void LoadMap(int level, char *name) 

    memset(fileName, 0, sizeof(fileName)); 
    if (level != 0) 
        sprintf_s(fileName, "%s%d.txt", name, level); 
    else 
        sprintf_s(fileName, "%s.txt", name); 
    ifstream in; 
    in.open(fileName, ios::in); 
    if (in.fail()) 
    { 
        MessageBox(NULL, L"文件打开失败", L"错误", MB_OK); 
        g_stage = 0; 
        return; 
    } 
    for (int i = 0; i < 19; i++) 
        for (int j = 0; j < 30; j++) 
        { 
            map[i][j] = 0; 
            if (in.eof()) 
            { 
                in.close(); 
                return; 
            } 
            in >> map[i][j]; 
        } 
    in.close(); 

 
 
void Tanker::setmap() 

    if (map[y / 40][x / 40] == 9) 
        return; 
    if (map[y / 40][x / 40] == 0) 
    { 
        map[y / 40][x / 40] = g_holdType; 
        return; 
    } 
    g_holdType = --map[y / 40][x / 40]; 
 
    if (g_holdType <= 0) 
    { 
        //map[y / 40][x / 40] = TIE; 
        g_holdType = TIE; 
    } 

void Tanker::Shot(int user, int  cd) 

 
    if (bulletcd>cd) 
    { 
        switch (tag)            //后坐力 
        { 
        case 0:MoveTank(0, BULLETPOWER); break; 
        case 1:MoveTank(-BULLETPOWER, 0); break; 
        case 2:MoveTank(BULLETPOWER, 0); break; 
        case 3:MoveTank(0, -BULLETPOWER); break; 
        default:break; 
        } 
 
        for (int i = 0; i < BULLETS_; i++) 
        { 
            if (!bullets[i].isexit) 
            { 
                bulletcd = -cd; 
                bullets[i].Shot(x, y, tag, id); 
                return; 
            } 
        } 
    } 
    else bulletcd++; 

 
void Tanker::MoveTank(int _x, int _y) 

 
    if (ismeet(_x, _y)) 
    { 
        x += _x; 
        y += _y; 
    } 
 

 
void Checkpoint_1() 

 
    for (int j = 0; j < 4; j++) 
    { 
        if (GetKeyState(pos[0][j]) < 0) 
        { 
            g_Tanker[0].vx = ptMove[0][j].x; 
            g_Tanker[0].vy = ptMove[0][j].y; 
            g_Tanker[0].MoveTank(g_Tanker[0].vx, g_Tanker[0].vy); 
            g_Tanker[0].tag = g_tagbuf[j]; 
            break; 
        } 
    } 
 
    for (int i = 0; i <g_NowEnemy_1; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(0, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i <g_NowEnemy_2; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
 
    SelectObject(g_bufdc, g_hTanker[0]); 
    TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, g_Tanker[0].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    if (isnew) 
        NewTank(1);//无敌保护 
 
    if (GetKeyState(VK_SPACE)<0) 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    g_Tanker[0].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_2; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_1; i++) 
    { 
        g_ETank[i].DrawBullet(); 
    } 
 
    DrawMap(1); 
    DrawBulletExp(); 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
    HFONT hFont; 
    hFont = CreateFont(20, 0, 0, 0, 700, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, TEXT("微软雅黑")); 
    SelectObject(g_mdc, hFont); 
    TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 10, L"坦克大战", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"小键盘控制方向", 7); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"T 读档", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"L 存档", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"U 下一关", 5); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    SetTextColor(g_mdc, RGB(0, 255, 127)); 
    swprintf_s(str, L"剩余战斗时间%d", 60 - g_time); 
    TextOut(g_mdc, 350, 50, str, wcslen(str)); 
    if (60 - g_time <= 0) 
    { 
        isgameover = true; 
    } 
    swprintf_s(str, L"当前关卡%d", g_CherkPoint); 
    TextOut(g_mdc, 350, 70, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

 
 
void Checkpoint_2() 

 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                g_Tanker[i].vx = ptMove[i][j].x; 
                g_Tanker[i].vy = ptMove[i][j].y; 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < g_NowEnemy_1; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < g_NowEnemy_2; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    DrawBulletExp(); 
    for (int i = 0; i < g_NowEnemy_2; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_1; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 10, L"坦克大战", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"连坐制度,一尸两命", 9); 
 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckSpeechGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
                } 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    for (int i = 0; i < ENEMY1_S+100; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < ENEMY_S+100; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    /*TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1);
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1);*/ 
    TextOut(g_mdc, WINDOW_WIDTH - 500, 10, L"生死时速", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"进攻敌方堡垒,速度对抗", 11); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckSuriveGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
                } 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S*10+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
            switch (g_ETank[i].tag) 
            { 
            case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
            case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
            case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
            case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
            } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S*10+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
            switch (g_ETank1[i].tag) 
            { 
            case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
            case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
            case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
            case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
            } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        //g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
    //  g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        //g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    for (int i = 0; i < ENEMY1_S*10; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < ENEMY_S*10; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 500, 10, L"求生考验", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    //TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"玩家1 WASD控制方向", 12); 
    //TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"看谁生存的更久", 12); 
 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckRunningGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
                } 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    for (int i = 0; i < g_NowEnemy_2; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_1; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    /*TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1);
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1);*/ 
    TextOut(g_mdc, WINDOW_WIDTH - 500, 10, L"你追我赶", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"相互厮杀吧", 5); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckppGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    if (Speech[0]>Speech[1]) 
    { 
        if ((g_Tanker[0].x + TANKSIZE) > g_Tanker[1].x&&g_Tanker[0].x < (g_Tanker[1].x + TANKSIZE)) 
            if (g_Tanker[0].y  < (g_Tanker[1].y + TANKSIZE) && (g_Tanker[0].y + TANKSIZE) >(g_Tanker[1].y)) 
            { 
                isgameover = true; 
            } 
    } 
    else if (Speech[0]<Speech[1]) 
    { 
 
        if ((g_Tanker[0].x + TANKSIZE) > g_Tanker[1].x&&g_Tanker[0].x < (g_Tanker[1].x + TANKSIZE)) 
            if (g_Tanker[0].y  < (g_Tanker[1].y + TANKSIZE) && (g_Tanker[0].y + TANKSIZE) >(g_Tanker[1].y)) 
            { 
                isgameover = true; 
 
            } 
    } 
    else 
    { 
        isgameover = false; 
    } 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
 
                } 
                /*g_Tanker[i].vx = ptMove[i][j].x;
                g_Tanker[i].vy = ptMove[i][j].y;*/ 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            //g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            //g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet2(); 
    } 
    DrawMap(1);                         //画地图 
    /*for (int i = 0; i < ENEMY1_S; i++)
        g_ETank1[i].DrawBullet();
    for (int i = 0; i < ENEMY_S; i++)
        g_ETank[i].DrawBullet();*/ 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    //TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    //TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 400, 10, L"碰碰车大战", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"升级碾压对方", 6); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
        //  case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
        //  case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

 
VOID Bullet::BulletExplosion() 

 
    for (int i = 0; i < BULLET_EXP_S - 1; i++) 
    { 
        exp[i].isexit = true; 
        exp[i].last = 0; 
        exp[i].x = x; 
        exp[i].y = y; 
        //exp[i].vx = BULLET_EXP_V; 
        //exp[i].vy = BULLET_EXP_V; 
        g_BulletExpList.push_front(exp[i]); 
    } 
 

 
VOID DrawBulletExp() 

 
    for (list<BulletExp>::iterator it = g_BulletExpList.begin(); it != g_BulletExpList.end(); ++it) 
    { 
        if (!it->isexit) 
        { 
            continue; 
        } 
 
        switch (rand() % 4) 
        { 
        case 0: 
            (*it).vx = -(1 + rand() % BULLET_EXP_V); 
            (*it).vy = -(1 + rand() % BULLET_EXP_V); 
            break; 
        case 1: 
            (*it).vx = (1 + rand() % BULLET_EXP_V); 
            (*it).vy = (1 + rand() % BULLET_EXP_V); 
            break; 
        case 2: 
            (*it).vx = (1 + rand() % BULLET_EXP_V); 
            (*it).vy = -(1 + rand() % BULLET_EXP_V); 
            break; 
        case 3: 
            (*it).vx = -(1 + rand() % BULLET_EXP_V); 
            (*it).vy = (1 + rand() % BULLET_EXP_V); 
            break; 
        default: 
            break; 
        } 
        (*it).x += (*it).vx; 
        (*it).y += (*it).vy; 
        SelectObject(g_bufdc, g_hExp[rand() % 7]); 
        BitBlt(g_mdc, (*it).x, (*it).y, 4, 4, g_bufdc, 0, 0, SRCCOPY); 
        //TransparentBlt(g_mdc, (*it).x, (*it).y, 8, 8, g_bufdc, 0, 0, 8, 8, RGB(255, 255, 255)); 
        if ((*it).last > BULLET_EXPLAST) 
        { 
            (*it).isexit = false; 
        } 
        else 
            (*it).last++; 
 
    } 

VOID Editmap() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
    DrawMap(1); 
    if (g_tankFlash < 0) 
    { 
        SelectObject(g_bufdc, g_hTanker[0]); 
        TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, g_Tanker[0].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    g_tankFlash++; 
    if (g_tankFlash > 10) 
        g_tankFlash = -20; 
    if (mode == 1) { 
 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[1][j]) < 0) 
            { 
                g_Tanker[0].vx = ptMove[2][j].x; 
                g_Tanker[0].vy = ptMove[2][j].y; 
                g_Tanker[0].MoveTank(g_Tanker[0].vx, g_Tanker[0].vy); 
                g_Tanker[0].tag = 0; 
                break; 
            } 
        } 
        if (GetKeyState(VK_SPACE) < 0) 
        { 
            g_Tanker[0].setmap(); 
        } 
    } 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"O普通建图", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 100, L"P快速建图", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 150, L"L保存地图", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 200, L"I清空地图", 5); 
    if (mode == 1) 
        TextOut(g_mdc, WINDOW_WIDTH / 2 - 100, 50, L"快速编辑地图中", 7); 
    else 
        TextOut(g_mdc, WINDOW_WIDTH / 2 - 100, 50, L"普通编辑地图中", 7); 

VOID Weather_System(int Type) 

    if (g_WeartherNum < WEATHER_NUMBER) 
    { 
        Wearther[Type][g_WeartherNum].x = rand() % 500 + 500; 
        Wearther[Type][g_WeartherNum].y = rand() % 200 + 10; 
        Wearther[Type][g_WeartherNum].exist = true; 
        g_WeartherNum++; 
    } 
    for (int i = 0; i < WEATHER_NUMBER; i++) 
    { 
        if (Wearther[Type][i].exist) 
        { 
            SelectObject(g_bufdc, g_hWearther[Type][rand() % 4]); 
            if (Type != 1) 
                TransparentBlt(g_mdc, Wearther[Type][i].x, Wearther[Type][i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
            else 
                TransparentBlt(g_mdc, Wearther[Type][i].x, Wearther[Type][i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(255, 255, 255)); 
            if (rand() % 2 == 0) 
            { 
                Wearther[Type][i].x += -rand() % 6; 
            } 
            else 
            { 
                Wearther[Type][i].x += -rand() % 6; 
 
            } 
            Wearther[Type][i].y += 8; 
            if (Wearther[Type][i].y>WINDOW_HEIGHT) 
            { 
                Wearther[Type][i].y = 0; 
                Wearther[Type][i].x = rand() % WINDOW_WIDTH; 
            } 
        } 
    } 

 
 
bool Tanker::isout(int bufx, int bufy) 

    if (bufx + x > WINDOW_WIDTH - 40 || bufx + x < 0) 
        return true; 
    if (bufy + y > WINDOW_HEIGHT - 40 || bufy + y < 0) 
        return true; 
    x += bufx; 
    y += bufy; 
    return false; 

 
bool Tanker::ismeet(int _x, int _y) 

    int bufx = x + _x, bufy = y + _y; 
    if (bufx > WINDOW_WIDTH - 40 || bufx < 0) 
        return false; 
    else if (bufy > WINDOW_HEIGHT - 40 || bufy < 0) 
        return false; 
    if (g_stage == 9) 
        return true; 
    //  0 , -1 , 1 , 
    //bool Judge(int bufxy){            } 
    //碰撞检测 
 
    //坦克撞坦克检测 
    if (g_stage != 1) 
        if (id == 1 || id == 0) 
        { 
            if (!isnew) 
                if ((g_Tanker[0].x + TANKSIZE) > g_Tanker[1].x&&g_Tanker[0].x  < (g_Tanker[1].x + TANKSIZE)) 
                    if (g_Tanker[0].y  < (g_Tanker[1].y + TANKSIZE) && (g_Tanker[0].y + TANKSIZE) >(g_Tanker[1].y)) 
                    { 
                        if (g_Tanker[0].x >(g_Tanker[1].x + TANKSIZE)) 
                        { 
 
                            g_Tanker[0].isout(6, 0); 
                            g_Tanker[1].isout(-6, 0); 
                        } 
                        else 
                        { 
                            g_Tanker[0].isout(-6, 0); 
                            g_Tanker[1].isout(6, 0); 
                        } 
                        return false; 
                    } 
        } 
    int k = PLAYER_S; 
    if (g_stage == 1) 
        --k; 
    //       1         
    // 0   1  2 3   4 5 2 
    if (g_stage != 4) 
        if (id >= PLAYER_S && id < ENEMY_S + PLAYER_S) 
        { 
            for (int i = 0; i < k; i++) 
            { 
                if ((g_Tanker[i].x + TANKSIZE) >x&&g_Tanker[i].x < (x + TANKSIZE)) 
                    if (g_Tanker[i].y  < (y + TANKSIZE) && (g_Tanker[i].y + TANKSIZE) >(y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_Tanker[i].x / 40 * 40, g_Tanker[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
 
 
                        if (g_stage != 5) 
                        { 
 
                            isgameover = true; 
                            if (g_stage == 6||g_stage==7||g_stage==8) 
                            { 
                                if (i == 0) 
                                { 
                                    Winner = 1; 
                                } 
                                else 
                                { 
                                    Winner = 0; 
                                } 
                            } 
                            else 
                            { 
                                g_stage = 0; 
                            } 
                        } 
                    } 
            } 
        } 
    // k=1    s=6    s1=4 
    //  id: 0 1 2 3 4 5 6 7 8 9 10           
    if (g_stage != 4) 
        if (id >= (ENEMY_S + PLAYER_S)) 
        { 
            for (int i = 0; i < k; i++) 
            { 
                if ((g_Tanker[i].x + TANKSIZE) >x&&g_Tanker[i].x < (x + TANKSIZE)) 
                    if (g_Tanker[i].y  < (y + TANKSIZE) && (g_Tanker[i].y + TANKSIZE) >(y)) 
                    { 
                        isexist = false; 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, x, y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        --g_NowEnemy_s; 
                        ++g_Tanker[i].kill_s; 
 
                        swprintf_s(g_str, L"玩家%d  碾压敌方坦克,目前摧毁数:%d", i + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                        return false; 
                    } 
            } 
        } 
    if (_y < 0)          //上 
    { 
        if (map[(bufy) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI&& map[(bufy) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI) 
            return true; 
        //  for (int i = ; i <= bufx / BLOCK_SIZE + 1; i++) 
        if (map[(bufy) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] != 0 || map[(bufy) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
        return true; 
    } 
    else if (_y > 0)     //下 
    { 
        if (map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI && map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI) 
            return true; 
        if (map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] != 0 || map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
 
        return true; 
    } 
    else if (_x < 0)         //左 
    { 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] <= CAODI&& map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] <= CAODI) 
            return true; 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] != 0 || map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
        return true; 
    } 
    else if (_x > 0) //右 
    { 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] <= CAODI && map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] <= CAODI) 
            return true; 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] != 0 || map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
        if (map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] == 9 || map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 9) 
        { 
            MessageBox(NULL, L"玩家成功突破", L"胜利", NULL); 
            g_stage = 0; 
        } 
        return true; 
    } 
    return false; 

 
VOID Tanker::DrawBullet2()              // 打印子弹图片 

    for (int i = 0; i < BULLETS_; i++) 
    { 
        if (!bullets[i].isexit) 
            continue; 
        if (id == 0) 
        { 
            SelectObject(g_bufdc, g_hBullet[0]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(3, 3, 3)); 
        } 
        else if (id == 1) 
        { 
            SelectObject(g_bufdc, g_hBullet[1]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(10, 4, 1)); 
        } 
        else 
        { 
            SelectObject(g_bufdc, g_hBullet[2]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        switch (bullets[i].tag) 
        { 
        case 0: bullets[i].y -= bullets[i].vy;  break; 
        case 1: bullets[i].x += bullets[i].vx; break; 
        case 2: bullets[i].x -= bullets[i].vx;  break; 
        case 3: bullets[i].y += bullets[i].vy;  break; 
        } 
        //下面为子弹碰撞  事件 检测 
        //过界 子弹消失 
        if (bullets[i].x >= WINDOW_WIDTH || bullets[i].x <= 0 || bullets[i].y >= WINDOW_HEIGHT || bullets[i].y <= 0) 
        { 
            bullets[i].isexit = false; 
            //      continue; 
        } 
        switch (bullets[i].tag)                 //子弹撞到障碍物{ 0, 3, 2, 1 }; 
        { 
        case 0: 
            //  if (upJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (upJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y) / 40][bullets[i].x / 40] = LUDI; 
                if (map[bullets[i].y / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 30) / 40] = LUDI; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id < 2) 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 3: //  if (downJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (downJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
            } 
            else if (downJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (downJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2) 
                    isgameover = true; 
            }break; 
        case 2://   if (leftJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (leftJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][bullets[i].x / 40] <= TU) 
                    map[bullets[i].y / 40][bullets[i].x / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][bullets[i].x / 40] = LUDI; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2) 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 1://if (rightJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (rightJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 40) / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] = LUDI; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        } 
        /*  //子弹 撞击 土墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 2)
        {
        bullets[i].isexit = false;
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        }
        //子弹 达到 老家 失败
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 9)
        {
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        SelectObject(g_bufdc, g_hFAIL);
        TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0));
        BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
        g_stage = 0;
        isgameover = true;
        }
        //子弹 撞击 铁墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 1 )
        {
        map[bullets[i].y / 40][bullets[i].x / 40] = 2;
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        bullets[i].isexit = false;
        }
        */ 
        //敌方子弹 撞击 我的坦克 
        if (id >= 2) 
        { 
            for (int m = 0; m<2; m++) 
            { 
                if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[m].x&&bullets[i].x + 10 < (g_Tanker[m].x + TANKSIZE)) 
                    if (bullets[i].y + 10 < (g_Tanker[m].y + TANKSIZE) && (bullets[i].y + TANKSIZE - 10) > (g_Tanker[m].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_Tanker[m].x, g_Tanker[m].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
 
                    } 
                if (g_stage == 1) 
                    break; 
            } 
        } 
        else                //我方攻击敌方 
        { 
            for (int k = 0; k < ENEMY1_S+100; k++) 
            { 
                if (!g_ETank1[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank1[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank1[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank1[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank1[k].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_ETank1[k].x, g_ETank1[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        g_ETank1[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; 
                        ++kill_s; 
                        if (id == 0) 
                        { 
                            g_Tanker[0].AddQuilty(); 
                            Speech[0]++; 
                        } 
                        else 
                        { 
                            g_Tanker[1].AddQuilty(); 
                            Speech[1]++; 
                        } 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方重型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            for (int k = 0; k < ENEMY_S+100; k++) 
            { 
                if (!g_ETank[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank[k].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_ETank[k].x, g_ETank[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        g_ETank[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; 
                        ++kill_s; 
 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方轻型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            /*if (g_ETank[0].count == 0 && g_ETank1[0].count1 == 0)
            {
 
 
            }*/ 
        } 
 
    } 

void Tanker::AddQuilty() 

    quality += 20; 

int Tanker::GetMotion() 

    int Vx = vx, Vy = vy; 
    if (vx < 0) 
        Vx = -vx; 
    if (vy < 0) 
        Vy = -vy; 
    return (int)sqrt(Vx*Vx + Vy*Vy)*quality; 

 
VOID Tanker::DrawBullet()               // 打印子弹图片 

    for (int i = 0; i < BULLETS_; i++) 
    { 
        if (!bullets[i].isexit) 
            continue; 
        if (id == 0) 
        { 
            SelectObject(g_bufdc, g_hBullet[0]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(3, 3, 3)); 
        } 
        else if (id == 1) 
        { 
            SelectObject(g_bufdc, g_hBullet[1]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(10, 4, 1)); 
        } 
        else 
        { 
            SelectObject(g_bufdc, g_hBullet[2]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        switch (bullets[i].tag) 
        { 
        case 0: bullets[i].y -= bullets[i].vy;  break; 
        case 1: bullets[i].x += bullets[i].vx; break; 
        case 2: bullets[i].x -= bullets[i].vx;  break; 
        case 3: bullets[i].y += bullets[i].vy;  break; 
        } 
        //下面为子弹碰撞  事件 检测 
        //过界 子弹消失 
        if (bullets[i].x >= WINDOW_WIDTH || bullets[i].x <= 0 || bullets[i].y >= WINDOW_HEIGHT || bullets[i].y <= 0) 
        { 
            bullets[i].isexit = false; 
            //      continue; 
        } 
        switch (bullets[i].tag)                 //子弹撞到障碍物{ 0, 3, 2, 1 }; 
        { 
        case 0: 
            //  if (upJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (upJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y) / 40][bullets[i].x / 40] = LUDI; 
                if (map[bullets[i].y / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 30) / 40] = LUDI; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
 
                bullets[i].isexit = false; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 3: //  if (downJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (downJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
            } 
 
            else if (downJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (downJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            }break; 
        case 2://   if (leftJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (leftJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][bullets[i].x / 40] <= TU) 
                    map[bullets[i].y / 40][bullets[i].x / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][bullets[i].x / 40] = LUDI; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 1://if (rightJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (rightJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 40) / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] = LUDI; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        } 
        /*  //子弹 撞击 土墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 2)
        {
        bullets[i].isexit = false;
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        }
        //子弹 达到 老家 失败
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 9)
        {
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        SelectObject(g_bufdc, g_hFAIL);
        TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0));
        BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
        g_stage = 0;
        isgameover = true;
        }
        //子弹 撞击 铁墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 1 )
        {
        map[bullets[i].y / 40][bullets[i].x / 40] = 2;
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        bullets[i].isexit = false;
        }
        */ 
        //敌方子弹 撞击 我的坦克 
        if (id >= 2) 
        { 
            for (int m = 0; m<2; m++) 
            { 
                if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[m].x&&bullets[i].x + 10 < (g_Tanker[m].x + TANKSIZE)) 
                    if (bullets[i].y + 10 < (g_Tanker[m].y + TANKSIZE) && (bullets[i].y + TANKSIZE - 10) > (g_Tanker[m].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_Tanker[m].x, g_Tanker[m].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        if (!isnew) 
                            isgameover = true; 
                        else 
                            bullets[i].isexit = false; 
                        if (g_stage == 6||g_stage==7||g_stage==8) 
                        { 
                            isgameover = true; 
                            if (m == 0) 
                                Winner = 1; 
                            else 
                                Winner = 0; 
                        } 
                        else 
                        { 
                            isgameover = true; 
                        } 
                    } 
                if (g_stage == 1) 
                    break; 
            } 
        } 
        else if (id == 0 || id == 1)            //我方攻击敌方 
        { 
 
            if (g_stage == 8) 
            { 
                if (id == 0) 
                { 
                    if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[1].x&&bullets[i].x + 10 < (g_Tanker[1].x + TANKSIZE)) 
                        if (bullets[i].y + 10 < (g_Tanker[1].y + TANKSIZE) && (bullets[i].y + TANKSIZE - 10) > (g_Tanker[1].y)) 
                        { 
                            isgameover = true; 
                            Winner = 0; 
                        } 
                } 
                if(id==1) 
                { 
                    if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[0].x&&bullets[0].x + 10 < (g_Tanker[0].x + TANKSIZE)) 
                        if (bullets[i].y + 10 < (g_Tanker[0].y + TANKSIZE) && (bullets[0].y + TANKSIZE - 10) > (g_Tanker[0].y)) 
                        { 
                            isgameover = true; 
                            Winner = 1; 
                        } 
                } 
 
            } 
            for (int k = 0; k < g_NowEnemy_2; k++) 
            { 
                if (!g_ETank1[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank1[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank1[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank1[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank1[k].y)) 
                    { 
                        /*  SelectObject(g_bufdc, g_hFire);
                        TransparentBlt(g_mdc, g_ETank1[k].x, g_ETank1[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0));
                        */ 
                        bullets[i].BulletExplosion(); 
                        g_ETank1[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; 
                        ++kill_s; 
                         
                        /*  PlaySound(L"image\\BOOM.wav", NULL, SND_FILENAME | SND_ASYNC);
 
                        if(g_NowEnemy_s+1==g_NowEnemy_1+g_NowEnemy_2)
                        PlaySound(L"image\\FB.wav", NULL, SND_FILENAME | SND_ASYNC);
                        switch (kill_s)
                        {
 
 
                        case 3:
                        break;
                        case 10:PlaySound(L"image\\SGOD.wav", NULL, SND_FILENAME | SND_ASYNC); break;
                        default:break;
                        }*/ 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方重型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            for (int k = 0; k < g_NowEnemy_1; k++) 
            { 
                if (!g_ETank[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank[k].y)) 
                    { 
                        /*  SelectObject(g_bufdc, g_hFire);
                        TransparentBlt(g_mdc, g_ETank[k].x, g_ETank[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0));
                        */ 
                        bullets[i].BulletExplosion(); 
                        g_ETank[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; ++kill_s; 
                        /*PlaySound(L"image\\BOOM.wav", NULL, SND_FILENAME | SND_ASYNC);
 
                        if (g_NowEnemy_s + 1 == g_NowEnemy_1 + g_NowEnemy_2)
                        PlaySound(L"image\\FB.wav", NULL, SND_FILENAME | SND_ASYNC );*/ 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方轻型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            /*if (g_ETank[0].count == 0 && g_ETank1[0].count1 == 0)
            {
 
 
            }*/ 
        } 
 
    } 

VOID ClearMap() 

    for (int i = 0; i < MAP_HEIGHT; i++) 
        for (int j = 0; j < MAP_WIDTH; j++) 
            map[i][j] = LUDI; 

 
BOOL upJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == type || map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

BOOL downJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y + BLOCK_SIZE) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == type || map[(y + BLOCK_SIZE) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

BOOL leftJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(x) / BLOCK_SIZE] == type || map[(y + DETECTION_LEVEL) / BLOCK_SIZE][(x) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

BOOL rightJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(x + BLOCK_SIZE) / BLOCK_SIZE] == type || map[(y + DETECTION_LEVEL) / BLOCK_SIZE][(x + BLOCK_SIZE) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

VOID NewTank(int count) 

    if (swappp) 
    { 
        SelectObject(g_bufdc, g_hNohurt[0]); 
        TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        if (count >= 2) 
        { 
            SelectObject(g_bufdc, g_hNohurt[0]); 
            TransparentBlt(g_mdc, g_Tanker[1].x, g_Tanker[1].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        swappp = false; 
    } 
    else 
    { 
        SelectObject(g_bufdc, g_hNohurt[0]); 
        TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, 40, 0, 40, 40, RGB(0, 0, 0)); 
        if (count >= 2) 
        { 
            SelectObject(g_bufdc, g_hNohurt[0]); 
            TransparentBlt(g_mdc, g_Tanker[1].x, g_Tanker[1].y, 40, 40, g_bufdc, 40, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        swappp = true; 
    } 

 
 
VOID MessageSend(int x, int y, wchar_t * str) 

    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    TextOut(g_mdc, x, y, str, wcslen(str)); 

 
int temp = 0; 
POINT g_Point[4][2]; 
bool isbig[4] = { 0 }; 
int tempp[4][4] = { 0 }; 
void Connect(SOCKET sock) 

    struct sockaddr_in serverAddress; 
    memset(&serverAddress, 0, sizeof(serverAddress)); 
    serverAddress.sin_family = AF_INET; 
    serverAddress.sin_addr.S_un.S_addr = inet_addr(IP); 
    serverAddress.sin_port = htons(1986); 
 
    //开始连接 
    if (connect(sock, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) 
    { 
        wprintf(g_strTip, L"不能连接到服务器"); 
        NetWorkOk = false; 
        return; 
    } 
    ShowCursor(true); 
    for (int i = 0; i < 4; i++) 
    { 
        g_HeadP[i].x = rand() % (WINDOW_WIDTH - 200); 
        g_HeadP[i].y = rand() % (WINDOW_HEIGHT - 200); 
        g_Point[i][0].x = g_HeadP[i].x; 
        g_Point[i][0].y = g_HeadP[i].y; 
        g_Point[i][1].x = g_HeadP[i].x + 97; 
        g_Point[i][1].y = g_HeadP[i].y + 97; 
        g_HeadP[i].tag = i; 
        g_HeadP[i].isexist = false; 
        isbig[i] = false; 
        switch (rand() % 4) 
        { 
        case 0: 
            g_HeadP[i].vx = -(3 + rand() % HEADP_V); 
            g_HeadP[i].vy = -(3 + rand() % HEADP_V); 
            break; 
        case 1: 
            g_HeadP[i].vx = (3 + rand() % HEADP_V); 
            g_HeadP[i].vy = (3 + rand() % HEADP_V); 
            break; 
        case 2: 
            g_HeadP[i].vx = (3 + rand() % HEADP_V); 
            g_HeadP[i].vy = -(3 + rand() % HEADP_V); 
            break; 
        case 3: 
            g_HeadP[i].vx = -(3 + rand() % HEADP_V); 
            g_HeadP[i].vy = (3 + rand() % HEADP_V); 
            break; 
        default: 
            break; 
        } 
    } 
    for (int i = 0; i <= 4; i++) 
        g_hPen[i] = CreatePen(PS_SOLID, 3, RGB(rand() % 256, rand() % 256, rand() % 256)); 
 
    swprintf_s(g_strTip, L"正在匹配..."); 
    MessageSend(550, 400, g_strTip); 
 
 

 
void DoRecvMsg(char* buf) 

    string strBuf = buf; 
    int pos = strBuf.find('_'); 
    int opType = -1; 
    if (pos != -1) 
    { 
        string bufTemp = strBuf.substr(0, pos); 
        opType = atoi(bufTemp.c_str()); 
        strBuf = strBuf.substr(pos + 1); 
    } 
    else 
    { 
        opType = atoi(strBuf.c_str()); 
    } 
    if (opType <= 0) 
    { 
        return; 
    } 
    switch (opType) 
    { 
    case Msg_GameBegin: 
        //游戏开始消息 
        SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
        Rectangle(g_mdc, WINDOW_WIDTH, 0, 200, WINDOW_HEIGHT); 
        code = atoi(strBuf.c_str()); 
        swprintf_s(g_strTip, L"游戏即将开始..."); 
        MessageSend(500, 350, g_strTip); 
        NetWorkOk = true; 
        BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
        if (code == 0) 
        { 
            temp = 1; 
            //  g_Tanker[temp].x = 500 +100; g_Tanker[temp].y = 300;                //对手 
            g_Tanker[code].x = 0; g_Tanker[code].y = 0;             //我的 
            g_Tanker[temp].x = 0; g_Tanker[temp].y = 14 * 40;               //对手 
        } 
        else 
        { 
            temp = 0; 
            g_Tanker[code].x = 0; g_Tanker[code].y = 14 * 40;               //我的 
            g_Tanker[temp].x = 0; g_Tanker[temp].y = 0;             //对手 
        } 
        LoadMap(1, "image\\Maze"); 
 
        Sleep(100); 
        _beginthread(&DrawThread, 0, NULL); 
        break; 
    case Msg_Info: 
    { 
        //同步信息  %d_%d(%d,%d 
        string str1, str2; 
        pos = strBuf.find('_'); 
        if (pos == -1) 
        { 
            return; 
        } 
        str1 = strBuf.substr(0, pos); 
        str2 = strBuf.substr(pos + 1); 
        int bSelf = atoi(str1.c_str()); 
        int xPos = atoi(str2.c_str()); 
        int posX = strBuf.find('('); 
        int posY = strBuf.find(','); 
        int x = atoi(strBuf.substr(posX + 1, posY).c_str()); 
        int y = atoi(strBuf.substr(posY + 1).c_str()); 
        if (x > 1200 || y > 800) 
            return; 
        if (bSelf == code) 
        { 
            if (xPos == 3) 
                xPos = 1; 
            else if (xPos == 1) 
                xPos = 3; 
 
            g_Tanker[code].vx = ptMove[1][xPos].x; 
            g_Tanker[code].vy = ptMove[1][xPos].y; 
            g_Tanker[code].x = x; 
            g_Tanker[code].y = y; 
            g_Tanker[code].MoveTank(g_Tanker[code].vx, g_Tanker[code].vy); 
            g_Tanker[code].tag = g_tagbuf[xPos]; 
        } 
        else 
        { 
            if (xPos == 3) 
                xPos = 1; 
            else if (xPos == 1) 
                xPos = 3; 
            /*      wchar_t s[20];
            swprintf_s(s, L"%d,%d", x, y);
            MessageBox(NULL, s, L"错误", MB_OK);*/ 
            g_Tanker[temp].x = x; 
            g_Tanker[temp].y = y; 
            g_Tanker[temp].vx = ptMove[1][xPos].x; 
            g_Tanker[temp].vy = ptMove[1][xPos].y; 
            g_Tanker[temp].MoveTank(g_Tanker[temp].vx, g_Tanker[temp].vy); 
            g_Tanker[temp].tag = g_tagbuf[xPos]; 
        } 
        break; 
    } 
    case Msg_GameEnd: 
        //游戏结束 
        int bSelfWin = atoi(strBuf.c_str()); 
        if (bSelfWin) 
        { 
            wprintf(g_strTip, L"你赢了"); 
        } 
        else 
        { 
            wprintf(g_strTip, L"对家赢了"); 
        } 
        break; 
    } 

 
void Receive(void* p) 

    char buf[2048] = { 0 }; 
    SOCKET* sock = (SOCKET*)p; 
    while (1) 
    { 
        int bytes; 
        if ((bytes = recv(g_sock, buf, sizeof(buf), 0)) == SOCKET_ERROR) 
        { 
            MessageBox(NULL, L"与服务器断开连接", L"错误", MB_OK); 
            _endthread(); 
            return; 
        } 
        buf[bytes] = '\0'; 
 
        DoRecvMsg(buf); 
 
 
    } 

 
void ConnectServer() 

    WSADATA wsa; 
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
    { 
        MessageBox(NULL, L"套接字初始化失败", L"错误", MB_OK); 
        return; 
    } 
 
    SOCKET clientSocket; 
    if ((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) 
    { 
        MessageBox(NULL, L"套接字申请失败", L"错误", MB_OK); 
        return; 
    } 
    g_sock = clientSocket; 
    /*SelectObject(g_mdc, GetStockObject(BLACK_BRUSH));
    Rectangle(g_mdc, WINDOW_WIDTH, 0, 200, WINDOW_HEIGHT);*/ 
 
 
    //  _beginthread(Anime, 0, NULL); 
    Connect(clientSocket);  //连接服务器 
 
    _beginthread(Receive, 0, &clientSocket); 

void OnKeyUp(WPARAM wParam) 

    int temp[] = { 0, 2, 3, 1 }; 
    for (int j = 0; j < 4; j++) 
    { 
        if (GetKeyState(pos[0][j]) < 0) 
        { 
            char buf[25] = { 0 }; 
            //  type tag x y 
            sprintf_s(buf, "%d_%d(%d,%d", Msg_Move, g_tagbuf[j], g_Tanker[code].x, g_Tanker[code].y);//方向 
            if (send(g_sock, buf, strlen(buf), 0) == SOCKET_ERROR) 
            { 
                MessageBox(NULL, L"网络出错", L"错误", MB_OK); 
                return; 
            } 
            Sleep(60); 
            break; 
        } 
 
    } 
 
    /*if (GetKeyState(VK_SPACE) < 0)
    {
    g_Tanker[code].Shot(0, G_TANKBULLETCD);//后坐力
    }*/ 
    /*if (wParam == VK_LEFT)
    {
    char buf[5] = { 0 };
    sprintf(buf, "%d_%d", Msg_Move);//方向
    if (send(g_sock, buf, strlen(buf), 0) == SOCKET_ERROR)
    {
    return;
    }
    }*/ 

 
VOID NetWork() 

    if (!NetWorkOk) 
    { 
        SelectObject(g_bufdc, g_hBackGround); 
        BitBlt(g_mdc, 0, 0, g_offset, WINDOW_HEIGHT, g_bufdc, WINDOW_WIDTH - g_offset, 0, SRCCOPY); 
        BitBlt(g_mdc, g_offset, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
        if (g_offset == WINDOW_WIDTH) 
            g_offset = 0; 
        g_offset += 1; 
        wchar_t str[50]; 
        swprintf_s(str, L"请耐心等待其他玩家加入..."); 
        MessageSend(500, 350, str); 
        for (int i = 0; i < 4; i++) 
        { 
            SelectObject(g_bufdc, g_hHead_P[i]); 
            BitBlt(g_mdc, g_HeadP[i].x, g_HeadP[i].y, 97, 97, g_bufdc, 0, 0, SRCCOPY); 
 
 
            if (g_HeadP[i].isexist) 
            { 
                for (int k = 0; k < 4; k++) 
                { 
                    if (g_HeadP[k].isexist&&k != i) 
                        if (isbig[i] && isbig[k]) 
                        { 
                            SelectObject(g_mdc, g_hPen[rand() % 4]); 
                            MoveToEx(g_mdc, g_HeadP[i].x + 48, g_HeadP[i].y + 48, NULL); 
                            LineTo(g_mdc, g_HeadP[k].x + 48, g_HeadP[k].y + 48); 
                        } 
                } 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x, g_HeadP[i].y + 1, NULL); 
                LineTo(g_mdc, g_HeadP[i].x + 1 + 97, g_HeadP[i].y); 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x + 1 + 97, g_HeadP[i].y, NULL); 
                LineTo(g_mdc, g_HeadP[i].x + 1 + 97, g_HeadP[i].y + 97 + 1); 
 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x + 97, g_HeadP[i].y + 97 + 1, NULL); 
                LineTo(g_mdc, g_HeadP[i].x, g_HeadP[i].y + 1 + 97); 
 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x + 1, g_HeadP[i].y + 97, NULL); 
                LineTo(g_mdc, g_HeadP[i].x + 1, g_HeadP[i].y); 
 
            } 
 
            g_HeadP[i].x += g_HeadP[i].vx; 
            g_HeadP[i].y += g_HeadP[i].vy; 
            if (g_HeadP[i].x >= WINDOW_WIDTH - 120 || g_HeadP[i].x <= 10) 
                g_HeadP[i].vx *= -1; 
            if (g_HeadP[i].y >= WINDOW_HEIGHT - 120 || g_HeadP[i].y <= 10) 
                g_HeadP[i].vy *= -1; 
 
            if (g_HeadP[i].HeadpReturn()) 
            { 
                if (rand() % 2 == 0) 
                    g_HeadP[i].vx *= -1; 
                else 
                    g_HeadP[i].vy *= -1; 
            } 
            if (g_HeadP[i].y > WINDOW_HEIGHT - 80 || g_HeadP[i].y <= -60 || g_HeadP[i].x >= WINDOW_WIDTH - 80 || g_HeadP[i].x <= -60) 
            { 
                g_HeadP[i].x = 600; 
                g_HeadP[i].y = 300; 
            } 
        } 
 
 
    } 
    /*  */ 

 
void DrawThread(void* param) 

    while (1) 
    { 
        //绘制内容 
        DrawAll(); 
        Sleep(20); 
    } 

void DrawAll() 

    if (GetKeyState(VK_BACK) < 0) 
    { 
        _endthread(); 
        closesocket(g_sock); 
    } 
 
    SelectObject(g_bufdc, g_hBackGround); 
    BitBlt(g_mdc, 0, 0, g_offset, WINDOW_HEIGHT, g_bufdc, WINDOW_WIDTH - g_offset, 0, SRCCOPY); 
    BitBlt(g_mdc, g_offset, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
    if (g_offset == WINDOW_WIDTH) 
        g_offset = 0; 
    g_offset += 1; 
    SelectObject(g_bufdc, g_hTanker[code]); 
    TransparentBlt(g_mdc, g_Tanker[code].x, g_Tanker[code].y, 40, 40, g_bufdc, g_Tanker[code].tag * 40, 0, 40, 40, RGB(0, 0, 0));                   //自己 
 
    SelectObject(g_bufdc, g_hTanker[temp]); 
    TransparentBlt(g_mdc, g_Tanker[temp].x, g_Tanker[temp].y, 40, 40, g_bufdc, g_Tanker[temp].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    DrawMap(3); 
    swprintf_s(g_strTip, L"WASD控制"); 
    SetBkMode(g_mdc, 0); 
    SetTextColor(g_mdc, RGB(249, 249, 45)); 
    TextOut(g_mdc, 1100, 100, g_strTip, lstrlen(g_strTip)); 
 
    BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
 

 
 
 
bool ETank::HeadpReturn() 

    for (int i = 0; i < 4; i++) 
    { 
        if (i == tag) 
            continue; 
        if (x + 97 > g_HeadP[i].x&&x < g_HeadP[i].x + 97) 
            if (y<g_HeadP[i].y + 97 && y + 97>g_HeadP[i].y) 
                return true; 
    } 
    return false; 

 
VOID LButtonDown(LPARAM lparam) 

    for (int i = 0; i < 4; i++) 
    { 
        if (g_HeadP[i].x <= LOWORD(lparam) && g_HeadP[i].x + 97 >= LOWORD(lparam)) 
            if (g_HeadP[i].y <= HIWORD(lparam) && g_HeadP[i].y + 97 >= HIWORD(lparam)) 
            { 
                isbig[i] = !isbig[i]; 
                if (!g_HeadP[i].isexist) 
                { 
                    g_HeadP[i].isexist = true; 
 
                    g_HeadP[i].vx *= 2include<Windows.h> 
#pragma comment(lib,"winmm.lib") 
#pragma comment(lib,"Msimg32.lib") 
#include<time.h> 
#include<fstream> 
#include<string> 
#include<list> 
#include<math.h> 
/*********/ 
#include "process.h" 
#include "winsock.h" 
#include "string.h" 
 
 
 
#define MAX_LOADSTRING 100 
 
#pragma comment(lib,"Msimg32.lib") 
#pragma comment(lib,"ws2_32.lib") 
 
//********************************************* 
#define Max_Player 2        //最多玩家个数 
//服务器发送给客户端 
#define Msg_GameBegin   1 
#define Msg_Info        2 
#define Msg_GameEnd     3 
//客户端到服务器 
#define Msg_Move        4           //移动         初始X Y 已知  
#define Msg_Tag_UP  5 
#define Msg_Tag_DOWN 8 
#define Msg_Tag_LEFT  7 
#define Msg_Tag_RIGHT 6 
// { 0, 3, 2, 1 };   
#define Msg_Stop   9 
void DrawThread(void* param); 
void DrawAll(); 
void ConnectServer(); 
void OnKeyUp(WPARAM wParam); 
//void MusicThread(void* param); 
 
HWND g_hWnd; 
 
SOCKET g_sock; 
 
int Speech[2] = { 5, 5 };//速度 
int Winner = -1; 
 
wchar_t g_strTip[100] = { 0 };  //提示信息 
int code = -1; 
/****************************/ 
using namespace std; 
#define WINDOW_WIDTH 1200 
#define WINDOW_HEIGHT 760 
#define CHERK_S     4       //关卡总数 
#define BULLETS_  10                                        //子弹数 
#define HEADP_V       5                             //头像运动速度 
#define MAP_WIDTH 30                                    //地图宽 
#define MAP_HEIGHT 19                               //地图高 
#define G_TANKSPEED 5                               //坦克速度 
#define G_ASPEED 0                      //额外的移动速度 
#define G_TANKBULLETCD 3                            //坦克攻击CD 
#define TANKSIZE   40                                       //坦克大小 
#define BULLETSPEED   13                                //子弹速度 
#define BULLETPOWER 2                               //后坐力 
#define PLAYER_S        2               //玩家数量 
#define ENEMY_S   2                             //敌人数量 
#define ENEMY1_S  1                                 //同 
#define POINT_2_ENEMY_S      7 
#define POINT_2_ENEMY1_S    5 
#define BULLET_EXPLAST 10           //子弹爆炸粒子持续时间 
#define BULLET_EXP_S  30                //子弹爆炸粒子个数 
#define BULLET_EXP_V  15 //     粒子爆炸的速度 
#define CAODI  1   //草地 
#define LUDI   0        //空路 
#define TU  2       //土墙 
#define TIE 3   //铁墙 
#define BASE 9 
#define WEATHER_NUMBER 50       //天气粒子个数 
#define ENEMY_BULLETCD      5                       //敌人子弹cd 
#define BLOCK_SIZE  40                          //墙的大小 
#define DETECTION_LEVEL         6           //     检测与墙相撞的级别 越低要求越高  不得小于0 
#define BULLET_DETECTION_LE  10   //子弹碰撞检测 越大 越靠近坦克中心 
#define ENEMY_MOVEHOLD 20                   //敌人持续向一个方向移动时间 
#define TEXT_X         500  //杀敌显示文字的X坐标 
#define POINT_1_F        "image\\level"     //关卡保存文件名 
#define PLAYER_POINET_F  "image\\Playerdata"        //双人对抗      玩家进度保存文件名 
#define PLAYER_SAVE_MAP "image\\PlayerMap" 
#define PLAYER_SELF_MAP "image\\SelfMap" 
#define PLAYER_VS_PLAYER "image\\PlayerVsPlayer"                //玩家对抗战 
#define P_P_GAME            "image\\PPGame"         //碰碰车 
#define PLAYER_SPEECH_F  "image\\speechgame" 
#define SURIVE_GAME      "image\\Surivetext"       //求生考验 
#define RUNNINGTANKER_GAME "image\\RunningTanker" //你追我赶 
#define WINDOW_TITLE L"坦克世界" 
#define IP "10.255.125.228" 
//#define IP "127.0.0.1" 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 
void DrawThread(void* param); 
VOID Game_Paint(HWND hwnd); 
BOOL Game_Init(HWND hwnd); 
VOID Game_Bmp(HWND hwnd); 
void OnKeyUp(WPARAM wParam); 
BOOL Game_ClearUp(HWND hwnd); 
//BOOL Game_Pointer(HWND hwnd); 
VOID SaveMap(int, char *name); 
VOID DrawBulletExp(); 
VOID LoadMap(int, char *name); 
VOID DrawMap(int); 
VOID Checkpoint_1(); 
VOID Checkpoint_2(); 
 
VOID CheckppGame();//碰碰车; 
VOID CheckSpeechGame();//生死时速 
VOID CheckSuriveGame();//求生考验 
VOID CheckRunningGame();//你追我赶 
VOID LButtonDown(LPARAM); 
VOID MessageSend(int x, int y, wchar_t * str); 
VOID Editmap(); 
VOID NewTank(int); 
VOID NetWork(); 
VOID ClearMap(); 
VOID Weather_System(int Type); 
 
BOOL upJudge(int x, int y, int type); 
BOOL downJudge(int x, int y, int type); 
BOOL rightJudge(int x, int y, int type); 
BOOL leftJudge(int x, int y, int type); 
VOID SavePlayerData(int, char*); 
BOOL ReadPlayerData(int, char*); 
bool g_Stop = true;             //我是否停下 
bool g_OStop = true;            //他是否停下 
BOOL isgameover; 
wchar_t g_str[100]; 
int g_fram = 0; 
bool isnew = true; 
bool swappp = false;        //交换闪烁 
 
int g_NowEnemy_s = 0;   //敌人数量剩余标记 
int g_NowEnemy_1 = 0; 
int g_NowEnemy_2 = 0; 
 
int g_offset = 0; 
int g_stage = 0; 
bool NetWorkOk = false; 
int mode = 0; 
int tankertag[4] = { VK_UP, VK_LEFT, VK_DOWN, VK_RIGHT }; 
int  g_id = 0;   //用于分配的 ID  分配一次 ++ 
int g_holdType = 3; 
int g_color = 0; 
int g_tankFlash;            //小 
char fileName[35]; 
int g_CherkPoint = 1; 
HPEN g_hPen[7] = { 0 }; 
int map[MAP_HEIGHT][MAP_WIDTH] = { 0 }; 
int pos[2][4] = { 'W', 'S', 'A', 'D', VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT }; 
POINT ptMove[][4] = { 0, -G_TANKSPEED - G_ASPEED, 0, G_TANKSPEED + G_ASPEED, -G_TANKSPEED - G_ASPEED, 0, G_TANKSPEED + G_ASPEED, 0, 
0, -G_TANKSPEED, 0, G_TANKSPEED, -G_TANKSPEED, 0, G_TANKSPEED, 0, 
0, -TANKSIZE, 0, TANKSIZE, -TANKSIZE, 0, TANKSIZE, 0 
}; 
typedef struct position 

    int x; 
    int y; 
    int vx; 
    int vy; 
    int tag; 
    int id; 
    position() { x = 100; y = 100; } 
}Pos; 
class Weather :public Pos 

public: 
    bool exist; 
}; 
Weather Wearther[3][50]; 
 
int g_WeartherNum = 0; 
class BulletExp :public Pos { 
public: 
    int last; 
    bool isexit; 
}; 
list<BulletExp>g_BulletExpList; 
class Bullet : public Pos 

private: 
    BulletExp exp[BULLET_EXP_S]; 
public: 
    VOID BulletExplosion(); 
    bool isfire; 
    int firetime; 
    bool isexit; 
    Bullet() { vx = BULLETSPEED; vy = BULLETSPEED; tag = 0; isexit = false;  firetime = 15; isfire = false; } 
    void Shot(int _x, int _y, int _tag, int _id) { 
        isexit = true; 
        id = _id; 
        tag = _tag; 
        if (tag == 0 || tag == 3) 
        { 
            if (tag == 0) 
                y = _y - 10; 
            else 
                y = _y + 10; 
            x = _x; 
        } 
        else 
        { 
            if (tag == 1) 
                x = _x + 10; 
            else 
                x = _x - 10; 
            y = _y; 
        } 
    } 
}; 
class Tanker :public Pos { 
private: 
    int bulletcd; 
    int bulletcount; 
    int movecd; 
 
    int quality; 
public: 
    void AddQuilty(); 
    int GetMotion(); 
    void DrawBullet2(); 
    int kill_s; 
    bool isexist; 
    bool isout(int, int); 
    bool ismeet(int _x, int _y); 
    void setcount(int c) { bulletcount += c; } 
    int getcount() { return bulletcount; } 
    Bullet bullets[BULLETS_]; 
    Tanker() { bulletcount = 0; bulletcd = 10; movecd = -10; isexist = true; vx = 5; vy = 5; kill_s = 0; } 
    VOID Shot(int user, int  cd); 
    void MoveTank(int _x, int _y); 
    void setmap(); 
    VOID DrawBullet(); 
}; 
 
class ETank :public Tanker 

public: 
    static int count1; 
    static int count; 
 
    int movehold; 
    bool HeadpReturn(); 
    ETank() { x = 100; y = 50; vx = 5; vy = 5; movehold = ENEMY_MOVEHOLD; isexist = false; } 
}; 
ETank g_HeadP[4]; 
int  ETank::count = ENEMY_S; 
int  ETank::count1 = ENEMY1_S; 
BOOL g_isGameStart = true; 
HDC g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL; 
 
DWORD g_tNow = 0, g_tPre = 0; 
Pos g_Pointer;                      //开始界面选项指针 
Tanker g_Tanker[2];                 //玩家坦克 
ETank g_ETank[ENEMY_S + 100]; 
ETank g_ETank1[ENEMY1_S + 100]; 
RECT g_rect; 
Pos g_textPos; 
int g_tag = 0;      //方向 
int g_tagbuf[] = { 0, 3, 2, 1 };            //方向数组 
int g_WearthType = 0; 
HBITMAP g_hBackGround = NULL, g_hBackStart = NULL, g_hTanker[2] = { NULL }, g_hPointer = NULL; 
HBITMAP g_hBullet[3] = { NULL }, g_hBlock[3] = { NULL }, g_hFire = NULL; 
HBITMAP  g_hTank1 = NULL, g_hTank2 = NULL, g_hFAIL = NULL, g_hWin = NULL; 
HBITMAP g_hBase = NULL, g_hNohurt[2] = { NULL }, g_hSmallMenu = NULL; 
HBITMAP g_hExp[7] = { NULL }, g_hBlock1[10] = { NULL }, g_hWearther[3][4] = { NULL }; 
HBITMAP g_hHead_P[4] = { NULL }; 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 

    WNDCLASSEX wndclass = { 0 }; 
    wndclass.cbSize = sizeof(WNDCLASSEX); 
    wndclass.cbClsExtra = 0; 
    wndclass.cbWndExtra = 0; 
    wndclass.style = CS_HREDRAW | CS_VREDRAW; 
    wndclass.lpfnWndProc = WndProc; 
    wndclass.hInstance = hInstance; 
    wndclass.hIcon = (HICON)::LoadImage(NULL, L"image\\icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); 
    wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 
    wndclass.lpszMenuName = NULL; 
    wndclass.lpszClassName = L"Tank"; 
    wndclass.hCursor = (HCURSOR)::LoadImage(NULL, L"image\\Normal Select.cur", IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); 
    if (!RegisterClassEx(&wndclass)) 
        return -1; 
    HWND hwnd = CreateWindow(L"Tank", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT + 40, NULL, NULL, hInstance, NULL);                                          //返回地址 
    g_hWnd = hwnd; 
    MoveWindow(hwnd, 100, 20, WINDOW_WIDTH + 28, WINDOW_HEIGHT + 40, true); 
    ShowWindow(hwnd, nShowCmd); 
    UpdateWindow(hwnd); 
    g_NowEnemy_s = ENEMY1_S + ENEMY_S; 
    //  g_NowEnemy_1 = ENEMY_S; 
    //  g_NowEnemy_2 = ENEMY1_S; 
    g_Pointer.x = 60; 
    g_Pointer.y = 310; 
 
    PlaySound(L"image\\0BGM.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); 
 
    Game_Init(hwnd); 
    Game_Bmp(hwnd); 
    //BGM       PlaySound(L"LOG.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); 
    MSG msg = { 0 }; 
    while (msg.message != WM_QUIT) 
    { 
        if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 
        { 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
        else 
        { 
            g_tNow = GetTickCount(); 
            if (g_tNow - g_tPre >= 30)           //33帧 
                Game_Paint(hwnd); 
        } 
    } 
 
    UnregisterClass(L"Tank", wndclass.hInstance); 
 
    return 0; 
 

// 
int g_time = 0; 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 

    PAINTSTRUCT paintStruct; 
    static   int sta = 0; 
    static   int sta1 = 0; 
    char buf[25] = { 0 }; 
    switch (message) 
    { 
 
    case WM_TIMER: 
        switch (wParam) 
        { 
        case 1:     KillTimer(hwnd, 1); break; 
        case 2:     KillTimer(hwnd, 2); break; 
        case 8:     g_time++; 
            if (g_time >= 60 && g_stage != 1) 
            { 
                isgameover = true; 
                KillTimer(hwnd, 8); 
            }break; 
        default:isnew = false; break; 
        } 
        isnew = false; 
        break; 
    case WM_KEYDOWN: 
        if (wParam == VK_BACK) 
        { 
            sta = 0; 
            ShowCursor(false); 
            sta1 = 0; 
            NetWorkOk = false; 
            g_Pointer.y = 310; 
            g_Pointer.x = 60; 
            g_stage = 0; 
        } 
        if (wParam == VK_ESCAPE) 
        { 
            DestroyWindow(hwnd); 
        } 
        switch (g_stage) 
        { 
        case 0: 
        { 
            switch (wParam) 
            { 
            case 87: 
            case VK_UP:                 if (sta == 0)break; sta--;      g_Pointer.y -= 70; 
                /*  char s[25];
                sprintf(s, "%d_%d(%d,%d",2,4, 700, 600);
                wchar_t t[30];
                swprintf(t, L"%d", strlen(s));
                MessageBox(NULL, t, L"错误", MB_OK); */break; 
            case 83: 
            case VK_DOWN:           if (sta == 4)break; sta++;  g_Pointer.y += 70;                                              break; 
            case VK_RETURN: 
                switch (sta) 
                { 
                case 0: //MessageBox(NULL, L"单人游戏", L"开始", MB_OK);       
                    g_stage = 1; 
                    g_CherkPoint = 1; 
                    LoadMap(g_CherkPoint, POINT_1_F); 
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时 
                    SetTimer(hwnd, 8, 1000, NULL); 
                    Game_Init(hwnd); 
                    break; 
                case 1: 
                    g_Pointer.y -= 70; g_Pointer.x = 30; 
 
                    sta = 0; g_stage = 2; 
                    Game_Init(hwnd); 
                    break; 
                case 2: 
                    ConnectServer(); 
                    g_stage = 4; 
                    break; 
                case 3: 
                    LoadMap(1, POINT_1_F); 
                    g_Tanker[0].x = 280; 
                    g_Tanker[0].y = 600; 
                    g_stage = 9; 
                    break; 
                case 4: 
                    SaveMap(1, POINT_1_F);  PostQuitMessage(0); 
                    break; 
 
                default:break; 
                }break; 
            }       break; 
        case 1: 
            if (wParam == 'l' || wParam == 'L') 
                if (MessageBox(NULL, L"是否保存进度", L"保存", MB_OKCANCEL) != IDCANCEL) 
                { 
                    SavePlayerData(0, PLAYER_POINET_F); 
                    SaveMap(0, PLAYER_SAVE_MAP); 
                    g_stage = 0; 
                } 
            if (wParam == 't' || wParam == 'T') 
            { 
                if (ReadPlayerData(0, PLAYER_POINET_F)) 
                { 
                    LoadMap(0, PLAYER_SAVE_MAP); 
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时 
                    Game_Init(hwnd); 
                } 
            } 
            if (wParam == 'U' || wParam == 'u') 
            { 
                if (g_CherkPoint < CHERK_S) 
                { 
                    g_CherkPoint++; 
                    LoadMap(g_CherkPoint, POINT_1_F); 
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时 
                    Game_Init(hwnd); 
                } 
            /*  else
                {
                    LoadMap(0, PLAYER_SELF_MAP);
                    SetTimer(hwnd, 1, 3000, NULL);  //无敌倒计时
                    Game_Init(hwnd);
                }*/ 
            } 
 
            break; 
        case 2: 
            switch (wParam) 
            { 
            case 87: 
            case VK_UP:                 if (sta1 == 0)break; sta1--;        g_Pointer.y -= 70;                          break; 
            case 83: 
            case VK_DOWN:           if (sta1 == 4)break; sta1++;    g_Pointer.y += 70;                          break; 
            case VK_RETURN: 
                switch (sta1) 
                { 
                case 0: 
                    g_stage = 3; 
                    LoadMap(1, POINT_1_F); 
                    SetTimer(hwnd, 2, 3000, NULL); 
                    Game_Init(hwnd); 
                    break; 
                case 1: 
                    //  g_stage = 5; 
                    g_Pointer.y -= 70; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 5; 
                    LoadMap(1, P_P_GAME); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"碰碰车", L"开始", MB_OK); 
                    break; 
                case 2: 
                    g_Pointer.y -= 140; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 6; 
                    LoadMap(1, PLAYER_SPEECH_F); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"生死时速", L"开始", MB_OK); 
                    break; 
                case 3: 
                    g_Pointer.y -= 210; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 7; 
                    LoadMap(1, SURIVE_GAME); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"求生考验", L"开始", MB_OK); 
                    break; 
                case 4: 
                    g_Pointer.y -= 280; g_Pointer.x = 30; 
                    sta1 = 0; 
                    g_stage = 8; 
                    LoadMap(1, RUNNINGTANKER_GAME); 
                    Game_Init(hwnd); 
                    //MessageBox(NULL, L"你追我赶", L"开始", MB_OK); 
                    break; 
                default: 
                    break; 
                } 
            }break; 
        case 3:     break; 
        case 4: 
 
            OnKeyUp(wParam); break; 
        case 5:  break; 
        case 6:  break; 
        case 7:  break; 
        case 8:  break; 
        case 9: 
            if (mode == 0) 
                switch (wParam) 
                { 
                case 87: 
                case VK_UP:             g_Tanker[0].MoveTank(0, -TANKSIZE);         break; 
                case 83: 
                case VK_DOWN:       g_Tanker[0].MoveTank(0, TANKSIZE);              break; 
                case 'A':case 'a': 
                case VK_LEFT:           g_Tanker[0].MoveTank(-TANKSIZE, 0);         break; 
                case 'd':case 'D': 
                case VK_RIGHT:      g_Tanker[0].MoveTank(TANKSIZE, 0);              break; 
                case VK_SPACE:          g_Tanker[0].setmap();                           break; 
                case 'p':case 'P':      mode = 1; break; 
                default:break; 
                } 
            if (wParam == 'o' || wParam == 'O') 
                mode = 0; 
            if (wParam == 'i' || wParam == 'I') 
                ClearMap(); 
            if (wParam == 'l' || wParam == 'L') 
                if (MessageBox(NULL, L"是否保存地图", L"保存", MB_OKCANCEL) != IDCANCEL) 
                { 
                    SaveMap(0, PLAYER_SELF_MAP); 
                    g_stage = 0; 
                } 
 
        } 
        g_Tanker[0].tag = 0; 
        } 
        break; 
    case WM_LBUTTONDOWN: 
        if (!NetWorkOk) 
            LButtonDown(lParam); 
        break; 
    case WM_DESTROY: 
        PostQuitMessage(0); 
        break; 
    default: 
        return DefWindowProc(hwnd, message, wParam, lParam); 
        break; 
    } 
    return 0; 

VOID Game_Paint(HWND hwnd) 

    //BG 
    if (g_stage != 4) 
    { 
        SelectObject(g_bufdc, g_hBackGround); 
        BitBlt(g_mdc, 0, 0, g_offset, WINDOW_HEIGHT, g_bufdc, WINDOW_WIDTH - g_offset, 0, SRCCOPY); 
        BitBlt(g_mdc, g_offset, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
    } 
    if (g_offset >= WINDOW_WIDTH) 
        g_offset = 0; 
    g_offset += 1; 
 
    if (!isgameover) { 
        if (!g_NowEnemy_s&&g_stage!=5&&g_stage!=6&&g_stage!=7&&g_stage!=8) 
        {//胜利 
            SelectObject(g_bufdc, g_hWin); 
            TransparentBlt(g_mdc, 100, 100, 424, 174, g_bufdc, 0, 0, 424, 174, RGB(0, 0, 0)); 
            BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
 
            if (g_CherkPoint < CHERK_S) 
            { 
                MessageBox(NULL, L"很好这很骚,你赢了,是否开始下一局", L"胜利", MB_OKCANCEL); 
                LoadMap(++g_CherkPoint, POINT_1_F); 
            } 
            else { 
                MessageBox(NULL, L"看来我的关卡挡不住你了", L"通关", MB_OKCANCEL); 
                g_stage = 0; 
            } 
            Game_Init(hwnd); 
        } 
        if (g_stage == 1 || g_stage>2) 
            if (g_stage != 4) 
                Weather_System(g_WearthType); 
        switch (g_stage) 
        { 
        case 0: 
            if (g_Pointer.x > 310) 
                g_Pointer.x -= 5; 
            else 
                g_Pointer.x += 5; 
            SelectObject(g_bufdc, g_hBackStart); 
            BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
            SelectObject(g_bufdc, g_hPointer); 
            TransparentBlt(g_mdc, g_Pointer.x, g_Pointer.y, 75, 50, g_bufdc, 0, 0, 75, 50, RGB(27, 27, 27)); 
 
            //BitBlt(g_mdc, g_Pointer.x, g_Pointer.y, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
            break; 
        case 1: 
            Checkpoint_1(); 
            break; 
        case 2: 
            if (g_Pointer.x > 310) 
                g_Pointer.x -= 5; 
            else 
                g_Pointer.x += 5; 
            SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
            Rectangle(g_mdc, WINDOW_WIDTH, 0, 200, WINDOW_HEIGHT); 
            SelectObject(g_bufdc, g_hSmallMenu); 
            BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
            SelectObject(g_bufdc, g_hPointer); 
            TransparentBlt(g_mdc, g_Pointer.x, g_Pointer.y, 75, 50, g_bufdc, 0, 0, 75, 50, RGB(27, 27, 27)); 
            //Checkpoint_2(); 
            break; 
        case 3:Checkpoint_2(); break; 
        case 4: NetWork();  break; 
        case 5:CheckppGame(); break; 
        case 6:CheckSpeechGame(); 
            break; 
        case 7:CheckSuriveGame();   break; 
        case 8:CheckRunningGame();   break; 
        case 9: 
            Editmap(); 
            break; 
        default:break; 
        } 
        if (!NetWorkOk) 
            BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
    } 
 
    else 
    { 
        if (g_stage == 5) 
        { 
            if (Speech[1] > Speech[0]) 
            { 
                MessageBox(NULL, L"2P玩家胜利", L"1P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
                return; 
            } 
            else //if (g_Tanker[1].x <= 0 || g_Tanker[1].y <= 0 || g_Tanker[1].x >= 28 || g_Tanker[1].y >= 17) 
            { 
                MessageBox(NULL, L"1P玩家胜利", L"2P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
                return; 
            } 
 
            /*SelectObject(g_bufdc, g_hFAIL);
            TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0));
            BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);*/ 
        } 
        if (g_stage == 6||g_stage==7||g_stage==8) 
        { 
            if (Winner == 0) 
            { 
                MessageBox(NULL, L"1P玩家胜利", L"2P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
            } 
            else 
            { 
                MessageBox(NULL, L"2P玩家胜利", L"1P菜鸡你失败了", MB_OK); 
                g_stage = 0; 
                Game_Init(hwnd); 
                Speech[0] = 5; 
                Speech[1] = 5; 
            } 
        } 
        else 
        { 
            if (g_stage != 4) 
            { 
                SelectObject(g_bufdc, g_hFAIL); 
                TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0)); 
                BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
            } 
            if (MessageBox(NULL, L"菜鸡被打爆了,是否从新开始?", L"失败", MB_OKCANCEL) != IDCANCEL) 
            { 
                SetTimer(hwnd, 1, 3000, NULL); 
                isnew = true; 
                LoadMap(g_CherkPoint, POINT_1_F); 
 
            } 
            else 
            { 
                g_stage = 0; 
            } 
        } 
        Game_Init(hwnd); 
 
    } 
    g_tPre = GetTickCount(); 
 
 

 
BOOL Game_Init(HWND hwnd) 

    //  g_WearthType = rand() % 2; 
    g_textPos.x = 0; 
    g_textPos.y = 150; 
    isgameover = false; 
    g_time = 0; 
    isnew = true; 
    srand((unsigned)time(NULL)); 
    g_tankFlash = -10; 
    g_NowEnemy_s = ENEMY1_S + ENEMY_S + g_CherkPoint * 8; 
    for (int i = 0, k = 480; i < 2; i++, k += 160)       //玩家坦克数组 
    { 
        g_Tanker[i].x = k; 
        g_Tanker[i].y = WINDOW_HEIGHT - 40; 
        g_Tanker[i].kill_s = 0; 
        for (int k = 0; k < BULLETS_; k++) 
            g_Tanker[i].bullets[k].isexit = false; 
    } 
    ShowCursor(true); 
    if (g_stage == 5||g_stage==6||g_stage==7||g_stage==8) 
    { 
        g_NowEnemy_1=50; 
    } 
    else 
    { 
      g_NowEnemy_1 = ENEMY_S + g_CherkPoint * 5; 
    } 
    for (int i = 0; i <ENEMY_S + 100; i++)                   //第一类敌人坦克数组 
    { 
        if (i >= g_NowEnemy_1) 
        { 
            g_ETank[i].isexist = false; 
            continue; 
        } 
        g_ETank[i].x = rand() % 1000 + 50; 
        g_ETank[i].y = rand() % 50 + 150; 
        g_ETank[i].isexist = true; 
        for (int k = 0; k < BULLETS_; k++) 
            g_ETank[i].bullets[k].isexit = false; 
    } 
    if (g_stage == 5||g_stage==6||g_stage==7||g_stage==8) 
    { 
        g_NowEnemy_2 = 30; 
    } 
    else 
    { 
        g_NowEnemy_2 = ENEMY1_S + g_CherkPoint * 3; 
    } 
     
    for (int i = 0; i < ENEMY1_S + 100; i++)             //第二类敌人坦克 
    { 
        if (i >= g_NowEnemy_2) 
        { 
            g_ETank1[i].isexist = false; 
            continue; 
        } 
        g_ETank1[i].x = rand() % 1000 + 50; 
        g_ETank1[i].y = rand() % 100 + 50; 
        g_ETank1[i].isexist = true; 
        for (int k = 0; k < BULLETS_; k++) 
            g_ETank1[i].bullets[k].isexit = false; 
    } 
    return TRUE; 

 
VOID Game_Bmp(HWND hwnd) 

 
    for (int i = 0; i < 2; i++) 
    { 
        g_Tanker[i].id = g_id++; 
    } 
    for (int i = 0; i < ENEMY_S + 100; i++) 
    { 
        g_ETank[i].id = g_id++; 
    } 
    for (int i = 0; i < ENEMY1_S + 100; i++) 
    { 
        g_ETank1[i].id = g_id++; 
    } 
    HBITMAP bmp; 
    g_hdc = GetDC(hwnd); 
    g_mdc = CreateCompatibleDC(g_hdc); 
    g_bufdc = CreateCompatibleDC(g_hdc); 
    bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT); 
    SelectObject(g_mdc, bmp); 
    g_hBackGround = (HBITMAP)LoadImage(NULL, L"image\\bg.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE); 
    g_hBackStart = (HBITMAP)LoadImage(NULL, L"image\\start.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE); 
    g_hTanker[0] = (HBITMAP)LoadImage(NULL, L"image\\tank1.bmp", IMAGE_BITMAP, 160, 40, LR_LOADFROMFILE); 
    g_hTanker[1] = (HBITMAP)LoadImage(NULL, L"image\\tank2.bmp", IMAGE_BITMAP, 160, 40, LR_LOADFROMFILE); g_hPointer = (HBITMAP)LoadImage(NULL, L"image\\pointer.bmp", IMAGE_BITMAP, 75, 50, LR_LOADFROMFILE); 
    g_hBullet[0] = (HBITMAP)LoadImage(NULL, L"image\\bullet1.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE); 
    g_hBullet[1] = (HBITMAP)LoadImage(NULL, L"image\\bullet2.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE); 
    g_hBullet[2] = (HBITMAP)LoadImage(NULL, L"image\\bullet3.bmp", IMAGE_BITMAP, 40, 40, LR_LOADFROMFILE); 
 
    g_hSmallMenu = (HBITMAP)LoadImage(NULL, L"image\\menu1.bmp", IMAGE_BITMAP, WINDOW_WIDTH, WINDOW_HEIGHT, LR_LOADFROMFILE); 
    g_hBlock[0] = (HBITMAP)LoadImage(NULL, L"image\\block1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hBlock[1] = (HBITMAP)LoadImage(NULL, L"image\\block2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hBlock[2] = (HBITMAP)LoadImage(NULL, L"image\\block3.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hFire = (HBITMAP)LoadImage(NULL, L"image\\fire.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hTank1 = (HBITMAP)LoadImage(NULL, L"image\\Enemy1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hTank2 = (HBITMAP)LoadImage(NULL, L"image\\Enemy2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hFAIL = (HBITMAP)LoadImage(NULL, L"image\\gameover.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hWin = (HBITMAP)LoadImage(NULL, L"image\\win.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hBase = (HBITMAP)LoadImage(NULL, L"image\\base.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hNohurt[0] = (HBITMAP)LoadImage(NULL, L"image\\noHurt.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    g_hNohurt[1] = (HBITMAP)LoadImage(NULL, L"image\\noHurt1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
 
    for (int i = 1; i <= 7; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\exp%d.bmp", i); 
        g_hExp[i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    for (int i = 1; i <= 4; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\rain%d.bmp", i); 
        g_hWearther[0][i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    for (int i = 1; i <= 4; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\writer%d.bmp", i); 
        g_hHead_P[i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    for (int i = 1; i <= 3; i++) 
    { 
        wchar_t name[30]; 
        swprintf_s(name, L"image\\snow%d.bmp", i); 
        g_hWearther[1][i - 1] = (HBITMAP)LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
    } 
    GetClientRect(hwnd, &g_rect); 
 
    Game_Paint(hwnd); 

BOOL Game_ClearUp(HWND hwnd) 

 
    return TRUE; 

 
 
 
void DrawMap(int level) 

    for (int i = 0; i < 19; i++) 
        for (int j = 0; j < 30; j++) 
        { 
            if (map[i][j] == 0) 
                continue; 
 
            if (map[i][j] == TIE) 
            { 
                SelectObject(g_bufdc, g_hBlock[0]); 
                BitBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, SRCCOPY); 
            } 
            else if (map[i][j] == TU) 
            { 
                SelectObject(g_bufdc, g_hBlock[1]); 
                BitBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, SRCCOPY); 
            } 
            else if (map[i][j] == CAODI) 
            { 
                SelectObject(g_bufdc, g_hBlock[2]); 
                BitBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, SRCCOPY); 
            } 
            else if (map[i][j] == 9) 
            { 
                SelectObject(g_bufdc, g_hBase); 
                TransparentBlt(g_mdc, j * 40, i * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
            } 
        } 

 
 
void SaveMap(int level, char *name) 

    ofstream out; 
    if (level != 0) 
        sprintf_s(fileName, "%s%d.txt", name, level); 
    else 
        sprintf_s(fileName, "%s.txt", name); 
    out.open(name, ios::out); 
    for (int i = 0; i <MAP_HEIGHT; i++) 
    { 
        for (int j = 0; j < MAP_WIDTH; j++) 
            out << map[i][j] << " "; 
        out << endl; 
    } 
    out.close(); 

BOOL ReadPlayerData(int level, char*name) 

    /*if (level != 0)
    sprintf_s(fileName, "%s%d.txt", name, level);
    else
    sprintf_s(fileName, "%s", name);*/ 
    ifstream in; 
    in.open("image\\PlayerData.txt", ios::in); 
    if (in.fail()) 
    { 
        MessageBox(NULL, L"尚未保存进度", L"错误", MB_OK); 
        //g_stage = 0; 
        return false; 
    } 
    in >> g_Tanker[0].x; 
    in >> g_Tanker[0].y; 
    in >> g_Tanker[0].tag; 
    in >> g_NowEnemy_s; 
    in >> g_CherkPoint; 
    LoadMap(0, PLAYER_SAVE_MAP); 
    in.close(); 

VOID SavePlayerData(int level, char*name) 

    ofstream out; 
    /*if (level != 0)
    sprintf_s(fileName, "%s%d.txt", name, level);
    else
    sprintf_s(fileName, "%s", name);*/ 
    out.open("image\\PlayerData.txt", ios::out); 
    out << g_Tanker[0].x << " "; 
    out << g_Tanker[0].y << " "; 
    out << g_Tanker[0].tag << " "; 
    out << g_NowEnemy_s << " "; 
    out << g_CherkPoint; 
    out.close(); 

 
 
 
void LoadMap(int level, char *name) 

    memset(fileName, 0, sizeof(fileName)); 
    if (level != 0) 
        sprintf_s(fileName, "%s%d.txt", name, level); 
    else 
        sprintf_s(fileName, "%s.txt", name); 
    ifstream in; 
    in.open(fileName, ios::in); 
    if (in.fail()) 
    { 
        MessageBox(NULL, L"文件打开失败", L"错误", MB_OK); 
        g_stage = 0; 
        return; 
    } 
    for (int i = 0; i < 19; i++) 
        for (int j = 0; j < 30; j++) 
        { 
            map[i][j] = 0; 
            if (in.eof()) 
            { 
                in.close(); 
                return; 
            } 
            in >> map[i][j]; 
        } 
    in.close(); 

 
 
void Tanker::setmap() 

    if (map[y / 40][x / 40] == 9) 
        return; 
    if (map[y / 40][x / 40] == 0) 
    { 
        map[y / 40][x / 40] = g_holdType; 
        return; 
    } 
    g_holdType = --map[y / 40][x / 40]; 
 
    if (g_holdType <= 0) 
    { 
        //map[y / 40][x / 40] = TIE; 
        g_holdType = TIE; 
    } 

void Tanker::Shot(int user, int  cd) 

 
    if (bulletcd>cd) 
    { 
        switch (tag)            //后坐力 
        { 
        case 0:MoveTank(0, BULLETPOWER); break; 
        case 1:MoveTank(-BULLETPOWER, 0); break; 
        case 2:MoveTank(BULLETPOWER, 0); break; 
        case 3:MoveTank(0, -BULLETPOWER); break; 
        default:break; 
        } 
 
        for (int i = 0; i < BULLETS_; i++) 
        { 
            if (!bullets[i].isexit) 
            { 
                bulletcd = -cd; 
                bullets[i].Shot(x, y, tag, id); 
                return; 
            } 
        } 
    } 
    else bulletcd++; 

 
void Tanker::MoveTank(int _x, int _y) 

 
    if (ismeet(_x, _y)) 
    { 
        x += _x; 
        y += _y; 
    } 
 

 
void Checkpoint_1() 

 
    for (int j = 0; j < 4; j++) 
    { 
        if (GetKeyState(pos[0][j]) < 0) 
        { 
            g_Tanker[0].vx = ptMove[0][j].x; 
            g_Tanker[0].vy = ptMove[0][j].y; 
            g_Tanker[0].MoveTank(g_Tanker[0].vx, g_Tanker[0].vy); 
            g_Tanker[0].tag = g_tagbuf[j]; 
            break; 
        } 
    } 
 
    for (int i = 0; i <g_NowEnemy_1; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(0, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i <g_NowEnemy_2; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
 
    SelectObject(g_bufdc, g_hTanker[0]); 
    TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, g_Tanker[0].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    if (isnew) 
        NewTank(1);//无敌保护 
 
    if (GetKeyState(VK_SPACE)<0) 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    g_Tanker[0].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_2; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_1; i++) 
    { 
        g_ETank[i].DrawBullet(); 
    } 
 
    DrawMap(1); 
    DrawBulletExp(); 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
    HFONT hFont; 
    hFont = CreateFont(20, 0, 0, 0, 700, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, TEXT("微软雅黑")); 
    SelectObject(g_mdc, hFont); 
    TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 10, L"坦克大战", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"小键盘控制方向", 7); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"T 读档", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"L 存档", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"U 下一关", 5); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    SetTextColor(g_mdc, RGB(0, 255, 127)); 
    swprintf_s(str, L"剩余战斗时间%d", 60 - g_time); 
    TextOut(g_mdc, 350, 50, str, wcslen(str)); 
    if (60 - g_time <= 0) 
    { 
        isgameover = true; 
    } 
    swprintf_s(str, L"当前关卡%d", g_CherkPoint); 
    TextOut(g_mdc, 350, 70, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

 
 
void Checkpoint_2() 

 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                g_Tanker[i].vx = ptMove[i][j].x; 
                g_Tanker[i].vy = ptMove[i][j].y; 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < g_NowEnemy_1; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < g_NowEnemy_2; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    DrawBulletExp(); 
    for (int i = 0; i < g_NowEnemy_2; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_1; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 10, L"坦克大战", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"连坐制度,一尸两命", 9); 
 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckSpeechGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
                } 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    for (int i = 0; i < ENEMY1_S+100; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < ENEMY_S+100; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    /*TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1);
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1);*/ 
    TextOut(g_mdc, WINDOW_WIDTH - 500, 10, L"生死时速", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"进攻敌方堡垒,速度对抗", 11); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckSuriveGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
                } 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S*10+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
            switch (g_ETank[i].tag) 
            { 
            case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
            case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
            case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
            case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
            } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S*10+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
            switch (g_ETank1[i].tag) 
            { 
            case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
            case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
            case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
            case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
            } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        //g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
    //  g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        //g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    for (int i = 0; i < ENEMY1_S*10; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < ENEMY_S*10; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 500, 10, L"求生考验", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    //TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"玩家1 WASD控制方向", 12); 
    //TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"看谁生存的更久", 12); 
 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckRunningGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
                } 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet(); 
    } 
    DrawMap(1);                         //画地图 
    for (int i = 0; i < g_NowEnemy_2; i++) 
        g_ETank1[i].DrawBullet(); 
    for (int i = 0; i < g_NowEnemy_1; i++) 
        g_ETank[i].DrawBullet(); 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    /*TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1);
    TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1);*/ 
    TextOut(g_mdc, WINDOW_WIDTH - 500, 10, L"你追我赶", 4); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"相互厮杀吧", 5); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
    case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
    case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

void CheckppGame() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    if (Speech[0]>Speech[1]) 
    { 
        if ((g_Tanker[0].x + TANKSIZE) > g_Tanker[1].x&&g_Tanker[0].x < (g_Tanker[1].x + TANKSIZE)) 
            if (g_Tanker[0].y  < (g_Tanker[1].y + TANKSIZE) && (g_Tanker[0].y + TANKSIZE) >(g_Tanker[1].y)) 
            { 
                isgameover = true; 
            } 
    } 
    else if (Speech[0]<Speech[1]) 
    { 
 
        if ((g_Tanker[0].x + TANKSIZE) > g_Tanker[1].x&&g_Tanker[0].x < (g_Tanker[1].x + TANKSIZE)) 
            if (g_Tanker[0].y  < (g_Tanker[1].y + TANKSIZE) && (g_Tanker[0].y + TANKSIZE) >(g_Tanker[1].y)) 
            { 
                isgameover = true; 
 
            } 
    } 
    else 
    { 
        isgameover = false; 
    } 
    for (int i = 0; i < 2; i++) 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[i][j]) < 0) 
            { 
                switch (j) 
                { 
                case 0: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = -Speech[i]; 
                    break; 
                case 1: 
                    g_Tanker[i].vx = 0; 
                    g_Tanker[i].vy = Speech[i]; 
                    break; 
                case 2: 
                    g_Tanker[i].vx = -Speech[i]; 
                    g_Tanker[i].vy = 0; 
                    break; 
                case 3: 
                    g_Tanker[i].vx = Speech[i]; 
                    g_Tanker[i].vy = 0; 
 
                } 
                /*g_Tanker[i].vx = ptMove[i][j].x;
                g_Tanker[i].vy = ptMove[i][j].y;*/ 
                g_Tanker[i].MoveTank(g_Tanker[i].vx, g_Tanker[i].vy); 
                g_Tanker[i].tag = g_tagbuf[j]; 
 
                break; 
            } 
        } 
 
    for (int i = 0; i < ENEMY_S+100; i++) 
    { 
        if (!g_ETank[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            //g_ETank[i].Shot(1, ENEMY_BULLETCD); 
        } 
 
        if (g_ETank[i].movehold < 0) 
        { 
            g_ETank[i].tag = rand() % 4; 
            g_ETank[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank[i].movehold--; 
 
        switch (g_ETank[i].tag) 
        { 
        case 0: if (!g_ETank[i].ismeet(0, -g_ETank[i].vy))break;    g_ETank[i].y -= g_ETank[i].vy;  break; 
        case 1: if (!g_ETank[i].ismeet(g_ETank[i].vx, 0))break; g_ETank[i].x += g_ETank[i].vx; break; 
        case 2: if (!g_ETank[i].ismeet(-g_ETank[i].vx, 0))break; g_ETank[i].x -= g_ETank[i].vx;  break; 
        case 3: if (!g_ETank[i].ismeet(0, g_ETank[i].vy))break; g_ETank[i].y += g_ETank[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank1); 
        TransparentBlt(g_mdc, g_ETank[i].x, g_ETank[i].y, 40, 40, g_bufdc, g_ETank[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    for (int i = 0; i < ENEMY1_S+100; i++) 
    { 
        if (!g_ETank1[i].isexist) 
            continue; 
        if (rand() % ENEMY_BULLETCD == 0) 
        { 
            //g_ETank1[i].Shot(2, ENEMY_BULLETCD); 
        } 
        if (g_ETank1[i].movehold < 0) 
        { 
            g_ETank1[i].tag = rand() % 4; 
            g_ETank1[i].movehold = ENEMY_MOVEHOLD; 
        } 
        else 
            g_ETank1[i].movehold--; 
 
        switch (g_ETank1[i].tag) 
        { 
        case 0: if (!g_ETank1[i].ismeet(0, -g_ETank1[i].vy))break;  g_ETank1[i].y -= g_ETank1[i].vy;  break; 
        case 1: if (!g_ETank1[i].ismeet(g_ETank1[i].vx, 0))break; g_ETank1[i].x += g_ETank1[i].vx; break; 
        case 2: if (!g_ETank1[i].ismeet(-g_ETank1[i].vx, 0))break; g_ETank1[i].x -= g_ETank1[i].vx;  break; 
        case 3: if (!g_ETank1[i].ismeet(0, g_ETank1[i].vy))break; g_ETank1[i].y += g_ETank1[i].vy;  break; 
        } 
 
        SelectObject(g_bufdc, g_hTank2); 
        TransparentBlt(g_mdc, g_ETank1[i].x, g_ETank1[i].y, 40, 40, g_bufdc, g_ETank1[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
 
    } 
    if (GetKeyState(VK_ADD)<0) 
    { 
        g_Tanker[1].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    if (GetKeyState(VK_SPACE) < 0) 
    { 
        g_Tanker[0].Shot(0, G_TANKBULLETCD);//后坐力 
 
    } 
 
    for (int i = 0; i < 2; i++)      //画子弹 
    { 
        SelectObject(g_bufdc, g_hTanker[i]); 
        TransparentBlt(g_mdc, g_Tanker[i].x, g_Tanker[i].y, 40, 40, g_bufdc, g_Tanker[i].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
        g_Tanker[i].DrawBullet2(); 
    } 
    DrawMap(1);                         //画地图 
    /*for (int i = 0; i < ENEMY1_S; i++)
        g_ETank1[i].DrawBullet();
    for (int i = 0; i < ENEMY_S; i++)
        g_ETank[i].DrawBullet();*/ 
 
    if (isnew) 
        NewTank(2);     //无敌保护罩 
 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
 
    //TextOut(g_mdc, g_Tanker[0].x + 16, g_Tanker[0].y + 20, L"1", 1); 
    //TextOut(g_mdc, g_Tanker[1].x + 16, g_Tanker[1].y + 20, L"2", 1); 
    TextOut(g_mdc, WINDOW_WIDTH - 400, 10, L"碰碰车大战", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"玩家2 小键盘控制方向", 11); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 90, L"加号发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 130, L"玩家1 WASD控制方向", 12); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 170, L"空格发射子弹", 6); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 210, L"升级碾压对方", 6); 
    wchar_t str[100]; 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    //swprintf_s(str, L"敌人剩余数量%d", g_NowEnemy_s); 
    TextOut(g_mdc, 50, 20, str, wcslen(str)); 
    switch (g_color) 
    { 
    case 0:     SetTextColor(g_mdc, RGB(255, 10, 10));  ++g_color; break; 
        //  case 1:     SetTextColor(g_mdc, RGB(0, 255, 127));  ++g_color; break; 
        //  case 2:     SetTextColor(g_mdc, RGB(148, 0, 211));  g_color = 0; break; 
    } 
    if (g_textPos.x < WINDOW_WIDTH / 2 + 200) 
    { 
        TextOut(g_mdc, g_textPos.x, g_textPos.y, g_str, wcslen(g_str)); 
        g_textPos.x += 5; 
    } 

 
VOID Bullet::BulletExplosion() 

 
    for (int i = 0; i < BULLET_EXP_S - 1; i++) 
    { 
        exp[i].isexit = true; 
        exp[i].last = 0; 
        exp[i].x = x; 
        exp[i].y = y; 
        //exp[i].vx = BULLET_EXP_V; 
        //exp[i].vy = BULLET_EXP_V; 
        g_BulletExpList.push_front(exp[i]); 
    } 
 

 
VOID DrawBulletExp() 

 
    for (list<BulletExp>::iterator it = g_BulletExpList.begin(); it != g_BulletExpList.end(); ++it) 
    { 
        if (!it->isexit) 
        { 
            continue; 
        } 
 
        switch (rand() % 4) 
        { 
        case 0: 
            (*it).vx = -(1 + rand() % BULLET_EXP_V); 
            (*it).vy = -(1 + rand() % BULLET_EXP_V); 
            break; 
        case 1: 
            (*it).vx = (1 + rand() % BULLET_EXP_V); 
            (*it).vy = (1 + rand() % BULLET_EXP_V); 
            break; 
        case 2: 
            (*it).vx = (1 + rand() % BULLET_EXP_V); 
            (*it).vy = -(1 + rand() % BULLET_EXP_V); 
            break; 
        case 3: 
            (*it).vx = -(1 + rand() % BULLET_EXP_V); 
            (*it).vy = (1 + rand() % BULLET_EXP_V); 
            break; 
        default: 
            break; 
        } 
        (*it).x += (*it).vx; 
        (*it).y += (*it).vy; 
        SelectObject(g_bufdc, g_hExp[rand() % 7]); 
        BitBlt(g_mdc, (*it).x, (*it).y, 4, 4, g_bufdc, 0, 0, SRCCOPY); 
        //TransparentBlt(g_mdc, (*it).x, (*it).y, 8, 8, g_bufdc, 0, 0, 8, 8, RGB(255, 255, 255)); 
        if ((*it).last > BULLET_EXPLAST) 
        { 
            (*it).isexit = false; 
        } 
        else 
            (*it).last++; 
 
    } 

VOID Editmap() 

    SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
    Rectangle(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); 
    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
    DrawMap(1); 
    if (g_tankFlash < 0) 
    { 
        SelectObject(g_bufdc, g_hTanker[0]); 
        TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, g_Tanker[0].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    } 
    g_tankFlash++; 
    if (g_tankFlash > 10) 
        g_tankFlash = -20; 
    if (mode == 1) { 
 
        for (int j = 0; j < 4; j++) 
        { 
            if (GetKeyState(pos[1][j]) < 0) 
            { 
                g_Tanker[0].vx = ptMove[2][j].x; 
                g_Tanker[0].vy = ptMove[2][j].y; 
                g_Tanker[0].MoveTank(g_Tanker[0].vx, g_Tanker[0].vy); 
                g_Tanker[0].tag = 0; 
                break; 
            } 
        } 
        if (GetKeyState(VK_SPACE) < 0) 
        { 
            g_Tanker[0].setmap(); 
        } 
    } 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 50, L"O普通建图", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 100, L"P快速建图", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 150, L"L保存地图", 5); 
    TextOut(g_mdc, WINDOW_WIDTH - 200, 200, L"I清空地图", 5); 
    if (mode == 1) 
        TextOut(g_mdc, WINDOW_WIDTH / 2 - 100, 50, L"快速编辑地图中", 7); 
    else 
        TextOut(g_mdc, WINDOW_WIDTH / 2 - 100, 50, L"普通编辑地图中", 7); 

VOID Weather_System(int Type) 

    if (g_WeartherNum < WEATHER_NUMBER) 
    { 
        Wearther[Type][g_WeartherNum].x = rand() % 500 + 500; 
        Wearther[Type][g_WeartherNum].y = rand() % 200 + 10; 
        Wearther[Type][g_WeartherNum].exist = true; 
        g_WeartherNum++; 
    } 
    for (int i = 0; i < WEATHER_NUMBER; i++) 
    { 
        if (Wearther[Type][i].exist) 
        { 
            SelectObject(g_bufdc, g_hWearther[Type][rand() % 4]); 
            if (Type != 1) 
                TransparentBlt(g_mdc, Wearther[Type][i].x, Wearther[Type][i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
            else 
                TransparentBlt(g_mdc, Wearther[Type][i].x, Wearther[Type][i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(255, 255, 255)); 
            if (rand() % 2 == 0) 
            { 
                Wearther[Type][i].x += -rand() % 6; 
            } 
            else 
            { 
                Wearther[Type][i].x += -rand() % 6; 
 
            } 
            Wearther[Type][i].y += 8; 
            if (Wearther[Type][i].y>WINDOW_HEIGHT) 
            { 
                Wearther[Type][i].y = 0; 
                Wearther[Type][i].x = rand() % WINDOW_WIDTH; 
            } 
        } 
    } 

 
 
bool Tanker::isout(int bufx, int bufy) 

    if (bufx + x > WINDOW_WIDTH - 40 || bufx + x < 0) 
        return true; 
    if (bufy + y > WINDOW_HEIGHT - 40 || bufy + y < 0) 
        return true; 
    x += bufx; 
    y += bufy; 
    return false; 

 
bool Tanker::ismeet(int _x, int _y) 

    int bufx = x + _x, bufy = y + _y; 
    if (bufx > WINDOW_WIDTH - 40 || bufx < 0) 
        return false; 
    else if (bufy > WINDOW_HEIGHT - 40 || bufy < 0) 
        return false; 
    if (g_stage == 9) 
        return true; 
    //  0 , -1 , 1 , 
    //bool Judge(int bufxy){            } 
    //碰撞检测 
 
    //坦克撞坦克检测 
    if (g_stage != 1) 
        if (id == 1 || id == 0) 
        { 
            if (!isnew) 
                if ((g_Tanker[0].x + TANKSIZE) > g_Tanker[1].x&&g_Tanker[0].x  < (g_Tanker[1].x + TANKSIZE)) 
                    if (g_Tanker[0].y  < (g_Tanker[1].y + TANKSIZE) && (g_Tanker[0].y + TANKSIZE) >(g_Tanker[1].y)) 
                    { 
                        if (g_Tanker[0].x >(g_Tanker[1].x + TANKSIZE)) 
                        { 
 
                            g_Tanker[0].isout(6, 0); 
                            g_Tanker[1].isout(-6, 0); 
                        } 
                        else 
                        { 
                            g_Tanker[0].isout(-6, 0); 
                            g_Tanker[1].isout(6, 0); 
                        } 
                        return false; 
                    } 
        } 
    int k = PLAYER_S; 
    if (g_stage == 1) 
        --k; 
    //       1         
    // 0   1  2 3   4 5 2 
    if (g_stage != 4) 
        if (id >= PLAYER_S && id < ENEMY_S + PLAYER_S) 
        { 
            for (int i = 0; i < k; i++) 
            { 
                if ((g_Tanker[i].x + TANKSIZE) >x&&g_Tanker[i].x < (x + TANKSIZE)) 
                    if (g_Tanker[i].y  < (y + TANKSIZE) && (g_Tanker[i].y + TANKSIZE) >(y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_Tanker[i].x / 40 * 40, g_Tanker[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
 
 
                        if (g_stage != 5) 
                        { 
 
                            isgameover = true; 
                            if (g_stage == 6||g_stage==7||g_stage==8) 
                            { 
                                if (i == 0) 
                                { 
                                    Winner = 1; 
                                } 
                                else 
                                { 
                                    Winner = 0; 
                                } 
                            } 
                            else 
                            { 
                                g_stage = 0; 
                            } 
                        } 
                    } 
            } 
        } 
    // k=1    s=6    s1=4 
    //  id: 0 1 2 3 4 5 6 7 8 9 10           
    if (g_stage != 4) 
        if (id >= (ENEMY_S + PLAYER_S)) 
        { 
            for (int i = 0; i < k; i++) 
            { 
                if ((g_Tanker[i].x + TANKSIZE) >x&&g_Tanker[i].x < (x + TANKSIZE)) 
                    if (g_Tanker[i].y  < (y + TANKSIZE) && (g_Tanker[i].y + TANKSIZE) >(y)) 
                    { 
                        isexist = false; 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, x, y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        --g_NowEnemy_s; 
                        ++g_Tanker[i].kill_s; 
 
                        swprintf_s(g_str, L"玩家%d  碾压敌方坦克,目前摧毁数:%d", i + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                        return false; 
                    } 
            } 
        } 
    if (_y < 0)          //上 
    { 
        if (map[(bufy) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI&& map[(bufy) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI) 
            return true; 
        //  for (int i = ; i <= bufx / BLOCK_SIZE + 1; i++) 
        if (map[(bufy) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] != 0 || map[(bufy) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
        return true; 
    } 
    else if (_y > 0)     //下 
    { 
        if (map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI && map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] <= CAODI) 
            return true; 
        if (map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] != 0 || map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
 
        return true; 
    } 
    else if (_x < 0)         //左 
    { 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] <= CAODI&& map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] <= CAODI) 
            return true; 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] != 0 || map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
        return true; 
    } 
    else if (_x > 0) //右 
    { 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] <= CAODI && map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] <= CAODI) 
            return true; 
        if (map[(bufy + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] != 0 || map[(bufy + DETECTION_LEVEL) / BLOCK_SIZE][(bufx + BLOCK_SIZE) / BLOCK_SIZE] != 0) 
        { 
            return false; 
        } 
        if (map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + DETECTION_LEVEL) / BLOCK_SIZE] == 9 || map[(bufy + BLOCK_SIZE) / BLOCK_SIZE][(bufx + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 9) 
        { 
            MessageBox(NULL, L"玩家成功突破", L"胜利", NULL); 
            g_stage = 0; 
        } 
        return true; 
    } 
    return false; 

 
VOID Tanker::DrawBullet2()              // 打印子弹图片 

    for (int i = 0; i < BULLETS_; i++) 
    { 
        if (!bullets[i].isexit) 
            continue; 
        if (id == 0) 
        { 
            SelectObject(g_bufdc, g_hBullet[0]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(3, 3, 3)); 
        } 
        else if (id == 1) 
        { 
            SelectObject(g_bufdc, g_hBullet[1]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(10, 4, 1)); 
        } 
        else 
        { 
            SelectObject(g_bufdc, g_hBullet[2]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        switch (bullets[i].tag) 
        { 
        case 0: bullets[i].y -= bullets[i].vy;  break; 
        case 1: bullets[i].x += bullets[i].vx; break; 
        case 2: bullets[i].x -= bullets[i].vx;  break; 
        case 3: bullets[i].y += bullets[i].vy;  break; 
        } 
        //下面为子弹碰撞  事件 检测 
        //过界 子弹消失 
        if (bullets[i].x >= WINDOW_WIDTH || bullets[i].x <= 0 || bullets[i].y >= WINDOW_HEIGHT || bullets[i].y <= 0) 
        { 
            bullets[i].isexit = false; 
            //      continue; 
        } 
        switch (bullets[i].tag)                 //子弹撞到障碍物{ 0, 3, 2, 1 }; 
        { 
        case 0: 
            //  if (upJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (upJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y) / 40][bullets[i].x / 40] = LUDI; 
                if (map[bullets[i].y / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 30) / 40] = LUDI; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id < 2) 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 3: //  if (downJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (downJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
            } 
            else if (downJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (downJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2) 
                    isgameover = true; 
            }break; 
        case 2://   if (leftJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (leftJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][bullets[i].x / 40] <= TU) 
                    map[bullets[i].y / 40][bullets[i].x / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][bullets[i].x / 40] = LUDI; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2) 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 1://if (rightJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (rightJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 40) / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] = LUDI; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        } 
        /*  //子弹 撞击 土墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 2)
        {
        bullets[i].isexit = false;
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        }
        //子弹 达到 老家 失败
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 9)
        {
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        SelectObject(g_bufdc, g_hFAIL);
        TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0));
        BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
        g_stage = 0;
        isgameover = true;
        }
        //子弹 撞击 铁墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 1 )
        {
        map[bullets[i].y / 40][bullets[i].x / 40] = 2;
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        bullets[i].isexit = false;
        }
        */ 
        //敌方子弹 撞击 我的坦克 
        if (id >= 2) 
        { 
            for (int m = 0; m<2; m++) 
            { 
                if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[m].x&&bullets[i].x + 10 < (g_Tanker[m].x + TANKSIZE)) 
                    if (bullets[i].y + 10 < (g_Tanker[m].y + TANKSIZE) && (bullets[i].y + TANKSIZE - 10) > (g_Tanker[m].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_Tanker[m].x, g_Tanker[m].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
 
                    } 
                if (g_stage == 1) 
                    break; 
            } 
        } 
        else                //我方攻击敌方 
        { 
            for (int k = 0; k < ENEMY1_S+100; k++) 
            { 
                if (!g_ETank1[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank1[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank1[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank1[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank1[k].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_ETank1[k].x, g_ETank1[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        g_ETank1[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; 
                        ++kill_s; 
                        if (id == 0) 
                        { 
                            g_Tanker[0].AddQuilty(); 
                            Speech[0]++; 
                        } 
                        else 
                        { 
                            g_Tanker[1].AddQuilty(); 
                            Speech[1]++; 
                        } 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方重型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            for (int k = 0; k < ENEMY_S+100; k++) 
            { 
                if (!g_ETank[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank[k].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_ETank[k].x, g_ETank[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        g_ETank[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; 
                        ++kill_s; 
 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方轻型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            /*if (g_ETank[0].count == 0 && g_ETank1[0].count1 == 0)
            {
 
 
            }*/ 
        } 
 
    } 

void Tanker::AddQuilty() 

    quality += 20; 

int Tanker::GetMotion() 

    int Vx = vx, Vy = vy; 
    if (vx < 0) 
        Vx = -vx; 
    if (vy < 0) 
        Vy = -vy; 
    return (int)sqrt(Vx*Vx + Vy*Vy)*quality; 

 
VOID Tanker::DrawBullet()               // 打印子弹图片 

    for (int i = 0; i < BULLETS_; i++) 
    { 
        if (!bullets[i].isexit) 
            continue; 
        if (id == 0) 
        { 
            SelectObject(g_bufdc, g_hBullet[0]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(3, 3, 3)); 
        } 
        else if (id == 1) 
        { 
            SelectObject(g_bufdc, g_hBullet[1]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(10, 4, 1)); 
        } 
        else 
        { 
            SelectObject(g_bufdc, g_hBullet[2]); 
            TransparentBlt(g_mdc, bullets[i].x, bullets[i].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        switch (bullets[i].tag) 
        { 
        case 0: bullets[i].y -= bullets[i].vy;  break; 
        case 1: bullets[i].x += bullets[i].vx; break; 
        case 2: bullets[i].x -= bullets[i].vx;  break; 
        case 3: bullets[i].y += bullets[i].vy;  break; 
        } 
        //下面为子弹碰撞  事件 检测 
        //过界 子弹消失 
        if (bullets[i].x >= WINDOW_WIDTH || bullets[i].x <= 0 || bullets[i].y >= WINDOW_HEIGHT || bullets[i].y <= 0) 
        { 
            bullets[i].isexit = false; 
            //      continue; 
        } 
        switch (bullets[i].tag)                 //子弹撞到障碍物{ 0, 3, 2, 1 }; 
        { 
        case 0: 
            //  if (upJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (upJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y) / 40][bullets[i].x / 40] = LUDI; 
                if (map[bullets[i].y / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 30) / 40] = LUDI; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
 
                bullets[i].isexit = false; 
            } 
            else if (upJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 3: //  if (downJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (downJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
                if (map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] <= TU) 
                    map[(bullets[i].y + 40) / 40][(bullets[i].x + 30) / 40] = 0; 
            } 
 
            else if (downJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (downJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            }break; 
        case 2://   if (leftJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (leftJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][bullets[i].x / 40] <= TU) 
                    map[bullets[i].y / 40][bullets[i].x / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][bullets[i].x / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][bullets[i].x / 40] = LUDI; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (leftJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        case 1://if (rightJudge(bullets[i].x, bullets[i].y, 0))break; 
            if (rightJudge(bullets[i].x, bullets[i].y, TU)) 
            { 
                bullets[i].isexit = false; 
                if (map[bullets[i].y / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[bullets[i].y / 40][(bullets[i].x + 40) / 40] = LUDI; 
                if (map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] <= TU) 
                    map[(bullets[i].y + 30) / 40][(bullets[i].x + 40) / 40] = LUDI; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, TIE)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                bullets[i].isexit = false; 
            } 
            else if (rightJudge(bullets[i].x, bullets[i].y, 9)) 
            { 
                SelectObject(g_bufdc, g_hFire); 
                TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1)); 
                if (g_stage != 6 || id<2)//生死时速关卡除外 
                { 
                    isgameover = true; 
                    if (id == 0) 
                        Winner = 0; 
                    else 
                        Winner = 1; 
                } 
            } 
            break; 
        } 
        /*  //子弹 撞击 土墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 2)
        {
        bullets[i].isexit = false;
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        }
        //子弹 达到 老家 失败
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 9)
        {
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        map[bullets[i].y / 40][bullets[i].x / 40] = 0;
        SelectObject(g_bufdc, g_hFAIL);
        TransparentBlt(g_mdc, 200, 100, 248, 160, g_bufdc, 0, 0, 248, 160, RGB(0, 0, 0));
        BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
        g_stage = 0;
        isgameover = true;
        }
        //子弹 撞击 铁墙
        if (map[bullets[i].y / 40][bullets[i].x / 40] == 1 )
        {
        map[bullets[i].y / 40][bullets[i].x / 40] = 2;
        SelectObject(g_bufdc, g_hFire);
        TransparentBlt(g_mdc, bullets[i].x / 40 * 40, bullets[i].y / 40 * 40, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(1, 1, 1));
        bullets[i].isexit = false;
        }
        */ 
        //敌方子弹 撞击 我的坦克 
        if (id >= 2) 
        { 
            for (int m = 0; m<2; m++) 
            { 
                if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[m].x&&bullets[i].x + 10 < (g_Tanker[m].x + TANKSIZE)) 
                    if (bullets[i].y + 10 < (g_Tanker[m].y + TANKSIZE) && (bullets[i].y + TANKSIZE - 10) > (g_Tanker[m].y)) 
                    { 
                        SelectObject(g_bufdc, g_hFire); 
                        TransparentBlt(g_mdc, g_Tanker[m].x, g_Tanker[m].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
                        if (!isnew) 
                            isgameover = true; 
                        else 
                            bullets[i].isexit = false; 
                        if (g_stage == 6||g_stage==7||g_stage==8) 
                        { 
                            isgameover = true; 
                            if (m == 0) 
                                Winner = 1; 
                            else 
                                Winner = 0; 
                        } 
                        else 
                        { 
                            isgameover = true; 
                        } 
                    } 
                if (g_stage == 1) 
                    break; 
            } 
        } 
        else if (id == 0 || id == 1)            //我方攻击敌方 
        { 
 
            if (g_stage == 8) 
            { 
                if (id == 0) 
                { 
                    if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[1].x&&bullets[i].x + 10 < (g_Tanker[1].x + TANKSIZE)) 
                        if (bullets[i].y + 10 < (g_Tanker[1].y + TANKSIZE) && (bullets[i].y + TANKSIZE - 10) > (g_Tanker[1].y)) 
                        { 
                            isgameover = true; 
                            Winner = 0; 
                        } 
                } 
                if(id==1) 
                { 
                    if ((bullets[i].x + TANKSIZE - 10) > g_Tanker[0].x&&bullets[0].x + 10 < (g_Tanker[0].x + TANKSIZE)) 
                        if (bullets[i].y + 10 < (g_Tanker[0].y + TANKSIZE) && (bullets[0].y + TANKSIZE - 10) > (g_Tanker[0].y)) 
                        { 
                            isgameover = true; 
                            Winner = 1; 
                        } 
                } 
 
            } 
            for (int k = 0; k < g_NowEnemy_2; k++) 
            { 
                if (!g_ETank1[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank1[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank1[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank1[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank1[k].y)) 
                    { 
                        /*  SelectObject(g_bufdc, g_hFire);
                        TransparentBlt(g_mdc, g_ETank1[k].x, g_ETank1[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0));
                        */ 
                        bullets[i].BulletExplosion(); 
                        g_ETank1[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; 
                        ++kill_s; 
                         
                        /*  PlaySound(L"image\\BOOM.wav", NULL, SND_FILENAME | SND_ASYNC);
 
                        if(g_NowEnemy_s+1==g_NowEnemy_1+g_NowEnemy_2)
                        PlaySound(L"image\\FB.wav", NULL, SND_FILENAME | SND_ASYNC);
                        switch (kill_s)
                        {
 
 
                        case 3:
                        break;
                        case 10:PlaySound(L"image\\SGOD.wav", NULL, SND_FILENAME | SND_ASYNC); break;
                        default:break;
                        }*/ 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方重型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            for (int k = 0; k < g_NowEnemy_1; k++) 
            { 
                if (!g_ETank[k].isexist) 
                    continue; 
                if ((bullets[i].x + TANKSIZE - BULLET_DETECTION_LE) > g_ETank[k].x&&bullets[i].x + BULLET_DETECTION_LE < (g_ETank[k].x + TANKSIZE)) 
                    if (bullets[i].y + BULLET_DETECTION_LE<(g_ETank[k].y + TANKSIZE) && (bullets[i].y + TANKSIZE - BULLET_DETECTION_LE)>(g_ETank[k].y)) 
                    { 
                        /*  SelectObject(g_bufdc, g_hFire);
                        TransparentBlt(g_mdc, g_ETank[k].x, g_ETank[k].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0));
                        */ 
                        bullets[i].BulletExplosion(); 
                        g_ETank[k].isexist = false; 
                        bullets[i].isexit = false; 
                        --g_NowEnemy_s; ++kill_s; 
                        /*PlaySound(L"image\\BOOM.wav", NULL, SND_FILENAME | SND_ASYNC);
 
                        if (g_NowEnemy_s + 1 == g_NowEnemy_1 + g_NowEnemy_2)
                        PlaySound(L"image\\FB.wav", NULL, SND_FILENAME | SND_ASYNC );*/ 
                        swprintf_s(g_str, L"玩家%d 已经成功摧毁敌方轻型坦克,目前摧毁数:%d", id + 1, kill_s); 
                        g_textPos.x = TEXT_X; 
                    } 
            } 
            /*if (g_ETank[0].count == 0 && g_ETank1[0].count1 == 0)
            {
 
 
            }*/ 
        } 
 
    } 

VOID ClearMap() 

    for (int i = 0; i < MAP_HEIGHT; i++) 
        for (int j = 0; j < MAP_WIDTH; j++) 
            map[i][j] = LUDI; 

 
BOOL upJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == type || map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

BOOL downJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y + BLOCK_SIZE) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == type || map[(y + BLOCK_SIZE) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

BOOL leftJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(x) / BLOCK_SIZE] == type || map[(y + DETECTION_LEVEL) / BLOCK_SIZE][(x) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

BOOL rightJudge(int x, int y, int type) 

    if (type == 0) 
        if (map[(y) / BLOCK_SIZE][(x + DETECTION_LEVEL) / BLOCK_SIZE] == 0 && map[(y) / BLOCK_SIZE][(x + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE] == 0) 
            return false; 
    if (map[(y + BLOCK_SIZE - DETECTION_LEVEL) / BLOCK_SIZE][(x + BLOCK_SIZE) / BLOCK_SIZE] == type || map[(y + DETECTION_LEVEL) / BLOCK_SIZE][(x + BLOCK_SIZE) / BLOCK_SIZE] == type) 
    { 
        return true; 
    } 
    return false; 

VOID NewTank(int count) 

    if (swappp) 
    { 
        SelectObject(g_bufdc, g_hNohurt[0]); 
        TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        if (count >= 2) 
        { 
            SelectObject(g_bufdc, g_hNohurt[0]); 
            TransparentBlt(g_mdc, g_Tanker[1].x, g_Tanker[1].y, 40, 40, g_bufdc, 0, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        swappp = false; 
    } 
    else 
    { 
        SelectObject(g_bufdc, g_hNohurt[0]); 
        TransparentBlt(g_mdc, g_Tanker[0].x, g_Tanker[0].y, 40, 40, g_bufdc, 40, 0, 40, 40, RGB(0, 0, 0)); 
        if (count >= 2) 
        { 
            SelectObject(g_bufdc, g_hNohurt[0]); 
            TransparentBlt(g_mdc, g_Tanker[1].x, g_Tanker[1].y, 40, 40, g_bufdc, 40, 0, 40, 40, RGB(0, 0, 0)); 
        } 
        swappp = true; 
    } 

 
 
VOID MessageSend(int x, int y, wchar_t * str) 

    SetBkMode(g_mdc, TRANSPARENT); 
    SetTextColor(g_mdc, RGB(0, 245, 255)); 
    SetTextColor(g_mdc, RGB(255, 10, 10)); 
    TextOut(g_mdc, x, y, str, wcslen(str)); 

 
int temp = 0; 
POINT g_Point[4][2]; 
bool isbig[4] = { 0 }; 
int tempp[4][4] = { 0 }; 
void Connect(SOCKET sock) 

    struct sockaddr_in serverAddress; 
    memset(&serverAddress, 0, sizeof(serverAddress)); 
    serverAddress.sin_family = AF_INET; 
    serverAddress.sin_addr.S_un.S_addr = inet_addr(IP); 
    serverAddress.sin_port = htons(1986); 
 
    //开始连接 
    if (connect(sock, (sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) 
    { 
        wprintf(g_strTip, L"不能连接到服务器"); 
        NetWorkOk = false; 
        return; 
    } 
    ShowCursor(true); 
    for (int i = 0; i < 4; i++) 
    { 
        g_HeadP[i].x = rand() % (WINDOW_WIDTH - 200); 
        g_HeadP[i].y = rand() % (WINDOW_HEIGHT - 200); 
        g_Point[i][0].x = g_HeadP[i].x; 
        g_Point[i][0].y = g_HeadP[i].y; 
        g_Point[i][1].x = g_HeadP[i].x + 97; 
        g_Point[i][1].y = g_HeadP[i].y + 97; 
        g_HeadP[i].tag = i; 
        g_HeadP[i].isexist = false; 
        isbig[i] = false; 
        switch (rand() % 4) 
        { 
        case 0: 
            g_HeadP[i].vx = -(3 + rand() % HEADP_V); 
            g_HeadP[i].vy = -(3 + rand() % HEADP_V); 
            break; 
        case 1: 
            g_HeadP[i].vx = (3 + rand() % HEADP_V); 
            g_HeadP[i].vy = (3 + rand() % HEADP_V); 
            break; 
        case 2: 
            g_HeadP[i].vx = (3 + rand() % HEADP_V); 
            g_HeadP[i].vy = -(3 + rand() % HEADP_V); 
            break; 
        case 3: 
            g_HeadP[i].vx = -(3 + rand() % HEADP_V); 
            g_HeadP[i].vy = (3 + rand() % HEADP_V); 
            break; 
        default: 
            break; 
        } 
    } 
    for (int i = 0; i <= 4; i++) 
        g_hPen[i] = CreatePen(PS_SOLID, 3, RGB(rand() % 256, rand() % 256, rand() % 256)); 
 
    swprintf_s(g_strTip, L"正在匹配..."); 
    MessageSend(550, 400, g_strTip); 
 
 

 
void DoRecvMsg(char* buf) 

    string strBuf = buf; 
    int pos = strBuf.find('_'); 
    int opType = -1; 
    if (pos != -1) 
    { 
        string bufTemp = strBuf.substr(0, pos); 
        opType = atoi(bufTemp.c_str()); 
        strBuf = strBuf.substr(pos + 1); 
    } 
    else 
    { 
        opType = atoi(strBuf.c_str()); 
    } 
    if (opType <= 0) 
    { 
        return; 
    } 
    switch (opType) 
    { 
    case Msg_GameBegin: 
        //游戏开始消息 
        SelectObject(g_mdc, GetStockObject(BLACK_BRUSH)); 
        Rectangle(g_mdc, WINDOW_WIDTH, 0, 200, WINDOW_HEIGHT); 
        code = atoi(strBuf.c_str()); 
        swprintf_s(g_strTip, L"游戏即将开始..."); 
        MessageSend(500, 350, g_strTip); 
        NetWorkOk = true; 
        BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
        if (code == 0) 
        { 
            temp = 1; 
            //  g_Tanker[temp].x = 500 +100; g_Tanker[temp].y = 300;                //对手 
            g_Tanker[code].x = 0; g_Tanker[code].y = 0;             //我的 
            g_Tanker[temp].x = 0; g_Tanker[temp].y = 14 * 40;               //对手 
        } 
        else 
        { 
            temp = 0; 
            g_Tanker[code].x = 0; g_Tanker[code].y = 14 * 40;               //我的 
            g_Tanker[temp].x = 0; g_Tanker[temp].y = 0;             //对手 
        } 
        LoadMap(1, "image\\Maze"); 
 
        Sleep(100); 
        _beginthread(&DrawThread, 0, NULL); 
        break; 
    case Msg_Info: 
    { 
        //同步信息  %d_%d(%d,%d 
        string str1, str2; 
        pos = strBuf.find('_'); 
        if (pos == -1) 
        { 
            return; 
        } 
        str1 = strBuf.substr(0, pos); 
        str2 = strBuf.substr(pos + 1); 
        int bSelf = atoi(str1.c_str()); 
        int xPos = atoi(str2.c_str()); 
        int posX = strBuf.find('('); 
        int posY = strBuf.find(','); 
        int x = atoi(strBuf.substr(posX + 1, posY).c_str()); 
        int y = atoi(strBuf.substr(posY + 1).c_str()); 
        if (x > 1200 || y > 800) 
            return; 
        if (bSelf == code) 
        { 
            if (xPos == 3) 
                xPos = 1; 
            else if (xPos == 1) 
                xPos = 3; 
 
            g_Tanker[code].vx = ptMove[1][xPos].x; 
            g_Tanker[code].vy = ptMove[1][xPos].y; 
            g_Tanker[code].x = x; 
            g_Tanker[code].y = y; 
            g_Tanker[code].MoveTank(g_Tanker[code].vx, g_Tanker[code].vy); 
            g_Tanker[code].tag = g_tagbuf[xPos]; 
        } 
        else 
        { 
            if (xPos == 3) 
                xPos = 1; 
            else if (xPos == 1) 
                xPos = 3; 
            /*      wchar_t s[20];
            swprintf_s(s, L"%d,%d", x, y);
            MessageBox(NULL, s, L"错误", MB_OK);*/ 
            g_Tanker[temp].x = x; 
            g_Tanker[temp].y = y; 
            g_Tanker[temp].vx = ptMove[1][xPos].x; 
            g_Tanker[temp].vy = ptMove[1][xPos].y; 
            g_Tanker[temp].MoveTank(g_Tanker[temp].vx, g_Tanker[temp].vy); 
            g_Tanker[temp].tag = g_tagbuf[xPos]; 
        } 
        break; 
    } 
    case Msg_GameEnd: 
        //游戏结束 
        int bSelfWin = atoi(strBuf.c_str()); 
        if (bSelfWin) 
        { 
            wprintf(g_strTip, L"你赢了"); 
        } 
        else 
        { 
            wprintf(g_strTip, L"对家赢了"); 
        } 
        break; 
    } 

 
void Receive(void* p) 

    char buf[2048] = { 0 }; 
    SOCKET* sock = (SOCKET*)p; 
    while (1) 
    { 
        int bytes; 
        if ((bytes = recv(g_sock, buf, sizeof(buf), 0)) == SOCKET_ERROR) 
        { 
            MessageBox(NULL, L"与服务器断开连接", L"错误", MB_OK); 
            _endthread(); 
            return; 
        } 
        buf[bytes] = '\0'; 
 
        DoRecvMsg(buf); 
 
 
    } 

 
void ConnectServer() 

    WSADATA wsa; 
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
    { 
        MessageBox(NULL, L"套接字初始化失败", L"错误", MB_OK); 
        return; 
    } 
 
    SOCKET clientSocket; 
    if ((clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) 
    { 
        MessageBox(NULL, L"套接字申请失败", L"错误", MB_OK); 
        return; 
    } 
    g_sock = clientSocket; 
    /*SelectObject(g_mdc, GetStockObject(BLACK_BRUSH));
    Rectangle(g_mdc, WINDOW_WIDTH, 0, 200, WINDOW_HEIGHT);*/ 
 
 
    //  _beginthread(Anime, 0, NULL); 
    Connect(clientSocket);  //连接服务器 
 
    _beginthread(Receive, 0, &clientSocket); 

void OnKeyUp(WPARAM wParam) 

    int temp[] = { 0, 2, 3, 1 }; 
    for (int j = 0; j < 4; j++) 
    { 
        if (GetKeyState(pos[0][j]) < 0) 
        { 
            char buf[25] = { 0 }; 
            //  type tag x y 
            sprintf_s(buf, "%d_%d(%d,%d", Msg_Move, g_tagbuf[j], g_Tanker[code].x, g_Tanker[code].y);//方向 
            if (send(g_sock, buf, strlen(buf), 0) == SOCKET_ERROR) 
            { 
                MessageBox(NULL, L"网络出错", L"错误", MB_OK); 
                return; 
            } 
            Sleep(60); 
            break; 
        } 
 
    } 
 
    /*if (GetKeyState(VK_SPACE) < 0)
    {
    g_Tanker[code].Shot(0, G_TANKBULLETCD);//后坐力
    }*/ 
    /*if (wParam == VK_LEFT)
    {
    char buf[5] = { 0 };
    sprintf(buf, "%d_%d", Msg_Move);//方向
    if (send(g_sock, buf, strlen(buf), 0) == SOCKET_ERROR)
    {
    return;
    }
    }*/ 

 
VOID NetWork() 

    if (!NetWorkOk) 
    { 
        SelectObject(g_bufdc, g_hBackGround); 
        BitBlt(g_mdc, 0, 0, g_offset, WINDOW_HEIGHT, g_bufdc, WINDOW_WIDTH - g_offset, 0, SRCCOPY); 
        BitBlt(g_mdc, g_offset, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
        if (g_offset == WINDOW_WIDTH) 
            g_offset = 0; 
        g_offset += 1; 
        wchar_t str[50]; 
        swprintf_s(str, L"请耐心等待其他玩家加入..."); 
        MessageSend(500, 350, str); 
        for (int i = 0; i < 4; i++) 
        { 
            SelectObject(g_bufdc, g_hHead_P[i]); 
            BitBlt(g_mdc, g_HeadP[i].x, g_HeadP[i].y, 97, 97, g_bufdc, 0, 0, SRCCOPY); 
 
 
            if (g_HeadP[i].isexist) 
            { 
                for (int k = 0; k < 4; k++) 
                { 
                    if (g_HeadP[k].isexist&&k != i) 
                        if (isbig[i] && isbig[k]) 
                        { 
                            SelectObject(g_mdc, g_hPen[rand() % 4]); 
                            MoveToEx(g_mdc, g_HeadP[i].x + 48, g_HeadP[i].y + 48, NULL); 
                            LineTo(g_mdc, g_HeadP[k].x + 48, g_HeadP[k].y + 48); 
                        } 
                } 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x, g_HeadP[i].y + 1, NULL); 
                LineTo(g_mdc, g_HeadP[i].x + 1 + 97, g_HeadP[i].y); 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x + 1 + 97, g_HeadP[i].y, NULL); 
                LineTo(g_mdc, g_HeadP[i].x + 1 + 97, g_HeadP[i].y + 97 + 1); 
 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x + 97, g_HeadP[i].y + 97 + 1, NULL); 
                LineTo(g_mdc, g_HeadP[i].x, g_HeadP[i].y + 1 + 97); 
 
                SelectObject(g_mdc, g_hPen[rand() % 4]); 
 
                MoveToEx(g_mdc, g_HeadP[i].x + 1, g_HeadP[i].y + 97, NULL); 
                LineTo(g_mdc, g_HeadP[i].x + 1, g_HeadP[i].y); 
 
            } 
 
            g_HeadP[i].x += g_HeadP[i].vx; 
            g_HeadP[i].y += g_HeadP[i].vy; 
            if (g_HeadP[i].x >= WINDOW_WIDTH - 120 || g_HeadP[i].x <= 10) 
                g_HeadP[i].vx *= -1; 
            if (g_HeadP[i].y >= WINDOW_HEIGHT - 120 || g_HeadP[i].y <= 10) 
                g_HeadP[i].vy *= -1; 
 
            if (g_HeadP[i].HeadpReturn()) 
            { 
                if (rand() % 2 == 0) 
                    g_HeadP[i].vx *= -1; 
                else 
                    g_HeadP[i].vy *= -1; 
            } 
            if (g_HeadP[i].y > WINDOW_HEIGHT - 80 || g_HeadP[i].y <= -60 || g_HeadP[i].x >= WINDOW_WIDTH - 80 || g_HeadP[i].x <= -60) 
            { 
                g_HeadP[i].x = 600; 
                g_HeadP[i].y = 300; 
            } 
        } 
 
 
    } 
    /*  */ 

 
void DrawThread(void* param) 

    while (1) 
    { 
        //绘制内容 
        DrawAll(); 
        Sleep(20); 
    } 

void DrawAll() 

    if (GetKeyState(VK_BACK) < 0) 
    { 
        _endthread(); 
        closesocket(g_sock); 
    } 
 
    SelectObject(g_bufdc, g_hBackGround); 
    BitBlt(g_mdc, 0, 0, g_offset, WINDOW_HEIGHT, g_bufdc, WINDOW_WIDTH - g_offset, 0, SRCCOPY); 
    BitBlt(g_mdc, g_offset, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY); 
    if (g_offset == WINDOW_WIDTH) 
        g_offset = 0; 
    g_offset += 1; 
    SelectObject(g_bufdc, g_hTanker[code]); 
    TransparentBlt(g_mdc, g_Tanker[code].x, g_Tanker[code].y, 40, 40, g_bufdc, g_Tanker[code].tag * 40, 0, 40, 40, RGB(0, 0, 0));                   //自己 
 
    SelectObject(g_bufdc, g_hTanker[temp]); 
    TransparentBlt(g_mdc, g_Tanker[temp].x, g_Tanker[temp].y, 40, 40, g_bufdc, g_Tanker[temp].tag * 40, 0, 40, 40, RGB(0, 0, 0)); 
    DrawMap(3); 
    swprintf_s(g_strTip, L"WASD控制"); 
    SetBkMode(g_mdc, 0); 
    SetTextColor(g_mdc, RGB(249, 249, 45)); 
    TextOut(g_mdc, 1100, 100, g_strTip, lstrlen(g_strTip)); 
 
    BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY); 
 

 
 
 
bool ETank::HeadpReturn() 

    for (int i = 0; i < 4; i++) 
    { 
        if (i == tag) 
            continue; 
        if (x + 97 > g_HeadP[i].x&&x < g_HeadP[i].x + 97) 
            if (y<g_HeadP[i].y + 97 && y + 97>g_HeadP[i].y) 
                return true; 
    } 
    return false; 

 
VOID LButtonDown(LPARAM lparam) 

    for (int i = 0; i < 4; i++) 
    { 
        if (g_HeadP[i].x <= LOWORD(lparam) && g_HeadP[i].x + 97 >= LOWORD(lparam)) 
            if (g_HeadP[i].y <= HIWORD(lparam) && g_HeadP[i].y + 97 >= HIWORD(lparam)) 
            { 
                isbig[i] = !isbig[i]; 
                if (!g_HeadP[i].isexist) 
                { 
                    g_HeadP[i].isexist = true; 
 
                    g_HeadP[i].vx *= 2; 
                    g_HeadP[i].vy *= 2; 
                } 
                else 
                { 
                    g_HeadP[i].isexist = false; 
 
                    g_HeadP[i].vx /= 2; 
                    g_HeadP[i].vy /= 2; 
                } 
                break; 
                //MessageBox(NULL, L"s", L"", NULL); 
            } 
    } ; 
                    g_HeadP[i].vy *= 2; 
                } 
                else 
                { 
                    g_HeadP[i].isexist = false; 
 
                    g_HeadP[i].vx /= 2; 
                    g_HeadP[i].vy /= 2; 
                } 
                break; 
                //MessageBox(NULL, L"s", L"", NULL); 
            } 
    } 

猜你喜欢

转载自blog.csdn.net/qq_42309746/article/details/80791799