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

📄 fiveplusdlg.cpp

📁 该程序功能:用JAVa实现的彩色五珠棋小游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//DEL void CFivePlusDlg::OnButton1() 
//DEL {
//DEL 	// TODO: Add your control notification handler code here
//DEL 	
//DEL }

void CFivePlusDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if ( m_rectPlayArea.PtInRect(point) 
		&& !m_bIsMoving 
		&& !m_bIsDisappearing ){
		CPoint ptMap = this->MapCoord(point);
		
		switch (m_gameModel.ClickPoint(ptMap)) {
		case MOVE_CHESSMAN:
			m_ptMoveTo = ptMap;
			m_bIsMoving = TRUE;
			m_nTimerMoving = SetTimer(MOVE_SELECT, m_gameModel.m_nMoveInterval, 0);
			break;
		case SELECT_CHESSMAN:			
			InvalidateGrid();
			m_nBlendSelect = MIN_ALPHA ;
			m_nDirection = CHANGE_STEP;
			break;
		}					
	}
	CDialog::OnLButtonDown(nFlags, point);
}

CPoint CFivePlusDlg::MapCoord(CPoint point, BOOL bDirection)
{
	CPoint result;
	if ( bDirection ){
		result.x = (point.x - m_rectPlayArea.left)/(GRID_WIDTH + 2);
		result.y = (point.y - m_rectPlayArea.top)/(GRID_HEIGHT + 2);
	}else{
		result.x = point.x * (2 + GRID_WIDTH) + m_rectPlayArea.left + 1;
		result.y = point.y * (2 + GRID_HEIGHT) + m_rectPlayArea.top + 1;
	}	
	return result;
}

BOOL CFivePlusDlg::InvalidateGrid(){

	POSITION pos = m_gameModel.
		m_lstInvalidPoint.GetHeadPosition();

	while ( pos ){
		
		CPoint point = m_gameModel.
			m_lstInvalidPoint.GetNext(pos);	
		
		InvalidateRect(CRect(point.x * (GRID_WIDTH + 2) + 1,
			PLAY_AREA_TOP + point.y * (GRID_HEIGHT + 2) + 1,
			point.x * (GRID_WIDTH + 2) + 1 + GRID_WIDTH,
			PLAY_AREA_TOP + point.y * (GRID_HEIGHT + 2) + 1 + GRID_HEIGHT));			
	}
	return TRUE;
}

void CFivePlusDlg::DrawScore(CDC *dc)
{
	int score = m_gameModel.GetScore();
	for ( int i = 0; i < 4; i++){
		int remain = score;
		
		for ( int j = 0; j < (4-i-1); j++){
			remain /= 10;
		}					
		remain = remain%10;		
		dc->BitBlt(4 + i*30, 2, 24, 42, &m_dcNumber,
			remain*24, 0, SRCCOPY);
	}
}

void CFivePlusDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	switch(nIDEvent){
	case FLASH_SELECT:					
		this->FlashSelect();
		break;
	case MOVE_SELECT:
		this->FlashMove();		
		break;
	case DISAPPEAR:
		this->FlashDisappear();
		break;
	case SHOWING:
		this->FlashShow();
		break;
	}
	CDialog::OnTimer(nIDEvent);
}

void CFivePlusDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	KillTimer(m_nTimerSelected);	
}

void CFivePlusDlg::OnAboutbox() 
{
	// TODO: Add your command handler code here
	CAboutDlg dlg;
	dlg.DoModal();
}


BOOL CFivePlusDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	if ( !m_hAccel )
		return FALSE;
	HWND hwnd = this->GetSafeHwnd();
	return ::TranslateAccelerator(hwnd, m_hAccel, pMsg);
	//return CDialog::PreTranslateMessage(pMsg);
}

int CFivePlusDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	m_hAccel = ::LoadAccelerators(
		::AfxGetResourceHandle(),
		MAKEINTRESOURCE(IDR_ACCEL_COMMANDS));
		
	return 0;
}

void CFivePlusDlg::OnGameScore() 
{
	// TODO: Add your command handler code here
	CHighScoreDlg dlg(this, &(m_gameModel.m_scoreModel));
	dlg.DoModal();
}

