现在的位置: 首页 > 综合 > 正文

泡泡堂单机版

2013年03月17日 ⁄ 综合 ⁄ 共 36927字 ⁄ 字号 评论关闭

http://blog.csdn.net/column/details/vc-game-programming.html?page=2

我也是跟着个人学的SDK图形图像,想学游戏开发的同学可以先看一下这个教程,下面是代码

最重要的函数就是BitBlt贴图函数

还有这个程序需要的图片和声音资源 下载地址(资源显示有延迟稍后加上)

 

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <windowsx.h>
#include <mmsystem.h> 
#pragma comment(lib, "WINMM.LIB") 
#include <time.h>
//全局变量声明
HINSTANCE hInst;
HBITMAP bmp,bmp1,people,bg,peoplebg,mboom,mboombg,mbooming,mboomingbg,mobj1,mobj1bg,
		mobj2,mobj2bg,mground,mgroundbg,bg2,goods,goodsbg,mrobot,mrobotbg;
HDC		hdc,mdc,bufdc,bufdc1,bufdc2,bufdc3,mdc1;
HWND	hWnd;
DWORD	tPre,tNow;
RECT	rect;
int		num,dir,x,y,keyd,moveloop,boomnum,mx=0,my=15; 
struct Peo
{
	int x,y;
	int moveloop;
	int num;
	int power;
	int boomlimit;
	int boomn;
	int speed;
	int dir;
	int dead;
}player;
struct Rob
{
	int x,y;
	int moveloop;
	int num;
	int power;
	int boomlimit;
	int boomn;
	int speed;
	int dir;
	int premove;
	int move;
	int planstep;
	int stepnow;
	int plan[900];
	int plan1[900];
	int dead;
}robot;
struct Bo
{
	int x,y,time,num,power;
}boom[1000];
struct Map
{
	int ground;
	int obj;
	int goods;
	int moveBox;
	int distory;
	int boom;
	int booming;
	int boomingdir;
}map[35][35];

//全局函数声明
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
void				MyPaint(HDC hdc);

//****WinMain函数,程序入口点函数***********************
int APIENTRY WinMain(HINSTANCE hInstance,
	                 HINSTANCE hPrevInstance,
	                 LPSTR     lpCmdLine,
	                 int       nCmdShow)
{
	MSG msg;

	MyRegisterClass(hInstance);

	//初始化
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	 GetMessage(&msg,NULL,NULL,NULL);            //初始化msg  
	//消息循环
	while( msg.message!=WM_QUIT )
	{
	    if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
	    {
	        TranslateMessage( &msg );
	        DispatchMessage( &msg );
	    }
		else
		{
			tNow = GetTickCount();
			if(tNow-tPre >= 40)
				MyPaint(hdc);
		}
	}

	return msg.wParam;
}

//****设计一个窗口类,类似填空题,使用窗口结构体*******************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 
	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= NULL;
	wcex.hCursor		= NULL;
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= "canvas";
	wcex.hIconSm		= NULL;

	return RegisterClassEx(&wcex);
}

