JAVA中国象棋打谱系统课程设计报告

更新时间:2023-12-17 11:24:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课 程 设 计

设计题目:中国象棋打谱系统 学生姓名:郑毅 专业班级:信息管12-2班 指导教师:伍章俊 2014年7月8日

- 1 -

目录

一、本组课题及程序功能要求 ........................................................................................... - 3 - 二、系统需求分析 ............................................................................................................... - 3 - 2.1 系统名称 .................................................................................................................... - 3 - 2.2 系统介绍 .................................................................................................................... - 3 - 三、系统总体设计 ............................................................................................................... - 4 - 3.1系统功能结构图 ......................................................................................................... - 4 - 3.2 具体功能实现 .......................................................................................................... - 4 - 11、CanRule.java .............................................................................................................. - 7 - 四、程序代码设计 ............................................................................................................... - 7 - ChinaChess ........................................................................................................................ - 7 - ChessBoard ...................................................................................................................... - 10 - Point ................................................................................................................................ - 17 - ChessBox .......................................................................................................................... - 18 - InitPieceLocation ............................................................................................................. - 22 - InitCanju .......................................................................................................................... - 28 - HandleMouse .................................................................................................................. - 32 - MoveRule ........................................................................................................................ - 38 - DemoManulDialog ........................................................................................................... - 44 - CanRule ............................................................................................................................ - 51 - 五、系统效果演示 ............................................................................................................. - 54 - 5.1效果图 ....................................................................................................................... - 54 - 5.2时序图 ....................................................................................................................... - 55 - 六、设计体会 ..................................................................................................................... - 56 - 附件一:课程设计小组人员任务分配 ............................................................................. - 56 - 附件二:合肥工业大学课程设计任务书 ......................................................................... - 57 -

- 2 -

一、本组课题及程序功能要求

课题名称:Java中国象棋打谱系统改进 要求:对中国象棋打谱系统进行改进

1) 添加音乐播放功能模块,实现当玩家托起或放下棋子 时,播放一段简短音乐。

2) 处理残局是添加一定规则:“士”、“将”必须放在田字格中。

二、系统需求分析

2.1 系统名称

中国象棋打谱系统

2.2 系统介绍

中国象棋打谱系统采用的是JavaSE中的基本技术可以实现简单的游戏操作,如下: (1)、制作实战棋谱 (2)、制作残局棋谱

(3)、在移动棋子过程中播放简短音乐

- 3 -

三、系统总体设计

3.1系统功能结构图

中国象棋

制作实战棋谱

演示实战棋谱

演示棋谱

演示实战棋谱

制作残局棋谱

3.2 具体功能实现

1、ChinaChess.java(打谱系统的主类)

ChinaChess

类负责创建中国象棋打谱系统的主窗口,该

类含有main方法,程序从该类开始执行。ChinaChess类的成

- 4 -

员变量中有5种重要类型的对

象:Jmenu,ChessBoard,DemoManulDialog,JtextField,Jbutton。 2、ChessBoard.java

ChessBoard类创建的对象是ChessBoard类最重要的成员之一,棋盘。该类的成员变量有5种重要类型的对象:Point,ChessPiece,ChessBox,InitPieceLocation,InitCanju,HandleMouse。

3、ChessPiece.java

ChessPiece类创建的对象是ChessBoard的重要成员之一,

用来表示棋子。 4、Point.java

Point.java类创建的对象是ChessBoard类的重要成员之

一,使用Point对象可以确定ChessPiece对象在ChessBoard中的位置,即确定棋子在棋盘中的位置。 5、ChessBox.java

ChessBox

类创建的对象是ChessBoard的重要成员之一,

用来表示棋盒。

6、InitPieceLocation.java

InitPieceLocation类创建的对象是ChessBoard的重要成员

之一,负责安排棋子在棋盘中的初始化位置,比如对于制作实战棋谱,InitPieceLocation对象就会按着实战开局将棋子摆放

- 5 -

在棋盘中的对弈点上;对于制作残局棋谱,InitPieceLocation对象就将棋子摆在棋盒中。 7、InitCanju.java

InitCanju类创建的对象是ChessBoard的重要成员之一,

当用户需要制作残局棋谱时,棋盘的开局要由用户来确定,InitCanju类创建的对象允许用户将棋盒中的棋子拖入棋盘中的对弈点上,以便摆放好残局的开局。并添加一定规则 8、HandleMouse.java

HandleMouse类创建的对象是ChessBoard的重要成员之

一,当用户开始对弈时,HandleMouse类创建的对象负责处理鼠标事件,以便用户拖动棋子走棋。并且在拖动按下或释放棋子时发出声音 9、MoveRule.java

MoveRule类创建的对象是ChessBoard的重要成员之

一,当用户拖动棋子时,MoveRule类创建的对象负责验证用户走法是否符合象棋规则。 10、DemoManulDialog.java

DemoManulDialog类创建的对象是ChessBoard的重要成员之一。DemoManulDialog类创建的对象负责演示棋谱。

- 6 -

11、CanRule.java

CanRule类创建的对象负责在创建残局的时候,控制棋子的摆放位置,如像必须放在田字格中,将士必须在米子格中。

四、程序代码设计

ChinaChess

import javax.swing.*; import java.awt.*;

import java.awt.event.*; import java.io.*;

