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

📄 game1.cpp

📁 用vc编写的俄罗斯方块游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include"game1.h"

//函数声明
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
BOOL getpath(char szTemp[200]);
BOOL getdir(char szDir[200]);
BOOL DataToFile(HWND hWnd,LPCTSTR lpszFileName);
BOOL FileToData(HWND hWnd,LPSTR lpszFileName);

//定义全局句柄
HWND hWndMain;
HMENU hMenu;
HWND hWnd;
HINSTANCE hInst;
HANDLE hFile;
//HINSTANCE hInst1;
HBITMAP hBm;
HDC hDC;
HDC hdcmem;
BITMAP bm;
HWND hdlg;

//定义全局变量
int ispeed1[4] = {1,0,0,0};
int ispeed2[4] = {1,0,0,0};
int isize1[4] = {1,0,0,0};
int isize2[4] = {1,0,0,0};
int ndlg;
int crRGB[3] = {0,0,0},crRGBbuf[3] = {0,0,0};//
int i,   D = 40, L = 80,   sball = 2, sline = 10;//
int Dbuf = D ,Lbuf = L, sballbuf = sball, slinebuf = sline;
int x = 30, y = 40, fx = 1, fy = 1;//
int x1 = 30;//
int life = 3,   p = 1,   eg = 21,   ready = 10,   gameover = 0;//
char lpszFileName[200];
char *lpBufPtr;
DWORD dwFileSize;

