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

📄 myview.cpp

📁 VC面向对象的学习教程
💻 CPP
字号:
// MyView.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "My.h"

#include "MyDoc.h"
#include "MyView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
	//{{AFX_MSG_MAP(CMyView)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
	// TODO: add construction code here
	InitGame();
}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	m_Plate.ShowPlate(pDC);				// 显示棋盘
	for(int i=0; i<32; i++)				// 显示所有棋子
		m_StoneList[i].ShowStone(pDC);		
	ShowInfo(pDC);						// 显示轮谁行棋
}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers
void CMyView::InitGame()
{
	m_bRedTurn		= TRUE;
	m_bSelectOne	= FALSE;
	m_rectInfo		= CRect(315, 480, 515, 550);
	m_StoneList[ 0] = CStone(TRUE, 0, 0, "车", 3, m_Plate);
	m_StoneList[ 1] = CStone(TRUE, 1, 0, "马", 4, m_Plate);
	m_StoneList[ 2] = CStone(TRUE, 2, 0, "象", 5, m_Plate);
	m_StoneList[ 3] = CStone(TRUE, 3, 0, "士", 6, m_Plate);
	m_StoneList[ 4] = CStone(TRUE, 4, 0, "将", 7, m_Plate);
	m_StoneList[ 5] = CStone(TRUE, 5, 0, "士", 6, m_Plate);
	m_StoneList[ 6] = CStone(TRUE, 6, 0, "象", 5, m_Plate);
	m_StoneList[ 7] = CStone(TRUE, 7, 0, "马", 4, m_Plate);
	m_StoneList[ 8] = CStone(TRUE, 8, 0, "车", 3, m_Plate);
	m_StoneList[ 9] = CStone(TRUE, 1, 2, "炮", 2, m_Plate);
	m_StoneList[10] = CStone(TRUE, 7, 2, "炮", 2, m_Plate);
	m_StoneList[11] = CStone(TRUE, 0, 3, "兵", 1, m_Plate);
	m_StoneList[12] = CStone(TRUE, 2, 3, "兵", 1, m_Plate);
	m_StoneList[13] = CStone(TRUE, 4, 3, "兵", 1, m_Plate);
	m_StoneList[14] = CStone(TRUE, 6, 3, "兵", 1, m_Plate);
	m_StoneList[15] = CStone(TRUE, 8, 3, "兵", 1, m_Plate);
	m_StoneList[16] = CStone(FALSE, 0, 9, "车", 3, m_Plate);
	m_StoneList[17] = CStone(FALSE, 1, 9, "马", 4, m_Plate);
	m_StoneList[18] = CStone(FALSE, 2, 9, "相", 5, m_Plate);
	m_StoneList[19] = CStone(FALSE, 3, 9, "仕", 6, m_Plate);
	m_StoneList[20] = CStone(FALSE, 4, 9, "帅", 7, m_Plate);
	m_StoneList[21] = CStone(FALSE, 5, 9, "仕", 6, m_Plate);
	m_StoneList[22] = CStone(FALSE, 6, 9, "相", 5, m_Plate);
	m_StoneList[23] = CStone(FALSE, 7, 9, "马", 4, m_Plate);
	m_StoneList[24] = CStone(FALSE, 8, 9, "车", 3, m_Plate);
	m_StoneList[25] = CStone(FALSE, 1, 7, "炮", 2, m_Plate);
	m_StoneList[26] = CStone(FALSE, 7, 7, "炮", 2, m_Plate);
	m_StoneList[27] = CStone(FALSE, 0, 6, "卒", 1, m_Plate);
	m_StoneList[28] = CStone(FALSE, 2, 6, "卒", 1, m_Plate);
	m_StoneList[29] = CStone(FALSE, 4, 6, "卒", 1, m_Plate);
	m_StoneList[30] = CStone(FALSE, 6, 6, "卒", 1, m_Plate);
	m_StoneList[31] = CStone(FALSE, 8, 6, "卒", 1, m_Plate);
}
void CMyView::ShowInfo(CDC *pDC)
{
	CFont *pOldFont, fontInfo;
	fontInfo.CreateFont(50, 0, 0, 0, 400, FALSE, FALSE,
					 0, OEM_CHARSET, OUT_DEFAULT_PRECIS,
					 CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
					 DEFAULT_PITCH, "楷体");
	pOldFont = pDC->SelectObject(&fontInfo);
	pDC->SetTextColor(RGB(m_bRedTurn?255:0, 0, 0));
	pDC->TextOut(m_rectInfo.left, m_rectInfo.top,
				 m_bRedTurn?"红方行棋": "黑方行棋");
	pDC->SelectObject(pOldFont);
}
BOOL CMyView::KillSelfStone(int col, int row, BOOL red)
{
	int from = red?0:16;
	// 逐个检查己方棋子是否被误杀
	for(int i=from; i<from+16; i++)
		if( m_StoneList[i].BeKilled(col, row))
			return TRUE;
	return FALSE;
}
int CMyView::KillEnemy(int col, int row, BOOL red)
{
	int from = red?16:0;
	// 逐个检查对方棋子是否被吃
	for(int i=from; i<from+16; i++)
		if( m_StoneList[i].BeKilled(col, row))
			return i;
	return -1;
}
void CMyView::MoveStone(CPoint point)
{
	// 如果选择原来的棋子, 作废原来的选择
	if(m_StoneList[m_nWhichStone].MouseOnStone(point))
	{
		m_StoneList[m_nWhichStone].SelectStone();
		m_bSelectOne = FALSE;
		InvalidateRect(m_StoneList[m_nWhichStone].GetRect(), FALSE);
	}
	else // 在棋盘其他位置行棋
		Go(point);
}
void CMyView::SelectStone(CPoint point)
{
	int nwhich = m_bRedTurn?0:16;
	// 逐个查看己方棋子是否被选中
	for(int i=nwhich; i<nwhich+16; i++)
		if(m_StoneList[i].MouseOnStone(point))
		{
			m_StoneList[i].SelectStone();
			// 更新窗口客户区被选中棋子的位置(该棋子要变色)
			InvalidateRect(m_StoneList[i].GetRect(), FALSE);
			m_nWhichStone	= i;
			m_bSelectOne	= TRUE;
			break;
		}
}
void CMyView::Go(CPoint point)
{
	for(int col=0; col<9; col++)	// 检查鼠标是否指向某个棋盘交叉点
		for(int row=0; row<10; row++)
		{
			CPoint p = m_Plate.GetPosition(col, row);
			CRect  r(p.x-23, p.y-23, p.x+23, p.y+23);
			if(r.PtInRect(point)) // 鼠标指向该交叉点
			{
				if(KillSelfStone(col, row, m_bRedTurn))
					MessageBox("您竟然想吃自己人?!");
				else
					m_bRedTurn = MoveTo(col, row);
			}
		}
}
BOOL CMyView::MoveTo(int col, int row)
{
	// 更新窗口客户区原来的棋子位置
	InvalidateRect(m_StoneList[m_nWhichStone].GetRect());
	// 棋子移向新位置
	m_StoneList[m_nWhichStone].MoveTo(col, row, m_Plate);
	// 更新窗口客户区新的棋子位置
	InvalidateRect(m_StoneList[m_nWhichStone].GetRect());
	// 还原选择棋子标志
	m_bSelectOne = FALSE;
	// 检查是否吃了对方的棋子
	int i = KillEnemy(col, row, m_bRedTurn);
	if(i>=0)	// 确实吃了对方棋子
	{
		m_StoneList[i].KillIt();
		if(m_StoneList[i].GetType() == JIANG)
		{
			if(m_bRedTurn)
				MessageBox(m_bRedTurn?"红方胜!":"黑方胜!");
			InitGame();
			Invalidate();
			return TRUE;
		}
	}
	// 更新窗口客户区提示信息位置
	InvalidateRect(m_rectInfo);
	return !m_bRedTurn;
}

void CMyView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bSelectOne) // 已选择了要移动的棋子
		MoveStone(point);
	else				// 尚未选择要移动的棋子
		SelectStone(point);
		
	CView::OnLButtonDown(nFlags, point);
}

⌨️ 快捷键说明

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