象棋代码

#include<afxwin>
#include"resource"
using namespace std;
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_SOLLD,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,REG(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,REG(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;
}
//棋子类
//定义棋子名称
#define   BING   1
#define   PAO    2
#define   JU     3
#define   MA     4
#define   XIANG 5
#define   SHI    6
#define   JIANG 7
class 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_nrectStone.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=23;
CPoint pos=plate.GetPosition(col,row);
m_rectStone=CRect(pos.x-mR,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,REG(120,120,120));
   CBrush *pOldBrush,brushNormal,brushSelected;
   brushNormal.CreateSolidBrush(RGB(255,255,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(40,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(REG(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 CMyDoc : public CDocument
{protected://create from serialization only
     DECLARE_DYNCREATE(CMyDoc)
public:
DECLARE_MESSAGE_MAP()
};
IMPLEMENT_DYNCREATE(CMyDoc,CDocument)
BEGIN_MESSAGE_MAP(CMyDoc,CDocument)
END_MESSAGE_MAP()
//视图类
class CMyView : public CView
{
protected://create from serialization only
CMyView();
DECLARE_DYNCREATE(CMyView)
   //Attributes
private:
CStone m_StoneList[32];
CPlate m_Plate;
BOOL m_bRedTurn;
BOOL m_bSelectOne;
int m_nWhichStone;
CRect m_rectInfo;
public:
CMyDoc *GetDocument();
//Opertion
public:
BOOL MoveTo(int col,int row);
void Go(Cpoint point);
void SelectStone(Cpoint point);
void MoveStone(Cpoint point);
int KillEnemy(int col,int row,BOOL red);
BOOL KillSelfStone(int col,int row,BOOL red);
void ShowInfo(CDC *pDC);
void InitGame();
//Overrides
//ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyView)
public:
   virtual void OnDraw(CDC *pDC);//overrridden to draw this view
   virtual BOOL PreCreateWindow(CREATESTRUCT &cs);
   protected:
   virtual BOOL OnPreparePrinting(CPrintInfo *pInfo);
      virtual void OnBenginPrinting(CDC *pDC,CPrintInfo *pInfo);
   virtual void OnEndPrinting(CDC *pDC,CPrintInfo *pInfo);
   //}}AFX_VIRTUAL
   //Implementation
   public:
    virtual~CMyView();
#ifdef_DEBUG
    virtual void AssertValid()const;
    virtual void Dump(CDumpContext& dc)const;
#endif
   protected:
    //Generated message map functions
   protected:
    //{{AFX_MSG(CMyView)
    afx_msg void OnLButtonDown(UINT nFlags,CPoint point);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

IMPLEMENT_DYNCREATE(CMyView,CView)
BEGIN_MESSAGE_MAP(CMyView,CView)
//{{AFX_MSG_MAP(CMyView)
ON_WN_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::OnFilePrint)
END_MESSAGE_MAP()
//视图类的成员函数
CMyView::CMyView()//初始化棋局
{
//TODO:add construction code here
InitGame();
}

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);
}

void CMyView::InitGame()
{
   m_bRedTurn=TRUE;
   m_bSelectOne=FALSE;
   m_rectInfo=CRect(315,480,515,550);
   m_StoneList[0]=CStone(TRUE,0,0,"车",m_Plate);
   m_StoneList[1]=CStone(TRUE,1,0,"马",m_Plate);
   m_StoneList[2]=CStone(TRUE,2,0,"象",m_Plate);
   m_StoneList[3]=CStone(TRUE,3,0,"士",m_Plate);
   m_StoneList[4]=CStone(TRUE,4,0,"将",m_Plate);
   m_StoneList[5]=CStone(TRUE,5,0,"士",m_Plate);
   m_StoneList[6]=CStone(TRUE,6,0,"象",m_Plate);
   m_StoneList[7]=CStone(TRUE,7,0,"马",m_Plate);
   m_StoneList[8]=CStone(TRUE,8,0,"车",m_Plate);
   m_StoneList[10]=CStone(TRUE,1,2,"炮",m_Plate);
   m_StoneList[11]=CStone(TRUE,7,2,"炮",m_Plate);
   m_StoneList[12]=CStone(TRUE,0,3,"兵",m_Plate);
   m_StoneList[13]=CStone(TRUE,2,3,"兵",m_Plate);
   m_StoneList[14]=CStone(TRUE,4,3,"兵",m_Plate);
   m_StoneList[15]=CStone(TRUE,6,3,"兵",m_Plate);
   m_StoneList[16]=CStone(TRUE,8,3,"兵",m_Plate);
   m_StoneList[17]=CStone(FALSE,0,9,"车",m_Plate);
   m_StoneList[18]=CStone(FALSE,1,9,"马",m_Plate);
   m_StoneList[19]=CStone(FALSE,2,9,"相",m_Plate);
   m_StoneList[20]=CStone(FALSE,3,9,"仕",m_Plate);
   m_StoneList[21]=CStone(FALSE,4,9,"帅",m_Plate);
   m_StoneList[22]=CStone(FALSE,5,9,"仕",m_Plate);
   m_StoneList[23]=CStone(FALSE,6,9,"相",m_Plate);
   m_StoneList[24]=CStone(FALSE,7,9,"马",m_Plate);
   m_StoneList[25]=CStone(FALSE,8,9,"车",m_Plate);
   m_StoneList[26]=CStone(FALSE,1,7,"炮",m_Plate);
   m_StoneList[27]=CStone(FALSE,7,7,"炮",m_Plate);
   m_StoneList[28]=CStone(FALSE,0,6,"卒",m_Plate);
   m_StoneList[29]=CStone(FALSE,2,6,"卒",m_Plate);
   m_StoneList[30]=CStone(FALSE,4,6,"卒",m_Plate);
   m_StoneList[31]=CStone(FALSE,6,6,"卒",m_Plate);
   m_StoneList[31]=CStone(FALSE,8,6,"卒",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::KillEnmeny(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 -i;
}
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);
   }
   esle
   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();
    m_bSelectOne=FALSE;
    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)
{
   if(m_bSelectOne)
    MoveStone(point);
   else
    SelectStone(point);
   CView::OnLButtonDown(nFlags,point);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
功能介绍:<br/> * 本上传软件仅为爱好编程的同仁C#学习之用. <br/> <br/> a. 支持单人/双人游戏; 在开局中任意时刻可以切换单人/双人状态. <br/> b. 音效支持;有三首背景音乐,前台走棋音乐多样,如果您仔细观察的话,连拖动旗子的声音也有了:).<br/> c. 能够自定义残局; 通过*.ini配置文件增加了多个残局棋局.<br/> d. 保存. 能够实现动态保存功能,在下棋过程中能够保存当前下棋棋盘布局状态; 并在任意时刻恢复您保存的状态.<br/> e. 防止作弊. 程式严格控制了没个旗子的走发,比如:卒在过诃之前只能够进攻,过了诃才能够左右移动以及不能够一方连续走棋. <br/> f. 支持键盘鼠标两种操作方式; 双人下棋是一人使用鼠标,一人使用键盘操作最佳!<br/> g. 比较好的智能提示. 即使对象棋规则不台熟悉的人也可以很好的根据提示走棋,比如:当一方走棋后,它会自动提示另一方再走棋;当拿起旗子后,它回自动提示该位置是否可以落棋, 当落棋后它会提示您走了哪个旗子. 下棋结束会有得分和分析当前旗子损失率等.<br/> h. 有点不足的是电脑走棋比较苯,不过这也无妨影响学习大碍. 程式里面用到了许多C#技术细节方面,比如: Graphics,Sound,Repaint Control(Change picture to round),KeyDownPress,MouseClick/Move/Down/Drag picture,game save(Serialization),operate setting file etc.<br/><br/>扩展功能:<br/> i. 重新设计了所有旗子, 选择新的旗盘背景, 换了一个更清爽的面.(界面配色并不是件很容易的事情, 这样的棋类游戏长时间容易使眼睛疲劳, 首先要做到选择的色彩不刺激眼睛,其实大部分色彩都比较刺激眼睛,尤其是纯三基色(红/黄/蓝), 还要使界面做得漂亮). <br/> j. 增加”回放” 功能. 当下完旗子时,可以重新回味一下, 刚杀完的一盘旗,可以寻找不足和重新感受一下胜利的喜悦! 这个功能比较复杂!<br/> k. 又看了一下电脑走旗, 感觉确实比较难处理, 没有高人指点写这个算法确实比较难, 应该比以前聪明了一些, 但是还是比较笨, 打算有空去找个现在的电脑走旗组件替换上, 自己的电脑走旗算法慢慢研究(当时是因为实在找不到现在的组件, 自己写了个较笨的,如果哪位朋友能够提供组件,在次深表感谢!!!).<br/> l. 扩展走旗的步数容量, 有些网友, 对战的都是高手, 产生数组越界, 这次从 200 扩展到了500, 当然<br/> 您还可以扩展到更大,因为源代码已经开放).<br/> m. 增加图像缓存功能.<br/> (开发语言: C#语言)<br/><br/> * 本上传软件仅为爱好编程的同仁C#学习之用. <br/> <br/><br/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值