一.题目简介

本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,可以设计棋谱,完成棋谱的保存和对已保存的棋谱的演示,方便现在爱棋人士对残局的收藏于研究,而且达到了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练的应用面向对象的思想和设计方法解决实际问题的能力的目的。

1.当两方有一方将(帅)被吃掉后,程序不能自动结束或提示游戏结束,但想到该程序并不是要进行两方对弈,而是要设计棋谱所以在能力实现范围内可以允许该事件发生;

2.用户不能自动的将棋子删除,使得在摆棋谱过程中增加了工作量,必须从一开始进行,记录每一个棋子的行走过程,因为该程序给用户提供按照一定的思路设计防止其他非专业用户乱走和乱摆。

二.结对分工及过程

姓  名

学号

承  担  的  任  务

李增佐

201303014031

棋盘界面设计,对弈规则的实现,设计棋谱

纪欣

201303014016

保存下棋的步骤从而实现悔棋的实现,完成保存棋谱

1.棋子的设计;

(1)声明一个ChessPiece类,完成各个棋子的外观设计;

public class ChessPiece extends JLabel

{String name;

Color backColor=null,foreColor;

String 颜色类别=null;

ChessBoard board=null;

int width,height;

public ChessPiece(String name,Color fc,Color bc,int width,int height,ChessBoard board){

this.name=name;

this.board=board;

this.width=width;

this.height=height;

foreColor=fc;

backColor=bc;

setSize(width,height);

setBackground(bc);

addMouseMotionListener(board);

addMouseListener(board);}

public void paint(Graphics g){

g.setColor(foreColor);

g.fillOval(2,2,width-2,height-2);

g.setColor(Color.white);

g.setFont(new Font("隶书",Font.BOLD,28));

g.drawString(name,7,height-8);

g.setColor(Color.yellow);

g.drawOval(2,2,width-2,height-2);}

public int getWidth(){return width;}

public int getHeight(){return height;}

public String getName(){return name;}

public Color 获取棋子颜色(){ return foreColor;}

public void set棋子类别(String 类别){颜色类别=类别;}

public String 棋子类别(){return  颜色类别;}}

(2)实现各个棋子外观;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class ChessBoard extends JPanel implements MouseListener,MouseMotionListener{

public ChessPoint point[][];

public int unitWidth,unitHeight;

int x轴长,y轴长;

int x,y;

boolean move=false;

public String     红方颜色="红色",黑方颜色="黑色";

ChessPiece 红车1,红车2,红马1,红马2,红相1,红相2,红帅,红士1,红士

2,红兵1,红兵2,红兵3,红兵4,红兵5,红炮1,红炮2;

ChessPiece 黑车1,黑车2,黑马1,黑马2,黑将,黑士1,黑士2,黑卒1,黑卒2,黑卒3,黑卒4,黑卒5,黑象1,黑象2,黑炮1,黑炮2;

int startX,startY;

int startI,startJ;

public boolean 红方走棋=true,黑方走棋=false;

Rule rule=null;

public  MakeChessManual record=null;

public  ChessBoard(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 ChessPoint[r+1][c+1];

for(int i=1;i<=r;i++){

for(int j=1;j<=c;j++){

point[i][j]=new ChessPoint(i*unitWidth,j*unitHeight,false); }}

rule=new Rule(this,point);

record=new MakeChessManual(this,point) ;

红车1=new ChessPiece("车",Color.red,bc,w-4,h-4,this);

红车1.set棋子类别(红方颜色);

……//分别是红方各个棋子的设计

红兵5=new ChessPiece("兵",Color.red,bc,w-4,h-4,this);

红兵5.set棋子类别(红方颜色);

黑将=new ChessPiece("将",Color.blue,bc,w-4,h-4,this);

黑将.set棋子类别(黑方颜色);

……//分别是黑方各个棋子的设计

黑卒5=new ChessPiece("卒",Color.blue,bc,w-4,h-4,this);

黑卒5.set棋子类别(黑方颜色);

point[1][10].setPiece(红车1,this);

……//红方的每个棋子放到与生活中棋盘位置一样

point[9][7].setPiece(红兵5,this);

point[1][1].setPiece(黑车1,this);

……//黑方的每个棋子放到与生活中棋盘位置一样

point[9][4].setPiece(黑卒5,this); }

(3)棋盘的设计:

public void paintComponent(Graphics g){

super.paintComponent(g);

for(int j=1;j<=y轴长;j++)   {

g.drawLine(point[1][j].x,point[1][j].y,point[x轴长][j].x,point[x轴长][j].y); }

for(int i=1;i<=x轴长;i++)     {

if(i!=1&&i!=x轴长){

g.drawLine(point[i][1].x,point[i][1].y,point[i][y轴长-5].x,point[i][y轴长-5].y);

g.drawLine(point[i][y轴长-4].x,point[i][y轴长-4].y,point[i][y轴长].x,point[i][y轴长].y); }

else{

g.drawLine(point[i][1].x,point[i][1].y,point[i][y轴长].x,point[i][y轴长].y);}}       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轴长;i++){

g.drawString(""+i,i*unitWidth,unitHeight/2);}int j=1;

for(char c='A';c<='J';c++){

g.drawString(""+c,unitWidth/4,j*unitHeight);j++;}}

