中国象棋实验报告.docx
《中国象棋实验报告.docx》由会员分享,可在线阅读,更多相关《中国象棋实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
中国象棋实验报告
本科学生综合性实验报告
课程名称:
Java程序设计
中国象棋
项目成员学号
班级B02班
项目名称中国象棋
指导教师
开课学期2013至2014学年第1学期
完成时间2013年12月25日
1.引言
1.1开发背景
中国象棋游戏流传至今已经有数千年的历史了,是一种古老的文化,它集文化、科学、艺术、竞技于一体,有利于开发人的智慧,锻炼人的思维,培养人的毅力,增强人的竞争意识。
自从计算机发明,向各个领域发展,到成为我们现在每天工作和生活必不可少的一部分的这个过程中,电子游戏也逐步渗入我们每个人的娱乐活动中。
在计算机已经普及的今天,对于可以用计算机进行程序编辑的人来说,开发属于自己的游戏,已经不再是梦想,中国象棋历史悠久不仅源远流长,而且基础广泛,作为一项智力运动更成为我们游戏开发的首选对象。
中国象棋是一项智力游戏,以往都是人和人下棋,现在有了计算机我们可以和计算机竞技,人可以与计算机进行对弈。
控制计算机的是人类,而人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。
因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。
1.2国内外象棋发展状况
中国象棋游戏流传至今已经有数千年的历史了,是一种古老的文化,它集文化、科学、艺术、竞技于一体,有利于开发人的智慧,锻炼人的思维,培养人的毅力,增强人的竞争意识。
自从计算机发明,向各个领域发展,到成为我们现在每天工作和生活必不可少的一部分的这个过程中,电子游戏也逐步渗入我们每个人的娱乐活动中。
在计算机已经普及的今天,对于可以用计算机进行程序编辑的人来说,开发属于自己的游戏,已经不再是梦想,中国象棋历史悠久不仅源远流长,而且基础广泛,作为一项智力运动更成为我们游戏开发的首选对象。
中国象棋是一项智力游戏,以往都是人和人下棋,现在有了计算机我们可以和计算机竞技,人可以与计算机进行对弈。
控制计算机的是人类,而人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。
因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。
1.3开发目标
在计算机技术日益发展的今天,为了让信息技术能够更好的贴近生活,并且在此基础上传承国学精髓,为此设计一个简单易懂的人人对弈的中国象棋小游戏,同时也为了巩固自身对java的运用。
1.4开发环境
本游戏程序的设计是在Windows7RTM7600.16385(X86)中文旗舰版操作系统环境下,使用MyEclipse6.0.1中文版开发成功的。
✧硬件环境:
英特尔酷睿i5双核处理器430M2GBDDR3内存
✧开发软件:
Eclipse6.0
✧运行平台:
Windows7
2.设计思路
2.1设计步骤
步骤一:
窗体界面的设计;主窗体利用的是swing组件JFrame,在组件JFrame上设计可视化界面。
步骤二:
棋盘的绘制;中国象棋的棋盘是一个由9*10的横纵交错的线条组成的,线条与线条之间的距离皆相等,而且横向线条上5线和下5线的交界处是“楚河汉界”,对此,要计算好线条与线条之间的距离以及线条起点和终点的坐标,利用线条绘制函数来绘制棋盘。
步骤三:
象棋棋子的加载;中国象棋中一共包含32个棋子,蓝子有26个,黑子有16个,其中兵(卒)有10个,炮4个,车4个,马4个,相(象)4个,士(仕)4个,将(帅)2个,于是我们需要设计32个象棋棋子对象,蓝方16个,黑方16个,在象棋棋子类里编写棋子的操作。
步骤四:
界面布局;JFrame中各个位置都有其位置坐标,象棋棋子的位置由坐标的位置确定,由于棋子走动的位置只能限制在棋盘的线与线之间的交点上,因此我们得到一个9*10的矩阵,棋子只能在这矩阵的位置上移动。
步骤五:
设定棋子走棋规则;在中国象棋中,每一个棋子都有其特定的行走规则,比如马走“日”,相走“田”等,兵只能过河之后才能左右移动,所以对于棋子的移动位置需要利用矩阵的思想来限定。
步骤六:
添加鼠标点击棋子事件;在当前的中国象棋游戏中,是通过点击移动鼠标的方法来移动象棋的,当鼠标点击到棋子时,鼠标下一个位置就是该象棋棋子移动的位置,如果位置与上述规则相左时,象棋需要重新选定。
步骤七:
吃棋规则的给定;在中国象棋里,任何棋子都有吃棋的资格,但是自己的棋子不能吃自己的棋子,棋子的吃棋方式是按照走棋的方式来给定的,当前位置的棋子能走动到的位置即为该棋子当前能吃的位置,没有棋子级别高低之分。
步骤八:
主函数调用;最后编写主函数调用以上方法。
2.2设计流程图
图1:
游戏设计流程图
3.设计技术
3.1io技术
该中国象棋小游戏运用信息的输入和输出技术,其主要的实现代码是打印函数,以及文件的加载函数,这两个函数所在的包是java.io.File以及java.io.IOException内的。
System.out.println()打印函数,在代码中的主要是输出鼠标点击的位置以及鼠标点击的棋子,并确定鼠标点击位置的棋子能否走棋或者能否吃棋。
ImageIO.read(newFile(“D:
\\image\\24.jpg”))图片导入函数,在游戏代码中的目的是加载棋子。
3.2多线程
3.3swing
该游戏的swing技术引用在游戏的可视化界面上,主界面继承的是JFrame父类,在JFrame界面上进行游戏操作。
在JFrame上绘制棋盘;先创建绘图对象,然后再在绘图对象上运用drawLine画线函数,给定起点坐标(x1,y1)和终点坐标(x2,y2),以此绘制出棋盘。
在JFrame上添加棋子;先定义一个棋子类ChessMan,然后再定义32个ChessMan类的对象,同时给每一个棋子对象再重载BufferedImage图片导入对象,利用ImageIO.read(newFile(“D:
\\image\\21.jpg”))函数依次导入32个棋子。
4.设计规则
4.1走棋规则
帅(将)每一着只许走一步,前进、后退、横走都可以,但不能走出“九宫”。
将和帅不准在同一直线上直接对面,如一方已先占据,另一方必须回避。
士每一着只许沿“九宫”斜线走一步,可进可退。
相(象)不能越过“河界”,每一着斜走两步,可进可退,即俗称“相(象)走田字”。
当田字中心有别的棋子时,俗称“塞(相)象眼”,则不许走过去。
马每着走一直(或一横)一斜,可进可退,即俗称“马走日字”。
如果在要去的方向有别的棋子挡住。
俗称“蹩马腿”,则不许走过去。
车每一着可以直进、直退、横走,不限步数。
炮在不吃子的时候,走法同车一样。
兵(卒)在没有过“河界”前,每着只许向前直走一步;过“河界”后,每着可向前直走或横走一步,但不能后退。
4.2吃棋规则
所有棋子都只能吃对方的棋子,不能吃己方的棋子。
帅可以吃九宫格里对方的棋子,每一着只能走一步。
士可沿着九宫斜线吃棋。
相、马、兵、车可以吃到其能走到的位置。
炮吃棋需要隔一子,而且只能隔一子。
5.代码实现
为了实现中国象棋的对弈功能,有以下几个类:
图2:
代码类下拉列表
Chess主类:
包括主窗体的继承,利用swing组件JFrame实现可视化界面,绘制棋盘,初始化每个棋子的初始位置,定义棋子的走棋规则以及棋子的吃棋规则,定义主函数调用方法。
ChessMan类:
这是象棋棋子类,用来定义每一个棋子,也就是说每一个棋子都是ChessMan类的对象,每一个对象都包含着特定的属性,有坐标属性,有名称属性。
StaticValue类:
将棋子重载为BufferedImage类的对象,定义图片载入方法,然后利用图片导入函数从D盘的image中导入棋子图片。
6.程序测试
6.1步骤一:
点击运行
图3:
中国象棋初始界面
如上图所示,程序点击运行时棋子按照初始化时的坐标以此排放在各自的位置,等待鼠标点击和移动。
6.2步骤二:
1)移动兵(卒):
在河内只能前进
图4:
兵在河内的移动规则
2)兵(卒)过河移动
图5:
兵过河的移动规则
3)炮的吃棋:
炮要隔一子才能吃子
图6:
炮的吃棋规则
4)马的移动:
马在未蹩脚时可以走“日”
图7:
马的走棋规则
5)相的移动:
相在未塞象眼时可以走“田”
图8:
相的走棋规则
6)士的移动:
只能在九宫格里对角走,而且只能跨一格
图9:
士的走棋规则
7)将的移动:
只能在九宫格里上下左右移动且一步
图10:
将的走棋规则
8)车的移动:
横纵方向跨越任意方格
图11:
车的走棋规则
7.总结与提升
此次中国象棋java小游戏的编写一方面巩固了我对java这门课程的了解与应用,另一方面更让我感到自身知识的匮乏,在此之前关于象棋软件有很多的想法,想实现很多功能,让它更与现实相吻合,比如编写算法,控制象棋的步数,实现人机对弈,还有联网对弈,但是在真正落实的时候却是举步维艰,寸步难行,很多技术都不懂,即使有资料也是无从下手,所以关于这个游戏的话还是漏洞百出,不够完善,关于游戏的缺陷,主要体现在以下几个方面:
1.没有控制玩家行走的步数,实际情况是每一种颜色的棋子只能走一步,等到对手走好之后才能走下一步,但是在我的这个程序中,某个玩家可以一直走,直至无路可走。
2.没有检测将帅碰头时的走法,象棋对弈时,如果将和帅的连线上没有子的话,上一步的将或帅是不能让它们碰头的,一旦碰头,需要重走。
3.一般情况下,是允许悔棋的,但是在我的这个游戏中,棋子一旦落下,则无法回头,也就是说,棋子落稳之后,不能悔棋,这就没有考虑到现实的情况,每一位玩家都会有一不小心走错的情况,所以于此应当设计可以悔棋的情况。
对于以上问题,不是在编写时没有考虑到,而是自身能力以及客观原因所限制,所以在今后的设计中将尽量完善,并且在此基础上设计联网技术和人机对弈算法,以此来满足现实的要求。