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

📄 minewnd.cpp

📁 这是一个关于扫雷游戏的代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
	rectClick.left = MINE_AREA_X + pos%uWidth*16;
	rectClick.right = rectClick.left + 16;
	rectClick.top = MINE_AREA_Y + pos/uWidth*16;
	rectClick.bottom = rectClick.top + 16;		
	InvalidateRect(&rectClick);	
}

void CMineWnd::ProcessLeftButtonUp( int pos )
{ 
	if( bFirstClick ) // first clicked
	{
		bFirstClick = FALSE;
		SetMine( pos );
		SetNumbers();
		GetEmptyAreas(); // set empty area flag
	}
	if( pMines[pos].uState >= STATE_NUMBER_8 &&
		pMines[pos].uState <= STATE_NUMBER_1 &&
		pMines[pos].uDraw != DRAW_FLAG ) // flag number
	{  
		ClickNumber++;
		pMines[pos].uDraw = pMines[pos].uState;	
        pMines[pos].uState = STATE_OPENED;
		
		RECT rectClick;	
		MyInvalidateRect( rectClick, nNewPos );				
        Victory(); //  victory?
	}
	else if( pMines[pos].uState == STATE_MINE )
	{
		if( pMines[pos].uDraw == DRAW_QUESTION_MARK ||
			pMines[pos].uDraw == DRAW_EMPTY) // dead
		{
			sndPlaySound((LPCSTR)LockResource(pBlastWavMem),
				SND_MEMORY | SND_ASYNC | SND_NODEFAULT);
			uGameState = DEAD;
			KillTimer( ID_TIMER_EVENT );
			m_nTimer = 0;	
			
			CRect rectButton(uButtonPos[1],15,uButtonPos[2],42);
			uButtonState = BUTTON_DEAD;
			InvalidateRect(rectButton);
			
			pMines[pos].uDraw = DRAW_BLAST;
			FlagAllMine(); 
		}		
	}
	else if( pMines[pos].uState >= EMPTY_AREA_START )	
	{	
		DrawEmptyArea( pMines[pos].uState );	//  flag empty area 
		Victory(); // is victory
	}
}

void CMineWnd::ProcessLeftRightButtonUp( int pos )
{	
	// compute round
	int around[10];
	GetAroundPos( pos, around );
	
	if( pMines[ pos ].uDraw >= DRAW_NUMBER_8 &&
		pMines[ pos ].uDraw <= DRAW_NUMBER_1 &&
		pMines[ pos ].uState == STATE_OPENED )
	{		
		UINT trueFlag = 0;
		UINT falseFlag = 0;
		UINT flag = 0;
		UINT error[8];
		UINT errorNum = 0;
		
		for(UINT i=0; i<(UINT)around[8]; i++) 
		{ 
			if( pMines[around[i]].uState == STATE_MINE && 
				pMines[around[i]].uDraw == DRAW_FLAG )// 
			{
				trueFlag++;
				flag++;
			}
			else if( pMines[around[i]].uState == STATE_MINE && 
				pMines[around[i]].uDraw != DRAW_FLAG ) // 		
			{
				falseFlag++;				
				error[errorNum++] = around[i];
			}
			else if(pMines[around[i]].uState != STATE_MINE && 
				pMines[around[i]].uDraw == DRAW_FLAG) // 
			{   
				flag++;
				falseFlag++;
			}
		}	
        if( trueFlag == flag && falseFlag == 0 ) // 
		{
			RECT rectClick;	
			for( i=0; i<(UINT)around[8]; i++)
			{
				if( pMines[around[i]].uState != STATE_OPENED )
				{
					if( pMines[around[i]].uState >= STATE_NUMBER_8 &&
						pMines[around[i]].uState <= STATE_NUMBER_1 )
					{						
						pMines[around[i]].uDraw = pMines[around[i]].uState;
						ClickNumber++;
						pMines[around[i]].uState = STATE_OPENED;
						MyInvalidateRect( rectClick, around[i] );						
					}
					else if( pMines[around[i]].uState >= EMPTY_AREA_START )				
					{
						// get and flag empty area
						DrawEmptyArea( pMines[around[i]].uState );
					}
				}
			}	
			Victory();	// is victory
		}
		else if( falseFlag > 0 ) // 
		{			
			if( DRAW_NUMBER_1 - pMines[pos].uDraw +1 == flag) 
			{
				sndPlaySound((LPCSTR)LockResource(pBlastWavMem),
					SND_MEMORY | SND_ASYNC | SND_NODEFAULT);
				uGameState = DEAD;
				KillTimer( ID_TIMER_EVENT );
				m_nTimer = 0;	
				
				CRect rectButton(uButtonPos[1],15,uButtonPos[2],42);
				uButtonState = BUTTON_DEAD;
				InvalidateRect(rectButton);
				
                for( i=0; i<errorNum; i++)
				{
					pMines[error[i]].uDraw = DRAW_BLAST;
				}
				FlagAllMine();  // 
			}
			else // 
			{
				SetMineUpEx(around,around[8]-1);
			}
		}        
	}
	else
	{	
		int num = around[8];
		around[num] = nNewPos;
		SetMineUpEx(around,num);		
    }
}

