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

📄 main.cpp

📁 一个推箱子基于GDI的的游戏
💻 CPP
字号:
#include <windows.h>
#include <stdio.h>
#include "resource.h"

HWND hWnd,hwndd;//窗口句丙
MSG msgd,msg;//消息句丙
WNDCLASSEX wc;//注册窗口结构
int map[15][20];
int man[15][20],fx;
HBITMAP hmap,hbg,hadg;//  绘制平面
HDC hdc,htdc,hadc,hbdc;
HGDIOBJ hold;
HPEN hpen;
HANDLE hback,hman;

bool fs;
char szbuffer[45];
int g=0,box=0;

TCHAR tmpText[50];

FILE *fp;
struct _Date
{
	int m_map[15][20];
}CDate[100];

struct _Date aate[100];


LRESULT CALLBACK DProc(HWND hWndd, UINT msgd, WPARAM wParam, LPARAM lParam,HINSTANCE hInstance);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM,HINSTANCE);
void LoadDate(int g);				//数据初始化
void InitBitmap(HWND hWnd);			//平面初始化
void Redraw();						//绘制
bool Pan();
void ReleaseTbox(HWND hWnd);
void COpenFile();
void SetData();

int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdShow)
{
	if(!hPrevInstance)
	{
		wc.cbSize		= sizeof(WNDCLASSEX);
		wc.style		= CS_HREDRAW | CS_VREDRAW;
		wc.lpfnWndProc	= (WNDPROC)WndProc;
		wc.cbWndExtra	= 0;
		wc.cbClsExtra	= 0;
		wc.hInstance	= hInstance;
		wc.hIcon		= LoadIcon(hInstance, (LPCTSTR)IDI_WINICON);
		wc.hCursor		= LoadCursor(NULL, IDC_ARROW);
		wc.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
		wc.lpszMenuName	= (LPCTSTR)IDR_MENU;
		wc.lpszClassName= "Game";
		wc.hIconSm		= NULL;
		RegisterClassEx(&wc);
	}

	hWnd= CreateWindow("Game", "推箱子1.0", WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,
						190, 140, 646, 524, NULL, NULL, hInstance, NULL);
	
	if(!hWnd)
	{
		return FALSE;
	}
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	hback = LoadImage(hInstance, "pic/back.bmp",IMAGE_BITMAP,160,32,LR_LOADFROMFILE);
	hman = LoadImage(hInstance, "pic/man.bmp",IMAGE_BITMAP,128,64,LR_LOADFROMFILE);
	COpenFile();
	LoadDate(g);
	InitBitmap(hWnd);
	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	ReleaseTbox(hWnd);
	UnregisterClass("Game", wc.hInstance);
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam,HINSTANCE hInstance)
{
	switch (msg)
	{
		case WM_CREATE:
			SetTimer(hWnd,1,100,NULL);
			hpen=CreatePen(PS_SOLID,5,RGB(255,0,0));
			break;
		case WM_PAINT:
			Redraw();
			ValidateRect(hWnd,NULL);
			break;
		case WM_COMMAND:
			switch (LOWORD(wParam))
			{
				case IDR_MENU1:
					SetData();
					break;
				case IDR_MENU2:
					if( g<100 )
					{
						g++;
					}
					SetData();
					break;
				case IDR_MENU3:
					if(g>0)
					{
						g--;
					}
					SetData();
					break;
				case IDR_EXIT:
					PostQuitMessage(0);
					break;
			}
			Redraw();
			break;
		case WM_KEYDOWN:
			if(wParam==VK_LEFT)
			{
				for(int i=0;i<15;i++)
				{
					for(int j=0;j<20;j++)
					{
						if(man[i][j]==2)
						{
							if(man[i][j-1]==3)
							{
								if(map[i][j-2]!=4 && man[i][j-2]!=3)
								{
									man[i][j-1]=2;
									man[i][j]=0;
									man[i][j-2]=3;
								}
							}
							else
							{
								if(map[i][j-1]!=4)
								{
									man[i][j-1]=2;
									man[i][j]=0;
								}
							}
							fx=1;
						}
					}
				}
			}
			if(wParam==VK_RIGHT)
			{
				for(int i=0;i<15;i++)
				{
					for(int j=0;j<20;j++)
					{
						if(man[i][j]==2)
						{
							if(man[i][j+1]==3)
							{
								if(map[i][j+2]!=4 && man[i][j+2]!=3)
								{
									man[i][j+1]=2;
									man[i][j]=0;
									man[i][j+2]=3;
								}
							}
							else
							{
								if(map[i][j+1]!=4)
								{
									man[i][j+1]=2;
									man[i][j]=0;
								}
							}
							fx=0;
							goto e1;
							
						}
						
					}
				}
	
			}
			e1:
			if(wParam==VK_UP)
			{
				for(int i=0;i<15;i++)
				{
					for(int j=0;j<20;j++)
					{
						if(man[i][j]==2)
						{
							if(man[i-1][j]==3)
							{
								if(map[i-2][j]!=4 && man[i-2][j]!=3)
								{
									man[i-1][j]=2;
									man[i][j]=0;
									man[i-2][j]=3;
								}
							}
							else
							{
								if(map[i-1][j]!=4)
								{
									man[i-1][j]=2;
									man[i][j]=0;
								}
							}
							fx=2;
						}
					}
				}
	
			}
			if(wParam==VK_DOWN)
			{
				for(int i=0;i<15;i++)
				{
					for(int j=0;j<20;j++)
					{
						if(man[i][j]==2)
						{
							if(man[i+1][j]==3)
							{
								if(map[i+2][j]!=4 && man[i+2][j]!=3)
								{
									man[i+1][j]=2;
									man[i][j]=0;
									man[i+2][j]=3;
								}
							}
							else
							{
								if(map[i+1][j]!=4)
								{
									man[i+1][j]=2;
									man[i][j]=0;
								}
							}
							fx=3;
							goto e2;
							
						}
					}
				}
	
			}
			e2:
			if(wParam==VK_F3)
			{
				box=0;
				ReleaseTbox(hWnd);
				LoadDate(g);
				for(int i=0;i<15;i++){
					for(int n=0;n<20;n++){
						man[i][n]=0;
					}
				}
				InitBitmap(hWnd);

			}
			if(wParam==VK_F1)
			{
				if(g>0)
				{
					g--;
				}
				box=0;
				ReleaseTbox(hWnd);
				LoadDate(g);
				for(int i=0;i<15;i++){
					for(int n=0;n<20;n++){
						man[i][n]=0;
					}
				}
				InitBitmap(hWnd);
			}
			if(wParam==VK_F2)
			{
				if( g<99 )
				{
					g++;
				}
				box=0;
				ReleaseTbox(hWnd);
				LoadDate(g);
				for(int i=0;i<15;i++){
					for(int n=0;n<20;n++){
						man[i][n]=0;
					}
				}
				InitBitmap(hWnd);
				
			}
			break;
		case WM_TIMER:
			if(!Pan())
			{
				g++;
				box=0;
				ReleaseTbox(hWnd);
				LoadDate(g);
				for(int i=0;i<15;i++){
					for(int n=0;n<20;n++){
						man[i][n]=0;
					}
				}
				InitBitmap(hWnd);
			}

			Redraw();
			break;
		case WM_DESTROY:				
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, msg, wParam, lParam);
	}
	return 0;
}
LRESULT CALLBACK DProc(HWND hWndd, UINT msgd, WPARAM wParam, LPARAM lParam,HINSTANCE hInstance)
{
	switch(msgd){
		case WM_INITDIALOG:
			if(fs)
			{
				LoadString(hInstance,IDS_TRUE,szbuffer,45);
				SetDlgItemText(hWndd,IDC_S1,szbuffer);
			}
			return TRUE;
		case WM_COMMAND:
			if (LOWORD(wParam) == IDC_DOWN) 
			{
				EndDialog(hWndd, LOWORD(wParam));
				return TRUE;
			}
			break;
	}
	return FALSE;
}
void LoadDate(int g)
{
	for(int n=0;n<15;n++)
	{
		for(int h=0;h<20;h++)
		{
			map[n][h]=0;
		}
	}
	for(int j=0;j<15;j++)
	{
		for(int i=0;i<20;i++)
		{
			
			map[j][i]=aate[g].m_map[j][i];
		}
	}
	sprintf(tmpText,"推箱子1.0--------第%d关",g);
	SetWindowText(hWnd,tmpText);
}
void InitBitmap(HWND hWnd)
{
	hdc=GetDC(hWnd);
	htdc=CreateCompatibleDC(hdc);
	hadc=CreateCompatibleDC(hdc);
	hbdc = CreateCompatibleDC(hdc);
	hmap=CreateCompatibleBitmap(hdc, 640, 480);
	hadg=CreateCompatibleBitmap(hdc, 640, 480);
	SelectObject(htdc,hmap);
	SelectObject(hbdc,hadg);
	for(int j=0;j<15;j++)
	{
		for(int i=0;i<20;i++)
		{
			switch (map[j][i])
			{
				case 1:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32, hadc, 0, 0, SRCCOPY);
					SelectObject(hadc,hold);
					break;
				case 2:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32,hadc,32,0,SRCCOPY);
					SelectObject(hadc,hold);
					man[j][i]=2;
					break;
				case 3:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32,hadc,32,0,SRCCOPY);
					SelectObject(hadc,hold);
					man[j][i]=3;
					box++;
					break;
				case 4:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32,hadc,128,0,SRCCOPY);
					SelectObject(hadc,hold);
					break;
				case 5:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32,hadc,64,0,SRCCOPY);
					SelectObject(hadc,hold);
					break;
				case 6:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32,hadc,32,0,SRCCOPY);
					SelectObject(hadc,hold);
					break;
			}
		}
	}
	hold=SelectObject(hdc,hpen);
	SelectObject(hbdc,hold);
	BitBlt(hadc,0,0,640,480,htdc,0,0,SRCCOPY);
	Redraw();
}

