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

📄 childview.cpp

📁 华容道游戏
💻 CPP
字号:
// ChildView.cpp : implementation of the CChildView class
//

#include "stdafx.h"
#include "Whrd.h"
#include "DlgLevel.h"
#include "ChildView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CBitmap CChildView::s_bmpBack;
const CSize CChildView::s_szMain = CSize(376, 376);
const CSize CChildView::s_szMap = CSize(6, 6);
char CChildView::s_Map[CChildView::MAX_LEVEL][256] = {"012200301340131433415154", //	1
													"002100122152144211241203331430404415", //	2
													"002130142104134240214215320351413",	//	3
													"002130142104134240214215320351413", //	4
													"002100122131124211234351420435", //	5
													"012123154200301330433425", //	6
													"012120200201244330303423425", //	7
													"002141122113134200220233215244245350303", //	8
													"022120112141144230243404", //	9
													"002130103114241233225245321352400424", //	10
													"032121123133231243244350400405",	//	11
													"012100120102114154241243224331430425",		//	12
													"012120200302330423405",	//	13
													"002100110131151104124154342430413",	//	14
													"002100122132124231243234350420435", //	15
													"002110103134144230214223243320350405"};

// CChildView

CChildView::CChildView()
{
	InitImage();
	m_nLevel = 0;
	StartNewGame(m_nLevel);
}

CChildView::~CChildView()
{
	ClearImage();
	m_aryMan.RemoveAll();
}


BEGIN_MESSAGE_MAP(CChildView, CWnd)
	ON_WM_PAINT()
	ON_COMMAND(ID_GAME_START, OnGameStart)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_GAME_CHOOSELEVEL, OnGameChooselevel)
END_MESSAGE_MAP()



// CChildView message handlers

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CWnd::PreCreateWindow(cs))
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
		::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);

	return TRUE;
}

void CChildView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	
	// Do not call CWnd::OnPaint() for painting messages
	
	CDC memDC;
	memDC.CreateCompatibleDC(&dc);
	memDC.SelectObject(s_bmpBack);

	dc.BitBlt(0, 0, s_szMain.cx, s_szMain.cy, &memDC, 0, 0, SRCCOPY);

	memDC.DeleteDC();

	for (int n=0; n<m_aryMan.GetCount(); n++)
	{
		if (m_manSelected.m_bUsed && m_manSelected.m_nIndex == n) continue;
		m_aryMan[n].Draw(&dc);
	}
	if (m_manSelected.m_bUsed) m_manSelected.Draw(&dc);
}

BOOL CChildView::InitImage(void)
{
	if (!s_bmpBack.LoadBitmap(IDB_BACK)) return FALSE;

	return CChessMan::InitImage();
}

void CChildView::ClearImage(void)
{
	s_bmpBack.DeleteObject();
	CChessMan::ClearImage();
}

BOOL CChildView::StartNewGame(int nLevel)
{
	CChessMan::SetStartPoint(CPoint(47, 47));
	m_aryMan.RemoveAll();
	CChessMan man;
	for (int i=0; i<(int)strlen(s_Map[nLevel]); i+=3)
	{
		int nType = s_Map[nLevel][i] - '0';
		CPoint pt = (CPoint(s_Map[nLevel][i+1] - '0', s_Map[nLevel][i+2] - '0'));
		man = CChessMan(pt, nType);
		m_aryMan.Add(man);
	}
	/*
	man = CChessMan(CPoint(1, 2), 0);
	m_aryMan.Add(man);
	man = CChessMan(CPoint(0, 0), 2);
	m_aryMan.Add(man);
	man = CChessMan(CPoint(0, 1), 3);
	m_aryMan.Add(man);
	man = CChessMan(CPoint(4, 0), 3);
	m_aryMan.Add(man);
	man = CChessMan(CPoint(3, 1), 1);
	m_aryMan.Add(man);
	man = CChessMan(CPoint(3, 3), 4);
	m_aryMan.Add(man);
	man = CChessMan(CPoint(1, 5), 4);
	m_aryMan.Add(man);
	man = CChessMan(CPoint(5, 4), 1);
	m_aryMan.Add(man);
	*/
	m_manSelected.m_bUsed = FALSE;
	return 0;
}

void CChildView::OnGameStart()
{
	// TODO: Add your command handler code here
	StartNewGame(m_nLevel);
	Invalidate();
}

void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default

	m_manSelected.m_bUsed = FALSE;
	for (int i=0; i<m_aryMan.GetCount(); i++)
	{
		if (m_aryMan[i].PointInMe(point))
		{
			if (IsChessManCanMove(i)) 
			{
				m_manSelected.m_ptMouseStart = point;
				m_manSelected.m_ptMouseNow = point;
				SetCapture();
				break;
			}
		}
	}
	CWnd::OnLButtonDown(nFlags, point);
}