void CFivePlusDlg::FlashSelect()
{
	if (m_gameModel.m_bHasSel){
					
		m_bfSelect.SourceConstantAlpha = m_nBlendSelect;			

		CRect rect(1 + m_gameModel.m_ptSel.x*(GRID_WIDTH+2),
			PLAY_AREA_TOP + 1 + m_gameModel.m_ptSel.y*(GRID_HEIGHT+2),
			1 + m_gameModel.m_ptSel.x*(GRID_WIDTH+2) + GRID_WIDTH,
			PLAY_AREA_TOP + 1 + m_gameModel.m_ptSel.y*(GRID_HEIGHT+2) + GRID_HEIGHT);
		
		m_dcOneGrid.BitBlt(0, 0, rect.Width(), rect.Height(),
			&m_dcGrid, (m_gameModel.m_grid[m_gameModel.m_ptSel.x][m_gameModel.m_ptSel.y] - 1)*GRID_WIDTH,
			0, SRCCOPY);

		BOOL result = ::AlphaBlend(m_dcOneGrid.m_hDC, 
			0,
			0,
			rect.Width(),
			rect.Height(),
			m_dcGrid.m_hDC,
			(m_gameModel.m_grid[m_gameModel.m_ptSel.x][m_gameModel.m_ptSel.y] - 1)*GRID_WIDTH,
			GRID_HEIGHT,
			GRID_WIDTH,
			GRID_HEIGHT,
			m_bfSelect);

		if (!result)
			AfxMessageBox("can't blend");

		CClientDC dc(this);
		dc.BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
			&m_dcOneGrid, 0, 0, SRCCOPY);
		
		if (m_nBlendSelect <= MIN_ALPHA)
			m_nDirection = CHANGE_STEP;
		if (m_nBlendSelect >= MAX_ALPHA )
			m_nDirection = -CHANGE_STEP;

		m_nBlendSelect += m_nDirection;			
		
		if ( m_nBlendSelect >= MAX_ALPHA  )
			m_nBlendSelect = MAX_ALPHA ;
		if ( m_nBlendSelect <= MIN_ALPHA )
			m_nBlendSelect = MIN_ALPHA;
	}
}

void CFivePlusDlg::FlashMove()
{	
	if ( m_bIsMoving ){			
		if ( !m_posCurMove ){
			m_posCurMove = m_gameModel.m_lstPathPoint.GetHeadPosition();
		}else{
			CPoint ptTopLeft = this->MapCoord(m_ptCurMove, FALSE);
			InvalidateRect(CRect(ptTopLeft.x, ptTopLeft.y, 
				ptTopLeft.x + GRID_WIDTH,
				ptTopLeft.y + GRID_HEIGHT));
		}
		m_ptCurMove = m_gameModel.m_lstPathPoint.GetNext(m_posCurMove);
		CPoint cur = this->MapCoord(m_ptCurMove, FALSE);
		CClientDC dc(this);
		dc.BitBlt(cur.x, cur.y, GRID_WIDTH, GRID_HEIGHT,
			&m_dcGrid,
			(m_gameModel.m_grid[m_ptMoveTo.x][m_ptMoveTo.y] - 1)*GRID_WIDTH,
			0, SRCCOPY);

		if ( !m_posCurMove ){
			m_bIsMoving = FALSE;
			KillTimer(m_nTimerMoving);
			int score = m_gameModel.CheckPoint(m_ptMoveTo, FALSE);
			if ( score ){
				BeginDisappear();				
			}else{
				if ( m_gameModel.NextStep() ){
					m_bIsDisappearing = TRUE;
					m_nBlendDisappear = 0;
					m_nTimerShow = SetTimer(SHOWING, m_gameModel.m_nShowInterval, 0);								
				}
				if ( m_gameModel.IsFill() ) {
					AfxMessageBox("游戏结束");
					OnGameNew();
				}
			}
		} 
	}		 
}

void CFivePlusDlg::FlashDisappear()
{
	if (m_bIsDisappearing){
		if (m_nBlendDisappear <= 0){
			m_gameModel.ClearInvalid();
			m_bIsDisappearing = FALSE;
			KillTimer(m_nTimerDisappear);			
			InvalidateRect(&m_rectScore);
		}else{			
			m_nBlendDisappear -= 8;
			if (m_nBlendDisappear < 0)
				m_nBlendDisappear = 0;
			m_bfDisappear.SourceConstantAlpha = m_nBlendDisappear;		
			this->DrawInvalid();
		}		
	}
}

void CFivePlusDlg::BeginDisappear()
{
	m_bIsDisappearing = TRUE;
	m_nBlendDisappear = 255;
	m_nTimerDisappear = SetTimer(DISAPPEAR, m_gameModel.m_nShowInterval, 0);
}

void CFivePlusDlg::FlashShow()
{
	if (m_bIsDisappearing){
		if (m_nBlendDisappear >= 255){
			m_bIsDisappearing = FALSE;
			KillTimer(m_nTimerShow);			
			InvalidateRect(&m_rectNextBalls);
			int score = m_gameModel.CheckNewPoint();
			if ( score ){
				BeginDisappear();
			}			
		}else{			
			m_nBlendDisappear += 8;
			if (m_nBlendDisappear > 255)
				m_nBlendDisappear = 255;
			m_bfDisappear.SourceConstantAlpha = m_nBlendDisappear;
			this->DrawInvalid();															
		}		
	}
}