//-------------------------------------------------------------------
//-------------------------------------------------------------------
//
//    入口函数(主函数)
//
int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine,
				   int nCmdShow)
{
	MSG Message;
	hBm = LoadBitmap(hInstance,"bitmap1.bmp");
	if(!InitWindowsClass(hInstance))
		return FALSE;
	if(!InitWindows(hInstance,nCmdShow))
		return FALSE;
	hInst = hInstance;
	while(GetMessage(&Message,0,0,0))
	{
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

//-------------------------------------------------------------------
//-------------------------------------------------------------------
//
//    消息处理函数
//
long WINAPI WndProc(HWND hWnd,UINT iMessage,
					UINT wParam,LONG lParam)
{	
	HBRUSH hBrush;
	HPEN hPen;
	HFONT hF;
	char lpsz_1[] = "按Ctrl键开始";
	char lpsz_2[] = "LIFE = ";
	char lpsz_4[] = "你挂了";

	PAINTSTRUCT PtStr;
	//TEXTMETRIC tm;
	static int xc1 = 50, xc2 = xc1, yc1 = 50, yc2 = yc1+20,
		       yc3 = yc2, xc3 = xc1+50,
			   xc4 = 250, yc4 = 200,
		       nCharlen1 = strlen(lpsz_1),
			   nCharlen2 = strlen(lpsz_2),
			   nCharlen4 = strlen(lpsz_4);
	char lpsz_3[] = "3";
//-----------------------------------------------
//-----------------------------------------------
	switch(iMessage)
	{
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDM_DATE:
			DialogBox(hInst,"Date",hWnd,(DLGPROC)DlgProc);
			break;
		case IDM_SIZE:
			ndlg = 1;
			DialogBox(hInst,"Size",hWnd,(DLGPROC)DlgProc);
			break;
		case IDM_SPEED:
			ndlg = 2;
			DialogBox(hInst,"Speed",hWnd,(DLGPROC)DlgProc);
			break;
		case IDM_COLOR:
			ndlg = 3;
			DialogBox(hInst,"Color",hWnd,(DLGPROC)DlgProc);
			break;
		case IDM_SAVE:
			ndlg = 4;
			DialogBox(hInst,"Save",hWnd,(DLGPROC)DlgProc);
			break;
		case IDM_LOAD:
			ndlg = 5;
			DialogBox(hInst,"Load",hWnd,(DLGPROC)DlgProc);
			break;
		case IDM_README:
			MessageBox(hWnd,
				"暂停:小键盘0键;向左移动:左箭头健;向右移动:右箭头健;开始:Ctrl键。",
				"READ ME",
				MB_OK);
			break;
		case IDM_EXIT:
			PostQuitMessage(0);
			break;
		case IDM_EG:
			eg = eg*(-1);
			if(eg == 21)
				CheckMenuItem(hMenu,IDM_EG,MF_BYCOMMAND|MF_UNCHECKED);
			else
				CheckMenuItem(hMenu,IDM_EG,MF_BYCOMMAND|MF_CHECKED);
			//InvalidateRect(hWnd,NULL,1);
			break;

		case IDM_TWO:
			CheckMenuItem(hMenu,IDM_TWO,MF_BYCOMMAND|MF_CHECKED);
			CheckMenuItem(hMenu,IDM_THREE,MF_BYCOMMAND|MF_UNCHECKED);
			CheckMenuItem(hMenu,IDM_FOUR,MF_BYCOMMAND|MF_UNCHECKED);
			life = 2;
			InvalidateRect(hWnd,NULL,1);
			break;
		case IDM_THREE:
			CheckMenuItem(hMenu,IDM_TWO,MF_BYCOMMAND|MF_UNCHECKED);
			CheckMenuItem(hMenu,IDM_THREE,MF_BYCOMMAND|MF_CHECKED);
			CheckMenuItem(hMenu,IDM_FOUR,MF_BYCOMMAND|MF_UNCHECKED);
			life = 3;
			InvalidateRect(hWnd,NULL,1);
			break;
		case IDM_FOUR:
			CheckMenuItem(hMenu,IDM_TWO,MF_BYCOMMAND|MF_UNCHECKED);
			CheckMenuItem(hMenu,IDM_THREE,MF_BYCOMMAND|MF_UNCHECKED);
			CheckMenuItem(hMenu,IDM_FOUR,MF_BYCOMMAND|MF_CHECKED);
			life = 4;
			InvalidateRect(hWnd,NULL,1);
			break;
		}
//-------------------------------------
	case WM_KEYDOWN:
		{
			switch(wParam)
			{
			case VK_CONTROL:
				ready = 11;
				EnableMenuItem(hMenu,IDM_SIZE,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_TWO,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_THREE,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_FOUR,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_SPEED,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_COLOR,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_EG,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_README,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_SAVE,MF_BYCOMMAND|MF_GRAYED);
				EnableMenuItem(hMenu,IDM_LOAD,MF_BYCOMMAND|MF_GRAYED);
				InvalidateRect(hWnd,NULL,1);
				break;
			case VK_NUMPAD0:
				if(ready == 11)
				{
					p = p*(-1);
					if(p == 1)
					{
						EnableMenuItem(hMenu,IDM_README,MF_BYCOMMAND|MF_GRAYED);
						EnableMenuItem(hMenu,IDM_SAVE,MF_BYCOMMAND|MF_GRAYED);
						EnableMenuItem(hMenu,IDM_LOAD,MF_BYCOMMAND|MF_GRAYED);
						InvalidateRect(hWnd,NULL,1);
					}
					else
					{
						EnableMenuItem(hMenu,IDM_README,MF_BYCOMMAND|MF_ENABLED);
						EnableMenuItem(hMenu,IDM_SAVE,MF_BYCOMMAND|MF_ENABLED);
						EnableMenuItem(hMenu,IDM_LOAD,MF_BYCOMMAND|MF_ENABLED);
					}
				}
					break;
			case VK_LEFT:
				if(p == 1 && x1 >20)
					x1 = x1-sline;
				//InvalidateRect(hWnd,NULL,1);
				break;
			case VK_RIGHT:
				if(p == 1 && x1+L <620)
					x1 = x1+sline;
				//InvalidateRect(hWnd,NULL,1);
				break;
			}
		}
//-------------------------------------
	case WM_CREATE:
		hDC = GetDC(hWnd);
		hdcmem = CreateCompatibleDC(hDC);
		ReleaseDC(hWnd,hDC);

		if(life == 3)
			CheckMenuItem(hMenu,IDM_THREE,MF_BYCOMMAND|MF_CHECKED);

		break;
	case WM_PAINT:
		hDC = BeginPaint(hWnd,&PtStr);
		SetMapMode(hDC,MM_ANISOTROPIC);
		SetWindowExtEx(hDC,640,480,NULL);
		SetViewportExtEx(hDC,640,480,NULL);

		switch(ready)
		{
		case 10:
			//hF = CreateFont(0,0,0,0,400,);
			hF = (HFONT)GetStockObject(SYSTEM_FONT);
			SelectObject(hDC,hF);
			TextOut(hDC,xc1,yc1,&lpsz_1[0],nCharlen1);
			TextOut(hDC,xc2,yc2,&lpsz_2[0],nCharlen2);
			switch(life)
			{
			case 1:
				lpsz_3[0] = '1';
				break;
			case 2:
				lpsz_3[0] = '2';
				break;
			case 3:
				lpsz_3[0] = '3';
				break;
			case 4:
				lpsz_3[0] = '4';
				break;
			}
			TextOut(hDC,xc3,yc3,&lpsz_3[0],1);
			DeleteObject(hF);
			break;
		case 11:
			hPen = CreatePen(PS_SOLID,2,RGB(255,0,0));
			SelectObject(hDC,hPen);
			MoveToEx(hDC,20,460,NULL);
			LineTo(hDC,20,20);
			LineTo(hDC,620,20);
			LineTo(hDC,620,460);
			DeleteObject(hPen);
			hPen = CreatePen(PS_SOLID,2,RGB(0,255,0));
			SelectObject(hDC,hPen);
			MoveToEx(hDC,x1,460,NULL);
			LineTo(hDC,x1+L,460);
			DeleteObject(hPen);
			switch(eg)
			{
			case 21:
				hPen = CreatePen(PS_SOLID,2,RGB(crRGB[0],crRGB[1],crRGB[2]));
				SelectObject(hDC,hPen);
				hBrush = CreateHatchBrush(HS_DIAGCROSS,RGB(crRGB[0],crRGB[1],crRGB[2]));
				SelectObject(hDC,hBrush);
				Ellipse(hDC,x,y,x+D,y+D);
				DeleteObject(hPen);
				DeleteObject(hBrush);
				break;
			case -21:
				//hdcmem = CreateCompatibleDC(hDC);
				SelectObject(hdcmem,hBm);
				BitBlt(hDC,x,y,D,D,hdcmem,0,0,SRCCOPY);
				//DeleteDC(hdcmem);
				break;
			}
			if(x <= 20)
				fx = 1;
			if(x >= 620-D)
				fx = -1;
			if(y <= 20)
				fy = 1;
			if(y >= 460-D && x+D/2 >= x1 && x+D/2 <= x1+L)
				fy = -1;
			if(p == 1)
			{
				x = x + fx*sball;
				y = y + fy*sball;
			}
			if(y>460-D+sball)
			{
				life--;
				x = 30;y = 40;
				fx = 1;fy = 1;
				x1 = 30;
				ready = 10;
				InvalidateRect(hWnd,NULL,1);
				Sleep(500);
				EnableMenuItem(hMenu,IDM_README,MF_BYCOMMAND|MF_ENABLED);
				EnableMenuItem(hMenu,IDM_SAVE,MF_BYCOMMAND|MF_ENABLED);
				EnableMenuItem(hMenu,IDM_LOAD,MF_BYCOMMAND|MF_ENABLED);
			}
			break;
		case 12:
			hF = (HFONT)GetStockObject(SYSTEM_FONT);
			SelectObject(hDC,hF);
			TextOut(hDC,xc4,yc4,&lpsz_4[0],nCharlen4);
			DeleteObject(hF);
			//Sleep(2000);
			break;
		}
		if(ready == 12)
		{
			gameover = 1;
			//Sleep(2000);
			PostQuitMessage(0);
		}
		if(life == 0)
			ready = 12;
		if(ready == 11 && p == 1)
			InvalidateRect(hWnd,NULL,1);
		Sleep(10);
		if(gameover == 1)
			Sleep(2000);
		EndPaint(hWnd,&PtStr);
		break;
//-------------------------------------
	case WM_DESTROY:
		DeleteObject(hBm);
		DeleteDC(hdcmem);
		PostQuitMessage(0);
		break;
	default:
		return(DefWindowProc(hWnd,iMessage,wParam,lParam));
	}
	return 0;
}

//-------------------------------------------------------------------
//-------------------------------------------------------------------
//
//    对话框消息处理函数
//
BOOL CALLBACK DlgProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam)
{
	static int CurrentVal[3],PrewVal[3];
	static HWND hwScroll[3];
	char szString[10];
	int nIndex,r;
	DWORD dwNameSize;
	static char szDirs[200] = "c:",szDir1s[200] = "c:\\";
	static char szTemps[200],szPaths[200] = "c:\\*.*";
	char szDir2s[200];
	static char szDirl[200] = "c:",szDir1l[200] = "c:\\";
	static char szTempl[200],szPathl[200] = "c:\\*.*";
	char szDir2l[200];
//-----------------------------------------------
//-----------------------------------------------
	switch(message)
	{
	case WM_INITDIALOG:
		switch(ndlg)
		{
		case 1:
			for(i=0;i<4;i++){isize1[i]=0;}
			for(i=0;i<4;i++){isize2[i]=0;}
			switch(D)
			{
			case 40:
				isize1[0] = 1;
				break;
			case 60:
				isize1[1] = 1;
				break;
			case 80:
				isize1[2] = 1;
				break;
			case 20:
				isize1[3] = 1;
				break;
			}
			switch(L)
			{
			case 80:
				isize2[0] = 1;
				break;
			case 100:
				isize2[1] = 1;
				break;
			case 120:
				isize2[2] = 1;
				break;
			case 40:
				isize2[3] = 1;
				break;
			}
			SendDlgItemMessage(hdlg,IDRADIOBUTTON9,BM_SETCHECK,isize1[0],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON10,BM_SETCHECK,isize1[1],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON11,BM_SETCHECK,isize1[2],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON12,BM_SETCHECK,isize1[3],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON13,BM_SETCHECK,isize2[0],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON14,BM_SETCHECK,isize2[1],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON15,BM_SETCHECK,isize2[2],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON16,BM_SETCHECK,isize2[3],0);
			Dbuf = D; Lbuf = L;
			break;
		case 2:
			for(i=0;i<4;i++){ispeed1[i]=0;}
			for(i=0;i<4;i++){ispeed2[i]=0;}
			switch(sball)
			{
			case 2:
				ispeed1[0] = 1;
				break;
			case 4:
				ispeed1[1] = 1;
				break;
			case 6:
				ispeed1[2] = 1;
				break;
			case 1:
				ispeed1[3] = 1;
				break;
			}
			switch(sline)
			{
			case 10:
				ispeed2[0] = 1;
				break;
			case 20:
				ispeed2[1] = 1;
				break;
			case 30:
				ispeed2[2] = 1;
				break;
			case 5:
				ispeed2[3] = 1;
				break;
			}
			SendDlgItemMessage(hdlg,IDRADIOBUTTON1,BM_SETCHECK,ispeed1[0],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON2,BM_SETCHECK,ispeed1[1],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON3,BM_SETCHECK,ispeed1[2],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON4,BM_SETCHECK,ispeed1[3],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON5,BM_SETCHECK,ispeed2[0],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON6,BM_SETCHECK,ispeed2[1],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON7,BM_SETCHECK,ispeed2[2],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON8,BM_SETCHECK,ispeed2[3],0);
			sballbuf = sball; slinebuf = sline;
			break;
		case 3:
			for(i=0;i<3;i++)
			{
				crRGBbuf[i] = crRGB[i];
				CurrentVal[i] = crRGBbuf[i];
				PrewVal[i] = crRGBbuf[i];
				hwScroll[i] = GetDlgItem(hdlg,IDC_RED+i);
				SetScrollRange(hwScroll[i],SB_CTL,0,255,FALSE);
				SetScrollPos(hwScroll[i],SB_CTL,crRGBbuf[i],TRUE);
				SetDlgItemText(hdlg,IDC_VALRED+i,itoa(CurrentVal[i],szString,10));
			}
			break;
		case 4:
			SendDlgItemMessage(hdlg,IDS_LISTBOX1,LB_DIR,0x4010,(LPARAM)szPaths);
			SetDlgItemText(hdlg,IDS_EDITTEXT1,szDir1s);
			break;
		case 5:
			SendDlgItemMessage(hdlg,IDS_LISTBOX2,LB_DIR,0x4010,(LPARAM)szPathl);
			SetDlgItemText(hdlg,IDS_EDITTEXT3,szDir1l);
			break;
		default:
			break;
		}
	
		return 1;
//-----------------------------------------------
//-----------------------------------------------
	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDRADIOBUTTON1:
			for(i=0;i<4;i++){ispeed1[i]=0;}
			ispeed1[0] = 1;
			SendDlgItemMessage(hdlg,IDRADIOBUTTON1,BM_SETCHECK,ispeed1[0],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON2,BM_SETCHECK,ispeed1[1],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON3,BM_SETCHECK,ispeed1[2],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON4,BM_SETCHECK,ispeed1[3],0);
			sballbuf = 2;
			break;
		case IDRADIOBUTTON2:
			for(i=0;i<4;i++){ispeed1[i]=0;}
			ispeed1[1] = 1;
			SendDlgItemMessage(hdlg,IDRADIOBUTTON1,BM_SETCHECK,ispeed1[0],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON2,BM_SETCHECK,ispeed1[1],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON3,BM_SETCHECK,ispeed1[2],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON4,BM_SETCHECK,ispeed1[3],0);
			sballbuf = 4;
			break;
		case IDRADIOBUTTON3:
			for(i=0;i<4;i++){ispeed1[i]=0;}
			ispeed1[2] = 1;
			SendDlgItemMessage(hdlg,IDRADIOBUTTON1,BM_SETCHECK,ispeed1[0],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON2,BM_SETCHECK,ispeed1[1],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON3,BM_SETCHECK,ispeed1[2],0);
			SendDlgItemMessage(hdlg,IDRADIOBUTTON4,BM_SETCHECK,ispeed1[3],0);
			sballbuf = 6;
			break;
		case IDRADIOBUTTON4:
			for(i=0;i<4;i++){ispeed1[i]=0;}
			ispeed1[3] = 1;

⌨️ 快捷键说明

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