(4)实现棋子按照生活中的对弈规则走棋的程序如下:

public boolean movePieceRule(ChessPiece piece,int startI,int startJ,int endI,int endJ){

this.piece=piece;this.startI=startI;this.startJ=startJ;

this.endI=endI;

this.endJ=endJ;

int minI=Math.min(startI,endI);

int maxI=Math.max(startI,endI);

int minJ=Math.min(startJ,endJ);

int maxJ=Math.max(startJ,endJ);

boolean 可否走棋=false;

if(piece.getName().equals("车")){if(startI==endI)

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

if(point[startI][j].isPiece()){可否走棋=false;break;} }

if(j==maxJ){可否走棋=true;}}

else if(startJ==endJ)  {  int i=0;for(i=minI+1;i<=maxI-1;i++)

{ if(point[i][startJ].isPiece()){可否走棋=false;

break;} }

if(i==maxI){可否走棋=true;}}

else{可否走棋=false;}}

else if(piece.getName().equals("马"))

…..//以及各个棋子规则的设计

实现棋子按对弈规则的移动并记录棋子移动的位置;

public void mousePressed(MouseEvent e){

ChessPiece piece=null;Rectangle rect=null;

if(e.getSource()==this)move=false;

if(move==false)

if(e.getSource() instanceof ChessPiece){

piece=(ChessPiece)e.getSource();

startX=piece.getBounds().x;

startY=piece.getBounds().y;

rect=piece.getBounds();

for(int i=1;i<=x轴长;i++){

for(int j=1;j<=y轴长;j++){

int x=point[i][j].getX();

int y=point[i][j].getY();

if(rect.contains(x,y))

{startI=i;startJ=j;break;} }}}}

public void mouseMoved(MouseEvent e){ }

public void mouseDragged(MouseEvent e){

ChessPiece piece=null;

if(e.getSource() instanceof ChessPiece){

piece=(ChessPiece)e.getSource();   move=true;

e=SwingUtilities.convertMouseEvent(piece,e,this); }

if(e.getSource()==this){if(move&&piece!=null)

{x=e.getX(); y=e.getY();

if(红方走棋&&((piece.棋子类别()).equals(红方颜色))){

piece.setLocation(x-piece.getWidth()/2,y-piece.getHeight()/2);}

if(黑方走棋&&(piece.棋子类别().equals(黑方颜色))){

piece.setLocation(x-piece.getWidth()/2,y-piece.getHeight()/2);}}}}

public void mouseReleased(MouseEvent e){ …}

public void mouseEntered(MouseEvent e){}

public void mouseExited(MouseEvent e){}

public void mouseClicked(MouseEvent e){ }

}

