可供两人对弈的中国象棋程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// Sample 10-4: 中国象棋程序

#include

// 棋盘类

class CPlate

{

int m_ndx; // 棋盘格宽

int m_ndy; // 棋盘格高

int m_nLeft; // 棋盘位置

int m_nTop;

int m_nRight;

int m_nBottom;

public:

CPlate();

void ShowPlate(CDC *pDC);

void DrawConer(CDC *pDC, int row, int col, int type);

CPoint GetPosition(int col, int row);

};

// 棋盘类的成员函数

// 构造函数: 初始化

CPlate::CPlate()

{

m_ndx = 50;

m_ndy = 45;

m_nLeft = 198;

m_nTop = 30;

m_nRight = m_nLeft+m_ndx*8;

m_nBottom = m_nTop+m_ndy*9;

}

// 显示棋盘

void CPlate::ShowPlate(CDC *pDC)

{

// 画棋盘方格

CPen penRed2(PS_SOLID,2,RGB(255,0,0));

CPen *pOldPen = pDC->SelectObject(&penRed2);

for(int i=0; i<10; i++)

{

pDC->MoveTo(m_nLeft, m_nTop+i*m_ndy);

pDC->LineTo(m_nRight, m_nTop+i*m_ndy);

}

for(i=0; i<9; i++)

{

if(i==0 || i==8)

{

pDC->MoveTo(m_nLeft+i*m_ndx, m_nTop);

pDC->LineTo(m_nLeft+i*m_ndx, m_nBottom);

}

else{

pDC->MoveTo(m_nLeft+i*m_ndx, m_nTop);

pDC->LineTo(m_nLeft+i*m_ndx, m_nTop+4*m_ndy);

pDC->MoveTo(m_nLeft+i*m_ndx, m_nTop+5*m_ndy);

pDC->LineTo(m_nLeft+i*m_ndx, m_nBottom);

}

}

// 画棋盘斜线

pDC->SelectObject(pOldPen);

CPen penRed1(PS_SOLID,1,RGB(255,0,0));

pOldPen = pDC->SelectObject(&penRed1);

pDC->MoveTo(m_nLeft+3*m_ndx, m_nTop);

pDC->LineTo(m_nLeft+5*m_ndx, m_nTop+2*m_ndy);

pDC->MoveTo(m_nLeft+3*m_ndx, m_nTop+2*m_ndy);

pDC->LineTo(m_nLeft+5*m_ndx, m_nTop);

pDC->MoveTo(m_nLeft+3*m_ndx, m_nBottom);

pDC->LineTo(m_nLeft+5*m_ndx, m_nBottom-2*m_ndy);

pDC->MoveTo(m_nLeft+3*m_ndx, m_nBottom-2*m_ndy);

pDC->LineTo(m_nLeft+5*m_ndx, m_nBottom);

pDC->SelectObject(pOldPen);

// 画兵, 炮位标记

DrawConer(pDC, 2, 1, 0);

DrawConer(pDC, 2, 7, 0);

DrawConer(pDC, 3, 0, 1);

DrawConer(pDC, 3, 2, 0);

DrawConer(pDC, 3, 4, 0);

DrawConer(pDC, 3, 6, 0);

DrawConer(pDC, 3, 8, 2);

DrawConer(pDC, 7, 1, 0);

DrawConer(pDC, 7, 7, 0);

DrawConer(pDC, 6, 0, 1);

DrawConer(pDC, 6, 2, 0);

DrawConer(pDC, 6, 4, 0);

DrawConer(pDC, 6, 6, 0);

DrawConer(pDC, 6, 8, 2);

}

// 绘制兵, 炮位标志

void CPlate::DrawConer(CDC *pDC, int row, int col, int type) {

CPen penRed1(PS_SOLID,1,RGB(255,0,0));

CPen *pOldPen = pDC->SelectObject(&penRed1);

if(type == 0 || type == 1)

{

pDC->MoveTo(m_nLeft+col*m_ndx+ 3, m_nTop+row*m_ndy-10);

pDC->LineTo(m_nLeft+col*m_ndx+ 3, m_nTop+row*m_ndy-3);

pDC->LineTo(m_nLeft+col*m_ndx+10, m_nTop+row*m_ndy-3);

pDC->MoveTo(m_nLeft+col*m_ndx+ 3, m_nTop+row*m_ndy+10);

pDC->LineTo(m_nLeft+col*m_ndx+ 3, m_nTop+row*m_ndy+3);

pDC->LineTo(m_nLeft+col*m_ndx+10, m_nTop+row*m_ndy+3);

}

if(type == 0 || type == 2)

{

pDC->MoveTo(m_nLeft+col*m_ndx- 3, m_nTop+row*m_ndy-10);

pDC->LineTo(m_nLeft+col*m_ndx- 3, m_nTop+row*m_ndy-3);

pDC->LineTo(m_nLeft+col*m_ndx-10, m_nTop+row*m_ndy-3);

pDC->MoveTo(m_nLeft+col*m_ndx- 3, m_nTop+row*m_ndy+10);

pDC->LineTo(m_nLeft+col*m_ndx- 3, m_nTop+row*m_ndy+3);

pDC->LineTo(m_nLeft+col*m_ndx-10, m_nTop+row*m_ndy+3);

}

pDC->SelectObject(pOldPen);

}

// 取棋盘上各交叉点的坐标

CPoint CPlate::GetPosition(int col, int row)

{

CPoint point;

point.x = m_nLeft+col*m_ndx;

point.y = m_nTop+row*m_ndy;

return point;

相关文档
最新文档