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

📄 main.cpp

📁 一个小游戏源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//换页
void Flip()
{
	RECT Window;
	POINT pt;
	GetClientRect(hwnd, &Window);
	pt.x=pt.y=0;
	ClientToScreen(hwnd, &pt);
	OffsetRect(&Window, pt.x, pt.y);

	HRESULT rval=lpDDSFront->Blt(&Window, lpDDSBack, NULL, DDBLT_WAIT, NULL);
	if(rval == DDERR_SURFACELOST) lpDDSFront->Restore();

	return ;
}

void DrawAll()
{
	int i;
	HRESULT rval;
//	HDC hdc;
	RECT rect,rect1;
	switch (GameStatus)
	{
	case 1:					//Game Normal
		//背景
		GetRect(&rect, 0, 0, 433, 348);
		rval=lpDDSBack->Blt( NULL, lpDDSBk, NULL, DDBLT_WAIT, NULL);
		if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		//画出老鼠
		for (i = 8;i>=0;i--)
		{
			if (mouse[i] > 0)
			{
				GetRect(&rect1,0,status[i]*85,124,85);
				GetRect(&rect,holepos[i].x, holepos[i].y, 124, 85);
				rval=lpDDSBack->Blt( &rect, lpDDSMouse[mouse[i]-1], &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
				if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
				if ((behit[i] >0)&&(status[i] ==4))
				{
					GetRect(&rect1,0,0,68,24);
					GetRect(&rect,mousepos[i].x, mousepos[i].y,68,24);
					rval=lpDDSBack->Blt( &rect, lpDDSBow, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
					if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
					GetRect(&rect1,0,0,43,25);
					GetRect(&rect,mousepos[i].x, holepos[i].y-20,43,25);
					switch (mouse[i])
					{
					case 1:
						rval=lpDDSBack->Blt( &rect, lpDDSScore[0], &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
						if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
						break;
					case 2:
						rval=lpDDSBack->Blt( &rect, lpDDSScore[1], &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
						if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
						break;
					case 3:
						rval=lpDDSBack->Blt( &rect, lpDDSScore[2], &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
						if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
						break;
					}
				}
			}
		}
		//画出木锤
		if (!hit)
		{
			GetRect(&rect1,0,0,68,68);
			GetRect(&rect,pos.x-34, pos.y-68, 68, 68);
			rval=lpDDSBack->Blt( &rect, lpDDSHammer, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
			if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		}
		else
		{
			GetRect(&rect1,0,68,68,68);
			GetRect(&rect,pos.x-34, pos.y-68, 68, 68);
			rval=lpDDSBack->Blt( &rect, lpDDSHammer, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
			if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		}
		
		GetRect(&rect1,0,0,45,13);
		GetRect(&rect,10, 10, 45, 13);
		rval=lpDDSBack->Blt( &rect, lpDDSTime, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
		if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		DrawNumber(lpDDSBack,lpDDSFig,time,60,7,16,23);
		DrawNumber(lpDDSBack,lpDDSHamfig,score,300,7,26,38);
		
		break;
	case 0:						//Game Starting
		//背景
		GetRect(&rect, 0, 0, 433, 348);
		rval=lpDDSBack->Blt( NULL, lpDDSBk, NULL, DDBLT_WAIT, NULL);
		if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		//画出老鼠
		for (i = 8;i>=0;i--)
		{
			if (mouse[i] > 0)
			{
				GetRect(&rect1,0,status[i]*85,124,85);
				GetRect(&rect,holepos[i].x, holepos[i].y, 124, 85);
				rval=lpDDSBack->Blt( &rect, lpDDSMouse[mouse[i]-1], &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
				if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
				if ((behit[i] >0)&&(status[i] ==4))
				{
					GetRect(&rect1,0,0,68,24);
					GetRect(&rect,mousepos[i].x, mousepos[i].y,68,24);
					rval=lpDDSBack->Blt( &rect, lpDDSBow, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
					if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
					GetRect(&rect1,0,0,43,25);
					GetRect(&rect,mousepos[i].x, holepos[i].y-20,43,25);
					rval=lpDDSBack->Blt( &rect, lpDDSScore[mouse[i]-1], &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
					if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
				}
			}
		}
		//画出木锤
		if (!hit)
		{
			GetRect(&rect1,0,0,68,68);
			GetRect(&rect,pos.x-34, pos.y-68, 68, 68);
			rval=lpDDSBack->Blt( &rect, lpDDSHammer, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
			if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		}
		else
		{
			GetRect(&rect1,0,68,68,68);
			GetRect(&rect,pos.x-34, pos.y-68, 68, 68);
			rval=lpDDSBack->Blt( &rect, lpDDSHammer, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
			if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		}
		GetRect(&rect1,0,0,319,56);
		GetRect(&rect,90,20,319,56);
		rval=lpDDSBack->Blt( &rect, lpDDSLogo, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
		if(rval == DDERR_SURFACELOST)    lpDDSBack->Restore();
		break;
	}
}

void InitData()
{
	int i;
	bActive = true;
	delay = 5;
	dwLastTickCount = 0;
	hit = false;
	get = false;
	time = 20;
	score = 0;

	RECT Window;
	GameStatus = 0;

	GetClientRect(hwnd, &Window);
	pt.x=pt.y=0;
	ClientToScreen(hwnd, &pt);

	//初始化老鼠洞位置
	holepos[0].x = 24;
	holepos[0].y = 215;
	holepos[1].x = 160;
	holepos[1].y = 215;
	holepos[2].x = 296;
	holepos[2].y = 215;
	holepos[3].x = 1;
	holepos[3].y = 150;
	holepos[4].x = 137;
	holepos[4].y = 150;
	holepos[5].x = 274;
	holepos[5].y = 150;
	holepos[6].x = 32;
	holepos[6].y = 87;
	holepos[7].x = 159;
	holepos[7].y = 87;
	holepos[8].x = 287;
	holepos[8].y = 87;
	
	//初始化老鼠头位置
	for (i = 0 ;i <9;i++)
	{
		mousepos[i].x = holepos[i].x + 25;
		mousepos[i].y = holepos[i].y +15;
	}
	mousewidth = 62;
	mouseheight = 62;

	//初始化老鼠洞
	for (i =0 ;i<9;i++)
	{
		mouse[i] = 1;
		status[i] = 0;
		holepos[i].y -= 21;
		mousepos[i].y -= 21;
		behit[i] = 0;
	}

}

void CheckHit()
{
	int i;
	if (GameStatus ==0) return ;

	if ((hit)&&(!get))
	{
		for (i =0;i<9;i++)
		{
			if ((mouse[i] >0)&&(status[i]<4))
			{
				if ((pos.x>mousepos[i].x)&&(pos.y>mousepos[i].y)&&(pos.x<mousepos[i].x+mousewidth)&&(pos.y<mousepos[i].y+mouseheight))
				{
					if (behit[i]<3)
					behit[i] ++;
					if (mouse[i]==2)
					{
						if (behit[i]>2)
						{
							status[i] = 4;
							time += 1;
							score += 3;
						}
					}
					else
						if (mouse[i] == 1)
						{
							score += 1;
							status[i] = 4;
						}
						else if (mouse[i] == 3)
						{
							time -=2;
							score -= 5;
							if (score<=0 ) score = 0;
							if (time<=0) time = 0;
							status[i] = 4;
						}
					get = true;
					return;		//You can Only get One most.
				}
			}
		}
	}
	//When Game is Over
	if (time <=0)
	{
		char temp[30];
		int s;
		s = 0;
		//写入注册表
		HKEY hRegKey;
		unsigned long result;
		unsigned long datasize,datatype;
		RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Raynor Game\\For Epork",0,"Epork",0,KEY_ALL_ACCESS,
			NULL,&hRegKey,&result);
		if (result == REG_CREATED_NEW_KEY)
		{
		}
		else
		{
			datasize = sizeof(DWORD);
			RegQueryValueEx(hRegKey,"Hiscore",NULL,&datatype,(LPBYTE)&s,&datasize);
		}
		sprintf(temp,"你得到了%d分",score);
		if (score > s)
		{
			strcat(temp,",恭喜您破了纪录啦!");
			RegSetValueEx(hRegKey,"Hiscore",NULL,datatype,(LPBYTE)&score,datasize);
		}
		RegCloseKey(hRegKey);
		MessageBox(hwnd,temp,"GameOver:(",MB_OK);
		hit = false;
		get = false;
		GameStatus = 0;
		time = 20;
	}
}

void StepAll()
{
//	if (GameStatus == 0) return;
	int i;
	int num;
	get = true;
	for (i =0;i<9;i++)
	{
		if (mouse[i] >0)
		{
			if ((status[i]==4)&&(behit[i]>0))
			{
				behit[i] = 0;
			}
			else
			{
				status[i] ++;
				if (status[i] >3)
				{
					mouse[i] =0;
					status[i] = 0;
					behit[i] = 0;
				}
			}
		}
	}
	num = rand()/2000;
	if (num <9) 
	{
		if (mouse[num]==0)
		{
			int n;
			n = rand()/10922;
			if (n<3)
			{
				mouse[num] = n+1;
				status[num] = 0;
			}
		}
	}
}

void StartGame()
{
	int i;
	bActive = false;
	delay = 5;
	dwLastTickCount = 0;
	hit = false;
	get = false;
	time = 20;
	score = 0;

	GameStatus = 1;

	//初始化老鼠洞
	for (i =0 ;i<9;i++)
	{
		mouse[i] = 0;
		status[i] = 0;
		behit[i] = 0;
	}
	MessageBox(hwnd,"游戏开始咯!\n黄色的老鼠只要打一下\n灰色的老鼠要连续打三下\n粉红色的老鼠不要随便打哦\n时间限制15秒\n打掉一只灰色的老鼠可以加1秒\n","注意啦!",MB_OK);
	bActive = true;
}

void DrawNumber(LPDIRECTDRAWSURFACE dd,LPDIRECTDRAWSURFACE ss,int num,int x,int y,int width,int height)
{
	int temp,temp1;
	RECT rect,rect1;
	HRESULT rval;
	int i;

	i = 0;
	temp = temp1 = num;
	while (1)
	{
		while (temp1>=10)
		temp1 = temp1/10;
		GetRect(&rect1,width*temp1,0,width,height);
		GetRect(&rect,x+i*width,y, width,height);
		rval=dd->Blt( &rect, ss, &rect1, DDBLT_WAIT|DDBLT_KEYSRC, NULL);
		if(rval == DDERR_SURFACELOST)   dd->Restore();
		if (temp <10) break;
		temp =temp - 10*(temp/10);
		temp1 = temp;
		i++;
	}
}

⌨️ 快捷键说明

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