关于象棋打谱系统 有经验的进

问题描述

本人比较菜,按书上的象棋打谱系统的源码进行了一些个性化的修改,但是发现一个非常严重的问题,在ChessBord类里面定义paintcomponent函数的时候如果使用g.drawImage然后保存,整个类里面的部分信息丢失,用g.fillRect却完全不会,我很费解,希望有能力的同学帮我看看现在贴出重点的类和函数ChinaChess类里面主要是点击了saveMenul按钮对board对象进行保存,代码如下

publicclassChinaChessextendsJFrameimplementsActionListener{ChessBoardboard;DemoManulDialogdemoManul;JMenuBarbar;JMenumakeMenu,showMenu,set,music,hf,player;JMenuItemmakeShiZhanManul,makeCanJuManul,openManulAndShow,dkbf;makeShiZhanManul,makeCanJuManul,openManulAndShowJButtonstartMakeManul,saveManul;JTextFieldhintMessage;JRadioButtonMenuItemon,off;JRadioButtonMenuItemn1,n2,n3,n4;staticinta=1;MusicPlayermu;publicChinaChess(){setTitle("中国象棋棋谱制作系统");mu=newMusicPlayer("音乐播放器");mu.setVisible(false);board=newChessBoard();board.setOpen(true);add(board,BorderLayout.CENTER);bar=newJMenuBar();makeMenu=newJMenu("选择制作棋谱的方式");showMenu=newJMenu("棋谱");set=newJMenu("设置");music=newJMenu("音效");dkbf=newJMenuItem("打开播放器");dkbf.addActionListener(this);player=newJMenu("音乐播放器");hf=newJMenu("更换背景");ButtonGroupgroup1=newButtonGroup();ButtonGroupgroup2=newButtonGroup();n1=newJRadioButtonMenuItem("粉红");n2=newJRadioButtonMenuItem("黄");n3=newJRadioButtonMenuItem("蓝");n4=newJRadioButtonMenuItem("绿");on=newJRadioButtonMenuItem("打开声音");off=newJRadioButtonMenuItem("关闭声音");//初始化一个名为;关闭声音的单选项on.addActionListener(this);//为单选项on添加监听器off.addActionListener(this);//为单选项off添加监听器n1.addActionListener(this);n2.addActionListener(this);n3.addActionListener(this);n4.addActionListener(this);group1.add(on);group1.add(off);group2.add(n1);group2.add(n2);group2.add(n3);group2.add(n4);n1.setSelected(true);on.setSelected(true);music.add(on);music.add(off);hf.add(n1);hf.add(n2);hf.add(n3);hf.add(n4);set.add(hf);set.add(music);player.add(dkbf);makeShiZhanManul=newJMenuItem("制作实战棋谱");makeCanJuManul=newJMenuItem("制作残局棋谱");openManulAndShow=newJMenuItem("打开一个棋谱并演示");makeMenu.add(makeShiZhanManul);makeMenu.add(makeCanJuManul);showMenu.add(openManulAndShow);bar.add(makeMenu);bar.add(showMenu);bar.add(set);bar.add(player);setJMenuBar(bar);makeShiZhanManul.addActionListener(this);makeCanJuManul.addActionListener(this);openManulAndShow.addActionListener(this);startMakeManul=newJButton("开始制作棋谱");startMakeManul.setVisible(false);//设置startMakeManul一开始为不可见startMakeManul.addActionListener(this);saveManul=newJButton("保存棋谱");//初始化saveManul按钮,并且设置文本为"保存棋谱"saveManul.setVisible(false);//设置saveManul一开始为不可见saveManul.addActionListener(this);hintMessage=newJTextField(30);//初始化hintMessage,并且设置大小为30个字符hintMessage.setHorizontalAlignment(JTextField.CENTER);//设置hintMessage为居中hintMessage.setFont(newFont("细黑",Font.PLAIN,15));//设置hintMessage的提示语句的字体为细黑,大小为15hintMessage.setEditable(false);//设置hintMessage为不可编辑hintMessage.setText("请单击菜单,选择制作棋谱的方式或演示已有的棋谱");//设置hintMessage的默认文本为“请单击菜单,选择制作棋谱的方式或演示已有的棋谱”hintMessage.setBackground(Color.green);//设置背景颜色为绿色JPanelnorth=newJPanel();//创建面板对象northnorth.add(hintMessage);//把hintMessage添加到面板对象north中north.add(startMakeManul);//把startMakeManul添加到面板对象north中north.add(saveManul);//把saveManul添加到面板对象north中add(north,BorderLayout.NORTH);setVisible(true);//设置为可见setBounds(120,10,710,580);//设置框的大小以及位置setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//为框添加关闭函数validate();JOptionPane.showMessageDialog(this,"请单击菜单,选择制作棋谱的方式或演示已有的棋谱","提示对话框",JOptionPane.WARNING_MESSAGE);}publicvoidactionPerformed(ActionEvente){Stringmessage="单击"开始制作棋谱",然后拖动棋子走棋";if(e.getSource()==makeShiZhanManul){board.setShizhanPlay();hintMessage.setText(message);startMakeManul.setVisible(true);saveManul.setVisible(false);JOptionPane.showMessageDialog(this,message,"提示对话框",JOptionPane.WARNING_MESSAGE);}if(e.getSource()==makeCanJuManul){message="将棋盒中棋子拖入棋盘摆好残局,然后单击"开始制作棋谱"";hintMessage.setText(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);JFileChooserchooser=newJFileChooser();intstate=chooser.showSaveDialog(null);Filefile=chooser.getSelectedFile();if(file!=null&&state==JFileChooser.APPROVE_OPTION){try{FileOutputStreamout=newFileOutputStream(file);ObjectOutputStreamobjectOut=newObjectOutputStream(out);objectOut.writeObject(board);out.close();objectOut.close();}catch(Exceptionevent){}}}if(e.getSource()==openManulAndShow){JFileChooserchooser=newJFileChooser();intstate=chooser.showOpenDialog(null);Filefile=chooser.getSelectedFile();if(file!=null&&state==JFileChooser.APPROVE_OPTION){demoManul=newDemoManulDialog(file);demoManul.setVisible(true);}}if(e.getSource()==on){board.setOpen(true);}//如果选择了打开音乐选项,把setOpen设为trueif(e.getSource()==off){board.setOpen(false);}//如果选择了关闭音乐选项,把setOpen设置为falseif(e.getSource()==n1){a=1;}if(e.getSource()==n2){a=2;}if(e.getSource()==n3){a=3;}if(e.getSource()==n4){a=4;}if(e.getSource()==dkbf){mu.setVisible(true);}}publicstaticvoidmain(Stringargs[]){newChinaChess();}}

解决方案

解决方案二:
第二个为ChessBoard类,主要调用paintComponent函数,类代码如下

publicclassChessBoardextendsJLayeredPaneimplementsActionListener{intm=10,n=9,distance=42;//Toolkittoolkit;//Imageimg;Point[][]playPoint;String[]redName={"帅","士","士","相","相","马","马","车","车","炮","炮","兵","兵","兵","兵","兵"};String[]blackName={"将","仕","仕","象","象","馬","馬","車","車","炮","炮","卒","卒","卒","卒","卒"};ChessPiece[]redPiece;ChessPiece[]blackPiece;ChessBoxredChessBox,blackChessBox;InitPieceLocationinitPieceLocation;InitCanjuinitCanju;HandleMousehandleMouse;ArrayList<Point>step;JButtoncancel;publicChessBoard(){//ChessBoard构造函数setLayout(null);//设置此容器的布局管理器step=newArrayList<Point>();//建立一个ArrayList表记录对弈时棋子所走过棋点initPointAndPiece();//完成棋子和棋点对象的初始化redChessBox=newChessBox(distance,11,7);blackChessBox=newChessBox(distance,11,1);for(inti=0;i<redPiece.length;i++)redChessBox.putPieceToBox(redPiece[i]);for(inti=0;i<blackPiece.length;i++)blackChessBox.putPieceToBox(blackPiece[i]);initPieceLocation=newInitPieceLocation();initPieceLocation.setPoint(playPoint);initPieceLocation.setRedChessPiece(redPiece);initPieceLocation.setBlackChessPiece(blackPiece);initPieceLocation.setRedChessBox(redChessBox);initPieceLocation.setBlackChessBox(blackChessBox);initCanju=newInitCanju();initCanju.setPoint(playPoint);initCanju.setRedChessBox(redChessBox);initCanju.setBlackChessBox(blackChessBox);initCanju.setrule();//调用initCanju中的函数setrule()handleMouse=newHandleMouse();handleMouse.setStep(step);handleMouse.setPoint(playPoint);handleMouse.setRedChessBox(redChessBox);handleMouse.setBlackChessBox(blackChessBox);handleMouse.initStep();//toolkit=getToolkit();//返回此框架的工具包。//img=toolkit.getImage("photo/1.jpg");//获取图片的相对路径cancel=newJButton("悔棋");add(cancel);cancel.setVisible(false);cancel.setSize(60,30);cancel.setLocation(13*distance,(int)(5*distance));cancel.addActionListener(this);}publicvoidstartMakeManul(){cancel.setVisible(true);handleMouse.setRedFirstMove(true);handleMouse.initStep();for(inti=0;i<redPiece.length;i++){MouseListener[]listener=redPiece[i].getMouseListeners();for(intk=0;k<listener.length;k++)redPiece[i].removeMouseListener(listener[k]);listener=blackPiece[i].getMouseListeners();for(intk=0;k<listener.length;k++)blackPiece[i].removeMouseListener(listener[k]);MouseMotionListener[]mr=redPiece[i].getMouseMotionListeners();for(intk=0;k<mr.length;k++)redPiece[i].removeMouseMotionListener(mr[k]);mr=blackPiece[i].getMouseMotionListeners();for(intk=0;k<mr.length;k++)blackPiece[i].removeMouseMotionListener(mr[k]);redPiece[i].addMouseListener(handleMouse);blackPiece[i].addMouseListener(handleMouse);redPiece[i].addMouseMotionListener(handleMouse);blackPiece[i].addMouseMotionListener(handleMouse);}}publicvoidpaintComponent(Graphicsg){//绘制出棋盘上的横线、竖线和其他必要的图形super.paintComponent(g);//g.setColor(Color.blue);//将背景色设置为绿色//g.fillRect(0,0,this.getBounds().width,this.getBounds().height);//代码出错于此,img是Image的一个类,用toolkit来获取的//g.drawImage(img,0,0,this.getBounds().width,this.getBounds().height,this);if(ChinaChess.a==1){g.setColor(Color.pink);}elseif(ChinaChess.a==2){g.setColor(Color.yellow);g.fillRect(0,0,this.getBounds().width,this.getBounds().height);repaint();}elseif(ChinaChess.a==3){g.setColor(Color.blue);repaint();}else{g.setColor(Color.green);repaint();}g.fillRect(0,0,this.getBounds().width,this.getBounds().height);g.setColor(Color.orange);g.fillRect(playPoint[0][0].x,playPoint[0][0].y,8*distance,9*distance);g.setColor(Color.black);//将棋盘的线设置为黑色for(inti=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(intj=0;j<=n-1;j++){if(j>0&&j<n-1){g.drawLine(playPoint[0][j].x,playPoint[0][j].y,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);g.setFont(newFont("宋体",Font.BOLD,18));intw=blackPiece[0].getBounds().width;inth=blackPiece[0].getBounds().height;Point[]boxPoint=blackChessBox.getBoxPoint();g.drawString("黑棋盒",boxPoint[5].getX(),boxPoint[5].getY());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();w=redPiece[0].getBounds().width;h=redPiece[0].getBounds().height;g.drawString("红棋盒",boxPoint[5].getX(),boxPoint[5].getY());g.drawRect(boxPoint[0].getX()-w/2-2,boxPoint[0].getY()-2*h/3,4*distance+5,4*distance+8);g.setColor(Color.black);for(intj=1;j<=n;j++){g.drawString(""+j,(1+j)*distance-5,2*distance/5+2);g.drawString(""+j,(1+j)*distance-5,11*distance-5);}intt=1;for(charc='a';c<='j';c++,t++)g.drawString(""+c,distance+3,t*distance+distance/5);}publicChessPiece[]getRedPiece(){returnredPiece;}publicChessPiece[]getBlackPiece(){returnblackPiece;}publicvoidactionPerformed(ActionEvente){if(step.size()>0)handleMouse.cancelAnStep();elseJOptionPane.showMessageDialog(this,"向上已经没有下棋操作,无法再悔棋","提示对话框",JOptionPane.WARNING_MESSAGE);}}
解决方案三:
最后是打开board对象的函数

publicvoidshowBoardManul(){stepNumber=1;stackStep.clear();stackBack.clear();if(demoOne!=null)remove(demoOne);try{FileInputStreamfile_in=newFileInputStream(file);ObjectInputStreamobject_in=newObjectInputStream(file_in);demoOne=(ChessBoard)object_in.readObject();file_in.close();object_in.close();ChessPiece[]redPiece=demoOne.getRedPiece();ChessPiece[]blackPiece=demoOne.getBlackPiece();for(inti=0;i<redPiece.length;i++){MouseListener[]listener=redPiece[i].getMouseListeners();for(intk=0;k<listener.length;k++)redPiece[i].removeMouseListener(listener[k]);listener=blackPiece[i].getMouseListeners();for(intk=0;k<listener.length;k++)blackPiece[i].removeMouseListener(listener[k]);MouseMotionListener[]mr=redPiece[i].getMouseMotionListeners();for(intk=0;k<mr.length;k++)redPiece[i].removeMouseMotionListener(mr[k]);mr=blackPiece[i].getMouseMotionListeners();for(intk=0;k<mr.length;k++)blackPiece[i].removeMouseMotionListener(mr[k]);}step=demoOne.getStep();for(inti=step.size()-1;i>=0;i--){stackStep.push(step.get(i));}demoOne.remove(demoOne.cancel);restoreChessBoard(step);split.setRightComponent(newJScrollPane(demoOne));}catch(Exceptionexp){add(newJButton("不是棋谱文件"),BorderLayout.CENTER);}}

时间: 2024-09-22 04:13:08

关于象棋打谱系统 有经验的进的相关文章

来自Google、Amazon和Facebook等7大知名互联网的系统扩展经验

本文出自澳大利亚一位ID为Dodgy Coder的程序员2012年4月的博客文章.他从High Scalability上整理和总结了Google.YouTube.Twitter.Amazon.Ebay.Facebook和Instagram等7家知名互联网的系统扩展经验.值得注意的是,有些资料时过境迁,已经不再反映最新情况,但是核心的理念和许多具体经验还是非常宝贵的学习资料,值得一读. 不难发现,这7个公司都有以下共同的6大理念: 保持简单--随着时间推移,复杂性会自然出现. 自动化一切--包括灾

系统 误删 引导-easyBCD误删单系统,现在开机进不去,蓝屏,求解

问题描述 easyBCD误删单系统,现在开机进不去,蓝屏,求解 win8在easyBCD中把默认win8系统引导删除了,现在开不了机,有什么办法没? 解决方案 这种情况..最简单的处理方法就是重装系统

我选择论坛系统的经验

从去年11月底开始做网站,到现在每天独立IP4万,PV40万左右,积累了一些经验.论坛是每个网站必不可少的功能,所以我也花了很多时间对比不同的论坛系统,半年多来,目前主流的三个论坛系统(DvBBS/Discuz/PHPwind)我都用了一遍.以下是我的一些使用经验,从安装便捷性.使用过程中的问题.搜索引擎友好度.官方论坛免费支持3个方面说一下,希望对新手有一定参考价值. 1.安装.使用经验 首先说我的第一个网站A,一开始就用PHPWIND 5.0.1,除了界面丑陋了点,其他方面都还不错,安装.备

使用U盘安装Windows XP系统的经验

便携笔记本什么都好,唯一不方便的地方就是万一系统崩了,做系统比较麻烦.今天周末,我研究了一上午,终于学会了用U盘做启动盘给笔记本从新做系统. 我觉得这个方法比用光驱恢复简单很多,所以拿来和坛子里的朋友们分享一下. 先介绍下两大主角吧,金士顿8G U盘和万利达81005笔记本 .我的万利达81005本子是年前入手的,在过年的时候遭遇过一次比较严重的病毒入侵,杀毒后系统就一直不是太流畅,不过工作忙吧,一直没空从新做系统.今天比较清闲,所以我决心把老系统给做掉. U盘启动盘制作: 1.U盘格式化:建议

Linux系统分区方法经验分享及意见建议

  Linux分区方法,不同的人有不同的方法,反正没有统一的方法.在分区方面,我觉得根据自己的实际情况来分是最好的.玩linux也有好几年了,下面说一下,我在分区方面的一些经验. 一.个人用 如果是个人用,就没必要分那么多区,分一个区,或者二个区就行了. 分一个区,就要一个根分区就行了/,我的多系统里面的linux都是一个分区. 分二个区,一个/boot分区,一个根分区/ 二.服务器用 关于服务器的分区,不要分的太多,适合自己就行,有二种比较好的方法,适合二种不同的人 1,喜欢用软件管理工具的人

戴尔笔记本win7系统下电池充不进电的原因排查及修复方法

  原因分析: 1.软件问题 一般来说,很多电脑品牌如戴尔.联想.索尼等,均会为自家笔记本配备电源管理软件,如果启用了某种"电池保护模式",电源管理软件在侦测到用户使用交流电源后会禁止电池充放电,以此来延长电池使用寿命. 所以,如果你发现自己的笔记本不充电,可以先进入相关的电源管理软件中,关闭电池保护模式或是勾掉禁止充电选项,如果硬件没有问题的话,电池就能够充电了. 2.硬件本身有问题 电池自身的硬件故障,通常来说,我们可以使用重启电脑.重新插拔电池来判断,如果电池依然无法充电,不妨安

vista系统加速经验九条

相信现在使用Vista的用户已经不在少数了,但对于它像以前在XP时代的加速教程并不多,刚好发现了一篇Speed Up Windows Vista ,简要整理如下: 1.更新你的硬件驱动 比如显卡,主板的显示芯片等等.这个很关键,因为开始我自己的vista并不支持Aero主题,在更新了主板显示芯片后便可以了.所以多去检查一下自己的硬件有没有驱动更新. 2.取消Windows部分程序 打开控制面板,选择卸载程序,点击左侧列表中的打开或关闭Windows功能,之后清除不必要的功能选项,鼠标移动上去时会

Win7系统无法开机安全模式进不去卡在disk.sys怎么办

  原因分析: 出现这类问题的一般都是因为分区格式没有成功转化成为MBR格式导致的,这里请先备份数据,然后使用纯净安装版安装介质,使用命令转换格式就可以解决了. 适用范围: ThinkPad,预装Win8,预装Linux,Win7 安全模式下故障图: 操作步骤: 1.使用DiskPart工具重新分区即可.首先使用Windows 7光盘或者U盘引导,进入系统安装界面; 2.在选择分区的界面中在键盘上按下"Shift+F10"或者"Shift+Fn+F10"快捷组合键,

百思买新CEO无零售从业经验擅改进业务

胡伯特·乔利(Hubert Joly)新浪科技讯 北京时间8月21日凌晨消息,百思买周一宣布任命医院和旅游公司卡尔森(Carlson)前CEO胡伯特·乔利(Hubert Joly)为新CEO,希望利用这名法国商人的经验来帮助公司实现业务复苏.在此以前,百思买CEO职位已 空缺了几个月时间,而这种情况的终结消除了前CEO布莱恩·邓恩(Brian Dunn)4月离职所带来的不确定性.乔利现年53岁,他不具备零售行业的从业经验,但在科技.媒体和服务部门中拥有重大的改进公司业务的经验.在1996年到19