c++坦克大战

#include
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"Msimg32.lib")
#include
#include
#include
#include
#include
/*********/
#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;
};
listg_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 = 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 > 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 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] 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::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 (yg_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);
			}
	}
}

你可能感兴趣的:(游戏开发之路,c++,win32,坦克大战,游戏)