象棋系统设计_中国象棋博弈系统设计
象棋系统设计由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“中国象棋博弈系统设计”。
滨江学院
软件工程课程设计
题 目 中国象棋打谱软件
院 系
计算机系
专 业
网络工程
组 员1 组 员2 组 员3 指导教师 吴婷婷
二O一六 年 十二 月 二十日
目录:
一、课程设计概述.....................................................................................................................1.1课程设计的内容........................................................................................................1.2课程设计的目的........................................................................................................1.3课程设计的背景........................................................................................................二、可行性研究与需求分析......................................................................................................2.1要求............................................................................................................................2.2用户需求分析............................................................................................................2.3可行性分析................................................................................................................三.项目的技术和方法..............................................................................................................3.1 Java GUI功能........................................................................................................3.2 多线程功能..............................................................................................................四.总体设计.............................................................................................................................4.1功能图........................................................................................................................4.2流程图........................................................................................................................五.详细设计:.........................................................................................................................5.1详细设计思路............................................................................................................六.测试:.................................................................................................................................七.总结:...............................................................................................................................八.心得体会:.......................................................................................................................参考文献:...............................................................................................................................一、课程设计概述
1.1课程设计的内容
中国象棋打谱软件提供给用户的一个能将对弈过程保存成文件 并可以重对弈过程 即复盘。主要功能有: 1.制作棋谱, 2.保存棋谱, 3.演示棋谱。
要求
中国象棋是双方在有着9 条竖线和10 条横线的棋盘上对弈的,竖线与横线的交叉点称做棋点,每个棋子都是在棋点上行走,而不是在方格中行走,河界将棋盘分成两个等份,每一边都有一块由9个点组成的“九宫”, 棋子“将”、“帅”、“士” 只能在“九宫”内移动。并且 “将”、“帅” 每一步只可以水平或垂直移动一个棋点。“士” 它只能在“九宫”内移动,并且它每一步只可以沿对角线方向移动一个棋点。“象” 它必须一步沿对角线方向走两个棋点,但它既不能过河,也不能跳过或穿越障碍,即象在走的过程中不能被“别眼”。“马” 每一步只可以水平或垂直移动一个棋点,但必须按对角线方向,向左或右移动,中国象棋的马不能跳过障碍,即在走的过程中不能被“别腿”。“车” 可以水平或垂直方向移动任意个无阻碍的点。“炮” 移动起来和车很类似,但它必须跳过一个棋子来吃掉对方的一个棋子,被跳过的那个棋子称为桥或者屏风。“兵' 每步只能向前移动一个棋点,过河以后,它便增加了向左右移动的能力,兵不允许向后移动。1.2课程设计的目的该软件在计算机、软件、网络普及的今天作为一个小游戏供人们消遣。为类似AlphaGo(阿尔法)的人工智能软件打下前期基础铺垫。同时象棋打谱软件也为想研究象棋的棋手提供便利,方便棋手详细的研究每个变化,每一步棋,钻研棋术。
通过软件开发的实践训练,进一步掌握软件工程的方法和技术,提高软件开发的实际能力,培养工程设计能力和综合分析、解决问题的能力。1.3课程设计的背景
随着计算机技术的飞速发展,各行各业都在追求信息化,以防在信息时代落伍。计算机和软件在帮助人们提高工作效率的同时也能够帮助人们放松一下,缓解工作及平时紧张生活。
供两人下棋的棋类打谱软件应用广泛,可以供没有棋子棋盘的两人当时下棋,也可以用于下棋比赛结束后的棋手钻研。适用人群也较广泛,没有象棋经验的初学者,有一定象棋经验的棋手,老少皆宜。
二、可行性研究与需求分析
2.1要求
实现一个中国象棋对弈的软件,实现中国象棋的规则:棋子共有三十二个,分为红、黑两组,每组十六个,各分七种,其名称和数目如下所述。
(1)红棋子:帅一人,车、马、炮、相、士各两个,兵五个。(2)黑棋子:
是非常小的,只需要计算机即可,然而计算机在现在家家户户已成为标配。
操作可行性:本系统设计清晰,操作简介,符合象棋设定,并达到操作过程中的直观、方便、使用、安全等要求。
技术可行性:本系统采用JAVA进行编写。使用的灵活性、良好的扩展性、以及现在编程语言的发展和其他软件的广泛应用,充分说明了本软件在技术方面的可行性。
使用环境可行性:现在信息社会发展迅速,家家户户都有电脑以及网络,人们都具有一定的计算机基础,包括老人。同时,在计算机普及的今天,绝大多数软件对计算机硬件的要求很低,基本的硬件条件就能够满足软件的使用,并且价格也能够被人们所接受。简单的象棋打谱软件所需要具备的计算机知识很少,使用方法也较简单易学易会。
三.项目的技术和方法
3.1 Java GUI功能
利用Java实现的俄罗斯方块游戏几乎能用到Java GUI(Graphical User Interface)的所有方面,其中包括Sun公司为Java提供的两个图形界面类库。
1、AWT(Abstract Windowing Toolkit),中文译为抽象窗口工具包,AWT是Sun公司最早推出的GUI类库,其中提供了建立和设置Java的图形用户界面的基本工具。AWT由Java中的java.awt包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类被称为构件(Components)。
2、Swing包是Java Foundation Claes(JFC)的一部分,与AWT的重量级构件不同,Swing中大部分是轻量级构件。正是这个原因,Swing几乎无所不能,不但有各式各样先进的构件,而且更为美观易用。所以一开始使用AWT的程序员很快就转向使用Swing了。
本设计中俄罗斯方块的实现的界面,主要是采用了Swing类库。(1本游戏的基本窗口类包括JFrame、JWindow、JPanel和JDialog等。
(2)在这里原子构件会用到标签类JLabel、按钮类JButton、JColorChooser类文本域JTextField。
(3)对一个大的GUI程序而言通常包含各种菜单,俄罗斯方块游戏中也包含许多种菜单,如JMenu、JMenuItem、JMenuBar等.(4)俄罗斯方块中的处理事件一般会用到ActionEvent类、ActionListener类、KeyEvent类、KeyEvent类、KeyListener接口、KeyAdapter类。
(5)俄罗斯方块的主界面采用的是BorderLayout布局。
5.1 按钮功能模块图
(3)棋子的操作模块 棋子的操作模块定义了线程,单击棋子的时候,可以使棋子闪烁以实现棋子已经被选取的效果,单击棋子或移动时,根据棋子的编号来判断使用规则进行移动或吃子。需要注意的是,移动和吃子是调用规则类模块完成的。
5.2棋子操作模块功能图
(4)棋子的移动规则类模块
移动规则类CheRule分别定义中国象棋32个棋子的移动规则。32个棋子可分为6类棋子。每一类棋子各有两个方法,定义这类棋子的移动规则和吃子
89101112附录:
1.象棋主类 文件ChineseChe.java package com.xmy;
import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.LinkedList;
public cla ChineseChe extends JFrame implements ActionListener { CheBoard board = null;Demon demon = null;MakeCheManual record = null;Container con = null;JMenuBar bar;JMenu fileMenu;JMenuItem 制作棋谱, 保存棋谱, 演示棋谱;JFileChooser fileChooser = null;LinkedList 棋谱 = null;
public ChineseChe(){ bar = new JMenuBar();fileMenu = new JMenu(”中国象棋“);制作棋谱 = new JMenuItem(”制作棋谱“);保存棋谱 = new JMenuItem(”保存棋谱“);保存棋谱.setEnabled(false);演示棋谱 = new JMenuItem(”演示棋谱“);fileMenu.add(制作棋谱);fileMenu.add(保存棋谱);fileMenu.add(演示棋谱);bar.add(fileMenu);setJMenuBar(bar);setTitle(制作棋谱.getText());制作棋谱.addActionListener(this);保存棋谱.addActionListener(this);演示棋谱.addActionListener(this);board = new CheBoard(45, 45, 9, 10);record = board.record;con = getContentPane();JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, board, record);split.setDividerSize(5);} } if(e.getSource()== 演示棋谱){ con.removeAll();con.repaint();con.validate();validate();保存棋谱.setEnabled(false);
int state = fileChooser.showOpenDialog(null);File openFile = fileChooser.getSelectedFile();if(openFile!= null && state == JFileChooser.APPROVE_OPTION){ try { FileInputStream inOne = new FileInputStream(openFile);ObjectInputStream inTwo = new ObjectInputStream(inOne);棋谱 =(LinkedList)inTwo.readObject();inOne.close();inTwo.close();CheBoard board = new CheBoard(45, 45, 9, 10);demon = new Demon(board);demon.set棋谱(棋谱);con.add(demon, BorderLayout.CENTER);con.validate();validate();this.setTitle(演示棋谱.getText()+ ”:“ + openFile);} catch(Exception event){ JLabel label = new JLabel(”不是棋谱文件“);label.setFont(new Font(”隶书“, Font.BOLD, 60));label.setForeground(Color.red);
label.setHorizontalAlignment(SwingConstants.CENTER);con.add(label, BorderLayout.CENTER);con.validate();this.setTitle(”没有打开棋谱“);validate();} } else { JLabel label = new JLabel(”没有打开棋谱文件呢“);label.setFont(new Font(”隶书“, Font.BOLD, 50));label.setForeground(Color.pink);label.setHorizontalAlignment(SwingConstants.CENTER);
int startX, startY;int startI, startJ;public boolean 红方走棋 = true, 黑方走棋 = false;Rule rule = null;public MakeCheManual record = null;
public CheBoard(int w, int h, int r, int c){ setLayout(null);addMouseListener(this);addMouseMotionListener(this);Color bc = getBackground();unitWidth = w;unitHeight = h;x轴长 = r;y轴长 = c;
point = new ChePoint[r + 1][c + 1];
for(int i = 1;i
rule = new Rule(this, point);record = new MakeCheManual(this, point);
img = Toolkit.getDefaultToolkit().getImage(”board.jpg“);pieceImg = Toolkit.getDefaultToolkit().getImage(”piece.gif“);
红车1 = new ChePiece(”車“, Color.red, bc, w4, this);红车1.set棋子类别(红方颜色);红车2 = new ChePiece(”車“, Color.red, bc, w4, this);红车2.set棋子类别(红方颜色);红马1 = new ChePiece(”馬“, Color.red, bc, w4, this);红马1.set棋子类别(红方颜色);红马2 = new ChePiece(”馬“, Color.red, bc, w4,84, h4, h4, h4, h4, h4, h4, h4, h4, h4, h4, h4, h4, h4, h 黑士2 = new ChePiece(”士“, Color.black, bc, w4, this);黑士2.set棋子类别(黑方颜色);黑车1 = new ChePiece(”车“, Color.black, bc, w4, this);黑车1.set棋子类别(黑方颜色);黑车2 = new ChePiece(”车“, Color.black, bc, w4, this);黑车2.set棋子类别(黑方颜色);黑炮1 = new ChePiece(”炮“, Color.black, bc, w4, this);黑炮1.set棋子类别(黑方颜色);黑炮2 = new ChePiece(”炮“, Color.black, bc, w4, this);黑炮2.set棋子类别(黑方颜色);黑象1 = new ChePiece(”象“, Color.black, bc, w4, this);黑象1.set棋子类别(黑方颜色);黑象2 = new ChePiece(”象“, Color.black, bc, w4, this);黑象2.set棋子类别(黑方颜色);黑马1 = new ChePiece(”马“, Color.black, bc, w4, this);黑马1.set棋子类别(黑方颜色);黑马2 = new ChePiece(”马“, Color.black, bc, w4, this);黑马2.set棋子类别(黑方颜色);黑卒1 = new ChePiece(”卒“, Color.black, bc, w4, this);黑卒1.set棋子类别(黑方颜色);黑卒2 = new ChePiece(”卒“, Color.black, bc, w4, this);黑卒2.set棋子类别(黑方颜色);黑卒3 = new ChePiece(”卒“, Color.black, bc, w4, this);黑卒3.set棋子类别(黑方颜色);黑卒4 = new ChePiece(”卒“, Color.black, bc, w4, this);黑卒4.set棋子类别(黑方颜色);黑卒5 = new ChePiece(”卒“, Color.black, bc, w4, this);黑卒5.set棋子类别(黑方颜色);point[1][10].setPiece(红车1, this);point[2][10].setPiece(红马1, this);
0imgWidth)/ 2;int y =(FHeight
for(int j = 1;j
g.drawLine(point[4][1].x, point[4][1].y, point[6][3].x, point[6][3].y);g.drawLine(point[6][1].x, point[6][1].y, point[4][3].x, point[4][3].y);g.drawLine(point[4][8].x, point[4][8].y, point[6][y轴长].x, point[6][y轴长].y);g.drawLine(point[4][y轴长].x, point[4][y轴长].y, point[6][8].x, point[6][8].y);
for(int i = 1;i
}
/**鼠标按下事件*/ x = e.getX();y = e.getY();if(红方走棋 &&((piece.棋子类别()).equals(红方颜色))){ piece.setLocation(xpiece.getHeight()/ 2);} if(黑方走棋 &&(piece.棋子类别().equals(黑方颜色))){ piece.setLocation(xpiece.getHeight()/ 2);} } } }
/**松开鼠标事件*/ public void mouseReleased(MouseEvent e){ ChePiece piece = null;move = false;Rectangle rect = null;if(e.getSource()instanceof ChePiece){ piece =(ChePiece)e.getSource();rect = piece.getBounds();
e = SwingUtilities.convertMouseEvent(piece, e, this);} if(e.getSource()== this){ boolean containChePoint = false;int x = 0, y = 0;int m = 0, n = 0;if(piece!= null){ for(int i = 1;i
containChePoint = true;m = i;n = j;break;} } }
} else {
boolean ok = rule.movePieceRule(piece, startI, startJ, m, n);if(ok){ point[m][n].setPiece(piece, this);(point[startI][startJ]).set有棋子(false);record.记录棋谱(piece, startI, startJ, m, n);record.记录吃掉的棋子(”没吃棋子“);
if(piece.棋子类别().equals(红方颜色)){ 红方走棋 = false;黑方走棋 = true;} if(piece.棋子类别().equals(黑方颜色)){ 黑方走棋 = false;红方走棋 = true;} } else { piece.setLocation(startX, startY);(point[startI][startJ]).set有棋子(true);} } }
if(piece!= null &&!containChePoint){ piece.setLocation(startX, startY);(point[startI][startJ]).set有棋子(true);} } }
public void mouseEntered(MouseEvent e){ }
public void mouseExited(MouseEvent e){ }
public void mouseClicked(MouseEvent e){
68);// 在棋子上绘制 “棋子名” g.setColor(Color.black);//g.drawOval(1, 1, width1);float lineWidth = 2.3f;
public ChePoint(int x, int y, boolean boo){ this.x = x;this.y = y;有棋子 = boo;}
public boolean isPiece(){ return 有棋子;}
public void set有棋子(boolean boo){ 有棋子 = boo;}
public int getX(){ return x;}
public int getY(){ return y;}
// 设置改点棋子
public void setPiece(ChePiece piece, CheBoard board){ this.board = board;this.piece = piece;board.add(piece);int w =(board.unitWidth);int h =(board.unitHeight);piece.setBounds(xh / 2, w, h);// 棋子位置,宽度,高度
有棋子 = true;board.validate();}
public ChePiece getPiece(){ return piece;}
public void reMovePiece(ChePiece piece, CheBoard board){ this.board = board;this.piece = piece;board.remove(piece);boolean 可否走棋 = false;if(piece.getName().equals(”车“)){ if(startI == endI){ int j = 0;for(j = minJ + 1;j
} else if(piece.getName().equals(”車“)){ if(startI == endI){ int j = 0;for(j = minJ + 1;j
1endI);int yAxle = Math.abs(startJ1][startJ].isPiece()){ 可否走棋 = false;} else { 可否走棋 = true;} }
}else if(xAxle == 1 && yAxle == 2){ if(endJ > startJ){ if(point[startI][startJ + 1].isPiece()){ 可否走棋 = false;} else { 可否走棋 = true;} } if(endJ
} else { 可否走棋 = false;} } else if(piece.getName().equals(”馬“)){ int xAxle = Math.abs(startIendJ);
if(xAxle == 2 && yAxle == 1){ if(endI > startI){ if(point[startI + 1][startJ].isPiece()){ 可否走棋 = false;} else { 可否走棋 = true;} } if(endI
} else { 可否走棋 = false;
3endI);int yAxle = Math.abs(startJendI);int yAxle = Math.abs(startJ1;j++){ if(point[startI][j].isPiece()){ number++;} } if(number > 1){ 可否走棋 = false;} else if(number == 1){ if(point[endI][endJ].isPiece()){ 可否走棋 = true;}
41;i++){ if(point[i][startJ].isPiece()){ number++;} } if(number > 1){ 可否走棋 = false;} else if(number == 1){ if(point[endI][endJ].isPiece()){ 可否走棋 = true;} } else if(number == 0 &&!point[endI][endJ].isPiece()){ 可否走棋 = true;} } else { 可否走棋 = false;} } else if(piece.getName().equals(”兵“)){ int xAxle = Math.abs(startIendJ);
if(endJ >= 6){ if(startJendJ == 1)&&(xAxle == 0)){ 可否走棋 = true;} else if((endJ } } else if(piece.getName().equals(”卒“)){ int xAxle = Math.abs(startIendJ);
if(endJ
return 可否走棋;
} }
6.走步类文件MoveStep.java
import java.awt.Point;public cla MoveStep implements java.io.Serializable { public Point pStart, pEnd;
public MoveStep(Point p1, Point p2){ pStart = p1;pEnd = p2;} }
7.制作棋谱类MakeCheManual.java package com.xmy;
import java.awt.BorderLayout;import java.awt.Font;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.LinkedList;
import javax.swing.JButton;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;
public cla MakeCheManual extends JPanel implements ActionListener {
break;
case 7:
c = 'G';
break;
case 8:
c = 'H';
break;
case 9:
c = 'I';
break;
case 10:
c = 'J';
break;
}
return c;
}
public void 记录棋谱(ChePiece piece, int startI, int startJ, int endI,int endJ){
Point pStart = new Point(startI, startJ);
Point pEnd = new Point(endI, endJ);
MoveStep step = new MoveStep(pStart, pEnd);
棋谱.add(step);
String 棋子类别 = piece.棋子类别();
String name = piece.getName();
String m = ”#“ + 棋子类别 + name + ”: “ + startI + numberToLetter(startJ)
+ ” 到 “ + endI + numberToLetter(endJ);
text.append(m);
if(piece.棋子类别().equals(board.黑方颜色))
text.append(”n“);
}
public void 记录吃掉的棋子(Object object){
吃掉的棋子.add(object);
}
public LinkedList 获取棋谱(){
return 棋谱;
}
public void actionPerformed(ActionEvent e){
int position = text.getText().lastIndexOf(”#“);
if(position!=-1)
}
}
} }
8.演示棋谱类文件Demon.java package com.xmy;
import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.GridLayout;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.LinkedList;
import javax.swing.JButton;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JSplitPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.SwingConstants;
public cla Demon extends JPanel implements ActionListener, Runnable {
public JButton replay = null, next = null, auto = null, stop = null;
LinkedList 棋谱 = null;
Thread 自动演示 = null;
int index =-1;
CheBoard board = null;
JTextArea text;
JTextField 时间间隔 = null;
int time = 1000;
String 演示过程 = ”“;
JSplitPane splitH = null, splitV = null;
public Demon(CheBoard board){
this.board = board;
replay = new JButton(”重新演示“);
next = new JButton(”下一步“);
auto = new JButton(”自动演示“);
stop = new JButton(”暂停演示“);
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;
case 10:
c = 'J';
break;
}
return c;
}
public void actionPerformed(ActionEvent e){
if(e.getSource()== next){
index++;
if(index
演示一步(index);
} else {
演示结束(”棋谱演示完毕“);
}
}
if(e.getSource()== replay){
board = new CheBoard(45, 45, 9, 10);
splitH.remove(board);
splitH.setDividerSize(5);
splitH.setDividerLocation(460);
splitH.setLeftComponent(board);
splitH.validate();
index =-1;
text.setText(null);
}
if(e.getSource()== auto){
next.setEnabled(false);
} catch(InterruptedException e){
notifyAll();
}
}
演示一步(index);
}
if(index >= 棋谱.size()){
演示结束(”棋谱演示完毕“);
next.setEnabled(true);
replay.setEnabled(true);
}
}
public void 演示一步(int index){
MoveStep step =(MoveStep)棋谱.get(index);
Point pStart = step.pStart;
Point pEnd = step.pEnd;
int startI = pStart.x;
int startJ = pStart.y;
int endI = pEnd.x;
int endJ = pEnd.y;
ChePiece piece =(board.point)[startI][startJ].getPiece();
if((board.point)[endI][endJ].isPiece()== true){
ChePiece pieceRemoved =(board.point)[endI][endJ].getPiece();
(board.point)[endI][endJ].reMovePiece(pieceRemoved, board);
board.repaint();
(board.point)[endI][endJ].setPiece(piece, board);
(board.point)[startI][startJ].set有棋子(false);
board.repaint();
} else {
(board.point)[endI][endJ].setPiece(piece, board);
(board.point)[startI][startJ].set有棋子(false);
}
String 棋子类别 = piece.棋子类别();
String name = piece.getName();
String m = ”#“ + 棋子类别 + name + ”: “ + startI + numberToLetter(startJ)
+ ” 到 “ + endI + numberToLetter(endJ);
text.append(m);
if(piece.棋子类别().equals(board.黑方颜色))
text.append(”n");
}
public void 演示结束(String meage){
546-
xx县xx镇中心小学2018年下半年象棋教学设计“棋子与棋盘”教学设计教学内容:棋子与棋盘.教学目标:1.进一步认识中国象棋棋盘与棋子。2.了解象棋起源的故事。3.激发学生的学棋......
小学生象棋教学设计第一课时主讲:甘沟门学校丁永祥 设计思路:随着课程改革的深入进行,教育对学校、对教师提出了更高的要求,深入开展以校为本的教学研究,进一步挖掘和利用教育资......
我国象棋源远流长,历史悠久。但究其源头,众说纷纭,尚难定论。小时候瞎琢磨的劲头竟让我对这千年古玩爱不释手。渐渐玩到深处,对它有了新的看法:人生如棋,棋若人生,社会为盘,人若子般......
第一章一、教学系统设计的不同层次:P10 ①以“产品”为中心的层次;②以“课堂”为中心的层次;③以“系统”为中心的层次二、教学系统设计的理论基础:P111、学习理论与教学设计2......
第一章教学系统概述:教学系统设计(ISD)是以促进学习者学习为根本目的,运用系统方法,将学习理论与教学理论等原理转换成对教学目标,教学内容、教学方法和教学策略、教学评价等环节......
