中国象棋对弈体会

中国象棋对弈感悟

新近,欣赏了几位中国象棋高手之间的精彩博弈,感触颇深,其中包含很宝贵的博弈财富,就此小结,与众共享。

象棋对弈首先是实力的对弈,决定棋手境界的是:是否进行了理论学习和实战磨砺,象棋开局、中局、残局都有博大精深的学问,前人有丰富的棋谱和理论研究,学过没学过区别很大,学得精不精、学得全面不全面直接奠定了棋手的水平档次。要提高水平,一方面就是打谱,听讲座,或者跟比自己水平高的棋手学习,仔细研究人家每一步,这得花心思和工夫。学习和实战练习结合,有学有练。

其次,对弈是象棋思想的对弈,诸如:

先弃而后取;

抢占先手和要道

弃子夺势,弃子战术、

顿挫节奏、攻守兼备,

追求官子棋、抢占要道重于兵卒得失,

喂子战术(喂子以夺取要道,或者通过喂子转化敌我双方的子力位置优劣),

控制大局重于局部得失,

对攻战术(彼攻于我,我攻其必救或者更要紧的关节而不是一味的直接就地防守,还要注意通过对攻的结果要使我方的子力位置比敌方更有利才划算)等。

暗保战策:对方攻我之某子或某处,我方不采取直接的防守保卫,而是采取一种潜伏的招数暗中保护该处,一旦对方攻上来,便在后续的步骤里遭到我方的另一种伏击,相当与给对方埋下“炸弹”。

“陷子”战策:即我方通过喂子或者弃子或者兑子或者将计就计等,使对方子力在转化后位置变化到某一较差的位置,使之不利防守和攻击,反而有利我方攻击或者防守。

“引位逼位”战策:通过喂子、弃子、兑子、迫击等措施,使对方子力脱离防守线而转化到另一位置更方便我方进行攻击,或者破坏对方攻击,消弱对方火力。类似与“陷子”战策。

象棋着数要保持紧迫感,要保持严密的紧凑,不得下缓手棋、不得下随手棋、不得下失误棋。

第三是心智素质和意志、状态的对弈。

1

处逆境而不退缩,仍能精心扑捉新的战机,不为所乱,不因为被动而一味防守,虽在危局还能坚持仔细寻求最佳进攻的战机——守不忘攻。

处于优势而不自负,仍能注意不下随手棋,对隐患仍能保持警惕和防范防备,不大意,防止一着不慎满盘皆输——攻不忘守。

只有攻守兼备,心智顽强镇定,攻守平衡,攻守皆凌厉的一方才能最终胜出。故而对弈的过程宁可保持严谨的行棋作风也不要过于追求胜利而仓促、随手,自乱状态和降低棋艺的提高,初学者适宜下慢棋,多琢磨每一步、寻觅更好的选择。急躁、心不在焉都不适合对弈,状态不佳不予行棋,那样反而易败而更加急躁心浮气躁。或者在对弈过程通过行棋(更威力、使对方艰涩难受,乱其心志、乱其状态,此谓心理战术。)棋艺的提高必然伴随着攻守平衡,攻守同强。越是高水平的棋手在攻守意识上越是平衡和敏锐,行棋选择更冷静、更严密,处于险境更镇定仍能仔细拆解招数,处于优势仍能谨慎防守我方漏洞。心浮气躁、手急、易烦、不适压力、不适辛苦计算者皆不宜行棋,必然挫败。

第四,象棋实战对弈考量方法。

多向多步两方考量。每一步棋都要精心考量,行将出手每一步每一子之前,能多考量多种选择特别是其他选择甚至是敢于做大胆的设想或者一般认为不可能的选择,对每一步或者每一子的选择上都能做关于下一步和以后发展事态的多步骤的纵深考量,再考量己方的同时也要考量对方的多向多步可能事态,也就是站在对方立场对每一步每一子也要做多向多步考量。每一步每一子都能如此的考量,必能更大的夺得优势。

