中国象棋人人对战

合集下载

基于Android技术的中国象棋人机对弈游戏的设计与实现

基于Android技术的中国象棋人机对弈游戏的设计与实现

西安邮电大学毕业设计(论文)题目:基于android技术的中国象棋人机对弈游戏的设计与实现目录摘要 (I)ABSTRACT .................................................... I I 1 绪论. (1)1.1 研究背景 (1)1.1.1中国象棋背景 (1)1.1.2 Android系统简介 (1)1.2 本论文研究意义 (3)2设计相关技术理论 (5)2.1 游戏系统开发平台及搭建 (5)2.2 可行性研究 (6)3游戏系统功能分析与设计 (7)3.1 界面的需求分析 (7)3.2游戏走棋需求设计分析 (7)3.3类框架的设计 (8)4 游戏系统的设计与实现 (9)4.1游戏界面的设计 (9)4.1.1 共有类ChessActivity的实现 (9)4.1.2 辅助界面相关类的实现 (9)4.1.3 游戏界面相关类的实现 (9)4.2 中国象棋的规则及走法的实现 (10)4.2.1行棋规则 (10)4.2.2棋盘的表示 (22)4.3 游戏人机会话的实现 (23)4.3.1 着法的生成 (23)4.3.2 搜索算法 (24)4.3.3 局面评估 (26)5 游戏系统模块的设计实现 (28)5.1 欢迎界面 (28)5.2菜单界面 (28)5.3 帮助界面 (30)5.4游戏界面 (30)6 运行测试 (34)7 结束语 (35)致谢 (36)参考文献 (37)附录: (38)译文 (48)摘要中国象棋是一款智力休闲游戏,具有历史悠久而且拥有巨大的游戏爱好者群体,他们以中国象棋陶冶情操、锻炼智力、体验象棋带来的快乐,中国象棋还是一个老少皆宜的娱乐游戏。

随着手持设备、智能手机的普及,搭载Android操作系统的智能手机也已经走进了千家万户,当人们闲暇偶尔需要娱乐时,却发现没有实物象棋,该软件不失为一个很好的替代品,供大家进行娱乐享受,尤其是在现在这个快节奏的社会中,人们更满足于手机的使用,可以方便地随意移动,不像实物象棋那样静静的坐着。

中国象棋真人对战开局

中国象棋真人对战开局

中国象棋真人对战开局现代的象棋型式,到宋代方才制定,下面店铺给你介绍中国象棋真人对战开局,欢迎阅读。

中国象棋真人对战开局象棋是以“将死”或“困毙”对方将[帅]为胜利的一种双人玩游戏。

双方各有16个棋子,共有7种类型。

对局前,按如图摆好各棋子位置。

由红棋一方先走,双方轮流各走一步,直至分出胜负对局即终了。

各类型棋子走法各不一,如下是走法口诀将帅不离九宫内,士只相随不出官。

象飞四方营四角,马行一步一尖冲。

炮须隔子打一子,车行直路任西东。

兵卒只能行一步,过河横进退无踪。

将帅不离九宫内说的是帅不能出九宫,只能走宫内红色线路(直线),不能走斜线。

士只相随不出官士只能相随着帅,也不能出九宫,但走的是斜线。

象飞四方营四角象只能走大本营与四方的角。

象走的线路为“田”字对角,如图黄色小圈位置当“田”中间有棋子时,象不能走到对角,也叫绊象角。

如图,因象中间有红炮,故吃红车。

马行一步一尖冲马走的线路为“日”字对角。

如图黄色小圈位置当“日”脚有棋子时,马也不能走,也叫绊马脚。

如图,马相邻有棋子时,就无法吃对方的车、炮炮须隔子打一子,车行直路任西东说是炮打子要隔一子。

如图,炮至红兵中间隔着象,那么黑炮可以吃红兵炮与车的走线路是上下左右任走,只能走直线,步数随意兵卒只能行一步,过河横进退无踪。

兵在没过河之前,只能向前一步步走,不能后退或走左右。

当过了河了就可以左右走了。

但还是不能后退网上或书上关于中国象棋经典棋局讲解,都是用什么炮二平五、马2进3之为类的写法。

这又怎样看呢。

平就是水平左右移动、进退就是前后移动。

数字2、3各中文二、五指黑红双方。

右图为炮八平五(红色)、马2进3(黑色)中国象棋真人大师和象棋软件哪个厉害电脑与人脑比拼中国象棋结果会如何?昨天下午,首次中国象棋人机大战在北京奥体中心结束,徐天红等5位象棋大师以4.5∶5.5的总比分不敌超级计算机“天梭”。

参加人机大战的五位象棋大师是特级大师柳大华、徐天红、卜风波,象棋大师张强、汪洋,比赛分为两轮,五位大师在比赛的房间中各自面对一台电脑,而对面则是一名工作人员,负责把电脑下出的棋走在棋盘上。

三人中国象棋

三人中国象棋

三人中国象棋
1、三人用一副半象棋来玩,中间三角格规定,两个三角格视为一个小方格,就是被弧形化的小方格。