//****初始化函数*************************************
// 加载位图并设定各种初始值
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	
	hInst = hInstance;

	hWnd = CreateWindow("canvas", "泡泡堂" , WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return FALSE;
	}

	//MoveWindow(hWnd,10,10,1024,768,true);
	ShowWindow(hWnd, SW_SHOWMAXIMIZED);
	UpdateWindow(hWnd);

	hdc = GetDC(hWnd);
	mdc = CreateCompatibleDC(hdc);
	mdc1 = CreateCompatibleDC(hdc);
	bufdc = CreateCompatibleDC(hdc);
	bufdc1 =CreateCompatibleDC(hdc);

	//建立空的位图并置入mdc中
	GetClientRect(hWnd,&rect);
	bmp = CreateCompatibleBitmap(hdc,rect.right,rect.bottom);//?为什么是hdc
	SelectObject(mdc,bmp);
	bmp1 = CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
	SelectObject(mdc1,bmp1);

	//设定人物贴图初始位置和移动方向
	x = 120;
	y = 80;
	robot.x=840;
	robot.y=420;
	robot.premove=-1;
	robot.move=1;
	robot.dir=3;
	dir = 1;
	num = 0;
	moveloop=0;
	keyd=0;
	boomnum=0;
	robot.boomn=player.boomn=0;
	robot.boomlimit=player.boomlimit=1;
	robot.power=player.power=1;
	robot.speed=player.speed=0;
	robot.dead=player.dead=0;
	memset(boom,0,sizeof(boom));
	memset(map,0,sizeof(map));
	freopen("map.txt","r",stdin);
	int i,j,k;
	for(j=0;j<15;j++)
	{
		for(i=0;i<25;i++)
		{
			scanf("%d %d",&map[i][j].ground,&map[i][j].obj);
			if(map[i][j].obj/10==1)
			{
				k=rand()%7;
				if(k==0)
				map[i][j].goods=1;
				else if(k==1)
				map[i][j].goods=7;
				else if(k==2)
				map[i][j].goods=9;
				else
				map[i][j].goods=0;
			}
			/*k=rand()%2;
			while(k==0) k=rand()%3;
			if(k==1)
			map[i][j].obj=10+rand()%3;
			else
			map[i][j].obj=20+rand()%4;*/
		}
	}
	/*map[5][5].obj=10;
	map[5][6].obj=23;
	map[0][0].obj=0;*/
	//载入各连续移动位图及背景图
	people = (HBITMAP)LoadImage(NULL,"people.bmp",IMAGE_BITMAP,192,228,LR_LOADFROMFILE);
	peoplebg = (HBITMAP)LoadImage(NULL,"peoplebg.bmp",IMAGE_BITMAP,192,228,LR_LOADFROMFILE);
	mrobot = (HBITMAP)LoadImage(NULL,"robot.bmp",IMAGE_BITMAP,192,224,LR_LOADFROMFILE);
	mrobotbg = (HBITMAP)LoadImage(NULL,"robotbg.bmp",IMAGE_BITMAP,192,224,LR_LOADFROMFILE);
	bg = (HBITMAP)LoadImage(NULL,"bg1.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
	mboom = (HBITMAP)LoadImage(NULL,"boom.bmp",IMAGE_BITMAP,180,45,LR_LOADFROMFILE);
	mboombg = (HBITMAP)LoadImage(NULL,"boombg.bmp",IMAGE_BITMAP,180,45,LR_LOADFROMFILE);
	mbooming = (HBITMAP)LoadImage(NULL,"booming.bmp",IMAGE_BITMAP,160,80,LR_LOADFROMFILE);
	mboomingbg = (HBITMAP)LoadImage(NULL,"boomingbg.bmp",IMAGE_BITMAP,160,80,LR_LOADFROMFILE);
	mobj1 = (HBITMAP)LoadImage(NULL,"obj1.bmp",IMAGE_BITMAP,120,44,LR_LOADFROMFILE);
	mobj1bg = (HBITMAP)LoadImage(NULL,"obj1bg.bmp",IMAGE_BITMAP,40,44,LR_LOADFROMFILE);
	mobj2 = (HBITMAP)LoadImage(NULL,"obj2.bmp",IMAGE_BITMAP,200,56,LR_LOADFROMFILE);
	mobj2bg = (HBITMAP)LoadImage(NULL,"obj2bg.bmp",IMAGE_BITMAP,200,56,LR_LOADFROMFILE);
	mground = (HBITMAP)LoadImage(NULL,"ground.bmp",IMAGE_BITMAP,200,40,LR_LOADFROMFILE);
	mgroundbg = (HBITMAP)LoadImage(NULL,"groundbg.bmp",IMAGE_BITMAP,40,40,LR_LOADFROMFILE);
	bg2 = (HBITMAP)LoadImage(NULL,"obj1bg.bmp",IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
	goods = (HBITMAP)LoadImage(NULL,"goods.bmp",IMAGE_BITMAP,400,45,LR_LOADFROMFILE);
	goodsbg = (HBITMAP)LoadImage(NULL,"goodsbg.bmp",IMAGE_BITMAP,400,45,LR_LOADFROMFILE);
	MyPaint(hdc);
	return TRUE;
}

//****自定义绘图函数*********************************
// 人物贴图坐标修正及窗口贴图
void Booming(HDC hdc,Bo &b)
{
	int dir1=1,dir2=1,dir3=1,dir4=1;
	int i,k;
	SelectObject(bufdc,mbooming);
	SelectObject(bufdc1,mboomingbg);
	BitBlt(mdc,b.x+20,b.y+20,40,40,bufdc1,0,0,SRCAND);
	BitBlt(mdc,b.x+20,b.y+20,40,40,bufdc,0,0,SRCPAINT);
	k=(11-b.time)*2;
	if(k>b.power) k=b.power;
	for(i=1;i<=k;i++)
	{
		if(b.y-i*40>=0&&dir1)
		{
			if(map[b.x/40][(b.y-i*40)/40].obj||map[b.x/40][(b.y-i*40)/40].boom)
			{
				dir1=0;
				if(b.time==0)
					map[b.x/40][(b.y-i*40)/40].obj=0;
				if(map[b.x/40][(b.y-i*40)/40].boom) 
				{
					if(boom[map[b.x/40][(b.y-i*40)/40].boom-1].time>10)
						boom[map[b.x/40][(b.y-i*40)/40].boom-1].time=10;
				}
			}
			else
			{
				BitBlt(mdc,b.x+20,b.y+20-i*40,40,40,bufdc1,40,0,SRCAND);
				BitBlt(mdc,b.x+20,b.y+20-i*40,40,40,bufdc,40,0,SRCPAINT);
			}
		}
		if(b.y+i*40<=600-40&&dir2)
		{
			if(map[b.x/40][(b.y+i*40)/40].obj||map[b.x/40][(b.y+i*40)/40].boom)
			{
				dir2=0;
				if(b.time==0)
					map[b.x/40][(b.y+i*40)/40].obj=0;
				if(map[b.x/40][(b.y+i*40)/40].boom) 
				{
					if(boom[map[b.x/40][(b.y+i*40)/40].boom-1].time>10)
						boom[map[b.x/40][(b.y+i*40)/40].boom-1].time=10;
				}
			}
			else 
			{
				BitBlt(mdc,b.x+20,b.y+20+i*40,40,40,bufdc1,40,0,SRCAND);
				BitBlt(mdc,b.x+20,b.y+20+i*40,40,40,bufdc,40,0,SRCPAINT);
				
			}
		}
		if(b.x-i*40>=0&&dir3)
		{
			if(map[(b.x-i*40)/40][b.y/40].obj||map[(b.x-i*40)/40][b.y/40].boom)
			{
				dir3=0;
				if(b.time==0)
					map[(b.x-i*40)/40][b.y/40].obj=0;
				if(map[(b.x-i*40)/40][b.y/40].boom) 
				{
					if(boom[map[(b.x-i*40)/40][b.y/40].boom-1].time>10)
						boom[map[(b.x-i*40)/40][b.y/40].boom-1].time=10;
				}
			}	
			else
			{
				BitBlt(mdc,b.x+20-i*40,b.y+20,40,40,bufdc1,80,0,SRCAND);
				BitBlt(mdc,b.x+20-i*40,b.y+20,40,40,bufdc,80,0,SRCPAINT);
				
			}
		}
		if(b.x+i*40<=800-40&&dir4)
		{
			if(map[(b.x+i*40)/40][b.y/40].obj||map[(b.x+i*40)/40][b.y/40].boom)
			{
				dir4=0;
				if(b.time==0)
					map[(b.x+i*40)/40][b.y/40].obj=0;
				if(map[(b.x+i*40)/40][b.y/40].boom) 
				{
					if(boom[map[(b.x+i*40)/40][b.y/40].boom-1].time>10)
						boom[map[(b.x+i*40)/40][b.y/40].boom-1].time=10;
				}
			}
			else
			{
				BitBlt(mdc,b.x+20+i*40,b.y+20,40,40,bufdc1,80,0,SRCAND);
				BitBlt(mdc,b.x+20+i*40,b.y+20,40,40,bufdc,80,0,SRCPAINT);
				
			}
		}
	}
	if(b.y-i*40>=0&&dir1)
	{
		if(map[b.x/40][(b.y-i*40)/40].obj||map[b.x/40][(b.y-i*40)/40].boom)
		{
			dir1=0;
			if(b.time==0)
				map[b.x/40][(b.y-i*40)/40].obj=0;
			if(map[b.x/40][(b.y-i*40)/40].boom) 
			{
				if(boom[map[b.x/40][(b.y-i*40)/40].boom-1].time>10)
					boom[map[b.x/40][(b.y-i*40)/40].boom-1].time=10;
			}
		}
		else
		{
			BitBlt(mdc,b.x+20,b.y+20-i*40,40,40,bufdc1,40,0,SRCAND);
			BitBlt(mdc,b.x+20,b.y+20-i*40,40,40,bufdc,40,0,SRCPAINT);
		}
	}
	if(b.y+i*40<=600-40&&dir2)
	{
		if(map[b.x/40][(b.y+i*40)/40].obj||map[b.x/40][(b.y+i*40)/40].boom)
		{
			dir2=0;
			if(b.time==0)
				map[b.x/40][(b.y+i*40)/40].obj=0;
			if(map[b.x/40][(b.y+i*40)/40].boom) 
			{
				if(boom[map[b.x/40][(b.y+i*40)/40].boom-1].time>10)
					boom[map[b.x/40][(b.y+i*40)/40].boom-1].time=10;
			}
		}
		else 
		{
			BitBlt(mdc,b.x+20,b.y+20+i*40,40,40,bufdc1,40,0,SRCAND);
			BitBlt(mdc,b.x+20,b.y+20+i*40,40,40,bufdc,40,0,SRCPAINT);
			
		}
	}
	if(b.x-i*40>=0&&dir3)
	{
		if(map[(b.x-i*40)/40][b.y/40].obj||map[(b.x-i*40)/40][b.y/40].boom)
		{
			dir3=0;
			if(b.time==0)
				map[(b.x-i*40)/40][b.y/40].obj=0;
			if(map[(b.x-i*40)/40][b.y/40].boom) 
			{
				if(boom[map[(b.x-i*40)/40][b.y/40].boom-1].time>10)
					boom[map[(b.x-i*40)/40][b.y/40].boom-1].time=10;
			}
		}	
		else
		{
			BitBlt(mdc,b.x+20-i*40,b.y+20,40,40,bufdc1,80,0,SRCAND);
			BitBlt(mdc,b.x+20-i*40,b.y+20,40,40,bufdc,80,0,SRCPAINT);			
		}
	}
	if(b.x+i*40<=800-40&&dir4)
	{
		if(map[(b.x+i*40)/40][b.y/40].obj||map[(b.x+i*40)/40][b.y/40].boom)
		{
			dir4=0;
			if(b.time==0)
				map[(b.x+i*40)/40][b.y/40].obj=0;
			if(map[(b.x+i*40)/40][b.y/40].boom) 
			{
				if(boom[map[(b.x+i*40)/40][b.y/40].boom-1].time>10)
					boom[map[(b.x+i*40)/40][b.y/40].boom-1].time=10;
			}
		}
		else
		{
			BitBlt(mdc,b.x+20+i*40,b.y+20,40,40,bufdc1,80,0,SRCAND);
			BitBlt(mdc,b.x+20+i*40,b.y+20,40,40,bufdc,80,0,SRCPAINT);
			
		}
	}
}
void PreBooming(Bo& b)
{
	int dir1=1,dir2=1,dir3=1,dir4=1;
	int i;
	map[b.x/40][(b.y)/40].booming=3;
	map[b.x/40][(b.y)/40].boomingdir=0;
	for(i=1;i<=b.power;i++)
	{
		if(b.y-i*40>=0&&dir1)
		{
			if(map[b.x/40][(b.y-i*40)/40].obj||map[b.x/40][(b.y-i*40)/40].boom)
			{
				dir1=0;
				if(b.time==0)
					map[b.x/40][(b.y-i*40)/40].distory=1;
				if(map[b.x/40][(b.y-i*40)/40].boom) 
				{
					int res=map[b.x/40][(b.y-i*40)/40].boom;
					while(res>1000) res-=1000;
					if(boom[res-1].time>10)
					{
						boom[res-1].time=10;
						PreBooming(boom[res-1]);
					}
				}
			}
			else if(i<b.power)
			{
				map[b.x/40][(b.y-i*40)/40].goods=0;
				map[b.x/40][(b.y-i*40)/40].boomingdir=1;
				if(b.time>=2)
				map[b.x/40][(b.y-i*40)/40].booming=1;
				else
				map[b.x/40][(b.y-i*40)/40].booming=2;
			}
			else if(i==b.power)
			{
				map[b.x/40][(b.y-i*40)/40].goods=0;
				map[b.x/40][(b.y-i*40)/40].boomingdir=1;
				map[b.x/40][(b.y-i*40)/40].booming=2;
			}
		}
		if(b.y+i*40<=600-40&&dir2)
		{
			if(map[b.x/40][(b.y+i*40)/40].obj||map[b.x/40][(b.y+i*40)/40].boom)
			{
				dir2=0;
				if(b.time==0)
					map[b.x/40][(b.y+i*40)/40].distory=1;
				if(map[b.x/40][(b.y+i*40)/40].boom) 
				{
					int res=map[b.x/40][(b.y+i*40)/40].boom;
					while(res>1000) res-=1000;
					if(boom[res-1].time>10)
					{
						boom[res-1].time=10;
						PreBooming(boom[res-1]);
					}
				}
			}
			else if(i<b.power)
			{
				map[b.x/40][(b.y+i*40)/40].goods=0;
				map[b.x/40][(b.y+i*40)/40].boomingdir=2;
				if(b.time>=2)
				map[b.x/40][(b.y+i*40)/40].booming=1;
				else
				map[b.x/40][(b.y+i*40)/40].booming=2;
			}
			else if(i==b.power)
			{
				map[b.x/40][(b.y+i*40)/40].goods=0;
				map[b.x/40][(b.y+i*40)/40].boomingdir=2;
				map[b.x/40][(b.y+i*40)/40].booming=2;
			}
		}
		if(b.x-i*40>=0&&dir3)
		{
			if(map[(b.x-i*40)/40][b.y/40].obj||map[(b.x-i*40)/40][b.y/40].boom)
			{
				dir3=0;
				if(b.time==0)
					map[(b.x-i*40)/40][b.y/40].distory=1;
				if(map[(b.x-i*40)/40][b.y/40].boom) 
				{
					int res=map[(b.x-i*40)/40][b.y/40].boom;
					while(res>1000) res-=1000;
					if(boom[res-1].time>10)
					{
						boom[res-1].time=10;
						PreBooming(boom[res-1]);
					}
				}
			}	
			else if(i<b.power)
			{
				map[(b.x-i*40)/40][b.y/40].goods=0;
				map[(b.x-i*40)/40][b.y/40].boomingdir=3;
				if(b.time>=2)
				map[(b.x-i*40)/40][b.y/40].booming=1;
				else
				map[(b.x-i*40)/40][b.y/40].booming=2;
			}
			else if(i==b.power)
			{
				map[(b.x-i*40)/40][b.y/40].goods=0;
				map[(b.x-i*40)/40][b.y/40].boomingdir=3;
				map[(b.x-i*40)/40][b.y/40].booming=2;
			}
		}
		if(b.x+i*40<=1000-40&&dir4)
		{
			if(map[(b.x+i*40)/40][b.y/40].obj||map[(b.x+i*40)/40][b.y/40].boom)
			{
				dir4=0;
				if(b.time==0)
					map[(b.x+i*40)/40][b.y/40].distory=1;
				if(map[(b.x+i*40)/40][b.y/40].boom) 
				{
					int res=map[(b.x+i*40)/40][b.y/40].boom;
					while(res>1000) res-=1000;
					if(boom[res-1].time>10)
					{
						boom[res-1].time=10;
						PreBooming(boom[res-1]);
					}
				}
			}
			else if(i<b.power)
			{
				map[(b.x+i*40)/40][b.y/40].goods=0;
				map[(b.x+i*40)/40][b.y/40].boomingdir=4;
				if(b.time>=2)
				map[(b.x+i*40)/40][b.y/40].booming=1;
				else
				map[(b.x+i*40)/40][b.y/40].booming=2;
			}
			else if(i==b.power)
			{
				map[(b.x+i*40)/40][b.y/40].goods=0;
				map[(b.x+i*40)/40][b.y/40].boomingdir=4;
				map[(b.x+i*40)/40][b.y/40].booming=2;
			}
		}
	}
}
void Boom(HDC hdc)
{
	int i,j;
	for(i=0;i<boomnum;i++)
	{
		boom[i].time--;
		if(boom[i].time%8==0)
		{
			boom[i].num++;
			if(boom[i].num==3) boom[i].num=0;
		}
	}
	for(i=0;i<boomnum;i++)
	{
		if(boom[i].time<=10)
		{
			PreBooming(boom[i]);
			if(boom[i].time<=0)
			{
				if(map[boom[i].x/40][boom[i].y/40].boom<2000)
				player.boomn--;
				else
				robot.boomn--;
				map[boom[i].x/40][boom[i].y/40].boom=0;
				for(j=i;j<boomnum-1;j++)
				{
					boom[j].x=boom[j+1].x;
					boom[j].y=boom[j+1].y;
					boom[j].time=boom[j+1].time;
					boom[j].num=boom[j+1].num;
					boom[j].power=boom[j+1].power;
					int res=map[boom[j].x/40][boom[j].y/40].boom;
					while(res>1000) res-=1000;
					if(res-1>i)
					map[boom[j].x/40][boom[j].y/40].boom--;
				}
				boomnum--;
				i--;
			}
		}
	}
}
void Move(HDC hdc)
{
	int h;
	//先在mdc中贴上背景图SRCPAINT  SRCAND
	//按照目前的移动方向取出对应人物的连续走动图,并确定截取人物图的宽度与高度
	SelectObject(bufdc,people);
	SelectObject(bufdc1,peoplebg);
	switch(dir)
	{
		case 0:
			h = 171;
			break;
		case 1:
			h = 0;
			break;
		case 2:
			h = 114;
			break;
		case 3:
			h = 57;
			break;
	}
	//按照目前的X,Y的值在mdc上进行透明贴图,然后显示在窗口画面上
	int i=(x+20)/40;
	int j=(y+20)/40;
	RECT p;
	p.left=(x+1)/40;
	p.right=(x+39)/40;
	p.top=(y+1)/40;
	p.bottom=(y+39)/40;
	if(map[i][j].goods)
	{
		if(map[i][j].goods==1||map[i][j].goods==2)
		{
			if(player.boomlimit<10)
			player.boomlimit++;
		}
		else if(map[i][j].goods==7||map[i][j].goods==8)
		{
			if(player.power<7)
			player.power++;
		}
		else if(map[i][j].goods==9||map[i][j].goods==10)
		{
			if(player.speed<3)
			player.speed++;
		}
		map[i][j].goods=0;
	}
	if(keyd)
	{
		moveloop++;
		switch(dir)
		{
			case 0:
				if(!(y-(8+4*player.speed)<j*40&&j>0&&(map[i][j-1].obj||map[i][j-1].boom)))
				{
					if(y-(8+4*player.speed)<j*40&&j>0&&(map[p.left][j-1].obj||map[p.left][j-1].boom))
					{
						x+=5;
						if(x>i*40) x=i*40;
					}
					else if(y-(8+4*player.speed)<j*40&&j>0&&(map[p.right][j-1].obj||map[p.right][j-1].boom))
					{
						x-=5;
						if(x<(i+1)*40) x=i*40;
					}
					else 
					{
						y-=8+4*player.speed;
						if(y<0) y=0;
					}
				}
				else
				{
					y=j*40;
				}
				if(y-(8+4*player.speed)<j*40&&j>1&&map[i][j-1].obj==10&&map[i][j-2].obj==0&&map[i][j-2].boom==0&&!map[i][j-1].moveBox)
				{
					map[i][j-1].moveBox=10;
				}
				break;
			case 1:
				if(!(y+40+8+4*player.speed>(j+1)*40&&j<14&&(map[i][j+1].obj||map[i][j+1].boom)))
				{
					if((y+40+8+4*player.speed>(j+1)*40&&j<14&&(map[p.left][j+1].obj||map[p.left][j+1].boom)))
					{
						x+=5;
						if(x>i*40) x=i*40;
					}
					else if((y+40+8+4*player.speed>(j+1)*40&&j<14&&(map[p.right][j+1].obj||map[p.right][j+1].boom)))
					{
						x-=5;
						if(x<(i+1)*40) x=i*40;
					}
					else 
					{
						y+=8+4*player.speed;
						if(y>600-40) y=600-40;
					}
				}
				else 
				{
					y=j*40;
				}
				if(y+40+8+4*player.speed>(j+1)*40&&j<13&&map[i][j+1].obj==10&&map[i][j+2].obj==0&&map[i][j+2].boom==0&&!map[i][j+1].moveBox)
				{
					map[i][j+1].moveBox=20;
				}
				break;
			case 2:
				if(!(x-(8+4*player.speed)<i*40&&i>0&&(map[i-1][j].obj||map[i-1][j].boom)))
				{
					if(x-(8+4*player.speed)<i*40&&i>0&&(map[i-1][p.top].obj||map[i-1][p.top].boom))
					{
						y+=5;
						if(y>j*40) y=j*40;
					}
					else if(x-(8+4*player.speed)<i*40&&i>0&&(map[i-1][p.bottom].obj||map[i-1][p.bottom].boom))
					{
						y-=5;
						if(y<(j+1)*40) y=j*40;
					}
					else 
					{
						x-=8+4*player.speed;
						if(x<0) x=0;
					}
				}
				else
				{
					x=i*40;
				}
				if(x-(8+4*player.speed)<i*40&&i>1&&map[i-1][j].obj==10&&map[i-2][j].obj==0&&map[i-2][j].boom==0&&!map[i-1][j].moveBox)
				{
					map[i-1][j].moveBox=30;
				}
				break;
			case 3:
				if(!(x+40+8+4*player.speed>(i+1)*40&&i<24&&(map[i+1][j].obj||map[i+1][j].boom)))
				{
					if(x+40+8+4*player.speed>(i+1)*40&&i<24&&(map[i+1][p.top].obj||map[i+1][p.top].boom))
					{
						y+=5;
						if(y>j*40) y=j*40;
					}
					else if(x+40+8+4*player.speed>(i+1)*40&&i<24&&(map[i+1][p.bottom].obj||map[i+1][p.bottom].boom))
					{
						y-=5;
						if(y<(j+1)*40) y=j*40;
					}
					else 
					{
						x+=8+4*player.speed;
						if(x>1000-40) x=1000-40;
					}
				}
				else
				{
					x=i*40;
				}
				if((x+40+8+4*player.speed)>(i+1)*40&&i<23&&map[i+1][j].obj==10&&map[i+2][j].obj==0&&map[i+2][j].boom==0&&!map[i+1][j].moveBox)
				{
					map[i+1][j].moveBox=40;
				}
				break;
		}
		if(moveloop==2)
		{
			num++;
			if(num>=4) num=0;
			BitBlt(mdc,x+mx-4,y+my-17,48,57,bufdc1,num*48,h,SRCAND);
			BitBlt(mdc,x+mx-4,y+my-17,48,57,bufdc,num*48,h,SRCPAINT);
			moveloop=0;
		}
		else 
		{
			BitBlt(mdc,x+mx-4,y+my-17,48,57,bufdc1,num*48,h,SRCAND);
			BitBlt(mdc,x+mx-4,y+my-17,48,57,bufdc,num*48,h,SRCPAINT);
		}
	}
	else 
	{
		BitBlt(mdc,x+mx-4,y+my-17,48,57,bufdc1,0,h,SRCAND);
		BitBlt(mdc,x+mx-4,y+my-17,48,57,bufdc,0,h,SRCPAINT);
	}
	i=(x+20)/40;
	j=(y+20)/40+1;
	if(j<15)
	{
		if(map[i][j].obj)
		{
			if(map[i][j].obj/10==1&&!map[i][j].moveBox)
			{
				SelectObject(bufdc,mobj1);
				SelectObject(bufdc1,mobj1bg);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc1,0,0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
			}
			else if(map[i][j].obj/10==2)
			{
				SelectObject(bufdc,mobj2);
				SelectObject(bufdc1,mobj2bg);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc1,40*(map[i][j].obj-20),0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc,40*(map[i][j].obj-20),0,SRCPAINT);
			}
		}
		i--;
		if(i>=0&&map[i][j].obj)
		{
			if(map[i][j].obj/10==1&&!map[i][j].moveBox)
			{
				SelectObject(bufdc,mobj1);
				SelectObject(bufdc1,mobj1bg);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc1,0,0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
			}
			else if(map[i][j].obj/10==2)
			{
				SelectObject(bufdc,mobj2);
				SelectObject(bufdc1,mobj2bg);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc1,40*(map[i][j].obj-20),0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc,40*(map[i][j].obj-20),0,SRCPAINT);
			}
		}
		i+=2;
		if(i<20&&map[i][j].obj&&!map[i][j].moveBox)
		{
			if(map[i][j].obj/10==1)
			{
				SelectObject(bufdc,mobj1);
				SelectObject(bufdc1,mobj1bg);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc1,0,0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
			}
			else if(map[i][j].obj/10==2)
			{
				SelectObject(bufdc,mobj2);
				SelectObject(bufdc1,mobj2bg);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc1,40*(map[i][j].obj-20),0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc,40*(map[i][j].obj-20),0,SRCPAINT);
			}
		}
	}
}
int isDead()
{
	char s[100];
	sprintf(s,"%d %d %d",(x+20)/40,(y+20)/40,map[(x+20)/40][(x+20)/40].booming);
	//MessageBox(NULL,s,NULL,MB_OK);
	if(map[(x+20)/40][(y+20)/40].booming)
	{
		return 1;
	}
	if(map[(robot.x+20)/40][(robot.y+20)/40].booming)
	{
		return 2;
	}
	return 0;
}
void Obj(HDC hdc)
{
	int i,j;
	static int goodsloop=0;
	for(j=0;j<15;j++)
	{
		for(i=0;i<25;i++)
		{
			SelectObject(bufdc,mground);
			SelectObject(bufdc1,mgroundbg);
			BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,0,0,SRCAND);
			BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,40*map[i][j].ground,0,SRCPAINT);
		}
	}
	goodsloop++;
	for(j=0;j<15;j++)
	{
		for(i=0;i<25;i++)
		{
			if(map[i][j].distory&&map[i][j].obj/10==1)
			{
				map[i][j].obj=0;
				map[i][j].distory=0;
			}
			else if(map[i][j].obj)
			{
				if(map[i][j].obj/10==1)
				{
					SelectObject(bufdc,mobj1);
					SelectObject(bufdc1,mobj1bg);
					if(map[i][j].obj==10&&map[i][j].moveBox>=10)
					{
						map[i][j].moveBox++;
						int bx,by;
						switch(map[i][j].moveBox/10)
						{
							case 1:
								bx=0;
								by=-5*(map[i][j].moveBox%10);
								break;
							case 2:
								bx=0;
								by=5*(map[i][j].moveBox%10);
								break;
							case 3:
								bx=-5*(map[i][j].moveBox%10);
								by=0;
								break;
							case 4:
								bx=5*(map[i][j].moveBox%10);
								by=0;
								break;
						}
						BitBlt(mdc,i*40+mx+bx,j*40+my-4+by,40,44,bufdc1,0,0,SRCAND);
						BitBlt(mdc,i*40+mx+bx,j*40+my-4+by,40,44,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
						if(map[i][j].moveBox%10==8)
						{
							map[i][j].obj=0;
							switch(map[i][j].moveBox/10)
							{
								case 1:
									map[i][j-1].obj=10;
									map[i][j-1].goods=map[i][j].goods;
									break;
								case 2:
									map[i][j+1].obj=10;
									map[i][j+1].goods=map[i][j].goods;
									break;
								case 3:
									map[i-1][j].obj=10;
									map[i-1][j].goods=map[i][j].goods;
									break;
								case 4:
									map[i+1][j].obj=10;
									map[i+1][j].goods=map[i][j].goods;
									break;
							}
							map[i][j].moveBox=0;
							map[i][j].goods=0;
						}
					}
					else
					{
						BitBlt(mdc,i*40+mx,j*40+my-4,40,44,bufdc1,0,0,SRCAND);
						BitBlt(mdc,i*40+mx,j*40+my-4,40,44,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
					}
				}
				else if(map[i][j].obj/10==2)
				{
					SelectObject(bufdc,mobj2);
					SelectObject(bufdc1,mobj2bg);
					BitBlt(mdc,i*40+mx,j*40+my-16,40,56,bufdc1,40*(map[i][j].obj-20),0,SRCAND);
					BitBlt(mdc,i*40+mx,j*40+my-16,40,56,bufdc,40*(map[i][j].obj-20),0,SRCPAINT);
				}
			}
			else if(map[i][j].boom&&!map[i][j].booming)
			{
				SelectObject(bufdc,mboom);
				SelectObject(bufdc1,mboombg);
				int res=map[i][j].boom;
				while(res>1000) res-=1000;
				BitBlt(mdc,i*40+mx-5,j*40+my-5,45,45,bufdc1,boom[res-1].num*45,0,SRCAND);
				BitBlt(mdc,i*40+mx-5,j*40+my-5,45,45,bufdc,boom[res-1].num*45,0,SRCPAINT);
			}
			else if(map[i][j].booming)
			{
				SelectObject(bufdc,mbooming);
				SelectObject(bufdc1,mboomingbg);
				if(map[i][j].booming==3)
				{
					BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,0,0,SRCAND);
					BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,0,0,SRCPAINT);
				}
				else if(map[i][j].booming==2)
				{
					switch(map[i][j].boomingdir)
					{
						case 1:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,40,40,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,40,40,SRCPAINT);
							break;
						case 2:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,0,40,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,0,40,SRCPAINT);
							break;
						case 3:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,120,40,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,120,40,SRCPAINT);
							break;
						case 4:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,80,40,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,80,40,SRCPAINT);
							break;
					}
				}
				else if(map[i][j].booming==1)
				{
					switch(map[i][j].boomingdir)
					{
						case 1:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,40,0,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,40,0,SRCPAINT);
							break;
						case 2:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,40,0,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,40,0,SRCPAINT);
							break;
						case 3:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,80,0,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,80,0,SRCPAINT);
							break;
						case 4:
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc1,80,0,SRCAND);
							BitBlt(mdc,i*40+mx,j*40+my,40,40,bufdc,80,0,SRCPAINT);
							break;
					}
				}
				map[i][j].booming=0;
				map[i][j].boomingdir=0;
			}
			else if(map[i][j].goods)
			{
				static int goodsmove=0;
				if(goodsloop==5)
				{
					goodsloop=0;
					if(map[i][j].goods%2==1)
					goodsmove=3;
					else 
					goodsmove=0;
					switch(map[i][j].goods)
					{
						case 1:
							map[i][j].goods=2;
							break;
						case 2:
							map[i][j].goods=1;
							break;
						case 7:
							map[i][j].goods=8;
							break;
						case 8:
							map[i][j].goods=7;
							break;
						case 9:
							map[i][j].goods=10;
							break;
						case 10:
							map[i][j].goods=9;
							break;
					}
				}
				SelectObject(bufdc,goods);
				SelectObject(bufdc1,goodsbg);
				BitBlt(mdc,i*40+mx,j*40+my-5+goodsmove,40,45,bufdc1,(map[i][j].goods-1)*40,0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-5+goodsmove,40,45,bufdc,(map[i][j].goods-1)*40,0,SRCPAINT);
			}
		}
	}
}
void Music(HDC hdc)
{
	//PlaySound(TEXT("ppt.wav"),NULL,SND_FILENAME | SND_ASYNC);
	static int alltime,isMusic=1,currenttime,i=0;
	static TCHAR time[345],timeon[345];
	static TCHAR MusicPath[100],Play[100];
	if(!i)
	{
		i++;
		if(i==20) i=0;
		return;
	}
	if(isMusic)
	{
		strcpy(MusicPath,"ppt.mp3");
		sprintf(Play,"play %s",MusicPath);
		mciSendString(Play,"",0,NULL);
	//	isMusic=0;
		
	}
	/*wsprintf(time,"status %s length",MusicPath);
		mciSendString(time,timeon,345,NULL);
		alltime=atoi(timeon)/1000;
		MessageBox(NULL,timeon,NULL,MB_OK);
	wsprintf(time,"status %s position",MusicPath);
	mciSendString(time,timeon,345,NULL);
	currenttime=atoi(timeon)/1000;
	if(currenttime==0)
		isMusic=1;*/
}
int searchPath(int& sx,int& sy,int& ex,int& ey,int epath[900],int &pathnum,int robotMap[30][30],int d)
{
	robotMap[ex][ey]=0;
	int dir[4][2]={0,-1,0,1,-1,0,1,0};
	int save[900][2],path[30][30];
	int i,j,k;
	int front=1,rear=1,newx,newy;
	int end=0;
	memset(path,0,sizeof(path));
	save[rear][0]=sx;
	save[rear++][1]=sy;
	path[sx][sy]=5;
	while(front<rear)
	{
		if(end) break;
		for(i=0;i<4;i++)
		{
			newx=save[front][0]+dir[i][0];
			newy=save[front][1]+dir[i][1];
			if(newx>=0&&newx<25&&newy>=0&&newy<15&&!path[newx][newy]&&robotMap[newx][newy]!=1&&robotMap[newx][newy]!=d)
			{
				save[rear][0]=newx;
				save[rear++][1]=newy;
				path[newx][newy]=i+1;
				if(newx==ex&&newy==ey) end=1;
			}
		}
		front++;
	}
	if(!end) return 0;
	else
	{
		int epath1[900];
		int num=0;
		newx=ex;
		newy=ey;
		while(newx!=sx||newy!=sy)
		{
			epath1[num++]=path[newx][newy]-1;
			int newx1=newx;
			int newy1=newy;
			newx-=dir[path[newx1][newy1]-1][0];
			newy-=dir[path[newx1][newy1]-1][1];
		}
		j=num;
		for(i=0;i<num;i++)
		epath[i]=epath1[--j];
		pathnum=num;
		return 1;
	}
}
int isDangous(int rx,int ry,int robotMap[30][30])
{
	int i,j;
	for(i=0;i<25;i++)
	{
		for(j=0;j<15;j++)
		{
			robotMap[i][j]=0;
		}
	}
	for(i=0;i<25;i++)
	{
		for(j=0;j<15;j++)
		{
			if(map[i][j].obj)
			{
				robotMap[i][j]=1;
			}
			if(map[i][j].booming)
			robotMap[i][j]=1;
			if(map[i][j].boom)
			{
				robotMap[i][j]=1;
				int k,res=map[i][j].boom;
				while(res>1000) res-=1000;	
				int dir1=1,dir2=1,dir3=1,dir4=1;
				for(k=1;k<=boom[res-1].power;k++)
				{
					if(j-k>=0&&!map[i][j-k].obj&&dir1)
					{
						if(boom[res-1].time<=20)
						robotMap[i][j-k]=1;
						else
						robotMap[i][j-k]=2;
					}
					else
					dir1=0;
					if(j+k<15&&!map[i][j+k].obj&&dir2)
					{
						if(boom[res-1].time<=20)
						robotMap[i][j+k]=1;
						else
						robotMap[i][j+k]=2;
					}
					else
					dir2=0;
					if(i-k>=0&&!map[i-k][j].obj&&dir3)
					{
						if(boom[res-1].time<=20)
						robotMap[i-k][j]=1;
						else
						robotMap[i-k][j]=2;
					}
					else
					dir3=0;
					if(i+k<25&&!map[i+k][j].obj&&dir4)
					{
						if(boom[res-1].time<=20)
						robotMap[i+k][j]=1;
						else
						robotMap[i+k][j]=2;
					}
					else
					dir4=0;
				}
			}
		}
	}
	if(robotMap[rx][ry]) return 1;
	else return 0;
}
int findSafeplace(int& sx,int& sy,int map[30][30])
{
	sx=sy=-1;
	int bx1=(robot.x+20)/40-6;
	if(bx1<0) bx1=0;
	int by1=(robot.y+20)/40-6;
	if(by1<0) by1=0;
	int i,j;
	int path[900],pathnum,rx=(robot.x+20)/40,ry=(robot.y+20)/40;
	for(i=bx1;i<bx1+12&&i<25;i++)
	{
		for(j=by1;j<by1+12&&j<15;j++)
		{
			if(!map[i][j]&&(sx==-1||(i-(robot.x+20)/40)*(i-(robot.x+20)/40)+(j-(robot.y+20)/40)*(j-(robot.y+20)/40)
				<(sx-(robot.x+20)/40)*(sx-(robot.x+20)/40)+(sy-(robot.y+20)/40)*(sy-(robot.y+20)/40)))
			{
				
				if(searchPath(rx,ry,i,j,path,pathnum,map,1))
				{
					sx=i;
					sy=j;
				}
			}
		}
	}
	if(sx==-1) return 0;
	else return 1;
}
int findGoods(int& sx,int& sy)
{
	sx=sy=-1;
	int bx1=(robot.x+20)/40-6;
	if(bx1<0) bx1=0;
	int by1=(robot.y+20)/40-6;
	if(by1<0) by1=0;
	int i,j;
	for(i=bx1;i<bx1+12&&i<25;i++)
	{
		for(j=by1;j<by1+12&&j<15;j++)
		{
			if(map[i][j].goods&&!map[i][j].obj&&(sx==-1||(i-(robot.x+20)/40)*(i-(robot.x+20)/40)+(j-(robot.y+20)/40)*(j-(robot.y+20)/40)
				<(sx-(robot.x+20)/40)*(sx-(robot.x+20)/40)+(sy-(robot.y+20)/40)*(sy-(robot.y+20)/40)))
			{
				sx=i;
				sy=j;
			}
		}
	}
	if(sx==-1) return 0;
	else return 1;
}
int findObj1(int &sx,int& sy,int robotMap[30][30])
{
	sx=sy=-1;
	int bx1=(robot.x+20)/40-6;
	if(bx1<0) bx1=0;
	int by1=(robot.y+20)/40-6;
	if(by1<0) by1=0;
	int i,j;
	int path[900],pathnum;
	int rx=(robot.x+20)/40,ry=(robot.y+20)/40;
	for(i=bx1;i<bx1+12&&i<25;i++)
	{
		for(j=by1;j<by1+12&&j<15;j++)
		{
			if(map[i][j].obj/10==1&&(sx==-1||(i-(robot.x+20)/40)*(i-(robot.x+20)/40)+(j-(robot.y+20)/40)*(j-(robot.y+20)/40)
				<(sx-(robot.x+20)/40)*(sx-(robot.x+20)/40)+(sy-(robot.y+20)/40)*(sy-(robot.y+20)/40)))
			{
				if(searchPath(rx,ry,i,j,path,pathnum,robotMap,2))
				{
					sx=i;
					sy=j;
				}
			}
		}
	}
	if(sx==-1) return 0;
	else return 1;
}
void Robot(HDC hdc)
{
	int px=(x+20)/40,py=(y+20)/40;
	int x=robot.x;
	int y=robot.y;
	int j=(y+20)/40;
	int i=(x+20)/40;
	int k;
	int robotMap[30][30];
	int safex,safey,path[900],pathnum;
	/*if(robot.x+robot.premove/10*8>=0&&robot.x+robot.premove/10*8<=1000-40&&robot.y+robot.premove%10*8>=0&&robot.y+robot.premove%10*8<=600-40
		&&!map[(robot.x+robot.premove/10*8)/40][(robot.y+robot.premove%10*8)/40].boom&&!map[(robot.x+robot.premove/10*8)/40][(robot.y+robot.premove%10*8)/40].obj)
	{
		
	}
	else
	{
		for(i=0;i<4;i++)
		{
			if(robot.x+dir[i][0]*8>=0&&robot.x+dir[i][0]*8<=1000-40&&robot.y+dir[i][1]*8>=0&&robot.y+dir[i][1]*8<600-40
				&&!map[(robot.x+dir[i][0]*8)/40][(robot.y+dir[i][1]*8)/40].boom&&!map[(robot.x+dir[i][0]*8)/40][(robot.y+dir[i][1]*8)/40].obj)
			{
				if(rand()%2==1)
				robot.dir=i;
				break;
			}
		}
	}*/
	int t1,t2,t3,t4,t5,t6;
	t1=isDangous(i,j,robotMap);
	if(t1)
	{
		t2=findSafeplace(safex,safey,robotMap);
		if(t2)
		{
			t3=searchPath(i,j,safex,safey,path,pathnum,robotMap,1);
			if(t3)
			{
				robot.planstep=pathnum;
				for(k=1;k<=robot.planstep;k++)
				{
					robot.plan[k]=path[k-1];
					robot.plan1[k]=0;
				}
				robot.stepnow=1;
				robot.move=1;
			}
		}
	}
	/*char s[100];
	sprintf(s,"%d %d %d %d",t1,robotMap[i][j],t2,t3);
	MessageBox(NULL,s,NULL,MB_OK);*/
	else
	{
		int gx,gy;
		t5=findGoods(gx,gy);
		if(t5)
		{
			if(searchPath(i,j,gx,gy,path,pathnum,robotMap,2))
			{
				robot.planstep=pathnum;
				for(k=1;k<=robot.planstep;k++)
				{
					robot.plan[k]=path[k-1];
					robot.plan1[k]=0;
				}
				robot.stepnow=1;
				robot.move=1;
			}
		}
		else
		{
			//if((i-1>=0&&map[i-1][j].obj/10==1||i+1<25&&map[i+1][j].obj/10==1||
			//	j-1>=0&&map[i][j-1].obj/10==1||j+1<15&&map[i][j+1].obj/10==1)&&!robot.boomn&&!map[i][j].boom)
			int obj1x,obj1y;
			t6=findObj1(obj1x,obj1y,robotMap);
			if(t6)
			{
				if(searchPath(i,j,obj1x,obj1y,path,pathnum,robotMap,2))
				{
					robot.planstep=pathnum;
					for(k=1;k<=robot.planstep;k++)
					{
						robot.plan[k]=path[k-1];
						robot.plan1[k]=0;
					}
					if(!robot.boomn)
					robot.plan1[robot.planstep]=2;
					robot.stepnow=1;	
					robot.move=1;
				}
			}
			else
			{
				if(searchPath(i,j,px,py,path,pathnum,robotMap,2))
				{
					robot.planstep=pathnum;
					for(k=1;k<=robot.planstep;k++)
					{
						robot.plan[k]=path[k-1];
						robot.plan1[k]=0;
					}
					for(k=robot.planstep;k>=robot.planstep-4&&k>=0;k--)
					robot.plan1[k]=1;
					robot.stepnow=1;
					robot.move=1;
				}
			}
			//char s[100];
			//sprintf(s,"%d %d %d %d %d %d",t1,t2,t3,obj1x,obj1y,t6);
			//MessageBox(NULL,s,NULL,MB_OK);
		}
	}
	/*char s[100];
	sprintf(s,"%d %d %d %d %d %d",t1,t2,t3,safex,safey,t6);*/
	//if(i==21&&j==9)
	//MessageBox(NULL,s,NULL,MB_OK);
	/*if(!map[(x+20)/40][(y+20)/40].boom&&robot.boomlimit>robot.boomn)
	{
		boom[boomnum].x=(x+20)/40*40;
		boom[boomnum].y=(y+20)/40*40;
		boom[boomnum].time=70;
		boom[boomnum].num=0;
		boom[boomnum].power=robot.power;
		map[boom[boomnum].x/40][boom[boomnum].y/40].boom=2000+boomnum+1;
		boomnum++;
		robot.boomn++;
	}
	switch(robot.dir)
		{
			case 0:
				if((y-(8+4*robot.speed)<j*40&&j>0&&(map[i][j-1].obj||map[i][j-1].boom))||y-(8+4*robot.speed)<0)
				{
					srand((unsigned)time(NULL));
					for(k=0;k<4;k++)
					if(rand()%2==1)
					robot.dir=k;
				}
				break;
			case 1:
				if((y+40+8+4*robot.speed>(j+1)*40&&j<14&&(map[i][j+1].obj||map[i][j+1].boom))||y+40+8+4*robot.speed>600)
				{
					srand((unsigned)time(NULL));
					for(k=0;k<4;k++)
					if(rand()%2==1)
					robot.dir=k;
				}
				break;
			case 2:
				if((x-(8+4*robot.speed)<i*40&&i>0&&(map[i-1][j].obj||map[i-1][j].boom))||x-(8+4*robot.speed)<0)
				{
					srand((unsigned)time(NULL));
					for(k=0;k<4;k++)
					if(rand()%2==1)
					robot.dir=k;
				}
				break;
			case 3:
				if((x+40+8+4*robot.speed>(i+1)*40&&i<24&&(map[i+1][j].obj||map[i+1][j].boom))||x+40+8+4*robot.speed>1000)
				{
					srand((unsigned)time(NULL));
					for(k=0;k<4;k++)
					if(rand()%2==1)
					robot.dir=k;
				}
				break;
		}*/
	if(robot.stepnow>robot.planstep)
		robot.move=0;
	robot.dir=robot.plan[robot.stepnow];
	SelectObject(bufdc,mrobot);
	SelectObject(bufdc1,mrobotbg);
	int h;
	//先在mdc中贴上背景图SRCPAINT  SRCAND
	//按照目前的移动方向取出对应人物的连续走动图,并确定截取人物图的宽度与高度
	switch(robot.dir)
	{
		case 0:
			h = 168;
			break;
		case 1:
			h = 0;
			break;
		case 2:
			h = 112;
			break;
		case 3:
			h = 56;
			break;
	}
	//按照目前的X,Y的值在mdc上进行透明贴图,然后显示在窗口画面上
	RECT p;
	p.left=(x+1)/40;
	p.right=(x+39)/40;
	p.top=(y+1)/40;
	p.bottom=(y+39)/40;
	if(map[i][j].goods)
	{
		if(map[i][j].goods==1||map[i][j].goods==2)
		{
			if(robot.boomlimit<10)
			robot.boomlimit++;
		}
		else if(map[i][j].goods==7||map[i][j].goods==8)
		{
			if(robot.power<7)
			robot.power++;
		}
		else if(map[i][j].goods==9||map[i][j].goods==10)
		{
			if(robot.speed<3)
			robot.speed++;
		}
		map[i][j].goods=0;
	}
	if(robot.plan1[robot.stepnow]&&robot.boomn<robot.boomlimit&&!map[i][j].boom)
	{
		boom[boomnum].x=(x+20)/40*40;
		boom[boomnum].y=(y+20)/40*40;
		boom[boomnum].time=70;
		boom[boomnum].num=0;
		boom[boomnum].power=robot.power;
		map[boom[boomnum].x/40][boom[boomnum].y/40].boom=2000+boomnum+1;
		boomnum++;
		robot.boomn++;
	}
	if(robot.move)
	{
		robot.moveloop++;
		switch(robot.dir)
		{
			case 0:
				if(!(y-(8+4*robot.speed)<j*40&&j>0&&(map[i][j-1].obj||map[i][j-1].boom)))
				{
					if(y-(8+4*robot.speed)<j*40&&j>0&&(map[p.left][j-1].obj||map[p.left][j-1].boom))
					{
						x+=5;
						if(x>i*40) x=i*40;
					}
					else if(y-(8+4*robot.speed)<j*40&&j>0&&(map[p.right][j-1].obj||map[p.right][j-1].boom))
					{
						x-=5;
						if(x<(i+1)*40) x=i*40;
					}
					else 
					{
						y-=8+4*robot.speed;
						if(y<0) y=0;
					}
				}
				else
				{
					y=j*40;
				}
				if(y-(8+4*robot.speed)<j*40&&j>1&&map[i][j-1].obj==10&&map[i][j-2].obj==0&&map[i][j-2].boom==0&&!map[i][j-1].moveBox)
				{
					map[i][j-1].moveBox=10;
				}
				break;
			case 1:
				if(!(y+40+8+4*robot.speed>(j+1)*40&&j<14&&(map[i][j+1].obj||map[i][j+1].boom)))
				{
					if((y+40+8+4*robot.speed>(j+1)*40&&j<14&&(map[p.left][j+1].obj||map[p.left][j+1].boom)))
					{
						x+=5;
						if(x>i*40) x=i*40;
					}
					else if((y+40+8+4*robot.speed>(j+1)*40&&j<14&&(map[p.right][j+1].obj||map[p.right][j+1].boom)))
					{
						x-=5;
						if(x<(i+1)*40) x=i*40;
					}
					else 
					{
						y+=8+4*robot.speed;
						if(y>600-40) y=600-40;
					}
				}
				else 
				{
					y=j*40;
				}
				if(y+40+8+4*robot.speed>(j+1)*40&&j<13&&map[i][j+1].obj==10&&map[i][j+2].obj==0&&map[i][j+2].boom==0&&!map[i][j+1].moveBox)
				{
					map[i][j+1].moveBox=20;
				}
				break;
			case 2:
				if(!(x-(8+4*robot.speed)<i*40&&i>0&&(map[i-1][j].obj||map[i-1][j].boom)))
				{
					if(x-(8+4*robot.speed)<i*40&&i>0&&(map[i-1][p.top].obj||map[i-1][p.top].boom))
					{
						y+=5;
						if(y>j*40) y=j*40;
					}
					else if(x-(8+4*robot.speed)<i*40&&i>0&&(map[i-1][p.bottom].obj||map[i-1][p.bottom].boom))
					{
						y-=5;
						if(y<(j+1)*40) y=j*40;
					}
					else 
					{
						x-=8+4*robot.speed;
						if(x<0) x=0;
					}
				}
				else
				{
					x=i*40;
				}
				if(x-(8+4*robot.speed)<i*40&&i>1&&map[i-1][j].obj==10&&map[i-2][j].obj==0&&map[i-2][j].boom==0&&!map[i-1][j].moveBox)
				{
					map[i-1][j].moveBox=30;
				}
				break;
			case 3:
				if(!(x+40+8+4*robot.speed>(i+1)*40&&i<24&&(map[i+1][j].obj||map[i+1][j].boom)))
				{
					if(x+40+8+4*robot.speed>(i+1)*40&&i<24&&(map[i+1][p.top].obj||map[i+1][p.top].boom))
					{
						y+=5;
						if(y>j*40) y=j*40;
					}
					else if(x+40+8+4*robot.speed>(i+1)*40&&i<24&&(map[i+1][p.bottom].obj||map[i+1][p.bottom].boom))
					{
						y-=5;
						if(y<(j+1)*40) y=j*40;
					}
					else 
					{
						x+=8+4*robot.speed;
						if(x>1000-40) x=1000-40;
					}
				}
				else
				{
					x=i*40;
				}
				if((x+40+8+4*robot.speed)>(i+1)*40&&i<23&&map[i+1][j].obj==10&&map[i+2][j].obj==0&&map[i+2][j].boom==0&&!map[i+1][j].moveBox)
				{
					map[i+1][j].moveBox=40;
				}
				break;
		}
		if(robot.moveloop==2)
		{
			robot.num++;
			if(robot.num>=4) robot.num=0;
			BitBlt(mdc,x+mx-4,y+my-14,48,54,bufdc1,robot.num*48,h,SRCAND);
			BitBlt(mdc,x+mx-4,y+my-14,48,54,bufdc,robot.num*48,h,SRCPAINT);
			robot.moveloop=0;
		}
		else 
		{
			BitBlt(mdc,x+mx-4,y+my-14,48,54,bufdc1,robot.num*48,h,SRCAND);
			BitBlt(mdc,x+mx-4,y+my-14,48,54,bufdc,robot.num*48,h,SRCPAINT);
		}
	}
	else 
	{
		BitBlt(mdc,x+mx-4,y+my-14,48,54,bufdc1,0,h,SRCAND);
		BitBlt(mdc,x+mx-4,y+my-14,48,54,bufdc,0,h,SRCPAINT);
	}
	if(((robot.x+20)/40!=i||(robot.y+20/40)!=j)&&robot.stepnow<=robot.planstep)
		robot.stepnow++;
	robot.x=x;
	robot.y=y;
	i=(x+20)/40;
	j=(y+20)/40+1;
	if(j<15)
	{
		if(map[i][j].obj)
		{
			if(map[i][j].obj/10==1&&!map[i][j].moveBox)
			{
				SelectObject(bufdc,mobj1);
				SelectObject(bufdc1,mobj1bg);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc1,0,0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
			}
			else if(map[i][j].obj/10==2)
			{
				SelectObject(bufdc,mobj2);
				SelectObject(bufdc1,mobj2bg);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc1,40*(map[i][j].obj-20),0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc,40*(map[i][j].obj-20),0,SRCPAINT);
			}
		}
		i--;
		if(i>=0&&map[i][j].obj)
		{
			if(map[i][j].obj/10==1&&!map[i][j].moveBox)
			{
				SelectObject(bufdc,mobj1);
				SelectObject(bufdc1,mobj1bg);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc1,0,0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
			}
			else if(map[i][j].obj/10==2)
			{
				SelectObject(bufdc,mobj2);
				SelectObject(bufdc1,mobj2bg);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc1,40*(map[i][j].obj-20),0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc,40*(map[i][j].obj-20),0,SRCPAINT);
			}
		}
		i+=2;
		if(i<20&&map[i][j].obj&&!map[i][j].moveBox)
		{
			if(map[i][j].obj/10==1)
			{
				SelectObject(bufdc,mobj1);
				SelectObject(bufdc1,mobj1bg);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc1,0,0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-4,40,20,bufdc,40*(map[i][j].obj-10),0,SRCPAINT);
			}
			else if(map[i][j].obj/10==2)
			{
				SelectObject(bufdc,mobj2);
				SelectObject(bufdc1,mobj2bg);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc1,40*(map[i][j].obj-20),0,SRCAND);
				BitBlt(mdc,i*40+mx,j*40+my-16,40,40,bufdc,40*(map[i][j].obj-20),0,SRCPAINT);
			}
		}
	}
}