void CMineWnd::MyCheckMenuItem()
{
	if( pSubMenu )
	{
		pSubMenu->CheckMenuItem(ID_MENU_PRIMARY, MF_UNCHECKED | MF_BYCOMMAND);
		pSubMenu->CheckMenuItem(ID_MENU_SECONDARY, MF_UNCHECKED | MF_BYCOMMAND);
		pSubMenu->CheckMenuItem(ID_MENU_ADVANCED, MF_UNCHECKED | MF_BYCOMMAND);
		pSubMenu->CheckMenuItem(ID_MENU_CUSTOM, MF_UNCHECKED | MF_BYCOMMAND);
		
		switch(theApp.uGameLevel)	
		{
		case LEVEL_PRIMARY:
			pSubMenu->CheckMenuItem(ID_MENU_PRIMARY, MF_CHECKED | MF_BYCOMMAND);
			break;
		case LEVEL_SECONDARY:
			pSubMenu->CheckMenuItem(ID_MENU_SECONDARY, MF_CHECKED | MF_BYCOMMAND);
			break;
		case LEVEL_ADVANCED:
			pSubMenu->CheckMenuItem(ID_MENU_ADVANCED, MF_CHECKED | MF_BYCOMMAND);
			break;
		case LEVEL_CUSTOM:
			pSubMenu->CheckMenuItem(ID_MENU_CUSTOM, MF_CHECKED | MF_BYCOMMAND);
			break;
		default:
			break;
		}
	}
}

void CMineWnd::SetWindowSize()
{
	UINT uWindowWidth = theApp.uFrameWidth + uWidth*MINE_WIDTH + 
		LINE_WIDTH_0*3 + SIDE_WIDTH_0 + SIDE_WIDTH_1;
	UINT uWindowHeight = theApp.uFrameHeight + uHeight*MINE_HEIGHT +
		LINE_WIDTH_0*3 + SIDE_WIDTH_1 + SIDE_WIDTH_0*2 + RECT_HEIGHT_0;
	
	SetWindowPos(&CWnd::wndBottom,0,0,uWindowWidth,uWindowHeight,
		SWP_NOZORDER|SWP_NOMOVE|SWP_NOCOPYBITS );
	
	SetPosition();
}

void  CMineWnd::SetPosition()
{	
	GetClientRect(&rect);
	
	// NUMBER pos
	uNumPos[0] = rect.right-55;
	uNumPos[1] = rect.right-15;
	uNumPos[2] = rect.right-54;
	uNumPos[3] = rect.right-41;
	uNumPos[4] = rect.right-28;
	
	// BUTTON POS
	uButtonPos[0] = rect.right/2-12;
	uButtonPos[1] = rect.right/2-13;
	uButtonPos[2] = rect.right/2+12;
	
	// Rectangle POS
	uRectPosX[0] = rect.right-14;
	uRectPosX[1] = rect.right-16;
	uRectPosX[2] = rect.right-18;	
	uRectPosX[3] = rect.right-6;
	uRectPosX[4] = rect.right-7;
	uRectPosX[5] = rect.right-8;
	uRectPosX[6] = RECT_X_0+1;
	uRectPosX[7] = RECT_X_1+1;
	uRectPosX[8] = RECT_X_1+2;
	uRectPosX[9] = rect.right;
	
	uRectPosY[0] = rect.bottom-RECT_Y_1-5;
	uRectPosY[1] = rect.bottom-RECT_Y_1-7;
	uRectPosY[2] = rect.bottom-RECT_Y_1-9;
	uRectPosY[3] = rect.bottom-8;	
	uRectPosY[4] = rect.bottom-7;
	uRectPosY[5] = rect.bottom-6;	
	uRectPosY[6] = RECT_Y_0+1;
	uRectPosY[7] = RECT_Y_1+1;
	uRectPosY[8] = RECT_Y_1+2;
	uRectPosY[9] = rect.bottom;
}