两个共用边的三角格对应一个小方格时,就是一个"日字格"。

四个"平行三角格"也作为一个"日字格"。

2、三个参战国的纵线,由各国及中间地带的三段直线相连,这样三段相连的线虽然不是绝对的直线,但在这里,作为一条纵线通行,尽管如此,每一方交通线都无法完全同时直达两个战国。

3、弧形线等同横线。

此外其他规则同象棋。

三人中国象棋附加图文:
1、三人中国象棋的[兵],在中间斜格上也是每次一格,兵只要离开本土河界线即可斜前或横行,中部斜线上的己方兵也不能朝己方退行,更不能再回到本土河界线上。

在敌方河界线上的[兵2]可横行到另一方参战国,但进到敌人内线的[兵1],则无法转战他国。

如图。

2、当一方将死某一方老将后,还要吃掉对方老将,若暂时不吃,
则这一方仍有权"带将死"走棋,吃掉后这一方的剩余棋归先赢方所有,继续对弈,直到胜负分晓。

二〇二〇年一月二十八日星期二。

棋牌游戏——中国象棋人机对弈

棋牌游戏——中国象棋人机对弈
走法类ChessMove的介绍 思考时间线程TimeThread的介绍
Android游戏开发
1-15
象棋规则类的实现
会玩中国象棋的人都知道,象棋的规则是很多的,“马 走日,象走田”等,GuiZe类就是对这些规则进行封装 的类,当玩家需要走某步棋时,需要通过该类判断是否 可以走。
象棋规则类GuiZe的框架 走法判断方法canMove的架构 帅、士、象、兵的规则介绍 将、车、马、炮的规则介绍 走法产生方法allPossibleMoves的架构 走法产生方法allPossibleMoves的完善
Android游戏开发
1-11
辅助界面相关类的实现
接下来将对本游戏的除了主游戏界面之外的其他界面以 及相关线程进行介绍,开发步骤如下。
欢迎界面WelcomeView的介绍 欢迎界面动画生成类WelcomeViewThread的介绍 菜单界面MenuView的介绍 帮助界面HelpView的介绍
Android游戏开发
Android游戏开发
1-16
帅、士的走法
Android游戏开发
1-17
象、兵的走法
Android游戏开发
1-18
车、马的走法
Android游戏开发
1-19
炮的走法
Android游戏开发
1-20
游戏界面的完善
前面已经将游戏界面需要的地图以及实体进行了介绍, 接下来将使用之前开发的各个类来完善游戏的主界面, 完成本游戏的开发。
Android游戏开发
1-23
易则易知,简则易从。 易知则有亲,易从则有功。 有亲则可久,有功则可大。 可久则贤人之德,可大则贤人之业。 ——《易经》
Android游戏开发 Android游戏开发

中国象棋网络对战平台系统

中国象棋网络对战平台系统

2010年度本科生毕业论文(设计)中国象棋网络对战平台系统学院:电子信息工程学专业:网络工程年级:2007 级学生姓名:学号:导师及职称:2010年6月摘要随着信息技术的发展,人民生活水平的不断提高。

联网游戏作为一种娱乐手段,正以其独特的魅力吸引着越来越多的玩家。

为了满足广大象棋爱好者也可以享受到网络所带来的便利,本论文完成了基于JAVA开发的中国象棋网络对战平台的设计和实现, 它主要包含以下几大模块:网络通信模块,图像绘制模块和规则设置模块。

网络通信模块使得玩家可以方便的迅速建立起网络连接,从而实现联机对弈和聊天功能;图像绘制模块实现棋盘更新以及棋子动态表示等功能;规则设置模块用于约束玩家的棋步。

在本系统中规定了行棋规则,以及吃棋规则。

此应用程序可以实现双人的网络对战,并能进行聊天,在象棋对战过程中,对获胜的一方及对方给与相应的信息提示。

相比传统的中国象棋对战平台,有功能更加齐全,操作更加简单,行棋更加人性化的优点。

