1、本 科 毕 业 论 文基于 MFC 的中国象棋游戏A Chinese Chess game based on Microsoft Foundation Classes姓 名:学 号:学 院:软件学院系:软件工程专 业:软件工程年 级: 校外指导老师: 校内指导教师: 年 月基于 MFC 的中国象棋游戏摘要摘 要MFC 微 软 基 础 类 (Microsoft Foundation Classes), 同 VCL 类 似 , 是 一种 Application Framework, 随 微 软 Visual C+ 开 发 工 具 发 布 。 目 前 最 新版 本 为 9.0( 截 止 2008 年
2、 11 月 ) 。 该 类 库 提 供 一 组 通 用 的 可 重 用 的 类 库 供开 发 人 员 使 用 。 大 部 分 类 均 从 CObject 直 接 或 间 接 派 生 , 只 有 少 部 分 类 例外 。MFC 应 用 程 序 的 总 体 结 构 通 常 由 由 开 发 人 员 从 MFC 类 派 生 的 几 个 类 和一 个 CWinApp 类 对 象 ( 应 用 程 序 对 象 ) 组 成 。 MFC 提 供 了 MFC AppWizard 自 动 生 成 框 架 。Windows 应 用 程 序 中 , MFC 的 主 包 含 文 件 为 “Afxwin.h“。此 外 MF
3、C 的 部 分 类 为 MFC/ATL 通 用 , 可 以 在 Win32 应 用 程 序 中 单 独 包含 并 使 用 这 些 类 。象 棋 是 中 华 民 族 的 传 统 文 化 , 不 仅 在 国 内 深 受 广 大 群 众 的 喜 爱 , 而 且 在国 外 , 尤 其 是 东 南 亚 的 侨 胞 和 外 籍 华 人 中 也 广 泛 流 传 。 许 多 海 外 华 侨 、 华 人和 港 澳 同 胞 把 象 棋 看 作 是 侨 胞 与 祖 国 联 系 的 桥 梁 和 纽 带 , 把 开 展 象 棋 活 动 看作 是 炎 黄 后 裔 对 自 己 民 族 文 化 的 继 承 和 发 扬 。 近
4、 几 十 年 来 , 随 着 贸 易 和 文 化交 往 的 不 断 发 展 , 象 棋 在 英 、 美 、 法 、 加 拿 大 、 联 邦 德 国 等 国 家 也 发 展 了 不少 的 爱 好 者 。 象 棋 正 从 它 的 发 源 地 , 经 过 亚 洲 , 传 播 到 世 界 各 个 角 落 。现 在 从 亚 洲 来 看 , 不 仅 港 澳 等 地 棋 风 很 盛 , 而 且 在 泰 国 、 新 加 坡 、 菲律 宾 、 马 来 西 亚 、 印 尼 , 日 本 等 国 的 华 侨 和 外 籍 华 人 中 , 象 棋 也 很 普 遍 。那 些 地 区 和 国 家 每 年 都 举 行 象 棋
5、比 赛 , 而 且 都 已 分 别 成 立 了 象 棋 总 会 或 象 棋协 会 。本文详细描述了开发该中国象棋游戏的完整的思路和实现过程。关键词:MFC;Visual C+;中国象棋基于 MFC 的中国象棋游戏AbstractAbstractMFC(Microsoft Foundation Classes), similar with VCL, is a kind of Application Framework and it is published with Microsoft Visual C+. The latest version of MFC is version 9.0(up
6、to Nov. 2008). This class library provides a group of universal, reusable class library for programmer.Except some of the classes,lots of classes are inherited from CObject.The frame of MFC applications was usually made up of several classes inherited from MFC by developer and a object of the class
7、CWinApp.MFC provides MFC Appwizard to creat frames automatically.In the MFC applications,the main including file is “Afxwin.h”.What besides is some of MFC classes are current in MFC/ATL,you could include solely and use these in win32 application.Chinese Chess is traditional culture of china,its not
8、only cared by Chinese people,but also fashonal in huakiaus and huajins in southeast Asia.A lot of huakiaus,huajins and compotriots from HongKong and Macao regard Chinese Chess as a bridge to connect mother country,and regard developing Chinese Chess as inheriting and developing the traditional cultu
9、re.In recent dozens of years,with the developing of trading and communication of culture,there are more fanciers in Britian,USA,France,Canada and Germany.Chinese Chess is spreading from China,across Asia,to the other places in the world.Looked from Asia now,Chinese Chess is not only popular in HongK
10、ong and Macao,but also in Thailand,Singapore,Filipion,Malaysia,Indonesia and Japan.These places hold Chinese Chess competitions every year,and Chinese Chess groups are borned there.This essay describes the entire consider and achieve process of exprodering the software of Chinese Chess.Key Words:MFC
11、;Visual C+;Chinese Chess基于 MFC 的中国象棋游戏目录目 录第一章 引言 11.1 选题背景 .11.2 当 前 象 棋 游 戏 状 况 11.3 选题意义 .11.4 本章小节 .2第二章 开发环境与主要技术 32.1 系统开发环境 .32.1.1 软件环境 32.1.2 硬件环境 32.2 技术背景 .32.2.1 C+32.2.2 C+的应用 42.2.3 WIN3242.2.4 消息映射机制 52.2.5 MFC62.2.6 MFC 类库简介 .72.2.7 Visual C+82.3 本章总结 9第三章 MFC 开发项目实例 中国象棋游戏(Chinese C
12、hess) .103.1 Chinese Chess 项目简介 .103.1.1 现有游戏软件分析 103.1.2 Chinese Chess 的优势 .103.2 项目详细介绍 .113.2.1 中国象棋的简介和规则 113.2.2 部分功能代码详解 143.3 本章小节 .313.3.1 运行截图及说明 313.3.2 小节 39第四章 软件测试 40第五章 总结 41致谢语 42参考文献 .43基于 MFC 的中国象棋游戏目录基于 MFC 的中国象棋游戏ContentsContentsChapter 1 Overview .11.1 Issue Background11.2 Curren
13、t Status of Chinese Chess Game.11.3 Issue Significance 11.4 Summary2Chapter 2 Environment and Technologies 32.1 System Environment.32.1.1 Software Environment 32.1.2 Hardware Environment .32.2 Technology Background.32.2.1 C+32.2.2 Applications of C+42.2.3 WIN32.42.2.4 Message map.52.2.5 MFC 62.2.6 M
14、FC Library Introduction.72.2.7 Visual C+ 82.3 Summary9Chapter 3 A MFC ProjectChinese Chess.103.1 Introduction of Chinese Chess 103.1.1 Current Status of Gameware .103.1.2 Advantages of Chinese Chess .103.2 Project Details113.2.1 Introduction and Regulation of Chinese Chess.113.2.2 Some of Codes Deta
15、ils 143.3 Summary313.3.1 Images when Running and the explaining 313.3.2 Summary .39Chapter 4 Software Testing.40Chapter 5 Summary.41Acknowledgement 42References.43基于 MFC 的中国象棋游戏 第 1 页第一章 引言1.1 选题背景新 中 国 建 立 之 后 , 象 棋 进 入 了 一 个 崭 新 的 发 展 阶 段 。 1956 年 , 象 棋 成为 国 家 体 育 项 目 。 以 后 , 几 乎 每 年 都 举 行 全 国 性 的
16、 比 赛 。 1962 年 成 立 了 中华 全 国 体 育 总 会 的 下 属 组 织 中 国 象 棋 协 会 , 各 地 相 应 建 立 了 下 属 协 会 机构 。 40 多 年 来 , 由 于 群 众 性 棋 类 活 动 和 比 赛 的 推 动 , 象 棋 棋 艺 水 平 提 高 得 很快 , 优 秀 棋 手 不 断 涌 现 。1978 年 , 成 立 了 亚 洲 象 棋 联 合 会 。 象 棋 在 欧 美 人 中 间 也 有 了 可 喜 的 发 展 。美 国 、 法 国 、 德 国 、 加 拿 大 等 国 , 纷 纷 成 立 了 象 棋 协 会 或 象 棋 社 。 一 些 国 际象
17、棋 大 师 也 下 起 了 中 国 象 棋 。在 各 大 街 小 巷 里 , 人 们 也 乐 于 围 成 一 团 , 共 同 讨 论 研 究 棋 术 。 象 棋 也 成了 大 人 们 茶 余 饭 后 休 闲 交 流 、 小 孩 智 力 开 发 的 主 要 手 段 之 一 。而 在 计 算 机 日 益 普 及 的 今 天 , 名 为 “中 国 象 棋 ”的 游 戏 也 不 可 避 免 的产 生 , 并 受 到 人 们 的 普 遍 欢 迎 。1.2 当 前 象 棋 游 戏 状 况当 前 象 棋 游 戏 很 多 , 主 要 包 含 界 面 精 美 友 好 、 操 作 方 便 等 特 点 以 及 人机
18、 对 战 、 悔 棋 、 记 录 棋 局 等 功 能 , 但 当 前 的 象 棋 游 戏 普 遍 缺 少 一 种 让 玩 家棋 艺 精 进 的 学 习 方 式 , 本 软 件 在 实 现 大 部 分 基 本 功 能 外 , 还 将 添 加 记 录 走 法 ,棋 局 等 功 能 。1.3 选题意义对于本软件的开发研究有如下意义:1、提高对 C+语言的驾驭能力2、熟悉 Visual C+开发平台以及 MFC 的底层结构基于 MFC 的中国象棋游戏 第 2 页3、作为游戏开发的基础,对高等级 AI(Artificial Intelligence,人工智能)的开发研究,将是未来各个行业所追求的高效率化
19、工作的必然结果4、作为软件本身,将能够解决很多普通象棋的问题,如:丢子、缺人、摆棋,对弈后忘记偶然产生的经典棋局等。1.4 本章小节本软件是一个用 C+编写的基于 MFC 的大众化游戏,玩家对象包括男女老少各种年龄段和各种阶层的人,下一章将简要重点介绍本软件的核心 C+和MFC。基于 MFC 的中国象棋游戏 第 3 页第二章 开发环境与主要技术2.1 系统开发环境2.1.1 软件环境开发工具:Visual C+ 6.0 /停止按钮CCoolButton m_btnUndo;/悔棋按钮CCoolButton m_btnRedo;/取消悔棋的还原按钮CCoolButton m_btnCompute
20、r;/电脑走棋按钮CListBox m_lstChessRecord;/记录走法的文本框CGradientProgressCtrl m_progressThink;/显式电脑正在思考的进程条CStatic m_staticTip;/输出文本CString m_strOutputInfo;/输出文本CChessDlg 类定义的类成员函数,函数表示的含义如代码后的注释:private:CString GetMoveStr(int nFromX,int nFromY,int nToX,int nToY,int nSourceID);bool IsChessOver(int nChessSort);
21、/摆棋时判断某种类型棋子有无剩余int IsGameOver(BYTE position9);/判断是否已有输赢void InvertChessBoard(BYTE cb9); /对换红黑双方棋子void AddChessRecord(int nFromX,int nFromY,int nToX,int nToY,int nUserChessColor,int nSourceID); /记录下棋步骤下面介绍一个函数 CString CChessDlg:GetMoveStr(int nFromX,int nFromY,int nToX,int nToY,int nSourceID),这个函数其实
22、是走法记录器,(玩家或电脑)每走一步棋,就将这步的走法记录下来现实在右边的 ListBox上面。下面以红马为例说明走法记录器是如何工作的:case R_HORSE:/红马bIsAgain=false;for(i=0;inFromY-1)if(nFromYnToY)str=“红:前马进“+ConvertDigit2Chinese(10-nToX);elsestr=“红:前马退“+ConvertDigit2Chinese(10-nToX);基于 MFC 的中国象棋游戏 第 16 页elseif(nFromYnToY)str=“红:前马进“+ConvertDigit2Chinese(10-nToX)
23、;elsestr=“红:前马退“+ConvertDigit2Chinese(10-nToX);elseif(nFromYnToY)str=“红:马“+ConvertDigit2Chinese(10-nFromX)+“进“+ConvertDigit2Chinese(10-nToX);elsestr=“红:马“+ConvertDigit2Chinese(10-nFromX)+“退“+ConvertDigit2Chinese(10-nToX);break;CChessDlg 定义的成 员 函 数 与 对 话 框 控 件 之 间 的 交 换 数 据 自 动 映 射 的 数 据 。以 下 是 保护的类成
24、员变量,变量存储的数据如下,主要包括棋盘信息、用户信息、电脑当前状态等:int m_iWhoChess; /下步该谁走棋int m_nUserChessColor; /用户棋子颜色BYTE m_byChessBoard109; /棋盘数组,用于显示棋盘BYTE m_byBackupChessBoard109;/备份棋盘数组,用于出错恢复BYTE m_byShowChessBoard109; /用于显示的棋盘MOVECHESS m_MoveChess; /用于保存当前被拖拽的棋子的结构POINT m_ptMoveChess; /用于保存当前被拖拽的棋子的位置CBitmap m_BoardBmp;
25、 /bitmap 图用于显示棋盘CImageList m_Chessman; /用于绘制棋子的 ImageList 对象int m_nBoardWidth; /棋盘宽度int m_nBoardHeight; /棋盘高度CPoint m_MousePoint; /当前鼠标所在点Status m_Status; /当前状态bool m_bIsThinking; /电脑是否正在想bool m_bIsBegin; /是否已开始下棋int m_nWillChessColor; /下一步该哪方下CHESSMOVE m_cmBestMove; /最佳走法UNDOMOVE m_umUndoMove; /悔棋走
26、法int m_iChessSort; /下棋方式基于 MFC 的中国象棋游戏 第 17 页int m_iDepthSort; /深度方式int m_iBout; /已下的回合数,如有悔棋算减以下是 CChessDlg 类定义的一部分从操作系统中接收的消息处理函数,大部分消息都来自于鼠标的点击和拖动,其中鼠标的点击主要是针对菜单和按钮,而鼠标的拖动主要是针对棋子:protected:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);/按下鼠标左键afx_msg void OnLButtonUp(UINT nFlags, CPoint po
27、int);/放开鼠标左键afx_msg void OnMouseMove(UINT nFlags, CPoint point);/鼠标移动afx_msg void OnSet();/点击参数设置菜单afx_msg void OnAbout();/点击关于菜单afx_msg void OnOpenfile();/点击打开菜单afx_msg void OnSavefile();/点击保存菜单afx_msg void OnClose();/点击退出按钮afx_msg void OnClearcb();/点击清空棋盘按钮afx_msg void OnNewgame();/点击新游戏按钮afx_msg
28、void OnBtnundo();/点击悔棋按钮afx_msg void OnBtnredo();/点击还原按钮afx_msg void OnBtnStop();/点击停止按钮afx_msg void OnPreview();/点击预览按钮afx_msg void OnPreviewover();/点击结束预览按钮afx_msg void OnHelp();/点击帮助菜单下面详细说明几个重要的消息处理函数。void CChessDlg:OnBtnundo(),这个函数表示的意思就是当玩家按下悔棋按钮后,软件将对现有数据如何处理(也就是如何进行悔棋的操作) 。函数首先判断按钮是否处于可用状态:已
29、有棋步。然后从一个栈指针中取出上一条数据传给主窗口类,重绘屏幕完成悔棋功能。void CChessDlg:OnBtnundo() / TODO: Add your control notification handler code hereif(m_stackUndoMove.empty()return;m_btnRedo.EnableWindow(1);/激活悔棋按钮m_bIsGameOver=false;for(int i=0;iUndoChessMove(m_byChessBoard,memcpy(m_byShowChessBoard,m_byChessBoard,90);memcpy(
30、m_byBackupChessBoard,m_byChessBoard,90);m_stackUndoMove.pop();m_lstChessRecord.DeleteString(m_lstChessRecord.GetCount()-1);/重绘屏幕 InvalidateRect(NULL,FALSE);UpdateWindow();m_iBout-;if(m_stackUndoMove.empty()m_staticTip.SetWindowText(“棋已悔完,无棋可悔了“);m_btnUndo.EnableWindow(0);/冻结悔棋按钮void CChessDlg:OnBtnr
31、edo(),这个函数表示如果玩家点击还原按钮后,软件将对现有数据如何处理。同上函数首先判断按钮是否处于可用状态,再从指向最后一条栈信息的指针中获取数据传给主窗口,重绘屏幕完成还原功能。void CChessDlg:OnBtnredo() / TODO: Add your control notification handler code hereif(m_stackRedoMove.empty()return;UNDOMOVE umTemp;m_iBout+;m_btnUndo.EnableWindow(1);/激活悔棋按钮for(int i=0;iRedoChessMove(m_byChes
32、sBoard,memcpy(m_byShowChessBoard,m_byChessBoard,90);memcpy(m_byBackupChessBoard,m_byChessBoard,90);基于 MFC 的中国象棋游戏 第 19 页m_stackUndoMove.push(umTemp);m_stackRedoMove.pop();this-AddChessRecord(umTemp.cmChessMove.From.x+1,umTemp.cmChessMove.From.y+1,umTemp.cmChessMove.To.x+1,umTemp.cmChessMove.To.y+1,m
33、_nUserChessColor,umTemp.cmChessMove.nChessID);/重绘屏幕 InvalidateRect(NULL,FALSE);UpdateWindow();if(m_stackRedoMove.empty()m_staticTip.SetWindowText(“棋已还原完,无棋可还原了“);m_btnRedo.EnableWindow(0);/冻结还原按钮CEveluation 类:估值类,对给定的棋盘进行估值,对每种不同的棋子估值让电脑能够在不同的棋路选择上有一个大致的方向,即值越高越重要。本软件设定为:兵 100,士 250,象 250,车 500,马 35
34、0,炮 350,王 10000。然后增加棋子的灵活性,每个棋子每多一条路可选,则为此棋子增值。本软件定义为:兵 15,士 1,象 1,车 6,马 12,炮 6,王 0。这个类的成员变量定义如下:protected:int m_BaseValue15; /存放棋子基本价值int m_FlexValue15; /存放棋子灵活性分值short m_AttackPos109; /存放每一位置被威胁的信息BYTE m_GuardPos109; /存放每一位置被保护的信息BYTE m_FlexibilityPos109;/存放每一位置上棋子的灵活性分值int m_chessValue109; /存放每一位
35、置上棋子的总价值int nPosCount; /记录一棋子的相关位置个数POINT RelatePos20; /记录一棋子的相关位置long m_nAccessCount;这个类的成员函数定义如下:public:virtual int Eveluate(BYTE position109,BOOL bIsRedTurn,int nUserChessColor); /估值函数,对传入的棋盘打分,bIsRedTurn 表示轮到谁走棋基于 MFC 的中国象棋游戏 第 20 页int GetAccessCount()return m_nAccessCount;/得到访问节点数void ClearAcce
36、ssCount()m_nAccessCount=0; /重置访问节点数为 0protected:void AddPoint(int x,int y); /将一个位置加入相关位置队列bool CanTouch(BYTE position109,int nFromX,int nFromY,int nToX,int nToY); /判断位置 From 的棋子是否能走到位置 Toint GetRelatePiece(BYTE position109,int j,int i);/列举与指定位置的棋子相关的棋子int GetBingValue(int x,int y,BYTE CurSituation9)
37、;/为每一个兵返回附加值,CurSituation 是棋盘,不是兵返回 0CMoveGenerator 类:走法产生器,对当前给定的棋盘局面搜索出所有可能的走法并存储在名为 CHESSMOVE 的结构中.如下截取了 CMoveGenerator 中定义的比较重要的函数:public: BOOL IsValidMove(BYTE position109,int nFromX,int nFromY,int nToX,int nToY,int nUserChessColor); /走法是否有效int CreatePossibleMove(BYTE position109,int nPly,int n
38、Side,int nUserChessColor);/产生所有可能的走法protected:void Gen_BPawnMove(BYTE position109,int i,int j,int nPly); /产生黑卒的走法,nPly 表明插入到 List 第几层void Gen_RPawnMove(BYTE position109, int i,int j,int nPly); /产生红兵的走法,nPly 表明插入到 List 第几层void Gen_BBishopMove(BYTE position109,int i,int j,int nPly);/产生黑士的走法,nPly 表明插入到
39、 List 第几层void Gen_RBishopMove(BYTE position109,int i,int j,int nPly); /产生红士的走法,nPly 表明插入到 List 第几层void Gen_CarMove(BYTE position109, int i,int j,int nPly); /产生车的走法,nPly 表明插入到 List 第几层void Gen_HorseMove(BYTE position109, int i,int j,int nPly); /产生马的走法,nPly 表明插入到 List 第几层void Gen_ElephantMove(BYTE pos
40、ition109,int i,int j,int nPly);/产生相或象的走法,nPly 表明插入到 List 第几层void Gen_KingMove(BYTE position109,int i,int j,int nPly); /产生将或帅的走法,nPly 表明插入到 List 第几层void Gen_CanonMove(BYTE position109,int i,int j,int nPly); /产生炮的走法,nPly 表明插入到 List 第几层int AddMove(int nFromX,int nToX,int nFromY,int nToY,int nPly,int nC
41、hessID); 基于 MFC 的中国象棋游戏 第 21 页/在 m_MoveList 中插入一个走法,nPly 表明插入到 List 第几层这里将详细介绍几个函数。public BOOL IsValidMove(BYTE position109,int nFromX,int nFromY,int nToX,int nToY,int nUserChessColor),这是判断棋子走法是否有效的函数,如果这个函数出错,那这个游戏就不能叫做象棋游戏。以下是这个函数的部分功能代码,首先声明代表棋子种类的对象,所有棋子的共同点就是不能原地不动,然后以一个 switch 循环对不同的棋子写出不同的走法
42、5:int nMoveChessID,nTargetID;/前者代表棋子的种类,后者为判断将帅见面所用if(nFromX=nToX /目的与原地相同,走法错误。nFromX,nFromY 为初始位置,nToX,nToY 为目的位置switch(nMoveChessID)/这个循环对不同的棋子写出不同的走法下面将逐个详细解释这个 switch 循环里的所有 case(只选取了红色棋子的走法,黑色相同) 。以红帅为开始,前面已经介绍过,帅的走法特点,帅 和 将 是 棋 中 的 首 脑 ,是 双 方 竭 力 争 夺 的 目 标 。 它 只 能 在 “九 宫 “之 内 活 动 , 可 上 可 下 ,
43、可 左 可 右 ,每 次 走 动 只 能 按 竖 线 或 横 线 走 动 一 格 。 帅 与 将 不 能 在 同 一 直 线 上 直 接 对 面 ,否 则 走 方 判 负 。 (详见 3.2.1 章节,后面不再提到)以下是红帅的走法代码,由于帅是象棋的核心,将帅见面产生胜负也是棋子中比较特殊的一点,要判断横坐标相等,中间没有其他棋子的情况 6:case R_KING:/红帅if(nUserChessColor=REDCHESS)if(nTargetID=B_KING)/判断是否将帅见面if(nFromX!=nToX)/横坐标不相等return false;/将帅不在同一列for(i=nFrom
44、Y-1;inToY;i-)if(positioninFromX!=NOCHESS)return false;/中间隔有棋子elseif(nToY5 | nToX1)return false;/将帅只走一步直线elseif(nTargetID=B_KING)/判断是否将帅见面if(nFromX!=nToX)/横坐标不相等return false;/将帅不在同一列for(i=nFromY+1;i2 | nToX5 | nToX1)return false;/将帅只走一步直线break;以下是红仕的走法,仕只能走斜线,且只能在九宫里行走,因此只要给出九宫这个限定就好了:case R_BISHOP:/
45、红仕if(nUserChessColor=REDCHESS)if(nToY5 | nToX2 | nToX5 | nToX4)return false;/相不能过河if(abs(nFromX-nToX)!=2 | abs(nFromY-nToY)!=2)return false;/相走田字if(position(nFromY +nToY)/2(nFromX +nToX)/2!=NOCHESS)return FALSE;/相眼被塞break;以下是黑兵的走法,黑卒的走法很简单,需要增加一个过河后能左右移动的特点。case B_PAWN:/黑卒if(nUserChessColor=REDCHESS
46、)if(nToYnFromY)return false;/卒不能回头if(nFromY4 /卒过河前只能直走基于 MFC 的中国象棋游戏 第 24 页if(nToY-nFromY+abs(nToX-nFromX)1)return FALSE;/卒只走一步直线break;以下是车的走法:车走直线,只要判断目的点与出发点之间没有己方棋子即可。case R_CAR:/红车if(nFromY!=nToY /车走直线if(nFromY=nToY)if(nFromXnToX)for(i=nFromX+1;inToX;i+)if(positionnFromYi!=NOCHESS)return FALSE;elsefor(i=nToX+1;inFromX;i+)if(positionnFromYi!=NOCHESS)return FALSE;elseif(nFromYnToY)for(j=nFromY+1;jnToY;j+)if(positionjnFromX!=NOCHESS)return FALSE;elsefor(j=nToY+1;jnFromY;j+)if(positionjnFromX!=NOCHESS)return FALSE;