大胆突破思维常规进行试想和计算。见很多大师与一般棋手的很明显的区别就是思维的根本方向有区别,比如喂子、弃子,初步判断近几步棋觉得不利,便放弃这个方向的深度考量。而没有延续着这个看似不利的方向上的大利。没有大胆的突破尝试试想就很难发现更精妙的棋路。

棋手之间的对弈从某种意义上说就是算度的对弈,更全面更仔细更精准更客观更纵深的算度者更优胜。越是高水平的棋手在选择上更是大胆甚至出人意料,这都源于精细长远的算度。能将局势作出如此精准深远的算度,需要付出更辛苦的脑力劳动。找到更好的招数,就要求棋手“拒绝平庸招数,拒绝看似凌厉却很稀松的招数”,在这个原则下,宁可停招也不要急于选择仓促的招数,在这练习过程尤为重要,假以时日必然进步,似慢实快,似拙实巧。快棋不是急出来的,而是长期的磨砺,随着经验的丰富和算度的提高,研究的熟悉程度的强化慢慢形成的。发展中的棋手,要拒绝快棋,快棋百害而无一利。

第五,象棋精髓。在象棋对弈中,一般棋手特别重于兵马的得失,而且大子就越看得重。 2

往往一兵一卒的得失会束缚棋手的战略思想,真正重要的是大局控制力,先手,全部子力的位置,将子力转化后的落点位置也要作为重要考虑,好位置才有大能量,劣质位置反而会大大降低子力本来的能量。

其次才是局部的得失和子力的得失。按照这个象棋价值观才能走出更好的棋来。才能越来越入行。当出现双方子力的兑换时,不光要看兑换的子力本身大小,还要看子力的兑换后,双方的其余全部子力在兑换后的位势和攻防能量。有时棋手贪图小利而使自己的子力陷入“泥泞之地”难以发挥攻防效能,通过弃子或者喂子而转化敌我双方子力的攻防能量、攻防进程以及攻防势力——这正是一种常见的战术手段。

另外一个重要的就是行棋的顿挫节奏次序,在子力、位置同样的情况下,行棋的次序、顿挫仍然有很大的区别,顿挫次序不好就会自损。好的顿挫次序甚至可以化险为夷,一招巧妙的顿挫次序甚至可以扭转乾坤。

关于大局的分析和控制,在双方局势变化的过程中要抓住主要症结围绕这个核心展开攻防战策的应对。首先要对全盘的核心、主要矛盾判断准确,要有敏锐的嗅觉,抓住这个瞬间即逝的机会和核心开展攻防才能更有效,换句话说,就是要仔细寻觅双方的最大弱点,隐性漏洞展开攻防,或者选择对方较为薄弱、较为重要的区域展开突破。

关于官子棋,官子棋就是每一步的多种选择当中最佳的那一步棋,判断最佳的标准就是,最有利大局的控制,最有效的攻防,最迅捷的攻防,即便没有明显的战机也要保持行棋的紧凑,保证效率的最大化。官子棋除了针对就地的一兵一卒的得失展开直接的攻防拆解之外,常常可能是围魏救赵,采用间接的办法,或者对攻,或者弃子抢攻,或者弃子陷敌。官子棋要区分开,哪些看似凌厉实则很虚弱的招数,也要辨得出看似普通却很凌厉的顿挫次序应招。

胜负手,在双方局势僵持不下各有千秋的时刻,往往一方会走出决定双方整盘局势胜负的一招,这一招可能表面上看起来很普通,可能很出人意料,很古怪反常,但是其中却暗含着杀气,作为进攻的一方这需要深厚而精确的算度。但是在关键时候某一方走出了很稀松很柔弱的一招就会给对方留下突破的口子,之后的局势便急转直下,这是反面的胜负手。当处于对攻情况下时,要经过仔细算度,如果我方比对方总是快一步,总是更紧迫对方,除了谨慎仔细计算好,就要大胆抉择和行棋。胜负手实则是“谨慎和大胆”的整体较量。谨慎而不束缚自我,大胆而不失误、不粗莽、不忽视防守。