关键词:JAVA 中国象棋网络对战平台AbstractWith the development of information technology, peoples standard of living have improved constantly. On-line game as a means of entertainment has a unique charm to attract more and more players. To meet chess lovers ,In this paper, we have completed the design and realization of Chinese Chess network Battle platform based on Java. It contains the following major modules: the network communication module, image rendering module and the rules set up module. Network Communication Module allows gamers can quickly set up a convenient network connection in order to achieve an online game and chat function; image rendering module to update the board as well as functional pieces, such as the dynamic that; rules binding settings module for step-by-step player's game. In this system we provide line game rules, game rules. This application can be achieved in the network between two people, and can chat, in the process,On the winning side and the other to give the appropriate information pared with traditional Chinese Chess Battle platform, it has a more complete function , simpler operation, the more human chess advantages.Keywords: JAVA; Chinese Chess; network; Battle platform.目录第一章绪论 (1)1.1背景 (1)1.2J AVA语言 (1)1.2.1 Java的发展历史 (1)1.2.2 Java的特点 (2)1.3S OCKET编程 (3)1.3.1 关于TCP/IP协议 (3)1.3.2 服务器和客户机 (3)1.4中国象棋介绍 (4)第二章系统的分析与设计 (6)2.1.网络对战平台系统的介绍 (6)2.2系统构成 (6)2.3相关技术 (6)2.3.1 点对点通信 (6)2.3.2数据库和数据结构的设计 (8)2.2服务器端与客户端的通信基本原理 (8)第3章系统模块的设计 (10)3.1 客户端系统模块设计 (10)3.1.1 棋盘设计 (10)3.1.2 棋子设计 (11)3.1.3 游戏房间、棋盘、棋子的关系 (13)3.2服务器端系统模块设计 (14)第四章系统界面设计与实现 (16)4.1客户端界面 (16)4.2注册界面 (18)4.3对战平台界面 (20)4.4游戏房间界面 (22)结论 (27)参考文献 (28)附录A (29)致谢 (46)第一章绪论1.1背景从九十年代的MUD时代[1],到99年《网络创世纪》进入中国,再到2001年盛大《传奇》的奇迹成功,直到今天国内网络游戏市场的一片兴盛势头。

中国象棋比赛规则2020

中国象棋比赛规则2020

中国象棋比赛规则2020中国象棋比赛规则是指在100平方的棋盘上,由两名选手进行的对局。

每个选手执黑一方和红一方,通过移动棋子进行对抗。

本文将详细介绍中国象棋比赛的规则和注意事项。

一、棋盘和棋子中国象棋棋盘是由64个方格组成的,分为红黑两色交替布置。

双方边界的两条平行线称为河界,将棋盘分为上下两部分。

每个方格代表一个落脚点。

中国象棋的棋子有32个,均分为两色(红和黑)。

红方的棋子通常是由红色棋子的字样所表示,而黑方用黑色棋子的字样表示。

每方各有一国王、两车、两马、两炮、两象和五卒(红方称为兵)。

二、对局目标对局过程中,每位选手都致力于将对方的国王困住,从而实现“将死”的目标。

而另一方的目标则是躲避对方的进攻并合理布局,寻求反攻的机会。

如果一方的国王无论如何也无法避免被对方抓住的威胁,则称为“被将军”。

被将军者需立即采取行动予以解围,否则被判为负。

三、各棋子的走法1.国王:每步只能走一个位置,可以向前、后、左、右、斜对角方向移动,但不能越过河界。

2.车:每步可以横向或纵向移动任意格数,但不能斜向移动。

3.马:每步可以走日字型,即横向或纵向先移动一格,再移动两格。

马还有“蹩马脚”的限制,即不能越子。

4.炮:炮可以横向或纵向移动任意格数,但走棋时必须“隔子”跳过一个棋子,被跳过的棋子称为“炮架”。

在没有隔子的情况下,炮只能走一格。

5.象:象的走法较为特殊,每步只能沿着斜线移动两格,走棋时必须要越过“象眼”,即两脚必须在对角线上的空白点上。

6.兵(卒):兵只能向前移动,起始位置在己方正线和邻近直线。

兵过河后就可左右移动。

四、开局对局开始前,双方需要先行选择席次,黑方坐南,红方坐北。

每位选手在开局布局时要在特定的位置摆放自己的棋子,具体方式为如图,第1位黑方选手在行车马炮象士将士象炮马车的位置上摆放自己的黑色棋子;第2位红方选手则在行兵兵兵兵兵的位置上摆放自己的红色棋子。

五、走棋的制约规则在中国象棋比赛中,走棋的制约规则如下:1.只有一方执棋,可以任意走子。

中国象棋双人远程对弈

中国象棋双人远程对弈

中国象棋双人远程对弈—需求规格说明书1.引言1.1编写目的如今越来越多的人都渐渐地离中国经典棋牌类游戏——象棋远去,借此书17章的课题,我们小组为“中国象棋双人远程对弈”程序编写需求分析,借此重拾对中国文化的信心。

本说明书的预期读者为业务或需求分析人员,测试人员,用户文档编写者,项目管理人员。

1.2项目背景随着网络技术的不断发展和普及,网络游戏也有了长足的发展,网络棋牌类游戏作为其中的一分支,也备受瞩目,通过网络,人们可以在更大的范围内和他人对弈,可以增强棋艺的技术文化交流,也可以增加玩家自身水平,其中象棋作为中国经典的棋牌类游戏,魅力不可小觑。

通过以上简单分析,为了满足长远对弈的需求,“中国象棋双人网上对弈”有了开发的必要,在这样的背景下,我们小组计划开发一款这样的象棋软件。

以下是对该软件的需求规格说明。

1.3定义P2P:端对端模式端到端模式的特别是两个客户端程序直接通过网络相互连通进行游戏,参于中国象棋对弈的玩家只有两人。

这时客户端程序也可以作为服务端,具体操作如下:a.选择游戏模式为点对点模式。

b.作为客户端的一方点击连接按钮在弹出的对话框中输入对方的IP地址进行连接。