void CChildView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	if (m_manSelected.m_bUsed)
	{
		ReleaseCapture();
		CRect rcOld = m_manSelected.GetRect();
		CSize sz = m_manSelected.PlaceChessMan(point);
		int nIndex = m_manSelected.m_nIndex;
		m_aryMan[nIndex].m_ptPos.Offset(sz);
		CRect rcNew = m_aryMan[nIndex].GetRect();
		if (rcNew != rcOld)
			InvalidateRect(rcNew | rcOld, TRUE);
		m_manSelected.m_bUsed = FALSE;
		if (m_aryMan[nIndex].m_nType == CChessMan::CT_MAIN && m_aryMan[nIndex].m_ptPos.x == s_szMap.cx - 1)
		{
			MessageBox("Entry next level ...");
			m_nLevel++;
			if (m_nLevel >= MAX_LEVEL) m_nLevel = 0;
			StartNewGame(m_nLevel);
			Invalidate();
		}
	}
	CWnd::OnLButtonUp(nFlags, point);
}

void CChildView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	if (m_manSelected.m_bUsed)
	{
		CRect rcOld = m_manSelected.GetRect();
		m_manSelected.m_ptMouseNow = point;
		CRect rcNew = m_manSelected.GetRect();
		if (rcNew != rcOld)
			InvalidateRect(rcNew | rcOld, TRUE);
	}
	CWnd::OnMouseMove(nFlags, point);
}

BOOL CChildView::IsChessManCanMove(int nIndex)
{
	int nMoveLeft = 0;
	int nMoveRight = 0;
	int nMoveUp = 0;
	int nMoveDown = 0;

	if (m_aryMan[nIndex].GetDirection() == 1)
	{
		nMoveLeft = 0;
		nMoveRight = 0;
		for (int i=m_aryMan[nIndex].m_ptPos.y+1; i<=s_szMap.cy-m_aryMan[nIndex].GetSize().cy; i++)
		{
			if (CanPlaceChessMan(nIndex, CPoint(m_aryMan[nIndex].m_ptPos.x, i)))
				nMoveDown++;
			else
				break;
		}
		for (int i=m_aryMan[nIndex].m_ptPos.y-1; i>=0; i--)
		{
			if (CanPlaceChessMan(nIndex, CPoint(m_aryMan[nIndex].m_ptPos.x, i)))
				nMoveUp++;
			else
				break;
		}
	}
	else
	{
		nMoveUp = 0;
		nMoveDown = 0;
		int nMainChessMove = 0;
		if (m_aryMan[nIndex].m_nType == CChessMan::CT_MAIN && m_aryMan[nIndex].m_ptPos.y == 2)
			nMainChessMove = 1;
		for (int i=m_aryMan[nIndex].m_ptPos.x+1; i<=s_szMap.cx-m_aryMan[nIndex].GetSize().cx + nMainChessMove; i++)
		{
			if (CanPlaceChessMan(nIndex, CPoint(i, m_aryMan[nIndex].m_ptPos.y)))
				nMoveRight++;
			else
				break;
		}
		for (int i=m_aryMan[nIndex].m_ptPos.x-1; i>=0; i--)
		{
			if (CanPlaceChessMan(nIndex, CPoint(i, m_aryMan[nIndex].m_ptPos.y)))
				nMoveLeft++;
			else
				break;
		}
	}
	if (nMoveUp || nMoveDown || nMoveLeft || nMoveRight)
	{
		m_manSelected.CopyChessMan(m_aryMan[nIndex], nIndex);
		m_manSelected.SetMoveStep(nMoveUp, nMoveDown, nMoveLeft, nMoveRight);
		return TRUE;
	}
	return FALSE;
}

BOOL CChildView::CanPlaceChessMan(int nIndex, CPoint pt)
{
	for (int i=0; i<m_aryMan.GetSize(); i++)
	{
		if (i == nIndex) continue;
		if (m_aryMan[i].IsRectInMe(CRect(pt, m_aryMan[nIndex].GetSize()))) 
			return FALSE;
	}
	return TRUE;
}

void CChildView::OnGameChooselevel()
{
	// TODO: Add your command handler code here
	CDlgLevel dlg;
	dlg.m_nLevel = m_nLevel + 1;
	if (dlg.DoModal() == IDOK)
	{
		if (dlg.m_nLevel != m_nLevel + 1)
		{
			m_nLevel = dlg.m_nLevel - 1;
			StartNewGame(m_nLevel);
			Invalidate();
		}
	}
}

⌨️ 快捷键说明

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