可供两人对弈的中国象棋程序.doc_第1页
可供两人对弈的中国象棋程序.doc_第2页
可供两人对弈的中国象棋程序.doc_第3页
可供两人对弈的中国象棋程序.doc_第4页
可供两人对弈的中国象棋程序.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#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 Show(CDC *pDC); void DrawConer(CDC *pDC, int row, int col, int type); CPoint GetPosition(int col, int row);/ 棋盘类的成员函数/ 构造函数: 初始化void CPlate:DrawConer(CDC *pDC, int row, int col, int type)CPen penRed1(PS_SOLID,2,RGB(255,0,0);CPen *p01dPen=pDC-SelectObject(&penRed1); /为所画的线条上红色if(type=2|type=1)pDC-MoveTo(m_nLeft+col*m_ndx+5,m_nTop+row*m_ndy-10);pDC-LineTo(m_nLeft+col*m_ndx+5,m_nTop+row*m_ndy-5);pDC-LineTo(m_nLeft+col*m_ndx+10,m_nTop+row*m_ndy-5);pDC-MoveTo(m_nLeft+col*m_ndx+5,m_nTop+row*m_ndy+10);pDC-LineTo(m_nLeft+col*m_ndx+5,m_nTop+row*m_ndy+5);pDC-LineTo(m_nLeft+col*m_ndx+10,m_nTop+row*m_ndy+5);if(type=2|type=3)pDC-MoveTo(m_nLeft+col*m_ndx-5,m_nTop+row*m_ndy-10);pDC-LineTo(m_nLeft+col*m_ndx-5,m_nTop+row*m_ndy-5);pDC-LineTo(m_nLeft+col*m_ndx-10,m_nTop+row*m_ndy-5);pDC-MoveTo(m_nLeft+col*m_ndx-5,m_nTop+row*m_ndy+10);pDC-LineTo(m_nLeft+col*m_ndx-5,m_nTop+row*m_ndy+5);pDC-LineTo(m_nLeft+col*m_ndx-10,m_nTop+row*m_ndy+5);/构造函数初始化CPlate:CPlate()m_ndx=60;m_ndy=60;m_nLeft=280;m_nTop=70;m_nRight=m_nLeft+m_ndy*8;m_nBottom=m_nTop+m_ndx*9;void CPlate:ShowPlate(CDC *pDC)CPen penRed2(PS_SOLID,3,RGB(255,0,0); /为所画的线条上红色CPen *p01dPen=pDC-SelectObject(&penRed2); int i;for(i=0;iMoveTo(m_nLeft,m_nTop+m_ndy*i);pDC-LineTo(m_nRight,m_nTop+m_ndy*i);for(i=0;iMoveTo(m_nLeft+m_ndx*i,m_nTop);pDC-LineTo(m_nLeft+m_ndx*i,m_nBottom);elsepDC-MoveTo(m_nLeft+m_ndx*i,m_nTop);pDC-LineTo(m_nLeft+m_ndx*i,m_nTop+m_ndy*4);pDC-MoveTo(m_nLeft+m_ndx*i,m_nTop+m_ndy*5);pDC-LineTo(m_nLeft+m_ndx*i,m_nBottom);pDC-MoveTo(m_nLeft+m_ndx*3,m_nTop);pDC-LineTo(m_nLeft+m_ndx*5,m_nTop+m_ndy*2);pDC-MoveTo(m_nLeft+m_ndx*5,m_nTop);pDC-LineTo(m_nLeft+m_ndx*3,m_nTop+m_ndy*2);pDC-MoveTo(m_nLeft+m_ndx*3,m_nTop+m_ndx*7);pDC-LineTo(m_nLeft+m_ndx*5,m_nBottom);pDC-MoveTo(m_nLeft+m_ndx*5,m_nTop+m_ndx*7);pDC-LineTo(m_nLeft+m_ndx*3,m_nBottom);DrawConer(pDC,2 ,1 , 2);DrawConer(pDC,2 ,7 , 2);DrawConer(pDC,3 ,0 , 1);DrawConer(pDC,3 ,2 , 2);DrawConer(pDC,3 ,4 , 2);DrawConer(pDC,3 ,6 , 2);DrawConer(pDC,3 ,8 , 3);DrawConer(pDC,7 ,1 , 2);DrawConer(pDC,7 ,7 , 2);DrawConer(pDC,6 ,0 , 1);DrawConer(pDC,6 ,2 , 2);DrawConer(pDC,6 ,4 , 2);DrawConer(pDC,6 ,6 , 2);DrawConer(pDC,6 ,8 , 3);CFont *pOldFont, fontInfo;fontInfo.CreateFont(45, 0, 0, 0, 400, FALSE, FALSE,0, OEM_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH, 楷体);pOldFont = pDC-SelectObject(&fontInfo);pDC-TextOut(346,320,楚);pDC-TextOut(411,320,河);pDC-TextOut(591,320,汉);pDC-TextOut(651,320,界); pDC-SelectObject(pOldFont);/ 绘制兵, 炮位标志/ 取棋盘上各交叉点的坐标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;/ 棋子类/ 定义棋子名称#define BING 1#define PAO 2#define JU 3#define MA 4#define XIANG 5#define SHI 6#define JIANG 7class CStone BOOL m_bRed; / 是否红方 BOOL m_bSelected; / 是否被选择 int m_nCol; / 路 int m_nRow; / 行 CRect m_rectStone; / 棋子包含矩形 BOOL m_bShow; / 是否显示 CString m_sName; / 棋子名称 int m_nR; / 棋子半径 int m_nType; / 棋子类型public: CStone () CStone (BOOL red, int col, int row, LPCSTR name, int type, CPlate &plate); void ShowStone(CDC *pDC); void MoveTo(int col, int row, CPlate &plate); CRect GetRect()return m_rectStone; int GetType()return m_nType; BOOL BeKilled(int col, int row)return m_bShow & m_nCol=col & m_nRow = row; BOOL MouseOnStone(CPoint point)return m_rectStone.PtInRect(point) & m_bShow; void KillIt()m_bShow = FALSE; void SelectStone()m_bSelected = !m_bSelected;/ 棋子类的成员函数/ 棋子类的构造函数:初始化棋子CStone:CStone(BOOL red, int col, int row, LPCSTR name, int type, CPlate &plate) m_bShow = TRUE; m_bSelected = FALSE; m_bRed = red; m_nCol = col; m_nRow = row; m_sName = name; m_nType = type; m_nR = 28; CPoint pos = plate.GetPosition(col, row); m_rectStone = CRect(pos.x-m_nR, pos.y-m_nR, pos.x+m_nR, pos.y+m_nR);/ 显示棋子void CStone:ShowStone(CDC *pDC) if(m_bShow) / 只有未被吃掉的棋子才显示 / 准备画棋子的画笔和画刷 CPen *pOldPen, penNormal(PS_SOLID, 3, RGB(120, 120, 120); CBrush *pOldBrush, brushNormal, brushSelected; brushNormal.CreateSolidBrush(RGB(230, 200, 0); brushSelected.CreateSolidBrush(RGB(127, 127, 0); pOldPen = pDC-SelectObject(&penNormal); / 被选中的棋子颜色不同 if(m_bSelected) pOldBrush = pDC-SelectObject(&brushSelected); else pOldBrush = pDC-SelectObject(&brushNormal); / 显示棋子 CRect r(m_rectStone); r.left +; r.top +; r.right -; r.bottom-; pDC-Ellipse(r); pDC-SelectObject(pOldPen); pDC-SelectObject(pOldBrush); / 准备显示棋子名称的字体 CFont *pOldFont, fontStone; fontStone.CreateFont(48, 0, 0, 0, 400, FALSE, FALSE,0, OEM_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH, 宋体); pOldFont = pDC-SelectObject(&fontStone); int tx = m_rectStone.left+6; int ty = m_rectStone.top+6; pDC-SetBkMode(TRANSPARENT); / 棋子背景均为黄色,字分红、黑两色 pDC-SetTextColor(RGB(m_bRed?255:0, 0, 0); pDC-TextOut(tx, ty, m_sName); pDC-SelectObject(pOldFont); / 将棋子放到指定位置void CStone:MoveTo(int col, int row, CPlate &plate) m_bSelected = FALSE; m_nCol = col; m_nRow = row; CPoint pos = plate.GetPosition(col, row); m_rectStone = CRect(pos.x-m_nR, pos.y-m_nR, pos.x+m_nR, pos.y+m_nR);/ 框架窗口类class CMyWnd: public CFrameWnd int a,b;CPlate m_Plate; / 棋盘 CStone m_StoneList32; / 棋子数组 BOOL m_bRedTurn; / 轮红方下 BOOL m_bSelectOne; / 已选择一棋子 int m_nWhichStone; / 被选择棋子的编号 CRect m_rectInfo; / 信息显示位置public: CMyWnd()InitGame();a=0;b=0; void InitGame(); void ShowInfo(CDC *pDC); BOOL KillSelfStone(int col, int row, BOOL red); int KillEnemy(int col, int row, BOOL red); void MoveStone(CPoint point); void SelectStone(CPoint point); void Go(CPoint); BOOL MoveTo(int, int);protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP();/ 消息映射BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)ON_WM_PAINT()ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()/ 框架窗口类的成员函数/ 初始化棋局void CMyWnd:InitGame() m_bRedTurn = TRUE; m_bSelectOne = FALSE; m_rectInfo = CRect(315, 480, 0, 0); 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_StoneList10 = CStone(TRUE, 7, 2, 炮, 2, m_Plate); m_StoneList11 = CStone(TRUE, 0, 3, 兵, 1, m_Plate); m_StoneList12 = CStone(TRUE, 2, 3, 兵, 1, m_Plate); m_StoneList13 = CStone(TRUE, 4, 3, 兵, 1, m_Plate); m_StoneList14 = CStone(TRUE, 6, 3, 兵, 1, m_Plate); m_StoneList15 = CStone(TRUE, 8, 3, 兵, 1, m_Plate); m_StoneList16 = CStone(FALSE, 0, 9, 车, 3, m_Plate); m_StoneList17 = CStone(FALSE, 1, 9, 马, 4, m_Plate); m_StoneList18 = CStone(FALSE, 2, 9, 相, 5, m_Plate); m_StoneList19 = CStone(FALSE, 3, 9, 仕, 6, m_Plate); m_StoneList20 = CStone(FALSE, 4, 9, 帅, 7, m_Plate); m_StoneList21 = CStone(FALSE, 5, 9, 仕, 6, m_Plate); m_StoneList22 = CStone(FALSE, 6, 9, 相, 5, m_Plate); m_StoneList23 = CStone(FALSE, 7, 9, 马, 4, m_Plate); m_StoneList24 = CStone(FALSE, 8, 9, 车, 3, m_Plate); m_StoneList25 = CStone(FALSE, 1, 7, 炮, 2, m_Plate); m_StoneList26 = CStone(FALSE, 7, 7, 炮, 2, m_Plate); m_StoneList27 = CStone(FALSE, 0, 6, 卒, 1, m_Plate); m_StoneList28 = CStone(FALSE, 2, 6, 卒, 1, m_Plate); m_StoneList29 = CStone(FALSE, 4, 6, 卒, 1, m_Plate); m_StoneList30 = CStone(FALSE, 6, 6, 卒, 1, m_Plate); m_StoneList31 = CStone(FALSE, 8, 6, 卒, 1, m_Plate);/ 处理 WM_ONPAINT 消息, 绘制窗口客户区 (绘制棋盘, 棋子等)void CMyWnd:OnPaint() CPaintDC dc(this); m_Plate.ShowPlate(&dc); / 显示棋盘 for(int i=0; i32; i+) / 显示所有棋子 m_StoneListi.ShowStone(&dc); ShowInfo(&dc); / 显示轮谁行棋/ 处理 WM_ONLBUTTONDOWN 消息, 移动棋子void CMyWnd:OnLButtonDown(UINT nFlags, CPoint point) if(m_bSelectOne) / 已选择了要移动的棋子 MoveStone(point); else / 尚未选择要移动的棋子 SelectStone(point);/ 移动棋子void CMyWnd:MoveStone(CPoint point) / 如果选择原来的棋子, 作废原来的选择 if(m_StoneListm_nWhichStone.MouseOnStone(point) m_StoneListm_nWhichStone.SelectStone(); m_bSelectOne = FALSE; InvalidateRect(m_StoneListm_nWhichStone.GetRect(), FALSE); else / 在棋盘其他位置行棋 Go(point);/ 走棋或吃棋void CMyWnd:Go(CPoint point) for(int col=0; col9; col+) / 检查鼠标是否指向某个棋盘交叉点 for(int row=0; row=0) / 确实吃了对方棋子 m_StoneListi.KillIt(); if(m_StoneListi.GetType() = 7)if(m_bRedTurn) MessageBox(红方胜!); a+;elseMessageBox(黑方胜!); b+; InitGame(); Invalidate(); return TRUE; / 更新窗口客户区提示信息位置 InvalidateRect(m_rectInfo); return !m_bRedTurn;/ 选择棋子void CMyWnd:SelectStone(CPoint point) int nwhich = m_bRedTurn?0:16; / 逐个查看己方棋子是否被选中 for(int i=nwhich; iSelectObject(&fontInfo); pDC-TextOut(800,400,黑方);pDC-S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论