📄 childview.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 + -