象棋打谱系统分析与设计
学生姓名:陈伟 指导老师:阳慧
摘 要 象棋是中国一个传统的益智类游戏,有着一套完整的走棋规则。随着计
算机技术的逐渐成熟,在工作中计算机起的作用也越来越大。然而在休闲生活中,
利用计算机软件制作的一些小游戏同样给人们带来了轻松和快乐。象棋打谱系统
使用美国 SUN 公司的编程工具 java 编写,有非常客观友好的的图型操作界面。本
系统软件采用链表方法存储棋谱,自己构造方法和接口,初步完成了设计任务。
本系统软件的主要功能有三个内容,能够模拟中国象棋的对弈过程,将对弈
过程保存成棋谱文件,演示存盘的棋谱。
关键词 对象,链表,构造方法,接口方法
1
1 绪论
一.引 言
象棋是中国一种流传十分广泛的游戏。下棋双方根据自己对棋局形式的理解
和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘--这块特定的战
场上进行着象征性的军事战斗。
从棋盘上来看,中国象棋中间以“楚河汉界”相隔,比较生动地表现了古时
两军对垒的场景。另外,中国象棋的棋子都摆在交叉点上,通过线与对方交锋
渊源流长的中国象棋等级鲜明不可逾越,将帅和兵卒是不可能逆转的;制度
严密无法越轨,即使是身为首脑的将帅也无法走出自己特定的格局.尤其是值得
一提的是中国象棋规则中的"炮",是中国人聪明智慧的体现,它的跳跃性思维,充
分调动脑力,出奇制胜,真正做到了事半功倍.
本系统得用 java 编程语言,形象的模拟出了中国象棋的棋盘布局,棋子类型,
界面友好,易于被大家接受。同时,又设立了走棋过程中的一些帮助模式,例如
悔棋,保存棋谱。更可以调出存盘的棋谱文件,生动的演示以往的棋局,供大家
揣摩学习,提高棋艺。
二.课程设计目的
中国象棋的软件已经层出不穷,并已实现网上联机对弈。但本次课程设计的
目的不在于要开发出一种更加完美的象棋软件,而是要通过对象棋打谱系统的分
析与设计的过程,从中掌握结构化、系统化的分析研究问题,自己动手解决问题。
除此以外,课程设计的过程就是收集资料,利用资料,整理结果的过程。而此过
程靠个人能力有效的解决非常困难,因此团队分工合作十分重要。软件工程课程
设计的目的也强调这一点。在保证质量的同时,同时也要实现中国象棋的对弈过
程。
该系统能够实现象棋打谱,保存棋谱,并重新演示对弈过程,因此可用于棋
友们分析棋局,提高棋艺。
2
2 需求分析
这个象棋打谱系统软件的主要用途,是记录自己以及象棋高手之间对弈的过
程,将其保存成棋谱文件,以便日后调出重新研究棋局,从中吸取经验,增长棋艺。
它应该具有棋盘界面,准确走棋,记录棋谱,演示棋谱等基本功能,下面是对它
的具体需求:
(1)创建一个客观、形象,易于被用户接受的系统界面。
(2)用户可以在棋盘内按规则走出任意的棋步。
(3)文本框能准确的显示出每一招走棋的棋谱。
(4)在意外情况下可以悔棋。
(5)可以将棋局走完之后的棋谱以文件的形式保存。
(6)可以打开调入以前的棋谱文件进行演示。
(7)创建一个多元化的演示界面,应该提供多个按钮供用户在演示过程中使用,
这样用户可以选择自己手动演示每一个走棋步骤或者由系统自动演示。演示
过程如需从新开始,应该可以直接按键恢复棋谱初始状态。
(8)如果由系统自动演示棋谱,应该可以让用户自己修改棋步之间的时间间隔,
以便用户思考。
(9)对于用户的误操作,系统能给出适当的提示,并且能够继续稳定的运行。
为了保证系统能够长期、安全、稳定、可靠、高效的运行,象棋打谱系统应
该满足以下性能要求:该系统在 WINDOWS2000 操作系统,JDK1.5 平台下运行,
CPU 频率不小于 2GHZ,内存不小于 256M,硬盘空间不小于 10G 的情况下能够快
速稳定的运行,不会出现任何故障异常。系统本身所占容量非常小,不到 1M,
响应速度除初始创建面板阶段稍慢(不超过五秒时间),其它情况下,如走棋过
程,不能超过 1 秒,力求看不出任何延时。
本系统暂不考虑网络互联问题,因此并不能联机对弈,在以后的开发过程中
可以进行功能扩充。
3
3 总体设计
中国象棋打谱系统共有 8 个 java 源文件。在这个问题域中,各个类之间的逻
辑关系相当简单,即运行 Chess 主类将生成一个包含棋盘和一个文本演示对象的
窗口。在棋盘对象上对弈的过程将会调用四个类,即生成棋子对象,创建棋点对
象,创建走棋规则对象和记录棋谱对象。其中重要类之间的关系图如图 3.1 所示。
Chess 主类
ChessBoard
Demon
ChessPoint
ChessPiece
Rule
MakeChessManual
MoveStep
1.Chess.java
图 3.1 类之间的关系
该 java 文件生成的类主要负责创建本程序的主窗口.该类含有 main 方
法,程序从该类开始执行。
2.ChessBoard.java
该文件生成的类负责创建“对弈棋盘”对象,用户可以用鼠标拖动棋盘
上的棋子,当松开鼠标时则将棋子放置到棋点。该棋盘不允许用户将棋子拖
动到非棋点上,棋盘的 Rule 对象负责判断走棋是否遵守了中国象棋的规则,
例如“马”走日,“象”走田、“小卒”一去不回头等等。如果用户的走法
不规则,棋子将放回原处,重新走着。棋盘的 MakeChessManual 对象负责记
录棋谱,当用户选择“保存棋谱”菜单项时,可以将当前棋谱保存成文件。
另外,该棋盘还能进行悔棋、悔棋将不被记录到棋谱。
3.ChessPoint.java
4
该文件生成的类负责创建棋盘的棋点对象。棋点对象可以判断该棋点上
是否有棋子、指定当前棋点上的棋子、移动当前棋点上的棋子。
4.ChessPiece.java
该文件生成的类负责创建子对象,并绘制棋子的外观。棋子对象可以获
取本身的颜色、大小、名字,也可以设置和获取本身的类别,即红棋或黑棋。
5.MakeChessManual.java
该文件生成的类负责创建记录棋谱的对象,该对象可以将棋谱记录到一
个链表中,并在一个文本区内显示棋谱。当对弈者悔棋时,该对象将修改棋
谱,并更新文本区的信息。
6.Rule.java
该文件生成的类负责创建“走棋规则”对象,该对象负责判断用户的走
着是否遵守了中国象棋规则。
7.Demon.java
该文件生成的类负责创建“棋谱演示”对象,该对象可以演示已保存的
棋谱。
8.MoveStep.java
该类创建的对象负责记录一个棋步。
5
4 详细设计
该过程将具体分析象棋打谱系统 8 个类的定义与实现的具体步骤。
一.主类 Chess
1.成员变量(如表 4-1 所示)
表 4-1 主要成员变量(属性)
成员变量描述
变量类型
菜单条
菜单
菜单项
JmenuBar
JmenuItem
JmenuBar
名称
bar
fileMenu
制作棋谱,保存棋谱,演示棋谱
对弈的棋盘
ChessBoard
演示棋谱的棋盘
Demon
board
dmon
棋谱记录者
MakeChessManual
reord
保存棋谱的链表
LinkedList
棋谱
2.Chess 类的三个主要方法
(1) public Chess(){}
这是 Chess 类的构造方法,创建程序主窗口。
bar=new JMenuBar();
fileMenu=new JMenu("中国象棋");
制作棋谱=new JMenuItem("制作棋谱");
保存棋谱=new JMenuItem("保存棋谱");
演示棋谱=new JMenuItem("演示棋谱");
fileMenu.add(制作棋谱);
fileMenu.add(保存棋谱);
fileMenu.add(演示棋谱);
bar.add(fileMenu)
6
其中此段代码即创建了一个内容菜单,包括制作棋谱,保存棋谱和演示棋谱
三个选项。
board=new ChessBoard(45,45,9,10)
该段代码即调用 ChessBoard 类的构造方法创建了一个棋盘。
(2) public void actionPerformed(ActionEvent e){ }
这是一个常用的接口方法,主要用于处理 ActionEvent 事件。
(3) public static void main(String args[])
{
new Chess();
}
Main 方法,程序从这开始运行,
二.对弈棋盘 ChessBoard
1.成员变量(如表 4-2 所示)
描述
棋点数组
棋点的水平和垂直距离
棋盘的行数和列数
棋子颜色
棋子对象
表 4-2 主要成员变量(属性)
变量类型
ChessPoint[][]
名称
Point
Int
Int
String
UnitWidth,UnitHeight
x 轴长,y 轴长
红方颜色,黑方颜色
ChessPiece
红车 1……黑炮 2
走棋的规则对象
Rule
rule
负责记录棋谱的对象
MakeChessManual
record
2.ChessBoard 类的主要方法
(1) public
ChessBoard(int w,int h,int r,int c){}
该类的构造方法,参数 w,h,r,c 分别表示棋格的宽度,高度和 X 轴长,Y
轴长。
7
(2) public void paintComponent(Graphics g) { }
该方法主要用来绘制棋盘布局线。
(3)判断鼠标动作的方法
public void mousePressed(MouseEvent e){ }
public void mouseMoved(MouseEvent e) { }
public void mouseDragged(MouseEvent e) { }
public void mouseReleased(MouseEvent e){ }
public void mouseEntered(MouseEvent e){ }
public void mouseExited(MouseEvent e) { }
public void mouseClicked(MouseEvent e){ }
上述七个方法都是接口方法,负责鼠标拖动棋子走棋过程中的动作响应。
三.棋子 ChessPiece
1.成员变量(如表 4-3 所示)
表 4-3 主要成员变量(属性)
描述
变量类型
棋子的名字
棋子的背景色
棋子的前景色
颜色的类别
String
Color
Color
String
2.ChessPiece 的主要方法
名称
name
backColor
foreColor
颜色类别
(1) public ChessPiece(String name,Color fc,Color bc,int width,int
height,ChessBoard board){ }
构造方法,各参数分别代表棋子的名称,棋子前景色,棋子背景色,棋子宽度和高
度,以及棋盘的名称。
(2) public void paint(Graphics g)
{
8