void MyPaint(HDC hdc)
{
	Music(hdc);
	SelectObject(mdc1,bg);
//	BitBlt(mdc1,0,0,rect.right,rect.bottom,bufdc,0,0,SRCCOPY);
	Boom(hdc);
	int t=isDead();
	Obj(hdc);
	Move(hdc);
	Robot(hdc);
	BitBlt(mdc1,32,44,1024,615,mdc,0,0,SRCCOPY);
	BitBlt(hdc,0,0,rect.right,rect.bottom,mdc1,0,0,SRCCOPY);
	tPre = GetTickCount();         //记录此次绘图时间	
	SelectObject(bufdc,bg2);
	BitBlt(mdc,0,0,rect.right,rect.bottom,bufdc,0,0,SRCCOPY);
	if(t==1)
	{
		MessageBox(NULL,TEXT("失败!"),NULL,MB_OK);
		x = 120;
		y = 80;
		robot.x=840;
		robot.y=420;
		robot.premove=-1;
		robot.move=1;
		robot.dir=3;
		dir = 1;
		num = 0;
		moveloop=0;
		keyd=0;
		boomnum=0;
		robot.boomn=player.boomn=0;
		robot.boomlimit=player.boomlimit=1;
		robot.power=player.power=1;
		robot.speed=player.speed=0;
		robot.dead=player.dead=0;
		memset(boom,0,sizeof(boom));
		memset(map,0,sizeof(map));
		freopen("map.txt","r",stdin);
		int i,j,k;
		for(j=0;j<15;j++)
		{
			for(i=0;i<25;i++)
			{
				scanf("%d %d",&map[i][j].ground,&map[i][j].obj);
				if(map[i][j].obj/10==1)
				{
					k=rand()%7;
					if(k==0)
					map[i][j].goods=1;
					else if(k==1)
					map[i][j].goods=7;
					else if(k==2)
					map[i][j].goods=9;
					else
					map[i][j].goods=0;
				}
				/*k=rand()%2;
				while(k==0) k=rand()%3;
				if(k==1)
				map[i][j].obj=10+rand()%3;
				else
				map[i][j].obj=20+rand()%4;*/
			}
		}
	}
	else if(t==2)
	{
		MessageBox(NULL,TEXT("成功!"),NULL,MB_OK);
		x = 120;
		y = 80;
		robot.x=840;
		robot.y=420;
		robot.premove=-1;
		robot.move=1;
		robot.dir=3;
		dir = 1;
		num = 0;
		moveloop=0;
		keyd=0;
		boomnum=0;
		robot.boomn=player.boomn=0;
		robot.boomlimit=player.boomlimit=1;
		robot.power=player.power=1;
		robot.speed=player.speed=0;
		robot.dead=player.dead=0;
		memset(boom,0,sizeof(boom));
		memset(map,0,sizeof(map));
		freopen("map.txt","r",stdin);
		int i,j,k;
		for(j=0;j<15;j++)
		{
			for(i=0;i<25;i++)
			{
				scanf("%d %d",&map[i][j].ground,&map[i][j].obj);
				if(map[i][j].obj/10==1)
				{
					k=rand()%7;
					if(k==0)
					map[i][j].goods=1;
					else if(k==1)
					map[i][j].goods=7;
					else if(k==2)
					map[i][j].goods=9;
					else
					map[i][j].goods=0;
				}
				/*k=rand()%2;
				while(k==0) k=rand()%3;
				if(k==1)
				map[i][j].obj=10+rand()%3;
				else
				map[i][j].obj=20+rand()%4;*/
			}
		}
	}
}