c.作为服务器的一方会监听客户端的连接请求,并对来到的请求进行响应。

d.待服务端用户同意连接请求后,双方中的任意一方都可以点击开始按钮进行游戏,点击开始游戏的一方为红方。

e.游戏过程中可以悔棋、求和和认输等操作,同时程序自动判断胜负。

C/S:服务器模式服务器模式的特别是所有的游戏玩家都集中连接服务器,在统一的平台下集中游戏。

在连接好服务器之后可以在房间里选择空位,棋桌的另一方如果也有玩家占位,则可以进行游戏。

功能简述如下:a.选择服务器模式。

b.正常运行服务器程序。

c.客户端点击连接,填入服务器所在的地址,连接成功点击显示房间。

d.双击一个空位准备游戏。

e.待对面的位置有玩家入坐就可以开始游戏,过程同端到端模式。

31.4参考资料《软件工程原理与应用》,曾强聪,赵歆编著,清华大学出版社2.系统概述2.1系统定义(目标)开发双人对弈中国象棋,实现双人远程对弈功能,并且软件界面友好,操作方便。

象棋群体比赛简明规则内容

象棋群体比赛简明规则内容

象棋群体比赛简明规则
一、适应范围
1.全国儿童比赛。

2.各行业系统比赛。

3.省级以下基层比赛。

二、行棋规定
1.摸子走子,以手离开为准。

2.违反行棋规定、“自杀”均判一次犯规。

三、比赛规定
1.用时办法:基本用时加秒制,包干制,临时限时制。

2.自然(临时)限着:30-40回合,将军不计。

3 .碰乱棋子:无论碰乱何种程度,可立即恢复。

在自己时间内,复原后继续比赛;在对方时间内,为其增加5分钟时间。

四、纠正错误
在对局过程中,出现意外错误,无论出自何方,均应在五个回合内及时纠正,超过五个回合不予受理,继续比赛。

五、裁决规定
1.在对局中出现问题,裁判有权介入。

如系案列,按“疑案从无”原则处理。

2.待判局面的裁定:
(1)一方长将,必须在下着变着。

(2)双方均为允许着法,不变着和。

(3)一方为禁止着法,另一方为允许着法,前者变着。

(4)双方均为禁止着法,不变作和。

3.一局棋累计三次犯规判负。

六、礼仪规定
1.服装整洁,文明对弈。

2.尊重对手,服从裁判。

3.手机静音,保持安静。

4.公平竞赛,赛后退场。

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

中国象棋----人人对战设计学号:系别:姓名:班级:成员:中国象棋--人人对战设计1 、问题定义中国象棋在单击游戏可执行文件进入游戏,游戏系统初始化游戏界面,进入游戏系统后,用户可能单击棋子,再点击相应棋子坐标或棋子,实现棋子移动、吃棋子功能。

实现人机对弈。

用户在对弈中,可以实现悔棋、新游戏、退出游戏功能。

系统的用例图如下所示:图1系统用例图2 、可行性研究用户进入系统,进入游戏,把自己的电脑设为主机实现人机对弈。

从功能上基本能满足用户的需求。

性能稳定可靠。

3、需求分析3.1象棋棋子走法规则和功能分析(1) 中国象棋是双方在有着9调竖线和10条横线的棋盘上对弈,竖线和横线的交叉称为棋点或对弈点,每个棋子都是在棋点上行走,而不是在方格中行走。

(2) 河界将棋盘分成两等份,每一边都有一块有9个点组成的九宫,棋子“将”,“帅”和“士”只能在九宫内移动,并且“将”和“帅”每一步只可以水平或垂直移动一个棋点;“士”只能在九宫内移动,并且它每一步只可以沿着对角线移动一个棋点;“象”必须一次沿着对角线方向走两个棋点,但它不能过河也不能跳过或穿越障碍,即“象”不能别眼,“马”没一步只可以水平或垂直移动两个棋点,但必须按对角线向左或向右移动。

中国象棋的“马”不能跳过障碍,即马不能别腿。

“车”可以水平或垂直方向移动入一个无障碍的点。

“炮”移动起来和车类似,但它必须跳过一个棋子来吃掉对方的一个棋子。

“兵”每步只能向前移动一个棋子过河以后,它便增加了向左右移动的能力,并不允许向后移动。

3.2 系统数据流图(1)0层数据流图图2 0层数据流图(2)1层数据流图图3 1层数据流图(3)2层数据流图图4 2层数据流图3.3数据字典设计3.4状态转换图下图图5 状态转换图:4、总体设计4.1总体流程图和中国象棋功能模块中国象棋游戏需要实现的基本功能应包括以下几个方面:(1) 提供棋盘和棋子;(2) 设定棋子的走棋规则;(3) 可以悔棋、重来、退出;(4) 判断胜负。

根据对中国象棋游戏的功能分析,设计得到中国象棋游戏的总流程图如图6图6总体流程图4.2各部分功能流程图4.2.1开始游戏该功能为本游戏的最核心的部分,它实现了中国象棋游戏的最主要的操作,是其他功能的基础。