图中中国象棋是个菜单包括制作棋谱、保存棋谱、演示棋谱三个菜单项

设计actionPerformed事件的代码为:

public void actionPerformed(ActionEvent e){

if(e.getSource()==制作棋谱) {con.removeAll();

保存棋谱.setEnabled(true);

this.setTitle(制作棋谱.getText());

board=new ChessBoard(45,45,9,10);

record=board.record;

JSplitPane split=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,board,record);

split.setDividerSize(5);

split.setDividerLocation(460);

con.add(split,BorderLayout.CENTER);

validate();}

if(e.getSource()==保存棋谱) {

int state=fileChooser.showSaveDialog(null);

File saveFile =fileChooser.getSelectedFile();

if(saveFile!=null&&state==JFileChooser.APPROVE_OPTION)

{try{

FileOutputStream outOne=newFileOutputStream(saveFile);

ObjectOutputStream outTwo=new ObjectOutputStream(outOne);

outTwo.writeObject(record.获取棋谱()) ;

outOne.close();

outTwo.close();}

catch(IOException event){} }}

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();ChessBoard board=new ChessBoard(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);

con.add(label,BorderLayout.CENTER);

con.validate();

this.setTitle("没有打开棋谱文件呢"); validate();  }}}

三.代码地址

https://github.com/jixin1995/xiangqi/tree/master

四.测试情况

菜单中保存棋谱:打开保存文件

(1)打开棋谱

菜单中保存棋谱:打开保存文件

(1)打开棋谱

(2)如果没有选择棋谱文件则会有如下:

(3)打开棋谱文件后:

五.问题及心得

采用程序设计棋子与棋盘,使得棋子更加可观,棋子和生活中真实存在的棋子相仿,使得用户使用软件布置棋谱更加习惯,且有悔棋功能方便了用户使用在界面上有用户设计棋谱的步骤使得棋谱从一开始状态到现在状态的过程,满足用户的需要。

增加打开棋谱文件功能,增加设计棋谱的作用,增加设计过的棋谱的可读性,也可以修改已存的棋谱文件。

具有演示功能,演示棋局的形成,可以手动一步一步的观察现有棋局的形成,也可以让软件自动形成,还可以设置电脑自动形成的时间间隔,增加与用户之间的互动性,使得软件更加人性化。