void  CMineWnd::MyDrawNumber( CPaintDC& dc )
{
	dc.Draw3dRect(16,15,41,25,darkColor,COLOR_WHITE);
	dc.Draw3dRect(uNumPos[0],15,41,25,darkColor,COLOR_WHITE);
	
	dc.SetPixel(56,15,COLOR_GRAY);
	dc.SetPixel(16,39,COLOR_GRAY);
	
	dc.SetPixel(uNumPos[1],15,COLOR_GRAY);
	dc.SetPixel(uNumPos[0],39,COLOR_GRAY);
	
	CDC cdc;	
	cdc.CreateCompatibleDC(&dc);
	cdc.SelectObject(BMP_NUMBER);
	
	UINT num;	
	// darw remain mine number
	if(theApp.uRemainMines < 0)
		num = 11;
	else
		num = theApp.uRemainMines/100;	
	dc.StretchBlt(17,16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
    
	num = abs(theApp.uRemainMines)/10%10;
	dc.StretchBlt(30,16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
	
	num = abs(theApp.uRemainMines)%10;
	dc.StretchBlt(43,16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
	
	// draw remain seconds
	num = theApp.uSecends/100;	
	dc.StretchBlt(uNumPos[2],16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
	
    num = theApp.uSecends/10%10;
	dc.StretchBlt(uNumPos[3],16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
	
	num = theApp.uSecends%10;
	dc.StretchBlt(uNumPos[4],16,13,23,&cdc,0,253-23*num,13, 23, SRCCOPY);
}


void  CMineWnd::MyDrawButton( CPaintDC& dc )
{
	CDC cdc;	
	cdc.CreateCompatibleDC(&dc);
	cdc.SelectObject(BMP_BUTTON);	
	dc.StretchBlt(uButtonPos[0],16,24,24,&cdc,0,24*uButtonState,24,24, SRCCOPY);
	
	dc.Draw3dRect(uButtonPos[1],15,26,26,darkColor,darkColor);
	
	dc.SetPixel(uButtonPos[1],40,COLOR_GRAY);
	dc.SetPixel(uButtonPos[2],15,COLOR_GRAY);
}

void  CMineWnd::MyDrawMineArea( CPaintDC& dc )
{
	CDC cdc;	
	cdc.CreateCompatibleDC(&dc);
	cdc.SelectObject(BMP_MINEAREA);	
	
	for(UINT i=0; i<uHeight; i++)
		for(UINT j=0; j<uWidth; j++)
		{
			dc.StretchBlt(MINE_AREA_X+16*j,MINE_AREA_Y+16*i,
				16,16,&cdc,0,16*pMines[i*uWidth+j].uDraw,16,16, SRCCOPY);
		}
}

void  CMineWnd::MyDrawRectangle( CPaintDC& dc )// Draw frame
{
	//  draw side
	dc.FillSolidRect(0,0,uRectPosX[9],LINE_WIDTH_0,COLOR_WHITE);
	dc.FillSolidRect(0,0,LINE_WIDTH_0,uRectPosY[9],COLOR_WHITE);
	
	//draw small rectangle
	dc.Draw3dRect(RECT_X_0,    RECT_Y_0,    uRectPosX[0],37,
		darkColor,COLOR_WHITE);
	dc.Draw3dRect(uRectPosX[6],uRectPosY[6],uRectPosX[1],35,
		darkColor,COLOR_WHITE);
	
	dc.SetPixel(RECT_X_1,    45,COLOR_GRAY);
	dc.SetPixel(uRectPosX[6],44,COLOR_GRAY);	
	
	dc.SetPixel(uRectPosX[3],RECT_Y_0,    COLOR_GRAY);
	dc.SetPixel(uRectPosX[4],uRectPosY[6],COLOR_GRAY);	
	
	// draw big rectangle
	dc.Draw3dRect(RECT_X_1,    RECT_Y_1,    uRectPosX[0],
		uRectPosY[0],darkColor,COLOR_WHITE);
	dc.Draw3dRect(uRectPosX[7],uRectPosY[7],uRectPosX[1],
		uRectPosY[1],darkColor,COLOR_WHITE);
	dc.Draw3dRect(uRectPosX[8],uRectPosY[8],uRectPosX[2],
		uRectPosY[2],darkColor,COLOR_WHITE);
	
	dc.SetPixel(uRectPosX[3],RECT_Y_1,    COLOR_GRAY);
	dc.SetPixel(uRectPosX[4],uRectPosY[7],COLOR_GRAY);
	dc.SetPixel(uRectPosX[5],uRectPosY[8],COLOR_GRAY);
	
	dc.SetPixel(RECT_X_1,    uRectPosY[5],COLOR_GRAY);	
	dc.SetPixel(uRectPosX[7],uRectPosY[4],COLOR_GRAY);
	dc.SetPixel(uRectPosX[8],uRectPosY[3],COLOR_GRAY);	
}

void  CMineWnd::SetBitmap()
{
	if(theApp.bColor)
	{
		BMP_MINEAREA.DeleteObject();
		BMP_MINEAREA.LoadBitmap(IDB_BITMAP10);
		BMP_NUMBER.DeleteObject();
		BMP_NUMBER.LoadBitmap(IDB_BITMAP20);
		BMP_BUTTON.DeleteObject();
		BMP_BUTTON.LoadBitmap(IDB_BITMAP30);		
	}
	else
	{
		BMP_MINEAREA.DeleteObject();
		BMP_MINEAREA.LoadBitmap(IDB_BITMAP11);
		BMP_NUMBER.DeleteObject();
		BMP_NUMBER.LoadBitmap(IDB_BITMAP21);
		BMP_BUTTON.DeleteObject();
		BMP_BUTTON.LoadBitmap(IDB_BITMAP31);		
	}
}


BEGIN_MESSAGE_MAP(CMineWnd, CWnd)
//{{AFX_MSG_MAP(CMineWnd)

ON_COMMAND(ID_MENU_ABOUT, OnMenuAbout)
ON_COMMAND(ID_MENU_HELP_LIST, OnMenuHelpList)
ON_COMMAND(ID_MENU_HELP_USE, OnMenuHelpUse)
ON_COMMAND(ID_MENU_HELP_FIND, OnMenuHelpFind)
ON_COMMAND(ID_MENU_GAMESTART, OnMenuGameStart)
ON_COMMAND(ID_MENU_EXIT, OnMenuExit)
ON_WM_KEYDOWN()
ON_COMMAND(ID_MENU_PRIMARY, OnMenuPrimary)
ON_COMMAND(ID_MENU_SECONDARY, OnMenuSecondary)
ON_COMMAND(ID_MENU_MARK, OnMenuMark)
ON_COMMAND(ID_MENU_ADVANCED, OnMenuAdvanced)
ON_COMMAND(ID_MENU_COLOR, OnMenuColor)
ON_COMMAND(ID_MENU_CUSTOM, OnMenuCustom)
ON_COMMAND(ID_MENU_SOUND, OnMenuSound)
ON_COMMAND(ID_MENU_HERO_LIST, OnMenuHeroList)
ON_WM_INITMENU()
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_CLOSE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
ON_WM_ERASEBKGND()

//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMineWnd message handlers

void CMineWnd::OnMenuAbout() 
{
	::ShellAbout(this->m_hWnd,theApp.sResource[5],
		theApp.sResource[6],theApp.LoadIcon(IDR_MAINFRAME));
}

void CMineWnd::OnMenuHelpList() //?
{
	::WinExec("HH  winmine.chm", SW_SHOW);
}

void CMineWnd::OnMenuHelpFind() //?
{	
	::WinExec("HH  WINMINE.CHM", SW_SHOW);
}

void CMineWnd::OnMenuHelpUse() //?
{	
	::WinExec("HH NTHelp.chm", SW_SHOW);
}

void CMineWnd::OnMenuGameStart() 
{ 	
	ReAssign();
	GameInit();		
	Invalidate();
}

void CMineWnd::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if( nChar == VK_F1 )
	{
		OnMenuHelpList();
	}
	else if( nChar == VK_F2 )
	{  
		OnMenuGameStart();
	}
	CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CMineWnd::OnMenuPrimary() 
{     
	theApp.uGameLevel = LEVEL_PRIMARY;	
	uHeight = PRIMARY_HEIGHT;
	uWidth = PRIMARY_WIDTH;
	theApp.uCustomMineNum = PRIMARY_MINE_NUM;
	
	MyCheckMenuItem();
	SetWindowSize();
	
	ReAssign();
	GameInit();		
	Invalidate();
}


void CMineWnd::OnMenuSecondary() 
{
	theApp.uGameLevel = LEVEL_SECONDARY;
	uHeight = SECONDARY_HEIGHT;
	uWidth = SECONDARY_WIDTH;
	theApp.uCustomMineNum = SECONDARY_MINE_NUM;
	
	MyCheckMenuItem();
	SetWindowSize();	
	
	ReAssign();
	GameInit();		
	Invalidate();
}


void CMineWnd::OnMenuAdvanced() 
{	
	theApp.uGameLevel = LEVEL_ADVANCED;
	uWidth = ADVANCED_WIDTH;
	uHeight = ADVANCED_HEIGHT;	
	theApp.uCustomMineNum = ADVANCED_MINE_NUM;

⌨️ 快捷键说明

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