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