开始游戏流程图如图7所示:55图8 系统总体结构图5.2 棋盘、棋子绘制的算法设计本中国象棋有限的棋盘和棋子采用的都是图片,采用图片比较简单,不用绘制那么多条线,用图片来代替棋盘和棋子。

建立坐标系,只需使用函数调用图片文件,把象棋图片有序的排列,再使用排列棋子的函数把棋子有序排列。

其中,棋盘距页面左边距离为24,上面为56,棋盘一格为57,棋子直径为55,棋子间的距离为2,例如从上面开始,黑棋子“车”的坐标为(24,56),黑马为(81,56),红“车”的坐标(24,596),依此类推就可以计算各棋子的坐标,这样算法较易实现。

5.3 棋种走棋规则的算法设计5.3.1“车”的走棋规则的算法设计“车”,它只能走直线,且中间不能有任何棋子,设计时分为两种情况来考虑,一种是纵向行走;一种是横向行走。

用if语句来判断实现,例如车纵向行走,首先,用if来判断棋子是否纵向行走,接着再用另一判断语句if来判断中间有没别的棋子。

横向行走同理。

如果棋子车符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设车的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图9所示:图9 “车”的走棋规则算法设计流程图5.3.2 “马”的走棋规则的算法设计“马”,它只能走“日”字格,而且马腿不能被其它的棋子压到。

设计时可两种情况来考虑,一种是横向走两个棋点,纵向走一个棋点;一种是纵向走两个棋点,横向走一个棋点。

用if语句来判断。

首先,用if来判断棋子是否横向走两个棋点,纵向走一个棋点,接着再用判断语句if来判断马腿是否被其它棋子压着。

纵向走“日”同理。

如果棋子马符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设马的棋点坐标为(a,b),a为横坐标,b为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图10所示:图10 “马”的走棋规则算法设计流程图5.3.3 “卒”的走棋规则的算法设计“卒”,它的行走规则分两种情况。

一种是棋子没过河界,另一种是棋子过了河界。

用if语句来判断,首先,用if语句来设定棋子没过河界,接着设定棋子在没过河界的情况下只能向前行走一个棋点;然后用if语句来设定棋子过了河界,紧接着设定棋子在过了河界的情况下只能向前、向左、向右行走一个棋点。

如果棋子卒符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设卒的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图11所示:图11 “卒”的走棋规则算法设计流程图5.3.4 “将”的走棋规则的算法设计“将”,它只能在“九宫”中行走,而且每次只能横着或者纵着行走一棋点。

直接用if语句来判断,首先,用if来判断棋子是否是在“九宫”里行走,接着判断棋子是否是横向或纵向只走一个棋点。

如果棋子将符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设将的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图12所示:图12“将”的走棋规则算法设计流程图5.3.5 “炮”的走棋规则的算法设计“炮”,它只能走直线,且中间有且只能有一个棋子。

假设现在坐标为(i,j),则算法设计流程图如图13所示:图13“炮”的走棋规则算法设计流程图5.3.6 “象”的走棋规则的算法设计“象”,它只能走“田”字格,而且不能过河,象腿不能被其它的棋子压到。

这样只有一种情况考虑,那就是纵向走两个棋点,横向也走两个棋点。

用if语句来判断,首先,用if来判断棋子是否走"田"字格,而且不能过河,接着再用判断语句if来判断象腿是否被其它棋子压着。

如果棋子象走动符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设象的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图14所示:图14“象”的走棋规则算法设计流程图5.3.7 “士”的走棋规则的算法设计“士”,它只能在“九宫”中行走,而且每次只能斜着行走一格。

这样只有一种情况来考虑,即纵向走一个棋点,横向走一个棋点。

if语句来判断,如果棋子士符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设士的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图15所示:图15 “士”的走棋规则算法设计流程图6、编码见附页。

7、运行结果测试与分析下图是进入游戏主界面后的游戏界面。

图16 游戏主界面7.1测试进入主界面后工具栏的各功能进入游戏主界面,在主界面的工具栏中,分别有“悔棋”、”退出”“新游戏”功能按钮。

可以点击“退出”结束游戏系统。

在游戏过程中点击“悔棋”实现棋子返回上一步的位置。

在游戏过程中点击“新游戏”结束当前的游戏,开始新的游戏。

7.2对“车”、“马”、“象”、“士”、“卒”、“炮”、“将”走法的测试“车”的测试,拖动“车”使其隔棋子或按斜角线走动,结果“车”不能被移动,拖动其按直线在界面范围内上下左右移动,结果可以移动,但中间隔了棋子,其不能被移动。

“马”的测试,拖动“马”使其按上下左右方向在主界面中移动,结果不可能移动“马”。

按向左或右走一格,再向上或下走二格时,其中上下左右没有棋子挡着时,可以移动,按向左或右走二格,再向上或下走二格时,其中上下左右没有棋子挡着时,可以移动,中间有棋子时,则移动不了。