//****消息处理函数***********************************
// 1.按下【Esc】键结束程序
// 2.按下方向键重设贴图坐标
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int i,j;
	switch (message)
	{
		case WM_KEYDOWN:	     //按下键盘消息
			//判断按键的虚拟键码
			i=(x+20)/40;
			j=(y+20)/40;
			switch (wParam) 
			{
				case VK_ESCAPE:           //按下【Esc】键
					PostQuitMessage( 0 );  //结束程序
					break;
				case VK_UP:				  //按下【↑】键
					keyd=1;
					if(dir!=0) 
					{
						dir=0;
						num=0;
						if(!(y-1<j*40&&j>0&&(map[i][j-1].obj||map[i][j-1].boom)))
						{
							y-=5+3*player.speed;
							if(y<0) y=0;
						}
					}
					break;
				case VK_DOWN:			  //按下【↓】键
					keyd=2;
					if(dir!=1) 
					{
						dir=1;
						num=0;
						if(!(y+41>(j+1)*40&&j<15&&(map[i][j+1].obj||map[i][j+1].boom)))
						{
							y+=5+3*player.speed;
							if(y>600-40) y=600-40;
						}
					}
					break;
				case VK_LEFT:			  //按下【←】键
					keyd=3;
					if(dir!=2) 
					{
						dir=2;
						num=0;
						if(!(x-1<i*40&&i>0&&(map[i-1][j].obj||map[i-1][j].boom)))
						{
							x-=5+3*player.speed;
							if(x<0) x=0;
						}
					}

					break;
				case VK_RIGHT:			   //按下【→】键
					keyd=4;
					if(dir!=3) 
					{
						dir=3;
						num=0;
						if(!(x+41>(i+1)*40&&i<24&&(map[i+1][j].obj||map[i+1][j].boom)))
						{
							x+=5+3*player.speed;
							if(x>1000-40) x=1000-40;
						}
					}
					break;
				case VK_SPACE:
					if(!map[(x+20)/40][(y+20)/40].boom&&player.boomlimit>player.boomn)
					{
						boom[boomnum].x=(x+20)/40*40;
						boom[boomnum].y=(y+20)/40*40;
						boom[boomnum].time=70;
						boom[boomnum].num=0;
						boom[boomnum].power=player.power;
						/*char s[100];
						sprintf(s,"%d %d %d %d",boom[boomnum].x/40,boom[boomnum].y/40,map[boom[boomnum].x/40][boom[boomnum].y/40].boomnum,boomnum);
						MessageBox(NULL,s,NULL,MB_OK);*/
						map[boom[boomnum].x/40][boom[boomnum].y/40].boom=boomnum+1;
						boomnum++;
						player.boomn++;
					}
					break;
			}
			break;
		case WM_KEYUP:
			switch (wParam) 
			{
				case VK_UP:				  //按下【↑】键
					if(keyd==1)
						keyd=0;
				case VK_DOWN:			  //按下【↓】键
					if(keyd==2)
						keyd=0;
					break;
				case VK_LEFT:			  //按下【←】键
					if(keyd==3)
					keyd=0;
					break;
				case VK_RIGHT:			   //按下【→】键
					if(keyd==4)
						keyd=0;
					break;
			}
			break;
		case WM_DESTROY:			    	//窗口结束消息
			DeleteDC(mdc);
			DeleteDC(bufdc);
			DeleteDC(bufdc1);
			DeleteObject(people);
			DeleteObject(peoplebg);
			DeleteObject(mboom);
			DeleteObject(mboombg);
			DeleteObject(mbooming);
			DeleteObject(mboomingbg);
			DeleteObject(bg);
			ReleaseDC(hWnd,hdc);
			PostQuitMessage(0);
			break;
		default:							//其他消息
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}


 

抱歉!评论已关闭.