github:https://github.com/zhangmin131/Chinese-chess
面向对象设计方法:Java面向对象程序设计的基本思想是通过构造和组织对象来求解问题的。对象是很好的,任何一种物体都可以被认为是对象,例如,汽车就是一种对象。对象具有两个最基本的属性:具有一定的物质基础和一定的功能,这两种基本属性在Java语言中表现为拥有一定的存储单元并具备一定的功能。理解了Java的这种面向对象程序设计的基本思想之后,在以后的编程过程中,就应当个构造人们容易理解的更接近于真实物理世界物体的对象。Java面向对象程序设计的过程非常简单。这里介绍一种自顶向下的程序设计方法,首先构造一个类来处理需要解决的问题,然后根据已经拥有的类(例如以前求解其问题时实现的类),分析和构造新的类,设法将问题分解下去,而最开始构造的类通过组织这些新构造的类、已有的类及由他们生成的实例来求解指定的问题。这个过程可以继续递归下去,用在新构造的类上,直到最后解决了指定的问题,例如Java的应用程序和小应用程序都必须有一个类作为入口求解问题。在计算机语言中,面向对象的类一般具有三个基本特性:封装性、继承性和多态性,这三种 特性进一步简化Java求解模型,提高了程序的复用性,节省了程序的代码量,从而提高了软件的生产率。
象棋盘由九道直线和十道横线交叉组成,棋盘上共有九十个交叉点,象棋子就摆放和活动在这些交叉点上.
棋盘中间没有划通直线的地方,叫做“河界”;划有交叉线的地方,叫做“九宫”。九道直线,红棋方面从右到左用中文数字一至九来代表,黑棋方面从右到左用阿拉伯数字1至9来表示。棋子共有三十二个,分为红、黑两组,每组十六个,各分七种,其名称和数目如下:红棋子:帅一人,车、马、炮、相、士各两个,兵五个。黑棋子:将一个,车、马、炮、象、士各两个,卒五个。
在对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜负或走成和棋为止。
轮到走棋的一方,将某个棋子从一个交叉点到另一个空着的交叉点,或者吃掉对方的棋子而占领叉点,都算走了一着。双方各走了一着,称为一个回合。帅(将)每一着只许走一步,前进、后退、横走都可以,但不能走出“九宫”。帅和将不准在同一直线上直接对面,如一方已先占据,另一方必须回避。士每一着只许沿“九宫”斜线走一步,可进可退。相(象)不能越过“河界”,每一着斜走两步,可进可退,即俗称相(象)走田字。当田字中心有别的棋子时,俗称塞相(象)眼,则不行走过去。马每着走一直(或一横)一斜,可进可退,即俗称“马走日字”。如果在要去方向紧靠一直(或一横)的地方,有别的棋子挡住,俗称“蹩马腿”,就不能走过去。车每一着可以直进、直退、横走,不限步数。炮在不吃子的时候,走法同车一样。兵(卒)在没有过“河界”前,每着只许向前直走一步;过“河界”后,每着可以向前走一步,也可以横走一步,但不能后退。走一着棋时,如果己方棋子能够走到的位置有对方棋子存在,就可把对棋子吃掉而占领那个位置。只有炮吃了必须隔一个棋子(无论是哪一方的)跳吃,即俗称“炮打隔子”。除帅(将)外,其它棋子都可以听任对方吃,或主动送吃。一方的棋子攻击对方的帅(将),并在下一着要把它吃掉,称为“将军”,或简称“将”。被“将军”的一方必须立即“应将”,即用自卫的着法去化解被“将”的状态。如果被“将军”而无法“应将”,就算被“将死”。轮到走棋的一方,帅(将)虽没被对方“将军”,却被禁在一个位置上无路可走,同时己方其它棋子也都不能走动,就算被“困毙”。
一.详细设计
Chesspoint.Java
该文件生成的类负责创建棋点对象。棋点对象可以判断该棋点上是否有棋子, 指定当前棋点上的棋子 ,获取当前棋点上的棋子,移动当前棋点上的棋子。
ChessPiece.java
该文件生成的类负责创建棋子对象。并绘制棋子的外观。棋子对象可以获取本身的颜色,大小,名字,也可以设置和获取本身的类别,即红棋和黑棋。
MakeChessManual,java
该文件生成的类负责创建记录棋谱的对象,该对象可以将棋谱记录到一个链接表中,并在一个文本区显示棋谱。当对弈者悔棋时,该对象将修改棋谱,并更新文本区域的信息。
Ruler.java
该文件生成的类负责创建“走棋规则”对象,该对象负责用户用户的走法是否符合规则。
Demon.java
该文件生成的类负责创建“棋谱演示”对象,该对象可以演示以保存的棋谱。
MoveStep.java
该类创建的对象记录一个棋步。
二.主要代码
public class ChineseChess {
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 showOpen;
// 保存
JButton showSave;
// 退出
JButton exit;
// 当前信息
JLabel text;
// 保存当前操作
Vector FileVar;
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() {
}
ChessMainFrame(String Title) {
// 获行客格引用
con = this.getContentPane();
con.setLayout(null);
// 实例化规则类
rule = new ChessRule();
FileVar = new Vector();
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("返回到上次走棋的位置");
showOpen = new JButton("打开");
showOpen.setToolTipText("打开以前棋局");
showSave = new JButton("保存");
showSave.setToolTipText("保存当前棋局");
// 把组件添加到工具栏
jmain.setLayout(new GridLayout(0, 6));
jmain.add(anew);
jmain.add(repent);
jmain.add(showOpen);
jmain.add(showSave);
jmain.add(exit);
jmain.add(text);
jmain.setBounds(0, 500, 450, 30);
con.add(jmain);
// 添加棋子标签
drawChessMan();
/* 注册监听者 */
// 注册按扭监听
anew.addActionListener(this);
repent.addActionListener(this);
exit.addActionListener(this);
showOpen.addActionListener(this);
showSave.addActionListener(this);
// 注册棋子移动监听
for (int i = 0; i < 32; i++) {
con.add(play[i]);
play[i].addMouseListener(this);
}
// 添加棋盘标签
con.add(image = new JLabel(new ImageIcon("img/chess.png")));
image.setBounds(0, 0, 446, 497);
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 - 200,
(screenSize.height - frameSize.height) / 2 - 290);
this.setIconImage(new ImageIcon("车1.gif").getImage());
this.setResizable(false);
this.setTitle(Title);
this.setSize(450, 550);
this.show();
}
/* 添加棋子方法*********** */
public void drawChessMan() {
// 流程控制
int i, k;
// 图标
Icon in;
// 黑色棋子
// 车
in = new ImageIcon("img/车2.GIF");
for (i = 0, k = 10; i < 2; i++, k += 385) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("车1");
}
// 马
in = new ImageIcon("img/马2.GIF");
for (i = 4, k = 60; i < 6; i++, k += 285) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("马1");
}
// 相
in = new ImageIcon("img/相2.GIF");
for (i = 8, k = 105; i < 10; i++, k += 195) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("相1");
}
// 士
in = new ImageIcon("img/士2.GIF");
for (i = 12, k = 155; i < 14; i++, k += 95) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("士1");
}
// 卒
in = new ImageIcon("img/兵2.GIF");
for (i = 16, k = 10; i < 21; i++, k += 96.5) {
play[i] = new JLabel(in);
play[i].setBounds(k, 160, 40, 40);
play[i].setName("卒1" + i);
}
// 炮
in = new ImageIcon("img/炮2.GIF");
for (i = 26, k = 60; i < 28; i++, k += 289) {
play[i] = new JLabel(in);
play[i].setBounds(k, 110, 40, 40);
play[i].setName("炮1" + i);
}
// 将
in = new ImageIcon("img/帅2.GIF");
play[30] = new JLabel(in);
play[30].setBounds(205, 10, 40, 40);
play[30].setName("将1");
// 红色棋子
// 车
in = new ImageIcon("img/车1.GIF");
for (i = 2, k = 10; i < 4; i++, k += 385) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("车2");
}
// 马
in = new ImageIcon("img/马1.GIF");
for (i = 6, k = 60; i < 8; i++, k += 285) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("马2");
}
// 相
in = new ImageIcon("img/相1.GIF");
for (i = 10, k = 105; i < 12; i++, k += 195) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("相2");
}
// 士
in = new ImageIcon("img/士1.GIF");
for (i = 14, k = 155; i < 16; i++, k += 95) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("士2");
}
// 兵
in = new ImageIcon("img/卒1.GIF");
for (i = 21, k = 10; i < 26; i++, k += 96.5) {
play[i] = new JLabel(in);
play[i].setBounds(k, 300, 40, 40);
play[i].setName("兵2" + i);
}
// 炮
in = new ImageIcon("img/炮1.GIF");
for (i = 28, k = 60; i < 30; i++, k += 289) {
play[i] = new JLabel(in);
play[i].setBounds(k, 350, 40, 40);
play[i].setName("炮2" + i);
}
// 帅
in = new ImageIcon("img/将1.GIF");
play[31] = new JLabel(in);
play[31].setBounds(205, 450, 40, 40);
play[31].setName("帅2");
}
public class ChineseChess {
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 showOpen;
// 保存
JButton showSave;
// 退出
JButton exit;
// 当前信息
JLabel text;
// 保存当前操作
Vector FileVar;
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() {
}
ChessMainFrame(String Title) {
// 获行客格引用
con = this.getContentPane();
con.setLayout(null);
// 实例化规则类
rule = new ChessRule();
FileVar = new Vector();
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("返回到上次走棋的位置");
showOpen = new JButton("打开");
showOpen.setToolTipText("打开以前棋局");
showSave = new JButton("保存");
showSave.setToolTipText("保存当前棋局");
// 把组件添加到工具栏
jmain.setLayout(new GridLayout(0, 6));
jmain.add(anew);
jmain.add(repent);
jmain.add(showOpen);
jmain.add(showSave);
jmain.add(exit);
jmain.add(text);
jmain.setBounds(0, 500, 450, 30);
con.add(jmain);
// 添加棋子标签
drawChessMan();
/* 注册监听者 */
// 注册按扭监听
anew.addActionListener(this);
repent.addActionListener(this);
exit.addActionListener(this);
showOpen.addActionListener(this);
showSave.addActionListener(this);
// 注册棋子移动监听
for (int i = 0; i < 32; i++) {
con.add(play[i]);
play[i].addMouseListener(this);
}
// 添加棋盘标签
con.add(image = new JLabel(new ImageIcon("img/chess.png")));
image.setBounds(0, 0, 446, 497);
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 - 200,
(screenSize.height - frameSize.height) / 2 - 290);
this.setIconImage(new ImageIcon("车1.gif").getImage());
this.setResizable(false);
this.setTitle(Title);
this.setSize(450, 550);
this.show();
}
/* 添加棋子方法*********** */
public void drawChessMan() {
// 流程控制
int i, k;
// 图标
Icon in;
// 黑色棋子
// 车
in = new ImageIcon("img/车2.GIF");
for (i = 0, k = 10; i < 2; i++, k += 385) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("车1");
}
// 马
in = new ImageIcon("img/马2.GIF");
for (i = 4, k = 60; i < 6; i++, k += 285) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("马1");
}
// 相
in = new ImageIcon("img/相2.GIF");
for (i = 8, k = 105; i < 10; i++, k += 195) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("相1");
}
// 士
in = new ImageIcon("img/士2.GIF");
for (i = 12, k = 155; i < 14; i++, k += 95) {
play[i] = new JLabel(in);
play[i].setBounds(k, 10, 40, 40);
play[i].setName("士1");
}
// 卒
in = new ImageIcon("img/兵2.GIF");
for (i = 16, k = 10; i < 21; i++, k += 96.5) {
play[i] = new JLabel(in);
play[i].setBounds(k, 160, 40, 40);
play[i].setName("卒1" + i);
}
// 炮
in = new ImageIcon("img/炮2.GIF");
for (i = 26, k = 60; i < 28; i++, k += 289) {
play[i] = new JLabel(in);
play[i].setBounds(k, 110, 40, 40);
play[i].setName("炮1" + i);
}
// 将
in = new ImageIcon("img/帅2.GIF");
play[30] = new JLabel(in);
play[30].setBounds(205, 10, 40, 40);
play[30].setName("将1");
// 红色棋子
// 车
in = new ImageIcon("img/车1.GIF");
for (i = 2, k = 10; i < 4; i++, k += 385) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("车2");
}
// 马
in = new ImageIcon("img/马1.GIF");
for (i = 6, k = 60; i < 8; i++, k += 285) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("马2");
}
// 相
in = new ImageIcon("img/相1.GIF");
for (i = 10, k = 105; i < 12; i++, k += 195) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("相2");
}
// 士
in = new ImageIcon("img/士1.GIF");
for (i = 14, k = 155; i < 16; i++, k += 95) {
play[i] = new JLabel(in);
play[i].setBounds(k, 450, 40, 40);
play[i].setName("士2");
}
// 兵
in = new ImageIcon("img/卒1.GIF");
for (i = 21, k = 10; i < 26; i++, k += 96.5) {
play[i] = new JLabel(in);
play[i].setBounds(k, 300, 40, 40);
play[i].setName("兵2" + i);
}
// 炮
in = new ImageIcon("img/炮1.GIF");
for (i = 28, k = 60; i < 30; i++, k += 289) {
play[i] = new JLabel(in);
play[i].setBounds(k, 350, 40, 40);
play[i].setName("炮2" + i);
}
// 帅
in = new ImageIcon("img/将1.GIF");
play[31] = new JLabel(in);
play[31].setBounds(205, 450, 40, 40);
play[31].setName("帅2");
}
三.结束语
在本次实验中我遇到了很多的困难,发现了很多的问题,正是在解决问题的期间我才慢慢地熟悉了Java的基础知识,才慢慢学会了如何去按照给定的要求设计出合适的java系统。