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

📄 main.cpp

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

HWND hWnd;
MSG msg;
WNDCLASSEX wc;
int map[15][20];

TCHAR tmpText[50];

int m,n,s,Gname=0;
HBITMAP hmap,hbg;//  绘制平面
HDC hdc,htdc,hadc;
HGDIOBJ hold;
HPEN hpen;
HANDLE hback,hman;

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

struct _Date aate[100];

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM,HINSTANCE);
void SaveDate();
void LoadDate(int);
void InitBitmap(HWND hWnd);
void Redraw();
void COpenFile();
void ReleaseTbox(HWND hWnd);
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(hInstance,(LPCTSTR)IDC_CURSOR);
		wc.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH);
		wc.lpszMenuName	= (LPCSTR)IDR_MENU;
		wc.lpszClassName= "Game";
		wc.hIconSm		= NULL;
		RegisterClassEx(&wc);
	}

	hWnd= CreateWindow("Game", "推箱子地图编辑器", 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(0);
	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,50,NULL);
			hpen=CreatePen(PS_SOLID,5,RGB(255,0,0));
			break;
		case WM_PAINT:
			Redraw();
			ValidateRect(hWnd,NULL);
			break;
		case WM_LBUTTONDOWN:
			m=(LOWORD(lParam)+16)/32;
			n=(HIWORD(lParam)+16)/32;
			map[n][m]=s;
		case WM_COMMAND:
			switch (LOWORD(wParam))
			{
				case IDM_SAVE:
					SaveDate();
					break;
				case ID_M1:
					if(Gname<99){
						Gname++;
					}					
					LoadDate(Gname);
					break;
				case ID_M2:
					if(Gname>0){
						Gname--;
					}
					LoadDate(Gname);
					break;
				case IDM_EXIT:
					PostQuitMessage(0);
					break;
			}
			Redraw();
			break;
		case WM_KEYDOWN:
			if(wParam==VK_F1)
			{
				s=1;
			}
			if(wParam==VK_F2)
			{
				s=2;	
			}
			if(wParam==VK_F3)
			{
				s=3;	
			}
			if(wParam==VK_F4)
			{
				s=4;	
			}
			if(wParam==VK_F5)
			{
				s=5;	
			}
			if(wParam==VK_F6)
			{
				s=6;
			}
			if(wParam==VK_RIGHT){
				if(Gname<99){
					Gname++;
				}
				LoadDate(Gname);
			}
			if(wParam==VK_LEFT){
				if(Gname>0){
					Gname--;
				}
				LoadDate(Gname);
			}
			if(wParam==VK_UP){
				if(Gname>0){
					Gname--;
				}
				LoadDate(Gname);
			}
			if(wParam==VK_DOWN){
				if(Gname<99){
					Gname++;
				}
				LoadDate(Gname);
			}
			break;
		case WM_TIMER:
			Redraw();
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, msg, wParam, lParam);
	}
	return 0;
}
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关",Gname);
	SetWindowText(hWnd,tmpText);
}
void InitBitmap(HWND hWnd)
{
	hdc=GetDC(hWnd);
	htdc=CreateCompatibleDC(hdc);
	hadc=CreateCompatibleDC(hdc);
	hmap=CreateCompatibleBitmap(hdc, 640, 480);
	SelectObject(htdc,hmap);
	hold=SelectObject(hdc,hpen);
	SelectObject(htdc,hold);
	BitBlt(hdc,0,0,640,480,htdc,0,0,SRCCOPY);
	Redraw();
}

void Redraw()							//绘制
{
	for(int j=0;j<15;j++)
	{
		for(int i=0;i<20;i++)
		{
			switch (map[j][i])
			{
				case 0:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32, hadc, 0, 0, SRCCOPY);
					SelectObject(hadc,hold);
					map[j][i]=1;
					break;
				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);
					hold=SelectObject(hadc,hman);
					BitBlt(htdc,i*32,j*32,32,32,hadc,0,32,SRCAND);
					BitBlt(htdc,i*32,j*32,32,32,hadc,0,0,SRCPAINT);
					SelectObject(hadc,hold);
					break;
				case 3:
					hold=SelectObject(hadc,hback);
					BitBlt(htdc,i*32,j*32,32,32,hadc,96,0,SRCCOPY);
					SelectObject(hadc,hold);
					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(htdc,hold);
	BitBlt(hdc,0,0,640,480,htdc,0,0,SRCCOPY);
}
void SaveDate()
{
	if((fp=fopen("Data/map.dat","w"))==NULL)
	{
		MessageBox(hWnd,"无法打开地图数据","警告",MB_OK);
	}
	for(int j=0;j<15;j++)
	{
		for(int i=0;i<20;i++)
		{
			aate[Gname].m_map[j][i]=map[j][i];
		}
	}
	for(int n=0;n<100;n++){
		fwrite(&aate[n],sizeof(struct _Date),1,fp);
	}
	fclose(fp);	
}

void COpenFile(){
	if((fp=fopen("Data/map.dat","r"))==NULL)
	{
		MessageBox(hWnd,"无法打开地图数据,要新建一个地图文件","警告",MB_OK);
		fp=fopen("Data/map.dat","w");
		for(int n=0;n<100;n++){
			fwrite(&aate[n],sizeof(struct _Date),1,fp);
		}
		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(hback);
	DeleteObject(hman);
	DeleteDC(hadc);
	DeleteDC(htdc);
	ReleaseDC(hWnd,hdc);
}

⌨️ 快捷键说明

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