void CFivePlusDlg::DrawInvalid(){

	POSITION pos = m_gameModel.m_lstInvalidPoint.GetHeadPosition();
	CClientDC dc(this);
	while(pos){
		CPoint ptCur = m_gameModel.m_lstInvalidPoint.GetNext(pos);
		CPoint ptCurMap = this->MapCoord(ptCur, FALSE);
		m_dcOneGrid.BitBlt(0, 0, GRID_WIDTH, GRID_HEIGHT,
			&m_dcBK, ptCurMap.x, ptCurMap.y, SRCCOPY);
		AlphaBlend(m_dcOneGrid.m_hDC, 0, 0, GRID_WIDTH, GRID_HEIGHT,
			m_dcGrid.m_hDC, (m_gameModel.m_grid[ptCur.x][ptCur.y] - 1)*GRID_WIDTH,
			0, GRID_WIDTH, GRID_HEIGHT, m_bfDisappear);

		dc.BitBlt(ptCurMap.x, ptCurMap.y, GRID_WIDTH, GRID_HEIGHT,
			&m_dcOneGrid, 0, 0, SRCCOPY);
	}
}


void CAboutDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CWnd* wndEmail = GetDlgItem(IDC_STATIC_EMAIL);
	CRect rect;
	wndEmail->GetClientRect(rect);
	CPoint copy = point;	
	MapWindowPoints(wndEmail, &copy, 1);	
	if ( rect.PtInRect(copy) ){
		ShellExecute(m_hWnd, NULL, "mailto:whbjiaozuo@263.net", NULL, NULL, SW_SHOW);		
	}
	CDialog::OnLButtonDown(nFlags, point);
}

BOOL CAboutDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	CPoint point;
	GetCursorPos(&point);	
	CWnd* wndEmail = GetDlgItem(IDC_STATIC_EMAIL);
	CRect rect;
	wndEmail->GetClientRect(rect);
	wndEmail->ScreenToClient(&point);

	if ( rect.PtInRect(point) ){
		HCURSOR cursor = AfxGetApp()->LoadCursor(IDC_HAND);
		SetCursor(cursor);
		return TRUE;
	}else{
		return CDialog::OnSetCursor(pWnd, nHitTest, message);
	}	
}

//DEL void CAboutDlg::OnHelpHowToPlay() 
//DEL {
//DEL 	// TODO: Add your command handler code here
//DEL 	ShellExecute(m_hWnd,"open","file://E:/game/FivePlus/res/Five+ Manual.htm",NULL,NULL,SW_SHOW);
//DEL }

void CFivePlusDlg::OnHelpHowToPlay() 
{
	// TODO: Add your command handler code here
	CFivePlusApp* theApp = (CFivePlusApp*)::AfxGetApp();
	ShellExecute(m_hWnd,"open",theApp->m_szWorkPath + "/res/Five+ Manual.htm",NULL,NULL,SW_SHOW);	// TODO: Add your message handler code here and/or call default	
}

BOOL CFivePlusDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
{	
	this->OnHelpHowToPlay();
	return TRUE;
	//return CDialog::OnHelpInfo(pHelpInfo);
}

void CFivePlusDlg::OnToolSetting() 
{
	// TODO: Add your command handler code here
	CSettingDlg	dlg;
		
	dlg.m_nExtraScore = m_gameModel.m_nExtraScore;
	dlg.m_nCommonFreq = m_gameModel.m_nCommon;
	dlg.m_nAnyFreq = m_gameModel.m_nAny;
	dlg.m_nCrackFreq = m_gameModel.m_nCrack;
	dlg.m_nSelect = m_gameModel.m_nSelectInterval;
	dlg.m_nShow = m_gameModel.m_nShowInterval;
	dlg.m_nMove = m_gameModel.m_nMoveInterval;
	int result = dlg.DoModal();
	if ( result == IDOK )
	{
		m_gameModel.m_nExtraScore = dlg.m_nExtraScore;
		m_gameModel.m_nCommon = dlg.m_nCommonFreq;
		m_gameModel.m_nAny = dlg.m_nAnyFreq;
		m_gameModel.m_nCrack = dlg.m_nCrackFreq;
		m_gameModel.m_nSelectInterval = dlg.m_nSelect;
		m_gameModel.m_nShowInterval = dlg.m_nShow;
		m_gameModel.m_nMoveInterval = dlg.m_nMove;
		m_gameModel.ResetRandom();
		//this->OnGameNew();
		//重新设置参数,开始新游戏。
	}
}

⌨️ 快捷键说明

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