中国象棋棋盘java_中国象棋棋子及棋盘的绘制相关推荐

  1. 从左上角到右下角 棋盘问题_分治算法之棋盘问题

    今天小编没怎么学习,就当放松了吧,明天一定要抓紧时间补回来~ 但是不会少了小伙伴们的算法的. 海风的幻想纯音乐 声明:因为两天同时写同一个算法会显示跟我这两天写的文章重复会不通过, 还要申请.审核好麻 ...

  2. 中国象棋棋子及棋盘的绘制

    一.题目简介 本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,可以设计棋谱,完成棋谱的保存和对已保存的棋谱的演示,方便现在爱棋人士对残局 ...

  3. 中国象棋程序的设计与实现(十)--棋盘的定义和绘制 中国象棋程序的设计与实现(八)-如何构造一个棋子(車馬炮等) 中国象棋程序的设计与实现(九)–棋子点,棋子的小窝...

    本篇简要介绍棋盘类的定义.棋盘的关键属性.棋盘绘制算法的骨架. 棋盘的详细绘制算法等内容,我们将在接下来的几篇进行详细介绍. 棋盘类的定义 public abstract class ChessBoa ...

  4. 中国象棋程序的设计与实现(十)--棋盘的定义和绘制

    2019独角兽企业重金招聘Python工程师标准>>> 本篇简要介绍棋盘类的定义.棋盘的关键属性.棋盘绘制算法的骨架. 棋盘的详细绘制算法等内容,我们将在接下来的几篇进行详细介绍. ...

  5. java象棋代码注释_中国象棋程序的设计与实现(十一)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)...

    上几篇中,我们详细介绍了,棋盘类的定义和关键属性,简要介绍了棋盘绘制算法的骨架. 本篇,我们将详细解读棋盘绘制算法的每一个细节. 强烈建议,大家结合文章末尾的"棋盘截图"来思考绘制 ...

  6. 中国象棋棋盘java_Java中国象棋博弈程序探秘[2]——棋盘的表示

    棋盘的表示 转载请保留作者信息: 作者:88250 MSN & Gmail & QQ:DL88250@gmail.com 在象棋博弈程序中,首先我们要确定下棋盘-棋子的数据结构描述. ...

  7. 象棋将帅不能碰面 java_中国象棋有大智慧,但是将帅却不能碰面,原来背后有这么一个故事...

    会玩象棋的人都懂的一件事,那就是在象棋里面,将和帅是不能碰面的.在中国象棋里面,最重要,最值得保护的就是"将"和"帅"了,因为这两个棋子决定了整个棋局的成败,可 ...

  8. Unity中国象棋(一)——初始化棋子

    新建一个plane,作为背景,新建一个StoneManager脚本,挂在plane上 初始化32个棋子,每个棋子自带6个属性值:ID,x轴的坐标位置,y轴的坐标位置,是否为红子,是否死亡,棋子的类型. ...

  9. linux上的中国象棋游戏下载,中国象棋下载_中国象棋最新下载_玩一玩游戏

    中国象棋是起源于中国,的一种棋类游戏,属于两个人之间的对抗,在中国有着悠久的历史.由于它的器皿简单,趣味性强,它已经成为一种非常受欢迎的棋类活动. 中国象棋是中华民族的文化瑰宝,历史悠久,趣味性强,基 ...

  10. 计算机中国象棋书籍,[建议]中国的象棋永远不能被没有“思维”的电脑所代替(就目前的电脑象棋软件...

    [建议]中国的象棋永远不能被没有"思维"的电脑所代替(就目前的电脑象棋软件有感而发) 先自我介绍一下,本人来自上海,师从原江苏省棋队教练言穆江大师,现年28岁,无任何值得自傲的成绩 ...

最新文章

  1. 用MATLAB模拟天线接收信号时,突然出现一个干扰信号,并且干扰信号从0°开始,绕90°,观察SINR的变化规律
  2. 让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务
  3. [leetcode]110.平衡二叉树
  4. springcloud服务注册中心eureka搭建
  5. 2020年快手母婴生态报告
  6. 如何反映两条曲线的拟合精度_中走丝线切割机床的加工精度用什么来衡量
  7. “才子进销存”新一代真正基于互联网(Internet)的进销存分销管理软件
  8. spring集成quartz框架
  9. charles iPhone抓包步骤 Fiddler
  10. 小程序 长按转发_小程序转发分享
  11. 浅析移动互联浪潮之由来
  12. BUMO 区块链开发文档
  13. php程序员工具箱v0.6,php程序员工具箱官方版
  14. 虚拟机vmware设置nat模式上网
  15. quora 查看自己关注了谁
  16. 【FI】财务预制凭证界面隐藏过账按钮
  17. vscode离线下载对应版本的插件,避免版本兼容问题
  18. 神奇的开关 — 可控硅
  19. 小米电视/小米盒子没有u盘怎么安装第三方软件
  20. java 快速合并文件_java 实现切割文件和合并文件的功能

热门文章

  1. Third season seventeenth episode,Ross and Rachel can not stay at one place???
  2. 民航产业发展趋势及对策建议(2021-10-21)
  3. Retrofit自定义CallAdapterFactory
  4. JAVA后台开发提升注解篇 @Deprecated
  5. LOI2504 [HAOI2006]聪明的猴子
  6. 量化投资之工具篇一:Backtrader从入门到精通(5)-Strategy类源代码解读
  7. 去除枕头异味的两种方法
  8. Android模拟器启动报错:gpu found. vendor id 1002 device id 0x
  9. java.lang.exceptionininitializererror_解决出现 java.lang.ExceptionInInitializerError错误问题
  10. Java项目毕业设计:基于springboot+vue的电影视频网站系统