何广飞2010-9-13

3

 

第二篇:可供两人对弈的中国象棋程序

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

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

#include <afxwin.h>

// 棋盘类

class CPlate

{

};

// 棋盘类的成员函数

// 构造函数: 初始化

CPlate::CPlate()

{

}

// 显示棋盘

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); m_ndx m_ndy = 50; = 45; = 198; = 30; = m_nLeft+m_ndx*8; = m_nTop+m_ndy*9; int m_ndx; int m_ndy; int m_nLeft; int m_nTop; int m_nRight; int m_nBottom; CPlate(); ShowPlate(CDC *pDC); DrawConer(CDC *pDC, int row, int col, int type); // 棋盘格宽 // 棋盘格高 // 棋盘位置 public: void void CPoint GetPosition(int col, int row); m_nLeft m_nTop m_nRight m_nBottom

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

} for(i=0; i<9; i++) { } // 画棋盘斜线 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); if(i==0 || i==8) { } 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->MoveTo(m_nLeft+i*m_ndx, m_nTop); pDC->LineTo(m_nLeft+i*m_ndx, m_nBottom);

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

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

}

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

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; CPen penRed1(PS_SOLID,1,RGB(255,0,0)); CPen *pOldPen = pDC->SelectObject(&penRed1); if(type == 0 || type == 1) { } if(type == 0 || type == 2) { } pDC->SelectObject(pOldPen); 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->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);

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

}

// 棋子类

// 定义棋子名称

#define

#define

#define

#define

#define

#define

#define

{

};

// 棋子类的成员函数

// 棋子类的构造函数:初始化棋子

CStone::CStone(BOOL red, int col, int row, LPCSTR name, int type, CPlate &plate) BOOL BOOL int int CRect BOOL int int m_bRed; m_nCol; m_nRow; m_bShow; m_nR; // 是否红方 // 是否被选择 // 路 // 行 // 棋子包含矩形 // 是否显示 // 棋子名称 // 棋子半径 // 棋子类型 m_bSelected; BING PAO JU MA XIANG SHI JIANG 1 2 3 4 5 6 7 class CStone m_rectStone; CString m_sName; m_nType; public: CStone (){} CStone (BOOL red, int col, int row, LPCSTR name, int type, CPlate &plate); void void CRect int BOOL ShowStone(CDC *pDC); MoveTo(int col, int row, CPlate &plate); GetRect(){return m_rectStone;} GetType(){return m_nType;} 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;}

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

{

}

// 显示棋子

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(255, 255, 0)); brushSelected.CreateSolidBrush(RGB(127, 127, 0)); pOldPen = pDC->SelectObject(&penNormal); // 被选中的棋子颜色不同 if(m_bSelected) pOldBrush = pDC->SelectObject(&brushSelected); pOldBrush = pDC->SelectObject(&brushNormal); else // 显示棋子 CRect r(m_rectStone); r.left ++; r.top ++; r.right --; r.bottom--; pDC->Ellipse(r); pDC->SelectObject(pOldPen); pDC->SelectObject(pOldBrush); // 准备显示棋子名称的字体 m_bShow m_bRed m_nCol m_nRow m_sName m_nType m_nR = TRUE; = red; = col; = row; = name; = type; m_bSelected = FALSE; = 23; 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);

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

} } 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(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) {

}

// 框架窗口类

class CMyWnd: public CFrameWnd

{

CPlate m_Plate; BOOL BOOL int CRect // 棋盘 // 棋子数组 // 轮红方下 // 已选择一棋子 // 被选择棋子的编号 // 信息显示位置 CStone m_StoneList[32]; m_bRedTurn; m_bSelectOne; m_rectInfo; m_bSelected = FALSE; m_nCol m_nRow = col; = 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); m_nWhichStone; public: CMyWnd(){InitGame();} 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); afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() protected:

// 消息映射

BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)