void Redraw()
{
	BitBlt(hbdc,0,0,640,480,htdc,0,0,SRCCOPY);
	for(int i=0;i<15;i++)
	{
		for(int j=0;j<20;j++)
		{
			switch(man[i][j])
			{
				case 2:
					hold=SelectObject(hadc,hman);
					BitBlt(hbdc,j*32,i*32,32,32,hadc,fx*32,32,SRCAND);
					BitBlt(hbdc,j*32,i*32,32,32,hadc,fx*32,0,SRCPAINT);
					SelectObject(hadc,hold);
					break;
				case 3:
					hold=SelectObject(hadc,hback);
					BitBlt(hbdc,j*32,i*32,32,32,hadc,96,0,SRCCOPY);
					SelectObject(hadc,hold);
					break;
			}
		}
	}
	hold=SelectObject(hdc,hpen);
	SelectObject(hbdc,hold);
	BitBlt(hdc,0,0,640,480,hbdc,0,0,SRCCOPY);
}
bool Pan()
{
	if(map[7][10]==0){
		g--;
		SetData();
		MessageBox(hWnd,"此关无地图数据","END",MB_OK);
	}
	else
	{
		int a=0;
		for(int i=0;i<15;i++)
		{
			for(int j=0;j<20;j++)
			{
				if(man[i][j]==3 && map[i][j]==5)
				{
					a++;
				}
			}
		}
		if(a==box)
		{
			return false;
		}
	}
	return true;
}
void COpenFile(){
	if((fp=fopen("Data/map.dat","r"))==NULL)
	{
		MessageBox(hWnd,"无法打开地图数据","警告",MB_OK);
	}
	for(int i=0;i<100;i++){
		fread(&aate[i],sizeof(struct _Date),1,fp);
	}
	fclose(fp);
}

void ReleaseTbox(HWND hWnd)
{
	SelectObject(htdc,hold);
	DeleteObject(hmap);
	DeleteObject(hbg);
	DeleteObject(hadg);
	DeleteDC(hadc);
	DeleteDC(htdc);
	DeleteDC(hbdc);
	ReleaseDC(hWnd,hdc);
}
void SetData(){
	box=0;
	ReleaseTbox(hWnd);
	LoadDate(g);
	for(int i = 0;i<15;i++){
		for(int n =0;n<20;n++){
			man[i][n]=0;
		}
	}
	InitBitmap(hWnd);
}

⌨️ 快捷键说明

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