public class ChinaChess extends JFrame implements ActionListener{ ChessBoard board; //棋盘

DemoManulDialog demoManul; //初始化棋盘摆设 JMenuBar bar; //菜单条

JMenu makeMenu,showMenu; //选择制作棋盘方式 棋谱

JMenuItem makeShiZhanManul,makeCanJuManul,openManulAndShow; //制作实战棋谱 制作残局 打开一个棋谱

JButton startMakeManul,saveManul; //开始制作棋谱 保存棋谱 JTextField hintMessage; //最初为:请单击菜单,选择制作棋谱的方式或演示已有的棋谱

public ChinaChess(){

setTitle(\中国象棋棋谱制作系统\ board=new ChessBoard();

add(board,BorderLayout.CENTER); /*主方法中chinachess容器,相当于chinachess.add(board,BorderLayout.CENTER) 作用:将棋盘board放到容器chinachess的中间 */

bar=new JMenuBar();

makeMenu=new JMenu(\选择制作棋谱的方式\ showMenu=new JMenu(\棋谱\

- 7 -

makeShiZhanManul=new JMenuItem(\制作实战棋谱\ makeCanJuManul=new JMenuItem(\制作残局棋谱\

openManulAndShow=new JMenuItem(\打开一个棋谱并演示\

makeMenu.add(makeShiZhanManul); //\制作残局棋谱\添加到\选择制作棋谱的方式\

makeMenu.add(makeCanJuManul); showMenu.add(openManulAndShow);

bar.add(makeMenu);//\选择制作棋谱的方式\添加到菜单条 bar.add(showMenu);

setJMenuBar(bar); //JFrame中方法 ,将菜单条放到窗口中(顶端) makeShiZhanManul.addActionListener(this); //对自己注册监听器 makeCanJuManul.addActionListener(this); openManulAndShow.addActionListener(this); startMakeManul=new JButton(\开始制作棋谱\

startMakeManul.setVisible(false); //setVisible(false) 设置组件“开始制作棋谱\不可见

startMakeManul.addActionListener(this); saveManul=new JButton(\保存棋谱\ saveManul.setVisible(false);

saveManul.addActionListener(this); hintMessage=new JTextField(30);

hintMessage.setHorizontalAlignment(JTextField.CENTER); //设置文本的水平对齐方式

hintMessage.setFont(new Font(\细黑\ //设置当前字体 hintMessage.setEditable(false);

hintMessage.setText(\请单击菜单,选择制作棋谱的方式或演示已有的棋谱\

hintMessage.setBackground(Color.green);

JPanel north=new JPanel(); //JPanel一般轻量级容器 north.add(hintMessage); north.add(startMakeManul); north.add(saveManul);

add(north,BorderLayout.NORTH);

setVisible(true); //chinachess窗口可见 setBounds(120,10,710,580);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); validate(); //确保布局完成

JOptionPane.showMessageDialog(this,

- 8 -

\请单击菜单,选择制作棋谱的方式或演示已有的棋谱\提示对话框\

JOptionPane.WARNING_MESSAGE); //消息对话框JOptionPane,this表示显示在当前窗口中央,WARNING_MESSAGE对话框显示感叹号 }

public void actionPerformed(ActionEvent e){

String message=\单击\\\开始制作棋谱\\\然后拖动棋子走棋\ if(e.getSource()==makeShiZhanManul) { //如果makeShiZhanManul事件源发生时间

board.setShizhanPlay(); //ChessBoard中自定义方法

hintMessage.setText(message);//hintMessage 文本框内容更换为message startMakeManul.setVisible(true); //startMakeManul变为可见 saveManul.setVisible(false);

JOptionPane.showMessageDialog(this,message,\提示对话框\JOptionPane.WARNING_MESSAGE); //makeShiZhanManul触发消息对话框 }

if(e.getSource()==makeCanJuManul){

message=\将棋盒中棋子拖入棋盘摆好残局,然后单击\\\开始制作棋谱\\\

hintMessage.setText(message); //hintMessage 文本框内容更换为message

board.setCanjuPlay();

startMakeManul.setVisible(true); saveManul.setVisible(false);

JOptionPane.showMessageDialog(this,message,\提示对话框\JOptionPane.WARNING_MESSAGE); }

if(e.getSource()==startMakeManul){ board.startMakeManul();

hintMessage.setText(\单击\\\保存棋谱\\\按钮可以保存棋谱\ saveManul.setVisible(true);

startMakeManul.setVisible(false); }

if(e.getSource()==saveManul){

startMakeManul.setVisible(false);

JFileChooser chooser=new JFileChooser(); //文件对话框,打开或保存一个文件

- 9 -

int state=chooser.showSaveDialog(null); //使对话框可见,提供保存文件对话框界面 ,null表示显示在屏幕中央

File file=chooser.getSelectedFile(); // getSelectedFile()可以得到文件对话框选择的文件

if(file!=null&&state==JFileChooser.APPROVE_OPTION){ //state返回值为JFileChooser.APPROVE_OPTION 代表可以使用getSelectedFile方法 try{

FileOutputStream out=new FileOutputStream(file);

ObjectOutputStream objectOut=new ObjectOutputStream(out); objectOut.writeObject(board); out.close();

objectOut.close(); }

catch(Exception event){} } }

if(e.getSource()==openManulAndShow){

JFileChooser chooser=new JFileChooser();

int state=chooser.showOpenDialog(null); //使对话框可见,提供打开文件对话框界面 ,null表示显示在屏幕中央 File file=chooser.getSelectedFile();

if(file!=null&&state==JFileChooser.APPROVE_OPTION){ demoManul=new DemoManulDialog(file); demoManul.setVisible(true); } } }

public static void main(String args[]){

ChinaChess chinachess=new ChinaChess(); }

ChessBoard

import javax.swing.*;

import java.util.*; import java.awt.*;

import java.awt.event.*;

public class ChessBoard extends JLayeredPane implements ActionListener{ int m=10,n=9,distance=42;

- 10 -

Point [][] playPoint;

String [] redName={\帅\士\士\相\相\马\马\车\车\炮\炮\ \兵\兵\兵\兵\兵\

String [] blackName={\将\仕\仕\象\象\馬\馬\車\車\炮\炮\ \卒\卒\卒\卒\卒\ ChessPiece [] redPiece; ChessPiece [] blackPiece;

ChessBox redChessBox,blackChessBox; InitPieceLocation initPieceLocation; InitCanju initCanju;

HandleMouse handleMouse; ArrayList step; JButton cancel; public ChessBoard(){ setLayout(null);

step=new ArrayList(); initPointAndPiece();

redChessBox=new ChessBox(distance,11,7); blackChessBox=new ChessBox(distance,11,1); for(int i=0;i

redChessBox.putPieceToBox(redPiece[i]); for(int i=0;i

blackChessBox.putPieceToBox(blackPiece[i]); initPieceLocation=new InitPieceLocation(); initPieceLocation.setPoint(playPoint);

initPieceLocation.setRedChessPiece(redPiece); initPieceLocation.setBlackChessPiece(blackPiece); initPieceLocation.setRedChessBox(redChessBox); initPieceLocation.setBlackChessBox(blackChessBox); initCanju=new InitCanju(); initCanju.setPoint(playPoint);

initCanju.setRedChessBox(redChessBox); initCanju.setBlackChessBox(blackChessBox); handleMouse=new HandleMouse(); handleMouse.setStep(step);

handleMouse.setPoint(playPoint);

handleMouse.setRedChessBox(redChessBox); handleMouse.setBlackChessBox(blackChessBox); handleMouse.initStep(); cancel=new JButton(\悔棋\ add(cancel);

cancel.setVisible(false); cancel.setSize(60,30);

cancel.setLocation(13*distance,(int)(5*distance));

- 11 -

cancel.addActionListener(this); }

private void initPointAndPiece() { removeAll();

playPoint=new Point[m][n];

int Hspace=distance,Vspace=distance; for(int i=0;i

playPoint[i][j]=new Point(distance+Hspace,Vspace); playPoint[i][j].setIsPlayPoint(true); Hspace=Hspace+distance; }

Hspace=distance;

Vspace=Vspace+distance; }

redPiece=new ChessPiece[redName.length]; int size=distance;

for(int i=0;i

add(redPiece[i],JLayeredPane.PALETTE_LAYER); redPiece[i].setSize(size,size); redPiece[i].setIsRed(true);

redPiece[i].setName(redName[i]); redPiece[i].repaint(); }

blackPiece=new ChessPiece[blackName.length]; for(int i=0;i

add(blackPiece[i],JLayeredPane.PALETTE_LAYER); blackPiece[i].setSize(size,size); blackPiece[i].setIsBlack(true);

blackPiece[i].setName(blackName[i]); blackPiece[i].repaint(); } }

public ArrayList getStep(){ return step; }

public Point [][] getPoint(){ return playPoint; }

public void setShizhanPlay(){

handleMouse.setRedFirstMove(true); handleMouse.initStep();

- 12 -

cancel.setVisible(false);

initPieceLocation.putAllPieceToPlayChessArea(); for(int i=0;i

MouseListener [] listener=redPiece[i].getMouseListeners(); for(int k=0;k

redPiece[i].removeMouseListener(listener[k]); listener=blackPiece[i].getMouseListeners(); for(int k=0;k

blackPiece[i].removeMouseListener(listener[k]);

MouseMotionListener [] mr=redPiece[i].getMouseMotionListeners(); for(int k=0;k

redPiece[i].removeMouseMotionListener(mr[k]); mr=blackPiece[i].getMouseMotionListeners(); for(int k=0;k

blackPiece[i].removeMouseMotionListener(mr[k]); } }

public void setCanjuPlay(){

handleMouse.setRedFirstMove(true); handleMouse.initStep(); cancel.setVisible(false);

initPieceLocation.putAllPieceToChessBox(); for(int i=0;i

MouseListener [] listener=redPiece[i].getMouseListeners(); for(int k=0;k

redPiece[i].removeMouseListener(listener[k]); listener=blackPiece[i].getMouseListeners(); for(int k=0;k

blackPiece[i].removeMouseListener(listener[k]);

MouseMotionListener [] mr=redPiece[i].getMouseMotionListeners(); for(int k=0;k

redPiece[i].removeMouseMotionListener(mr[k]); mr=blackPiece[i].getMouseMotionListeners(); for(int k=0;k

blackPiece[i].removeMouseMotionListener(mr[k]); redPiece[i].addMouseListener(initCanju); blackPiece[i].addMouseListener(initCanju);

redPiece[i].addMouseMotionListener(initCanju); blackPiece[i].addMouseMotionListener(initCanju); } }

public void startMakeManul(){ cancel.setVisible(true);

- 13 -

handleMouse.setRedFirstMove(true); handleMouse.initStep();

for(int i=0;i

MouseListener [] listener=redPiece[i].getMouseListeners(); for(int k=0;k

redPiece[i].removeMouseListener(listener[k]); listener=blackPiece[i].getMouseListeners(); for(int k=0;k

blackPiece[i].removeMouseListener(listener[k]);

MouseMotionListener [] mr=redPiece[i].getMouseMotionListeners(); for(int k=0;k

redPiece[i].removeMouseMotionListener(mr[k]); mr=blackPiece[i].getMouseMotionListeners(); for(int k=0;k

blackPiece[i].removeMouseMotionListener(mr[k]); redPiece[i].addMouseListener(handleMouse); blackPiece[i].addMouseListener(handleMouse);

redPiece[i].addMouseMotionListener(handleMouse); blackPiece[i].addMouseMotionListener(handleMouse); } }

public void paintComponent(Graphics g1){ Image img; final Color bgColor=new Color(245,250,160);//棋盘的背景色 super.paintComponent(g1);

Graphics2D g=(Graphics2D)g1;//获得Graphics2D对象 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);//打开抗锯齿 Color c=g.getColor();//获得画笔颜色 g.setColor(bgColor);//将画笔设为背景色 g.fill3DRect(0,0,this.getBounds().width,this.getBounds().height,false);//绘制一个矩形棋盘 g.fillRect(playPoint[0][0].x,playPoint[0][0].y,8*distance,9*distance); g.setColor(Color.black); for(int i=0;i<=m-1;i++){

g.drawLine(playPoint[i][0].x,playPoint[i][0].y,

playPoint[i][n-1].x,playPoint[i][n-1].y); }

for(int j=0;j<=n-1;j++){ if(j>0&&j

g.drawLine(playPoint[0][j].x,playPoint[0][j].y,

- 14 -

playPoint[4][j].x,playPoint[4][j].y);

g.drawLine(playPoint[5][j].x,playPoint[5][j].y, playPoint[m-1][j].x,playPoint[m-1][j].y); } else{

g.drawLine(playPoint[0][j].x,playPoint[0][j].y, playPoint[m-1][j].x,playPoint[m-1][j].y); } }

g.drawLine(playPoint[0][3].x,playPoint[0][3].y, playPoint[2][5].x,playPoint[2][5].y); g.drawLine(playPoint[0][5].x,playPoint[0][5].y, playPoint[2][3].x,playPoint[2][3].y); g.drawLine(playPoint[7][3].x,playPoint[7][3].y, playPoint[m-1][5].x,playPoint[m-1][5].y); g.drawLine(playPoint[7][5].x,playPoint[7][5].y, playPoint[m-1][3].x,playPoint[m-1][3].y);

this.smallLine(g,1,2); this.smallLine(g,7,2); this.smallLine(g,7,2); this.smallLine(g,7,7); this.smallLine(g,0,3); this.smallLine(g,2,3); this.smallLine(g,4,3); this.smallLine(g,6,3); this.smallLine(g,8,3); this.smallLine(g,0,6); this.smallLine(g,2,6); this.smallLine(g,4,6); this.smallLine(g,6,6); this.smallLine(g,8,6);

g.setFont(new Font(\宋体\ int w=blackPiece[0].getBounds().width; int h=blackPiece[0].getBounds().height;

Point [] boxPoint=blackChessBox.getBoxPoint();

g.drawString(\黑棋盒\ setOpaque(false);

g.drawRect(boxPoint[0].getX()-w/2-2,boxPoint[0].getY()-2*h/3, 4*distance+5,4*distance+8); g.setColor(Color.red);

boxPoint=redChessBox.getBoxPoint();

- 15 -

boxPoint[9].setChessPiece(piece);

boxPoint[9].setHaveChessPiece(true); piece.setAtPoint(boxPoint[9]); } else{

piece.setLocation(boxPoint[10].getX()-w/2,boxPoint[10].getY()-h/2); boxPoint[10].setChessPiece(piece); boxPoint[10].setHaveChessPiece(true); piece.setAtPoint(boxPoint[10]); } }

if(name.equals(\兵\卒\ if(boxPoint[11].isHaveChessPiece()==false){

piece.setLocation(boxPoint[11].getX()-w/2,boxPoint[11].getY()-h/2); boxPoint[11].setChessPiece(piece); boxPoint[11].setHaveChessPiece(true); piece.setAtPoint(boxPoint[11]); }

else if(boxPoint[12].isHaveChessPiece()==false){

piece.setLocation(boxPoint[12].getX()-w/2,boxPoint[12].getY()-h/2); boxPoint[12].setChessPiece(piece); boxPoint[12].setHaveChessPiece(true); piece.setAtPoint(boxPoint[12]); }

else if(boxPoint[13].isHaveChessPiece()==false){

piece.setLocation(boxPoint[13].getX()-w/2,boxPoint[13].getY()-h/2); boxPoint[13].setChessPiece(piece); boxPoint[13].setHaveChessPiece(true); piece.setAtPoint(boxPoint[13]); }

else if(boxPoint[14].isHaveChessPiece()==false){

piece.setLocation(boxPoint[14].getX()-w/2,boxPoint[14].getY()-h/2); boxPoint[14].setChessPiece(piece); boxPoint[14].setHaveChessPiece(true); piece.setAtPoint(boxPoint[14]); }

else if(boxPoint[15].isHaveChessPiece()==false){

piece.setLocation(boxPoint[15].getX()-w/2,boxPoint[15].getY()-h/2); boxPoint[15].setChessPiece(piece); boxPoint[15].setHaveChessPiece(true); piece.setAtPoint(boxPoint[15]); } } }

- 21 -

Point returnPoint=piece.getAtPoint(); return returnPoint; } }

InitPieceLocation

import java.util.ArrayList;

public class InitPieceLocation implements java.io.Serializable{ Point [][] playPoint; //二维坐标 ChessPiece [] redPiece,blackPiece;

ChessBox redChessBox,blackChessBox; public void setPoint(Point [][] p){ playPoint=p; }

public void setRedChessPiece(ChessPiece [] redPiece){ this.redPiece=redPiece; }

public void setBlackChessPiece(ChessPiece [] blackPiece){ this.blackPiece=blackPiece; }

public void setRedChessBox(ChessBox redChessBox){ this.redChessBox=redChessBox; }

public void setBlackChessBox(ChessBox blackChessBox){ this.blackChessBox=blackChessBox; }

public void putAllPieceToPlayChessArea(){ for(int i=0;i

for(int j=0;j

playPoint[i][j].setHaveChessPiece(false); } }

ArrayList pieceList=new ArrayList(); for(int i=0;i

pieceList.add(redPiece[i]);pieceList.add(blackPiece[i]); }

for(int i=0;i

for(int k=0;k

ChessPiece piece=pieceList.get(k); int w=piece.getBounds().width; int h=piece.getBounds().height;

- 22 -

Point p=null;

p=piece.getAtPoint(); if(p!=null)

p.setHaveChessPiece(false); String name=piece.getName();

if(name.equals(\帅\

piece.setLocation(playPoint[9][4].getX()-w/2,playPoint[9][4].getY()-h/2); piece.setAtPoint(playPoint[9][4]);

playPoint[9][4].setHaveChessPiece(true); playPoint[9][4].setChessPiece(piece); }

if((name.equals(\士\仕\ if(playPoint[9][3].isHaveChessPiece()==false){

piece.setLocation(playPoint[9][3].getX()-w/2,playPoint[9][3].getY()-h/2); piece.setAtPoint(playPoint[9][3]);

playPoint[9][3].setHaveChessPiece(true); playPoint[9][3].setChessPiece(piece); } else{

piece.setLocation(playPoint[9][5].getX()-w/2,playPoint[9][5].getY()-h/2); piece.setAtPoint(playPoint[9][5]);

playPoint[9][5].setHaveChessPiece(true); playPoint[9][5].setChessPiece(piece); } }

if(name.equals(\相\

if(playPoint[9][2].isHaveChessPiece()==false){

piece.setLocation(playPoint[9][2].getX()-w/2,playPoint[9][2].getY()-h/2); piece.setAtPoint(playPoint[9][2]);

playPoint[9][2].setHaveChessPiece(true); playPoint[9][2].setChessPiece(piece); } else{

piece.setLocation(playPoint[9][6].getX()-w/2,playPoint[9][6].getY()-h/2); piece.setAtPoint(playPoint[9][6]);

playPoint[9][6].setHaveChessPiece(true); playPoint[9][6].setChessPiece(piece); } }

if((name.equals(\马\馬\ if(playPoint[9][1].isHaveChessPiece()==false){

piece.setLocation(playPoint[9][1].getX()-w/2,playPoint[9][1].getY()-h/2); piece.setAtPoint(playPoint[9][1]);

playPoint[9][1].setHaveChessPiece(true);

- 23 -

playPoint[9][1].setChessPiece(piece); } else{

piece.setLocation(playPoint[9][7].getX()-w/2,playPoint[9][7].getY()-h/2); piece.setAtPoint(playPoint[9][7]);

playPoint[9][7].setHaveChessPiece(true); playPoint[9][7].setChessPiece(piece); } }

if((name.equals(\车\車\ if(playPoint[9][0].isHaveChessPiece()==false){

piece.setLocation(playPoint[9][0].getX()-w/2,playPoint[9][0].getY()-h/2); piece.setAtPoint(playPoint[9][0]);

playPoint[9][0].setHaveChessPiece(true); playPoint[9][0].setChessPiece(piece); } else{

piece.setLocation(playPoint[9][8].getX()-w/2,playPoint[9][7].getY()-h/2); piece.setAtPoint(playPoint[9][8]);

playPoint[9][8].setHaveChessPiece(true); playPoint[9][8].setChessPiece(piece); } }

if(name.equals(\炮\

if(playPoint[7][1].isHaveChessPiece()==false){

piece.setLocation(playPoint[7][1].getX()-w/2,playPoint[7][1].getY()-h/2); piece.setAtPoint(playPoint[7][1]);

playPoint[7][1].setHaveChessPiece(true); playPoint[7][1].setChessPiece(piece); } else{

piece.setLocation(playPoint[7][7].getX()-w/2,playPoint[7][7].getY()-h/2); piece.setAtPoint(playPoint[7][7]);

playPoint[7][7].setHaveChessPiece(true); playPoint[7][7].setChessPiece(piece); } }

if(name.equals(\兵\

if(playPoint[6][0].isHaveChessPiece()==false){

piece.setLocation(playPoint[6][0].getX()-w/2,playPoint[6][0].getY()-h/2); piece.setAtPoint(playPoint[6][0]);

playPoint[6][0].setHaveChessPiece(true); playPoint[6][0].setChessPiece(piece); }

- 24 -

else if(playPoint[6][2].isHaveChessPiece()==false){

piece.setLocation(playPoint[6][2].getX()-w/2,playPoint[6][2].getY()-h/2); piece.setAtPoint(playPoint[6][2]);

playPoint[6][2].setHaveChessPiece(true); playPoint[6][2].setChessPiece(piece); }

else if(playPoint[6][4].isHaveChessPiece()==false){

piece.setLocation(playPoint[6][4].getX()-w/2,playPoint[6][4].getY()-h/2); piece.setAtPoint(playPoint[6][4]);

playPoint[6][4].setHaveChessPiece(true); playPoint[6][4].setChessPiece(piece); }

else if(playPoint[6][6].isHaveChessPiece()==false){

piece.setLocation(playPoint[6][6].getX()-w/2,playPoint[6][6].getY()-h/2); piece.setAtPoint(playPoint[6][6]);

playPoint[6][6].setHaveChessPiece(true); playPoint[6][6].setChessPiece(piece); } else{

piece.setLocation(playPoint[6][8].getX()-w/2,playPoint[6][8].getY()-h/2); piece.setAtPoint(playPoint[6][8]);

playPoint[6][8].setHaveChessPiece(true); playPoint[6][8].setChessPiece(piece); } }

if(name.equals(\将\

piece.setLocation(playPoint[0][4].getX()-w/2,playPoint[0][4].getY()-h/2); piece.setAtPoint(playPoint[0][4]);

playPoint[0][4].setHaveChessPiece(true); playPoint[0][4].setChessPiece(piece); }

if((name.equals(\士\仕\ if(playPoint[0][3].isHaveChessPiece()==false){

piece.setLocation(playPoint[0][3].getX()-w/2,playPoint[0][3].getY()-h/2); piece.setAtPoint(playPoint[0][3]);

playPoint[0][3].setHaveChessPiece(true); playPoint[0][3].setChessPiece(piece); } else{

piece.setLocation(playPoint[0][5].getX()-w/2,playPoint[0][5].getY()-h/2); piece.setAtPoint(playPoint[0][5]);

playPoint[0][5].setHaveChessPiece(true); playPoint[0][5].setChessPiece(piece); }

- 25 -

}

if(name.equals(\象\ if(playPoint[0][2].isHaveChessPiece()==false){

piece.setLocation(playPoint[0][2].getX()-w/2,playPoint[0][2].getY()-h/2); piece.setAtPoint(playPoint[0][2]);

playPoint[0][2].setHaveChessPiece(true); playPoint[0][2].setChessPiece(piece); } else{

piece.setLocation(playPoint[0][6].getX()-w/2,playPoint[0][6].getY()-h/2); piece.setAtPoint(playPoint[0][6]);

playPoint[0][6].setHaveChessPiece(true); playPoint[0][6].setChessPiece(piece); } }

if((name.equals(\马\馬\ if(playPoint[0][1].isHaveChessPiece()==false){

piece.setLocation(playPoint[0][1].getX()-w/2,playPoint[0][1].getY()-h/2); piece.setAtPoint(playPoint[0][1]);

playPoint[0][1].setHaveChessPiece(true); playPoint[0][1].setChessPiece(piece); } else{

piece.setLocation(playPoint[0][7].getX()-w/2,playPoint[0][7].getY()-h/2); piece.setAtPoint(playPoint[0][7]);

playPoint[0][7].setHaveChessPiece(true); playPoint[0][7].setChessPiece(piece); } }

if((name.equals(\车\車\ if(playPoint[0][0].isHaveChessPiece()==false){

piece.setLocation(playPoint[0][0].getX()-w/2,playPoint[0][0].getY()-h/2); piece.setAtPoint(playPoint[0][0]);

playPoint[0][0].setHaveChessPiece(true); playPoint[0][0].setChessPiece(piece); } else{

piece.setLocation(playPoint[0][8].getX()-w/2,playPoint[0][7].getY()-h/2); piece.setAtPoint(playPoint[0][8]);

playPoint[0][8].setHaveChessPiece(true); playPoint[0][8].setChessPiece(piece); } }

if(name.equals(\炮\

- 26 -

if(playPoint[2][1].isHaveChessPiece()==false){

piece.setLocation(playPoint[2][1].getX()-w/2,playPoint[2][1].getY()-h/2); piece.setAtPoint(playPoint[2][1]);

playPoint[2][1].setHaveChessPiece(true); playPoint[2][1].setChessPiece(piece); } else{

piece.setLocation(playPoint[2][7].getX()-w/2,playPoint[2][7].getY()-h/2); piece.setAtPoint(playPoint[2][7]);

playPoint[2][7].setHaveChessPiece(true); playPoint[2][7].setChessPiece(piece); } }

if(name.equals(\卒\ if(playPoint[3][0].isHaveChessPiece()==false){

piece.setLocation(playPoint[3][0].getX()-w/2,playPoint[3][0].getY()-h/2); piece.setAtPoint(playPoint[3][0]);

playPoint[3][0].setHaveChessPiece(true); playPoint[3][0].setChessPiece(piece); }

else if(playPoint[3][2].isHaveChessPiece()==false){

piece.setLocation(playPoint[3][2].getX()-w/2,playPoint[3][2].getY()-h/2); piece.setAtPoint(playPoint[3][2]);

playPoint[3][2].setHaveChessPiece(true); playPoint[3][2].setChessPiece(piece); }

else if(playPoint[3][4].isHaveChessPiece()==false){

piece.setLocation(playPoint[3][4].getX()-w/2,playPoint[3][4].getY()-h/2); piece.setAtPoint(playPoint[3][4]);

playPoint[3][4].setHaveChessPiece(true); playPoint[3][4].setChessPiece(piece); }

else if(playPoint[3][6].isHaveChessPiece()==false){

piece.setLocation(playPoint[3][6].getX()-w/2,playPoint[3][6].getY()-h/2); piece.setAtPoint(playPoint[3][6]);

playPoint[3][6].setHaveChessPiece(true); playPoint[3][6].setChessPiece(piece); } else{

piece.setLocation(playPoint[3][8].getX()-w/2,playPoint[3][8].getY()-h/2); piece.setAtPoint(playPoint[3][8]);

playPoint[3][8].setHaveChessPiece(true); playPoint[3][8].setChessPiece(piece); }

- 27 -

} } }

public void putAllPieceToChessBox(){ for(int i=0;i

redChessBox.putPieceToBox(redPiece[i]); for(int i=0;i

blackChessBox.putPieceToBox(blackPiece[i]); Point [] boxPoint=redChessBox.getBoxPoint(); for(int i=0;i

boxPoint[i].setHaveChessPiece(true); boxPoint=blackChessBox.getBoxPoint(); for(int i=0;i

boxPoint[i].setHaveChessPiece(true); for(int i=0;i

playPoint[i][j].setHaveChessPiece(false); } } } }

InitCanju

import java.awt.event.*; import java.awt.*; import java.util.*; import javax.swing.*;

import java.io.*;

public class InitCanju implements MouseListener,MouseMotionListener,Serializable{ Point [][] point;

ChessBox redChessBox,blackChessBox; CanRule canput=new CanRule();

Point [] redChessBoxPoint,blackChessBoxPoint; int a,b,x0,y0,x,y,panorhe;

Point startPoint=null,endPoint=null;//

boolean redFirstMove,blackFirstMove,isPlaypoint;// public void setPoint(Point [][] point){ this.point=point; }

public void setRedChessBox(ChessBox redChessBox){ this.redChessBox=redChessBox;

- 28 -

redChessBoxPoint=redChessBox.getBoxPoint(); }

public void setBlackChessBox(ChessBox blackChessBox){ this.blackChessBox=blackChessBox;

blackChessBoxPoint=blackChessBox.getBoxPoint(); }

public void mousePressed(MouseEvent e){ ChessPiece piece=null;

piece=(ChessPiece)e.getSource(); a=piece.getBounds().x; b=piece.getBounds().y; x0=e.getX(); y0=e.getY();

startPoint=piece.getAtPoint(); for(int i=0;i

for(int j=0;j

public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e){ ChessPiece piece=null;

piece=(ChessPiece)e.getSource();

Container con=(Container)piece.getParent(); if(con instanceof JLayeredPane)

((JLayeredPane)con).setLayer(piece,JLayeredPane.DRAG_LAYER); a=piece.getBounds().x; b=piece.getBounds().y; x=e.getX(); y=e.getY(); a=a+x; b=b+y;

piece.setLocation(a-x0,b-y0); }

public void mouseReleased(MouseEvent e){ ChessPiece piece=null;

piece=(ChessPiece)e.getSource(); int w=piece.getBounds().width; int h=piece.getBounds().height; Container con=(Container)piece.getParent(); if(con instanceof JLayeredPane)

((JLayeredPane)con).setLayer(piece,JLayeredPane.DEFAULT_LAYER);

- 29 -

Rectangle rect=piece.getBounds(); endPoint=piece.getAtPoint();

for(int i=0;i

if(rect.contains(point[i][j].getX(),point[i][j].getY())){ endPoint=point[i][j]; panorhe=1; break; } } }

if(piece.getIsRed()){//判断endPoint是不是在红棋盒中 for(int i=0;i

if(rect.contains(redChessBoxPoint[i].getX(),redChessBoxPoint[i].getY())){ endPoint=redChessBoxPoint[i]; panorhe=0; break; } } }

else if(piece.getIsBlack()){//判断endPoint是不是在黑棋盒中 for(int i=0;i

if(rect.contains(blackChessBoxPoint[i].getX(),blackChessBoxPoint[i].getY())){ endPoint=blackChessBoxPoint[i]; panorhe=0; break; } } }

canput.canMove(piece,endPoint.x,endPoint.y);//设置是否允许移动 if(endPoint!=null&&panorhe==1){//endPoint不空且endPoint在棋盘中 if(endPoint.isHaveChessPiece()){

boolean ok=canput.getCanMove();//获取是否可移动 if(ok){ if(ok==true) System.out.println(\处有棋子,可以移动\ ChessPiece backToBoxPiece=endPoint.getChessPiece(); Point boxPoint=null;

if(backToBoxPiece.getIsRed())

boxPoint=redChessBox.putPieceToBox(backToBoxPiece); else if(backToBoxPiece.getIsBlack())

boxPoint=blackChessBox.putPieceToBox(backToBoxPiece); piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

endPoint.setHaveChessPiece(true);

- 30 -

endPoint.setChessPiece(piece);

startPoint.setHaveChessPiece(false); if(piece.getIsRed()){ redFirstMove=false; blackFirstMove=true; }

else if(piece.getIsBlack()){ blackFirstMove=false; redFirstMove=true; } }

else if(panorhe==1){ piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); } else{ piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece);

startPoint.setHaveChessPiece(false); } } else{ boolean ok=canput.getCanMove();//获取是否可移动 if(ok){

piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece);

startPoint.setHaveChessPiece(false); } else{ piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); } } }

else if(panorhe==1){//endPoint空但是在棋盘中 piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); }

else{//endPoint在棋盒中,不需要考虑是否允许移动 piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece);

- 31 -

startPoint.setHaveChessPiece(false); } }

public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} }

HandleMouse

/*------------------------------------------------------

在该类中插入两个方法PlayMusic1()和PlayMusic3() PlayMusic1():表示按下棋子时候发出一种声音 PlayMusic3():表示释放棋子时候发出一种声音 分别在:mousePressed()和mouseReleased()两个方法中调用以上方法,实现播放音乐功能 --------------------------------------------------*/ import java.awt.event.*; import java.awt.*; import java.util.*; import javax.swing.*; import java.io.*;

import java.applet.Applet; import java.applet.AudioClip;

import java.net.MalformedURLException; import java.net.URL;

public class HandleMouse implements MouseListener,MouseMotionListener,Serializable{ Point [][] point;

URL codebase1=null;

//定义获取路径的URL变量 AudioClip audio1; //定义音乐播放功能的变量,将URL获取地址付给audio1变量,便可以播放音乐 ChessBox redChessBox,blackChessBox; MoveRule rule;

ArrayList step; int a,b,x0,y0,x,y;

boolean redFirstMove,blackFirstMove,isPlaypoint; Point startPoint=null,endPoint=null; HandleMouse(){ //开始先移动红旗 redFirstMove=true; blackFirstMove=false;

- 32 -

rule=new MoveRule(); }

public void setStep(ArrayList step){ this.step=step; }

public void setRedFirstMove(boolean boo){ redFirstMove=true; blackFirstMove=false; }

public void setPoint(Point [][] point){ this.point=point; rule.setPoint(point); }

public void setRedChessBox(ChessBox redChessBox){ this.redChessBox=redChessBox; }

public void setBlackChessBox(ChessBox blackChessBox){ this.blackChessBox=blackChessBox; }

public void initStep(){ step.clear(); }

public ArrayList getStep(){ return step; }

//按下棋子时,发出一个声音 -----这里加一个 public void PlayMusic1(){

//按下棋子发出声音 try { codebase1 = new URL(\音频文件/按下棋子.WAV\ } catch (MalformedURLException m) { m.printStackTrace(); } audio1=Applet.newAudioClip(codebase1); audio1.play(); }

public void mousePressed(MouseEvent e){ //鼠标事件,按下鼠标左键,制动执行该过程 PlayMusic1(); //方法在上面,这里调用 ChessPiece piece=null;

piece=(ChessPiece)e.getSource(); a=piece.getBounds().x;

- 33 -

b=piece.getBounds().y; x0=e.getX(); y0=e.getY();

startPoint=piece.getAtPoint(); for(int i=0;i

for(int j=0;j

public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e){ //鼠标拖动棋子

ChessPiece piece=null;

piece=(ChessPiece)e.getSource();

Container con=(Container)piece.getParent(); a=piece.getBounds().x; b=piece.getBounds().y; x=e.getX(); y=e.getY(); a=a+x; b=b+y;

//初始化棋子位置

if(con instanceof JLayeredPane){

((JLayeredPane)con).setLayer(piece,JLayeredPane.DRAG_LAYER);

}

if(piece.getIsRed()&&redFirstMove) piece.setLocation(a-x0,b-y0); if(piece.getIsBlack()&&blackFirstMove) piece.setLocation(a-x0,b-y0); } public void PlayMusic3(){ //释放棋子播放声音 try { codebase1 = new URL(\音频文件/吃掉棋子.WAV\ } catch (MalformedURLException m) { m.printStackTrace(); } audio1=Applet.newAudioClip(codebase1);

- 34 -

audio1.play(); }

public void mouseReleased(MouseEvent e){ //鼠标事件,释放鼠标左键,制动实行该方法 PlayMusic3();

ChessPiece piece=null;

piece=(ChessPiece)e.getSource(); int w=piece.getBounds().width; int h=piece.getBounds().height;

Container con=(Container)piece.getParent(); //getParent() 此组件的父级容器

if(con instanceof JLayeredPane)

//con是JLayeredPane实例

((JLayeredPane)con).setLayer(piece,JLayeredPane.PALETTE_LAYER); //JLayeredPane.PALETTE_LAYER 调色板层位于默认层之上。 //它们对于浮动工具栏和调色板很有用,因此可以位于其他组件之上 Rectangle rect=piece.getBounds(); //Rectangle 指定坐标空间中的一个区域, //通过坐标空间中 Rectangle 对象左上方的点 (x,y)、宽度和高度可以定义这个区域。

for(int i=0;i

for(int j=0;j

if(rect.contains(point[i][j].getX(),point[i][j].getY())){ endPoint=point[i][j]; break; } } }

if(endPoint!=null&&isPlaypoint){ if(endPoint.isHaveChessPiece()){ //isHaveChessPiece() endPoint位置上面有的棋子 if(endPoint.getChessPiece().getIsRed()== startPoint.getChessPiece().getIsRed())

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); //都是红旗,不能移动,返回初始位置 else{

boolean ok=rule.movePieceRule(piece,startPoint,endPoint); //以上判断是否满足移动规则 if(ok){ //ok==true,可以移动

ChessPiece backToBoxPiece=endPoint.getChessPiece(); Point boxPoint=null;

if(backToBoxPiece.getIsRed())

- 35 -

boxPoint=redChessBox.putPieceToBox(backToBoxPiece); //返回棋盒是红旗,黑棋占位 else if(backToBoxPiece.getIsBlack())

boxPoint=blackChessBox.putPieceToBox(backToBoxPiece); piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece);

startPoint.setHaveChessPiece(false); step.add(startPoint); step.add(endPoint); step.add(boxPoint); if(piece.getIsRed()){ redFirstMove=false; blackFirstMove=true; }

//红旗走过,轮到黑棋走 else if(piece.getIsBlack()){ blackFirstMove=false; redFirstMove=true; } } else

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); //不满足规则,返回远点 } } else{ //末位置没有棋子

boolean ok=rule.movePieceRule(piece,startPoint,endPoint); if(ok){ //满足移动规则

piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece);

startPoint.setHaveChessPiece(false); step.add(startPoint); step.add(endPoint); step.add(null); if(piece.getIsRed()){ redFirstMove=false; blackFirstMove=true; }

- 36 -

//红旗走完黑棋走

else if(piece.getIsBlack()){ blackFirstMove=false; redFirstMove=true; } } else

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); //不满足返回远点 } } else

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); }

public void cancelAnStep(){ //删除一步,,,悔棋 int length=step.size(); if(length>=3){

Point boxPoint=step.get(length-1); Point endPoint=step.get(length-2); Point startPoint=step.get(length-3); ChessPiece piece=null; if(boxPoint!=null){

piece=endPoint.getChessPiece(); if(piece.getIsRed()){ redFirstMove=true; blackFirstMove=false; }

else if(piece.getIsBlack()){ blackFirstMove=true; redFirstMove=false; }

int w=piece.getBounds().width; int h=piece.getBounds().height;

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); piece.setAtPoint(startPoint);

startPoint.setHaveChessPiece(true); startPoint.setChessPiece(piece); endPoint.setHaveChessPiece(false); piece=boxPoint.getChessPiece(); w=piece.getBounds().width; h=piece.getBounds().height;

piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

- 37 -

endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece); boxPoint.setHaveChessPiece(false); } else{

piece=endPoint.getChessPiece(); if(piece.getIsRed()){ redFirstMove=true; blackFirstMove=false; }

else if(piece.getIsBlack()){ blackFirstMove=true; redFirstMove=false; }

int w=piece.getBounds().width; int h=piece.getBounds().height;

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); piece.setAtPoint(startPoint);

startPoint.setHaveChessPiece(true); startPoint.setChessPiece(piece); endPoint.setHaveChessPiece(false); }

step.remove(step.size()-1); step.remove(step.size()-1); step.remove(step.size()-1); } }

public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} }

MoveRule

public class MoveRule implements java.io.Serializable{ ChessPiece piece=null; Point [][] point;

Point startPoint,endPoint;

public void setPoint(Point [][] point){ this.point=point; }

public boolean movePieceRule(ChessPiece piece,Point startPoint,Point endPoint){ int startI=-1,startJ=-1,endI=-1,endJ=-1; this.piece=piece;

- 38 -

this.startPoint=startPoint; this.endPoint=endPoint; boolean isMove=false;

for(int i=0;i

for(int j=0;j

for(int i=0;i

for(int j=0;j

int minI=Math.min(startI,endI); int maxI=Math.max(startI,endI); int minJ=Math.min(startJ,endJ); int maxJ=Math.max(startJ,endJ);

if(piece.getName().equals(\车\車\ if(startI==endI){ int j=0;

for(j=minJ+1;j<=maxJ-1;j++){

if(point[startI][j].isHaveChessPiece()){ isMove=false; break; } }

if(j==maxJ)

isMove=true; }

else if(startJ==endJ){ int i=0;

for(i=minI+1;i<=maxI-1;i++){

if(point[i][startJ].isHaveChessPiece()){ isMove=false; break; }

- 39 -

}

if(i==maxI)

isMove=true; }

else isMove=false; }

else if(piece.getName().equals(\马\馬\ int xAxle=Math.abs(startI-endI); int yAxle=Math.abs(startJ-endJ); if(xAxle==2&&yAxle==1){ if(endI>startI){

if(point[startI+1][startJ].isHaveChessPiece()) isMove=false; else

isMove=true; }

if(endI

if(point[startI-1][startJ].isHaveChessPiece()) isMove=false; else

isMove=true; } }

else if(xAxle==1&&yAxle==2){ if(endJ>startJ){

if(point[startI][startJ+1].isHaveChessPiece()) isMove=false; else

isMove=true; }

if(endJ

if(point[startI][startJ-1].isHaveChessPiece()) isMove=false; else

isMove=true; } } else

isMove=false; }

else if(piece.getName().equals(\象\ int centerI=(startI+endI)/2; int centerJ=(startJ+endJ)/2;

- 40 -

int xAxle=Math.abs(startI-endI); int yAxle=Math.abs(startJ-endJ);

if(xAxle==2&&yAxle==2&&endI<=4) { if(point[centerI][centerJ].isHaveChessPiece()) isMove=false; else

isMove=true; } else

isMove=false; }

else if(piece.getName().equals(\相\ int centerI=(startI+endI)/2; int centerJ=(startJ+endJ)/2;

int xAxle=Math.abs(startI-endI); int yAxle=Math.abs(startJ-endJ);

if(xAxle==2&&yAxle==2&&endI>=5){ if(point[centerI][centerJ].isHaveChessPiece()) isMove=false; else

isMove=true; } else

isMove=false; }

else if(piece.getName().equals(\炮\ int number=0;

if(startI==endI){ int j=0;

for(j=minJ+1;j<=maxJ-1;j++){

if(point[startI][j].isHaveChessPiece()) number++; }

if(number>1)

isMove=false; else if(number==1){

if(point[endI][endJ].isHaveChessPiece()) isMove=true; }

else if(number==0&&!point[endI][endJ].isHaveChessPiece()) isMove=true; }

else if(startJ==endJ){ int i=0;

- 41 -

for(i=minI+1;i<=maxI-1;i++){

if(point[i][startJ].isHaveChessPiece()) number++; }

if(number>1)

isMove=false; else if(number==1){

if(point[endI][endJ].isHaveChessPiece()) isMove=true; }

else if(number==0&&!point[endI][endJ].isHaveChessPiece()) isMove=true; } else

isMove=false; }

else if(piece.getName().equals(\兵\ int xAxle=Math.abs(startI-endI); int yAxle=Math.abs(startJ-endJ); if(endI>=5){

if(startI-endI==1&&yAxle==0) isMove=true; else

isMove=false; }

else if(endI<=4){

if((startI-endI==1)&&(yAxle==0)) isMove=true;

else if((endI-startI==0)&&(yAxle==1)) isMove=true; else

isMove=false; } }

else if(piece.getName().equals(\卒\ int xAxle=Math.abs(startI-endI); int yAxle=Math.abs(startJ-endJ); if(endI<=4){

if(endI-startI==1&&yAxle==0) isMove=true; else

isMove=false; }

else if(endI>=5){

- 42 -

if((endI-startI==1)&&(yAxle==0)) isMove=true;

else if((endI-startI==0)&&(yAxle==1)) isMove=true; else

isMove=false; } }

//---------

else if(piece.getName().equals(\士\仕\ int xAxle=Math.abs(startI-endI); int yAxle=Math.abs(startJ-endJ); boolean c1=(endJ>=3&&endJ<=5); boolean c2=(endI>=7&&endI<=9); boolean d1=(endJ>=3&&endJ<=5); boolean d2=(endI>=0&&endI<=2); boolean ok=(xAxle==1&&yAxle==1); if((ok&&c1&&c2)||(ok&&d1&&d2)) isMove=true; else

isMove=false; }

else if((piece.getName().equals(\帅\将\ int xAxle=Math.abs(startI-endI); int yAxle=Math.abs(startJ-endJ); boolean c1=(endJ>=3&&endJ<=5); boolean c2=(endI>=7&&endI<=9); boolean d1=(endJ>=3&&endJ<=5); boolean d2=(endI>=0&&endI<=2);

boolean ok=(xAxle==1&&yAxle==0)||(xAxle==0&&yAxle==1); if((ok&&c1&&c2)||(ok&&d1&&d2)) isMove=true; else

isMove=false; }

//-------------

if(startPoint.equals(endPoint)) isMove=false; return isMove; } }

- 43 -

DemoManulDialog

import java.awt.*;

import java.awt.event.*; import javax.swing.*; import java.util.*; import java.io.*;

public class DemoManulDialog extends JDialog implements ActionListener{ ArrayList step=null;

Stack stackStep,stackBack; ChessBoard demoOne=null; File file;

JTextArea text;

JButton previous,next; JSplitPane split; int stepNumber=1;

DemoManulDialog(File f){ file=f;

setTitle(\演示棋谱,棋谱文件:\

split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); stackStep=new Stack(); stackBack=new Stack();

next=new JButton(\第\步\ previous=new JButton(\返回\ next.addActionListener(this); previous.addActionListener(this); previous.setEnabled(false); text=new JTextArea(); text.setEditable(false);

text.setFont(new Font(\宋体\ JPanel west=new JPanel(); west.add(text);

JPanel south=new JPanel(); south.add(previous); south.add(next);

split.setLeftComponent(new JScrollPane(text)); add(south,BorderLayout.SOUTH); add(split,BorderLayout.CENTER);

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); showTextManul(); showBoardManul();

setBounds(10,10,700,570); }

- 44 -

public void showBoardManul(){ stepNumber=1; stackStep.clear(); stackBack.clear(); if(demoOne!=null) remove(demoOne); try{

FileInputStream file_in=new FileInputStream(file);

ObjectInputStream object_in=new ObjectInputStream(file_in); demoOne=(ChessBoard)object_in.readObject(); file_in.close(); object_in.close();

ChessPiece [] redPiece=demoOne.getRedPiece(); ChessPiece [] blackPiece=demoOne.getBlackPiece(); for(int i=0;i

MouseListener [] listener=redPiece[i].getMouseListeners(); for(int k=0;k

redPiece[i].removeMouseListener(listener[k]); listener=blackPiece[i].getMouseListeners(); for(int k=0;k

blackPiece[i].removeMouseListener(listener[k]);

MouseMotionListener [] mr=redPiece[i].getMouseMotionListeners(); for(int k=0;k

redPiece[i].removeMouseMotionListener(mr[k]); mr=blackPiece[i].getMouseMotionListeners(); for(int k=0;k

blackPiece[i].removeMouseMotionListener(mr[k]); }

step=demoOne.getStep(); for(int i=step.size()-1;i>=0;i--){ stackStep.push(step.get(i)); }

demoOne.remove(demoOne.cancel); restoreChessBoard(step);

split.setRightComponent(new JScrollPane(demoOne)); }

catch(Exception exp){

add(new JButton(\不是棋谱文件\ } }

public void actionPerformed(ActionEvent e){ JButton source=(JButton)e.getSource();

Point startPoint=null,endPoint=null,boxPoint=null; if(source==next&&stackStep.empty()==false){

- 45 -

stepNumber++;

next.setText(\第\步\ startPoint=stackStep.pop(); stackBack.push(startPoint);

ChessPiece startPiece=startPoint.getChessPiece(); int w=startPiece.getBounds().width; int h=startPiece.getBounds().height; endPoint=stackStep.pop(); stackBack.push(endPoint); boxPoint=stackStep.pop(); stackBack.push(boxPoint); if(boxPoint!=null){

ChessPiece endPiece=endPoint.getChessPiece();

endPiece.setLocation(boxPoint.getX()-w/2,boxPoint.getY()-h/2); startPiece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); endPiece.setAtPoint(boxPoint); boxPoint.setHaveChessPiece(true); endPoint.setChessPiece(startPiece); endPoint.setHaveChessPiece(true); startPoint.setHaveChessPiece(false); } else{

startPiece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); startPiece.setAtPoint(endPoint); endPoint.setHaveChessPiece(true); endPoint.setChessPiece(startPiece); startPoint.setHaveChessPiece(false); } }

if(source==previous&&stackBack.empty()==false){ stepNumber--;

next.setText(\第\步\ boxPoint=stackBack.pop(); stackStep.push(boxPoint); endPoint=stackBack.pop(); stackStep.push(endPoint); startPoint=stackBack.pop(); stackStep.push(startPoint); ChessPiece piece=null; if(boxPoint!=null){

piece=endPoint.getChessPiece(); int w=piece.getBounds().width; int h=piece.getBounds().height;

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2);

- 46 -

piece.setAtPoint(startPoint);

startPoint.setHaveChessPiece(true); startPoint.setChessPiece(piece); endPoint.setHaveChessPiece(false); piece=boxPoint.getChessPiece();

piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); piece.setAtPoint(endPoint);

endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece); boxPoint.setHaveChessPiece(false); } else{

piece=endPoint.getChessPiece(); int w=piece.getBounds().width; int h=piece.getBounds().height;

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); piece.setAtPoint(startPoint);

startPoint.setHaveChessPiece(true); startPoint.setChessPiece(piece); endPoint.setHaveChessPiece(false); } }

if(stackBack.empty())

previous.setEnabled(false); else

previous.setEnabled(true); if(stackStep.empty()){

int n=JOptionPane.showConfirmDialog(this,\演示完毕,重新演示吗?\确认对话框\

JOptionPane.YES_NO_CANCEL_OPTION );

if(n==JOptionPane.YES_OPTION){ stepNumber=1;

next.setText(\第\步\ restoreChessBoard(step); stackStep.clear(); stackBack.clear();

previous.setEnabled(false); for(int i=step.size()-1;i>=0;i--){ stackStep.push(step.get(i)); } }

else if(n==JOptionPane.NO_OPTION) dispose();

- 47 -

} }

private void restoreChessBoard(ArrayList step){ for(int j=step.size()-1;j>=2;j=j-3){ Point boxPoint=step.get(j); Point endPoint=step.get(j-1); Point startPoint=step.get(j-2); ChessPiece piece=null; if(boxPoint!=null){

piece=endPoint.getChessPiece(); int w=piece.getBounds().width; int h=piece.getBounds().height;

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); startPoint.setHaveChessPiece(true); startPoint.setChessPiece(piece);

endPoint.setHaveChessPiece(false); piece=boxPoint.getChessPiece();

piece.setLocation(endPoint.getX()-w/2,endPoint.getY()-h/2); endPoint.setHaveChessPiece(true); endPoint.setChessPiece(piece); boxPoint.setHaveChessPiece(false); } else{

piece=endPoint.getChessPiece(); int w=piece.getBounds().width; int h=piece.getBounds().height;

piece.setLocation(startPoint.getX()-w/2,startPoint.getY()-h/2); startPoint.setHaveChessPiece(true); startPoint.setChessPiece(piece); endPoint.setHaveChessPiece(false); } } }

private void showTextManul(){ ChessBoard demoTwo=null; try{

FileInputStream file_in=new FileInputStream(file);

ObjectInputStream object_in=new ObjectInputStream(file_in); demoTwo=(ChessBoard)object_in.readObject(); file_in.close(); object_in.close(); }

catch(Exception exp){

add(new JButton(\不是棋谱文件\

- 48 -

}

if(demoTwo!=null){

ArrayList step=demoTwo.getStep(); step=demoTwo.getStep(); restoreChessBoard(step); text.setText(null);

StringBuffer buffer=new StringBuffer(); text.append(\棋谱\ Point [][] point=demoTwo.getPoint();

Point startPoint=null,endPoint=null,boxPoint=null; ChessPiece startPiece=null; int m=-1,n=-1,p=-1,q=-1; int index=0,number=0; while(index<=step.size()-1){ startPoint=step.get(index);

startPiece=startPoint.getChessPiece(); String name=startPiece.getName(); endPoint=step.get(index+1); boxPoint=step.get(index+2); for(int i=0;i

for(int i=0;i

char c1=numberToLetter(m); char c2=numberToLetter(p); number++;

if(boxPoint!=null){

ChessPiece endPiece=endPoint.getChessPiece(); if(startPiece.getIsRed()){

- 49 -

buffer.append(\红\→\

buffer.append(\吃掉黑\ }

else if(startPiece.getIsBlack()){

buffer.append(\黑\→\

buffer.append(\吃掉红\ }

endPiece.setAtPoint(boxPoint); boxPoint.setHaveChessPiece(true); endPoint.setChessPiece(startPiece); endPoint.setHaveChessPiece(true); startPoint.setHaveChessPiece(false); } else{

if(startPiece.getIsRed())

buffer.append(\红\→\

else if(startPiece.getIsBlack())

buffer.append(\黑\→\

startPiece.setAtPoint(endPoint); endPoint.setHaveChessPiece(true); endPoint.setChessPiece(startPiece); startPoint.setHaveChessPiece(false); }

index=index+3; }

text.append(new String(buffer)); } }

public char numberToLetter(int n){ char c='\\0'; switch(n){

case 1 : c='a'; break; case 2 : c='b'; break; case 3 : c='c'; break; case 4 : c='d'; break; case 5 : c='e'; break; case 6 : c='f'; break; case 7 : c='g'; break; case 8 : c='h'; break; case 9 : c='i'; break;

- 50 -

本文来源:https://www.bwwdw.com/article/u3f5.html

Top