“象”、“相”的测试,在主界面范围内,移动象、相向左或右走二格再向上或下行两格(“田”字格),如果在“田”字中间的十字上有棋子,则象或相,移动不了。

相反则可以移。

拖动“象”、“相”按其它任意方向或方式走,棋子无法移动。

“士”、“仕”的测试,拖动“士”、“仕”“九宫”中斜向走一格,结果可以移动,相反,使其按上下左右移动则不可动,向“九宫”外走则棋子不动。

“炮”的测试,拖动“炮”纵、横行,若在纵、横行中,前方有一个棋子,在这个棋子前方有对方的棋子,则可以行走,吃掉对方的棋子。

若纵、横方向没有棋子挡住,则可以纵、横走。

拖动“炮”斜着走,则其不可移动。

“将”的测试,拖其在“九宫”中行走,当其不在“九宫”中行走时,将会停在原处,不能移动。

在“九宫”中其可以纵、横、斜着行走。

“卒”、“兵”的测试,当其没有过河时,拖其向后、左、右行时,则其停在原处,不能移动,拖其向前行时,其可以移动。

当其过的楚河汉界后,可以向前左、右行,当拖其向后行时,棋子无法向后移动。

通过对软件各功能的测试发现,该软件各功能都能实现,性能可靠!附件:源代码(以上的设计思想是根据下面的代码分析的)import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class Chess{public static void main(String args[]){new ChessMainFrame("中国象棋:");}}class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{//玩家JLabel play[] = new JLabel[32];//棋盘JLabel image;//窗格Container con;//工具栏JToolBar jmain;//重新开始JButton anew;//悔棋JButton repent;//退出JButton exit;//当前信息JLabel text;//保存当前操作Vector Var;//规则类对象(使于调用方法)ChessRule rule;/**** 单击棋子** chessManClick = true 闪烁棋子并给线程响应** chessManClick = false 吃棋子停止闪烁并给线程响应*/boolean chessManClick;/**** 控制玩家走棋** chessPlayClick=1 黑棋走棋** chessPlayClick=2 红棋走棋默认红棋** chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;//控制棋子闪烁的线程Thread tmain;//把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame(){new ChessMainFrame("中国象棋"); }/**** 构造函数** 初始化图形用户界面*/ChessMainFrame(String Title){//获行客格引用con = this.getContentPane();con.setLayout(null);//实例化规则类rule = new ChessRule();Var = new Vector();//创建工具栏jmain = new JToolBar();text = new JLabel("欢迎使用象棋对弈系统");//当鼠标放上显示信息text.setToolTipText("信息提示");anew = new JButton(" 新游戏");anew.setToolTipText("重新开始新的一局");exit = new JButton(" 退出");exit.setToolTipText("退出象棋程序程序"); repent = new JButton(" 悔棋");repent.setToolTipText("返回到上次走棋的位置");//把组件添加到工具栏jmain.setLayout(new GridLayout(0,4));jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);//添加棋子标签drawChessMan();//注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);//注册棋子移动监听for (int i=0;i<32;i++){con.add(play[i]);play[i].addMouseListener(this);}//添加棋盘标签con.add(image = new JLabel(new ImageIcon("image\\Main.GIF"))); image.setBounds(0,30,558,620);image.addMouseListener(this);//注册窗体关闭监听this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent we){System.exit(0);}});//窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension frameSize = this.getSize();if (frameSize.height > screenSize.height){frameSize.height = screenSize.height;}if (frameSize.width > screenSize.width){frameSize.width = screenSize.width;}this.setLocation((screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);}/**** 添加棋子方法*/public void drawChessMan(){//流程控制int i,k;//图标Icon in;//黑色棋子//车in = new ImageIcon("image\\黑车.GIF");for (i=0,k=24;i<2;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("车1");}//马in = new ImageIcon("image\\黑马.GIF");for (i=4,k=81;i<6;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("马1");}//相in = new ImageIcon("image\\黑象.GIF"); for (i=8,k=138;i<10;i++,k+=228){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("象1");}//士in = new ImageIcon("image\\黑士.GIF"); for (i=12,k=195;i<14;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("士1");}//卒in = new ImageIcon("image\\黑卒.GIF"); for (i=16,k=24;i<21;i++,k+=114){play[i] = new JLabel(in);play[i].setBounds(k,227,55,55);play[i].setName("卒1" + i);}//炮in = new ImageIcon("image\\黑炮.GIF"); for (i=26,k=81;i<28;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,170,55,55);play[i].setName("炮1" + i);}//将in = new ImageIcon("image\\黑将.GIF"); play[30] = new JLabel(in);play[30].setBounds(252,56,55,55);play[30].setName("将1");//红色棋子//车in = new ImageIcon("image\\红车.GIF"); for (i=2,k=24;i<4;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("车2");}//马in = new ImageIcon("image\\红马.GIF"); for (i=6,k=81;i<8;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("马2");}//相in = new ImageIcon("image\\红象.GIF"); for (i=10,k=138;i<12;i++,k+=228){ play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("象2");}//士in = new ImageIcon("image\\红士.GIF"); for (i=14,k=195;i<16;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("士2");}//兵in = new ImageIcon("image\\红卒.GIF"); for (i=21,k=24;i<26;i++,k+=114){play[i] = new JLabel(in);play[i].setBounds(k,398,55,55);play[i].setName("卒2" + i);}//炮in = new ImageIcon("image\\红炮.GIF"); for (i=28,k=81;i<30;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,455,55,55);play[i].setName("炮2" + i);}//帅in = new ImageIcon("image\\红将.GIF");play[31] = new JLabel(in);play[31].setBounds(252,569,55,55);play[31].setName("帅2");}/**** 线程方法控制棋子闪烁*/public void run(){while (true){//单击棋子第一下开始闪烁if (chessManClick){play[Man].setVisible(false);//时间控制try{tmain.sleep(200);}catch(Exception e){}play[Man].setVisible(true);}//闪烁当前提示信息以免用户看不见else {text.setVisible(false);//时间控制try{tmain.sleep(250);}catch(Exception e){}text.setVisible(true);}try{tmain.sleep(350);}catch (Exception e){}}}/**** 单击棋子方法*/public void mouseClicked(MouseEvent me){ System.out.println("Mouse");//当前坐标int Ex=0,Ey=0;//启动线程if (tmain == null){tmain = new Thread(this);tmain.start();}//单击棋盘(移动棋子)if (me.getSource().equals(image)){//该红棋走棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){ Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 红棋走棋");chessPlayClick=2;}else {text.setText(" 黑棋走棋");chessPlayClick=1;}}//if//该黑棋走棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) =='1'){Ex = play[Man].getX();Ey = play[Man].getY();//移动卒、兵if (Man > 15 && Man < 26){rule.armsRule(Man,play[Man],me);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play,me);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){ text.setText(" 黑棋走棋");chessPlayClick=1;}else {text.setText(" 红棋走棋");chessPlayClick=2;}}//else if//当前没有操作(停止闪烁)chessManClick=false;}//if//单击棋子else{//第一次单击棋子(闪烁棋子)if (!chessManClick){for (int i=0;i<32;i++){//被单击的棋子if (me.getSource().equals(play[i])){//告诉线程让该棋子闪烁Man=i;//开始闪烁chessManClick=true;break;}}//for}//if//第二次单击棋子(吃棋子)else if (chessManClick){//当前没有操作(停止闪烁)chessManClick=false;for (i=0;i<32;i++){//找到被吃的棋子if (me.getSource().equals(play[i])){//该红棋吃棋的时候if (chessPlayClick == 2 && play[Man].getName().charAt(1) == '2'){Ex = play[Man].getX();Ey = play[Man].getY();if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me); }//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me); }//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play); }else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 红棋走棋");chessPlayClick=2;break;}else{text.setText(" 黑棋走棋");chessPlayClick=1;break;}}//if//该黑棋吃棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//卒吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me); }//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me); }//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play); }//将、帅吃棋规则else if (Man == 30 || Man == 31){rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);}//是否走棋错误(是否在原地没有动)if (Ex == play[Man].getX() && Ey == play[Man].getY()){text.setText(" 黑棋走棋");chessPlayClick=1;break;}else {text.setText(" 红棋走棋");chessPlayClick=2;break;}}//else if}//if}//for//是否胜利if (!play[31].isVisible()){JOptionPane.showConfirmDialog(this,"黑棋胜利","玩家一胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);//双方都不可以在走棋了chessPlayClick=3;text.setText(" 黑棋胜利");}//ifelse if (!play[30].isVisible()){JOptionPane.showConfirmDialog(this,"红棋胜利","玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText(" 红棋胜利");}//else if}//else}//else}public void mousePressed(MouseEvent me){}public void mouseReleased(MouseEvent me){}public void mouseEntered(MouseEvent me){}public void mouseExited(MouseEvent me){}/**** 定义按钮的事件响应*/public void actionPerformed(ActionEvent ae) { //重新开始按钮if (rstart()){//清除Vector中的内容Var.clear();}public void rstart(){int i,k;//重新排列每个棋子的位置//黑色棋子//车for (i=0,k=24;i<2;i++,k+=456){play[i].setBounds(k,56,55,55);}//马for (i=4,k=81;i<6;i++,k+=342){play[i].setBounds(k,56,55,55);}//相for (i=8,k=138;i<10;i++,k+=228){play[i].setBounds(k,56,55,55);}for (i=12,k=195;i<14;i++,k+=114){ play[i].setBounds(k,56,55,55); }//卒for (i=16,k=24;i<21;i++,k+=114){ play[i].setBounds(k,227,55,55); }//炮for (i=26,k=81;i<28;i++,k+=342){ play[i].setBounds(k,170,55,55); }//将play[30].setBounds(252,56,55,55);//红色棋子//车for (i=2,k=24;i<4;i++,k+=456){ play[i].setBounds(k,569,55,55); }//马for (i=6,k=81;i<8;i++,k+=342){ play[i].setBounds(k,569,55,55); }for (i=10,k=138;i<12;i++,k+=228){play[i].setBounds(k,569,55,55);}//士for (i=14,k=195;i<16;i++,k+=114){play[i].setBounds(k,569,55,55);}//兵for (i=21,k=24;i<26;i++,k+=114){play[i].setBounds(k,398,55,55);}//炮for (i=28,k=81;i<30;i++,k+=342){play[i].setBounds(k,455,55,55);}//帅play[31].setBounds(252,569,55,55);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i++){play[i].setVisible(true);}}}//悔棋按钮else if (back()){//删除用过的坐标Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.remove(Var.size()-2);Var.remove(Var.size()-1);//停止旗子闪烁chessManClick=false;catch(Exception e){}}public void back(){try{//获得setVisible属性值String S = (String)Var.get(Var.size()-4);//获得X坐标int x = Integer.parseInt((String)Var.get(Var.size()-3));//获得Y坐标int y = Integer.parseInt((String)Var.get(Var.size()-2));//获得索引int M = Integer.parseInt((String)Var.get(Var.size()-1));//赋给棋子play[M].setVisible(true);play[M].setBounds(x,y,55,55);if (play[M].getName().charAt(1) == '1'){text.setText(" 黑棋走棋");chessPlayClick = 1;}else{text.setText(" 红棋走棋");chessPlayClick = 2;}}//退出else if (exit()){}public void exit(){int j=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j == JOptionPane.YES_OPTION){System.exit(0);}}/*定义中国象棋规则的类*/class ChessRule {/**卒子的移动规则*/public void armsRule(int Man,JLabel play,MouseEvent me){ //黑卒向下if (Man < 21){//向下移动、得到终点的坐标模糊成合法的坐标if ((me.getY()-play.getY()) > 27 && (me.getY()-play.getY()) < 86 && (me.getX()-play.getX()) < 55 && (me.getX()-play.getX()) > 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),play.getY()+57,55,55);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (play.getX() - me.getX()) >= 2 && (play.getX() - me.getX()) <=58){//模糊坐标play.setBounds(play.getX()-57,play.getY(),55,55);}}//红卒向上else{//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//向上移动、得到终点的坐标模糊成合法的坐标if ((me.getX()-play.getX()) >= 0 && (me.getX()-play.getX()) <= 55 && (play.getY()-me.getY()) >27 && play.getY()-me.getY() < 86){play.setBounds(play.getX(),play.getY()-57,55,55);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (play.getX() - me.getX()) >= 3 && (play.getX() - me.getX()) <=58){play.setBounds(play.getX()-57,play.getY(),55,55);}}}//卒移动结束/**卒吃棋规则*/public void armsRule(JLabel play1,JLabel play2){//向右走if ((play2.getX() - play1.getX()) <= 112 && (play2.getX() -play1.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能右吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才左能吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向左走else if ((play1.getX() - play2.getX()) <= 112 && (play1.getX() - play2.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能左吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才能右吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向上走else if (play1.getX() - play2.getX() >= -22 && play1.getX() - play2.getX() <= 22 && play1.getY() - play2.getY() >= -112 && play1.getY() - play2.getY() <= 112){//黑棋不能向上吃棋if (play1.getName().charAt(1) == '1' && play1.getY() < play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋不能向下吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() > play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible()));Var.add(String.valueOf(play1.getX()));Var.add(String.valueOf(play1.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible()));Var.add(String.valueOf(play2.getX()));Var.add(String.valueOf(play2.getY()));Var.add(String.valueOf(i));}//卒吃结束/**炮、车移动规则*/public void cannonRule(JLabel play,JLabel playQ[],MouseEvent me){ //起点和终点之间是否有棋子int Count = 0;//上、下移动if (play.getX() - me.getX() <= 0 && play.getX() - me.getX() >= -55){ //指定所有模糊Y坐标for (int i=56;i<=571;i+=57){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -27 && i - me.getY() <= 27){//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -27 && playQ[j].getX() - play.getX() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从左到右)for (int k=play.getY()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < i && playQ[j].getY() > play.getY()){//中间有一个棋子就不可以从这条竖线过去Count++;break;}}//for//从起点到终点(从右到左)for (int k=i+57;k<play.getY();k+=57){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子就可以移动了if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));play.setBounds(play.getX(),i,55,55);break;}}//if}//for}//if//左、右移动else if (play.getY() - me.getY() >=-27 && play.getY() - me.getY() <= 27){//指定所有模糊X坐标for (int i=24;i<=480;i+=57){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -55 && i-me.getX() <= 0){//所有的棋子for (int j=0;j<32;j++){//找出在同一条横线的所有棋子、并不包括自己if (playQ[j].getY() - play.getY() >= -27 && playQ[j].getY() - play.getY() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从上到下)for (int k=play.getX()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < i && playQ[j].getX() > play.getX()){//中间有一个棋子就不可以从这条横线过去Count++;break;}}//for//从起点到终点(从下到上)for (int k=i+57;k<play.getX();k+=57){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子if (Count == 0){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));。

相关文档
最新文档