ON_WM_PAINT() ON_WM_LBUTTONDOWN()

END_MESSAGE_MAP()

// 框架窗口类的成员函数

// 初始化棋局

void CMyWnd::InitGame()

{

m_bRedTurn m_bSelectOne m_rectInfo = TRUE; = FALSE; = 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);

// 处理 WM_ONPAINT 消息, 绘制窗口客户区 (绘制棋盘, 棋子等) void CMyWnd::OnPaint()

{

}

// 处理 WM_ONLBUTTONDOWN 消息, 移动棋子

void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) {

}

// 移动棋子

void CMyWnd::MoveStone(CPoint point)

{

// 如果选择原来的棋子, 作废原来的选择 if(m_bSelectOne) // 已选择了要移动的棋子 MoveStone(point); // 尚未选择要移动的棋子 SelectStone(point); else CPaintDC dc(this); m_Plate.ShowPlate(&dc); for(int i=0; i<32; i++) ShowInfo(&dc); // 显示棋盘 // 显示所有棋子 // 显示轮谁行棋 m_StoneList[i].ShowStone(&dc);

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

} if(m_StoneList[m_nWhichStone].MouseOnStone(point)) { } else // 在棋盘其他位置行棋 Go(point); m_StoneList[m_nWhichStone].SelectStone(); m_bSelectOne = FALSE; InvalidateRect(m_StoneList[m_nWhichStone].GetRect(), FALSE);

// 走棋或吃棋

void CMyWnd::Go(CPoint point)

{

}

// 移到指定位置或吃子

BOOL CMyWnd::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; // 检查是否吃了对方的棋子 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("您竟然想吃自己人?!"); m_bRedTurn = MoveTo(col, row); else

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

} int i = KillEnemy(col, row, m_bRedTurn); if(i>=0) // 确实吃了对方棋子 { } // 更新窗口客户区提示信息位置 InvalidateRect(m_rectInfo); return !m_bRedTurn; m_StoneList[i].KillIt(); if(m_StoneList[i].GetType() == JIANG) { } if(m_bRedTurn) MessageBox(m_bRedTurn?"红方胜!":"黑方胜!"); InitGame(); Invalidate(); return TRUE;

// 选择棋子

void CMyWnd::SelectStone(CPoint point) {

}

// 显示轮谁行棋

void CMyWnd::ShowInfo(CDC *pDC) {

CFont *pOldFont, fontInfo; fontInfo.CreateFont(50, 0, 0, 0, 400, FALSE, FALSE, 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 break; = i; m_bSelectOne = TRUE;

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

} 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 CMyWnd::KillSelfStone(int col, int row, BOOL red) {

}

// 检查是否吃对方棋子

int CMyWnd::KillEnemy(int col, int row, BOOL red) {

}

// 应用程序类

class CMyApp: public CWinApp

{

public:

};

// 应用程序类的实例初始化函数

BOOL CMyApp::InitInstance()

{ BOOL InitInstance(); int from = red?16:0; // 逐个检查对方棋子是否被吃 for(int i=from; i<from+16; i++) if( m_StoneList[i].BeKilled(col, row)) return i; int from = red?0:16; // 逐个检查己方棋子是否被误杀 for(int i=from; i<from+16; i++) if( m_StoneList[i].BeKilled(col, row)) return TRUE; return FALSE; return -1;

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

} CMyWnd *pFrame = new CMyWnd; pFrame->Create(0,_T("中国象棋程序")); pFrame->ShowWindow(SW_SHOWMAXIMIZED); pFrame->UpdateWindow(); this->m_pMainWnd = pFrame; return TRUE;

// 应用程序类的全局对象

CMyApp ThisApp;

相关推荐