面向对象设计程序设计

面向对象设计方法: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系统。

时间: 2024-10-11 22:44:00

面向对象设计程序设计的相关文章

6. javacript高级程序设计-面向对象设计

1. 面向对象设计 1.1 理解对象 1.1.1 属性类型 (1). 数据属性:相当于对象的字段,包含一个数据值的位置,在这个位置可以读取和写入值.数据属性中有4个描述其行为的特性: l [[Configurable]]:表示能否通过delete删除属性从而重新定义属性 l [[Enumerable]]:表示是否通过for-in循环返回属性 l [[Writable]]:表示能否修改属性的值 l [[Value]]:包含这个属性的数据值 要修改属性默认的特性,必须使用ECMAScript5的Ob

Java程序员应该了解的10个面向对象设计原则

面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator.Observer这样的设计模式,而不重视面向对象的分析和设计.甚至还有经验丰富的Java程序员没有听说过OOPS和SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程. 众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计.查看Ap

第十篇 面向对象的程序设计

第十篇 面向对象的程序设计 阅读目录 一 面向对象的程序设计的由来 二 什么是面向对象的程序设计及为什么要有它 三 类和对象 3.1 什么是对象,什么是类 3.2 类相关知识 3.3 对象相关知识 3.4 对象之间的交互 3.5 类名称空间与对象/实例名称空间 3.6 小结 四 继承与派生 4.1 什么是继承 4.2 继承与抽象(先抽象再继承) 4.3 继承与重用性 4.4 组合与重用性 4.5 接口与归一化设计 4.6 抽象类 4.7 继承实现的原理(继承顺序) 4.8 子类中调用父类方法 五

走入计算机的第二十八天(面向对象的程序设计)

一  什么是面向对象的程序设计及为什么要有它 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了程序的复杂度 缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是

面向对象设计的11个原则

单一职责原则(The Single Responsibility Principle,简称SRP) 开放-封闭原则(The Open-Close Principle,简称OCP) Liskov替换原则(The Liskov Substitution,简称LSP) 依赖倒置原则(The Dependency Inversion Principle,简称DIP) 接口隔离原则(The Interface Segregation Principle,简称ISP) 重用发布等价原则(The Reuse-

面向对象设计——泛型的愉快体验

在实际的项目中,我们经常看到有人写了很多代码,抽象了很多类,而这些类无不是采用了泛型和委托,应用了这辆种技术后,经常有人给我们说,代码的复用性和耦合性就降低了,那作为一个合格的面向对象的程序设计人员,这种技术成为了我们的必备技能,今天就跟着我一起来一次轻松愉快的旅行! 定义(如果吃力,请直接看我对他的注解): 泛型是程序设计语言的一种特性.允许程序员在强类型程序设计语言中编写代码时定 义一些可变部分,那些部分在使用前必须作出指明.各种程序设计语言和其编译器.运行环境对泛型的支持均不一样.将类型参

面向对象设计的七大原则

在上一篇里我们谈了谈为何设计模式,那接下来我们再浅谈一下在面向对象设计中我们常常要遵循的一些原则. 这些原则是经过无数的前人总结出来的经验的结晶. 仅仅有遵循这些原则.你才有可能涉及出优秀的代码.今天我们要谈的原则有七大原则,即:单一职责.里氏替换.迪米特法则,依赖倒转,接口隔离,合成/聚合原则.开放-封闭 . 1.   开闭原则 定义:软件实体应当对扩展开放,对改动关闭.这句话说得有点专业.更通俗一点讲,也就是:软件系统中包括的各种组件,比如模块(Modules).类(Classes)以及功能

python之面向对象的程序设计

第一:程序设计思想与发展历程(了解) 1940年以前:面向机器编程最早的是采用机器语言编程,也就是直接使用二进制码来表示机器能够识别的指令和数据.优点:机器语言由机器直接执行,速度快缺点:写起来非常困难,并且不容易修改 汇编语言:用助记符号代替机器指令的操作码,用地址符号或者标号代替指令或操作数的地址优点:比机器语言的二进制码编写方便些缺点:汇编语言本质上还是一种面向机器的语言,编写困难,易出错 脱离机器后:面向过程编程面向过程的结构化程序设计强调功能的抽象和程序的模块化, 它将解决问题的过程看

第八章、面向对象设计

面向对象程序设计的基本特征有: 1,封装性: 封装性是指将对象相关的信息和行为状态捆绑成一个单元,即将对象封装为一个具体的类.封装隐藏了对象的具体实现,当要操纵 对象时,只需调用其中的方法,而不用管方法的具体实现. 2,继承性: 一个类继承另一个类,继承者可以获得被继承类的所有方法和属性,并且可以根据实际的需要添加新的方法或者对被继承类中的方法 进行覆写,被继承者称为父类或者超类,继承者称为子类或导出类,继承提高了程序代码的可重用性,Java中一个子类只能继承一个 父类,Object类是所有类的