




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java象棋人机对弈程序源代码和系统说明文档系统功能人机对弈,鼠标操作系统界面界面用到的棋子如下:棋盘:uznLrJLJrnrn澳界LjLjrj-ILrn1、/jLLJnLrJrnrn楚河LjLjrnrjnL7ir需要保存为gif文件三、 源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;/主类public class Chesspublic static void main(String args)new ChessMainFrame(&q
2、uot; 象棋 "); /主框架类class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable /玩家JLabel play = new JLabel32;/棋盘JLabel image;/窗格Container con;/工具栏JToolBar jmain;/重新开始JButton anew;/悔棋JButton repent;/打开JButton showOpen;/保存JButton showSave;/退出JButton exit;/当前信息JLabel text;/保
3、存当前操作Vector FileVar;Vector Var;/规则类对象(使于调用方法)/* 单击棋子ChessRule rule;*/*chessManClick = true 闪烁棋子并给线程响应*/*chessManClick = false 吃棋子 停止闪烁并给线程响应*/boolean chessManClick;/* 控制玩家走棋*/*chessPlayClick=1/*chessPlayClick=2/*chessPlayClick=3黑棋走棋*/红棋走棋默认红棋*/双方都不能走棋*/ int chessPlayClick=2;/控制棋子闪烁的线程Thread tmain;/把
4、第一次的单击棋子给线程响应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(" 提示信息&q
5、uot;);anew = new JButton(" 新 游 戏 " );anew.setToolTipText(" 重新开始新的一局");exit = new JButton(" 退 出 ");exit.setToolTipText(" 退出本程序");repent = new JButton(" 悔 棋 ");repent.setToolTipText(" 返回到上次走棋的位置");showOpen = new JButton(" 打开 ");show
6、Open.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
7、,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(playi);playi.addMouseListener(this);/添加棋盘标签
8、con.add(image = new JLabel(new ImageIcon("CChess.GIF");image.setBounds(0,0,445,498);image.addMouseListener(this);/注册窗体关闭监听this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent we)System.exit(0););/窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSiz
9、e();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
10、 ) / 2 - 290);this.setIconImage(new ImageIcon(" 相 1.gif").getImage();this.setResizable(false);this.setTitle(Title);this.setSize(450,555);this.show();/* 添加棋子方法*/ public void drawChessMan() /流程控制int i,k;/图标Icon in;/黑色棋子/车 in = new ImageIcon(" 车 1.GIF"); for (i=0,k=10;i<2;i+,k+=3
11、85) playi = new JLabel(in);playi.setBounds(k,10,40,40); playi.setName(" 车 1");/马in = new ImageIcon(" 马 1.GIF");for (i=4,k=60;i<6;i+,k+=285)playi = new JLabel(in);playi.setBounds(k,10,40,40); playi.setName(" 马 1");/相in = new ImageIcon(" 相 1.GIF");for (i=8,k=
12、105;i<10;i+,k+=195)playi = new JLabel(in);playi.setBounds(k,10,40,40); playi.setName(" 相 1");/士in = new ImageIcon(" 士 1.GIF");for (i=12,k=155;i<14;i+,k+=95)playi = new JLabel(in);playi.setBounds(k,10,40,40); playi.setName(" 士 1");/卒in = new ImageIcon(" 卒 1.GI
13、F");for (i=16,k=10;i<21;i+,k+=96.5)playi = new JLabel(in);playi.setBounds(k,160,40,40);playi.setName(" 卒 1" + i);/炮in = new ImageIcon(" 炮 1.GIF");for (i=26,k=60;i<28;i+,k+=289)playi = new JLabel(in);playi.setBounds(k,110,40,40);playi.setName(" 炮 1" + i);/将in
14、= new ImageIcon(" 将 1.GIF");play30 = new JLabel(in);play30.setBounds(205,10,40,40);play30.setName(" 将 1");/红色棋子/车in = new ImageIcon(" 车 2.GIF");for (i=2,k=10;i<4;i+,k+=385)playi = new JLabel(in);playi.setBounds(k,450,40,40);playi.setName(" 车 2");/马in = new
15、ImageIcon(" 马 2.GIF");for (i=6,k=60;i<8;i+,k+=285)playi = new JLabel(in);playi.setBounds(k,450,40,40);playi.setName(" 马 2");/相in = new ImageIcon(" 相 2.GIF");for (i=10,k=105;i<12;i+,k+=195)playi = new JLabel(in);playi.setBounds(k,450,40,40);playi.setName(" 相 2
16、");/士in = new ImageIcon(" 士 2.GIF");for (i=14,k=155;i<16;i+,k+=95)playi = new JLabel(in);playi.setBounds(k,450,40,40);playi.setName(" 士 2");/兵in = new ImageIcon(" 兵 2.GIF");for (i=21,k=10;i<26;i+,k+=96.5)playi = new JLabel(in);playi.setBounds(k,300,40,40);pla
17、yi.setName(" 兵 2" + i);/炮in = new ImageIcon(" 炮 2.GIF");for (i=28,k=60;i<30;i+,k+=289)playi = new JLabel(in);playi.setBounds(k,350,40,40);playi.setName(" 炮 2" + i);/帅in = new ImageIcon(" 帅 2.GIF");play31 = new JLabel(in);play31.setBounds(205,450,40,40);play
18、31.setName(" 帅 2");/* 线程方法控制棋子闪烁*/public void run()while (true)/单击棋子第一下开始闪烁if (chessManClick)playMan.setVisible(false);/时间控制 trytmain.sleep(500);catch(Exception e)playMan.setVisible(true);/闪烁当前提示信息以免用户看不见elsetext.setVisible(false);/时间控制 trytmain.sleep(500);catch(Exception e)text.setVisible
19、(true);trytmain.sleep(500);catch (Exception e)/* 单击棋子方法*/public void mouseClicked(MouseEvent me) System.out.println("Mouse");/当前坐标int Ex=0,Ey=0;/启动线程if (tmain = null)tmain = new Thread(this);tmain.start();/单击棋盘(移动棋子)if (me.getSource().equals(image)/该红棋走棋的时候if (chessPlayClick = 2 &&
20、 playMan.getName().charAt(1) = '2') Ex = playMan.getX();Ey = playMan.getY();/移动卒、兵if (Man > 15 && Man < 26)rule.armsRule(Man,playMan,me);/移动炮else if (Man > 25 && Man < 30)rule.cannonRule(playMan,play,me);/移动车else if (Man >=0 && Man < 4)rule.cannonRul
21、e(playMan,play,me);/移动马else if (Man > 3 && Man < 8)rule.horseRule(playMan,play,me);/移动相、象else if (Man > 7 && Man < 12)rule.elephantRule(Man,playMan,play,me);/移动仕、士else if (Man > 11 && Man < 16)rule.chapRule(Man,playMan,play,me);/移动将、帅else if (Man = 30 | Man
22、= 31)rule.willRule(Man,playMan,play,me);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() && Ey = playMan.getY()text.setText(" 红棋走棋");chessPlayClick=2;elsetext.setText(" 黑棋走棋");chessPlayClick=1;/if/该黑棋走棋的时候else if (chessPlayClick = 1 && playMan.getName().charAt(1) = '1
23、') Ex = playMan.getX();Ey = playMan.getY();/移动卒、兵if (Man > 15 && Man < 26)rule.armsRule(Man,playMan,me);/移动炮else if (Man > 25 && Man < 30)rule.cannonRule(playMan,play,me);/移动车else if (Man >=0 && Man < 4)rule.cannonRule(playMan,play,me);/移动马else if (Man &
24、gt; 3 && Man < 8)rule.horseRule(playMan,play,me);/移动相、象else if (Man > 7 && Man < 12)rule.elephantRule(Man,playMan,play,me);/移动仕、士else if (Man > 11 && Man < 16)rule.chapRule(Man,playMan,play,me); /移动将、帅 else if (Man = 30 | Man = 31)rule.willRule(Man,playMan,play
25、,me);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() && Ey = playMan.getY() text.setText(" 黑棋走棋");chessPlayClick=1;elsetext.setText(" 红棋走棋");chessPlayClick=2;/else if/当前没有操作(停止闪烁)chessManClick=false;/if/单击棋子else/第一次单击棋子(闪烁棋子)if (!chessManClick)for (int i=0;i<32;i+)/被单击的棋子if (
26、me.getSource().equals(playi) /告诉线程让该棋子闪烁 Man=i;/开始闪烁 chessManClick=true; break;/for/if/第二次单击棋子(吃棋子)else if (chessManClick)/当前没有操作(停止闪烁)chessManClick=false;for (i=0;i<32;i+)/找到被吃的棋子if (me.getSource().equals(playi) /该红棋吃棋的时候if (chessPlayClick = 2 && playMan.getName().charAt(1) = '2'
27、) Ex = playMan.getX();Ey = playMan.getY();/卒、兵吃规则if (Man > 15 && Man < 26)rule.armsRule(playMan,playi);/炮吃规则else if (Man > 25 && Man < 30)rule.cannonRule(0,playMan,playi,play,me);/车吃规则else if (Man >=0 && Man < 4)rule.cannonRule(1,playMan,playi,play,me);/马吃规则
28、else if (Man > 3 && Man < 8)rule.horseRule(playMan,playi,play,me);/相、象吃规则else if (Man > 7 && Man < 12)rule.elephantRule(playMan,playi,play);/士、仕吃棋规则else if (Man > 11 && Man < 16)rule.chapRule(Man,playMan,playi,play);/将、帅吃棋规则else if (Man = 30 | Man = 31)rule.
29、willRule(Man,playMan,playi,play);playMan.setVisible(true);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() && Ey = playMan.getY()text.setText(" 红棋走棋");chessPlayClick=2;break;else text.setText(" 黑棋走棋");chessPlayClick=1;break;/if/该黑棋吃棋的时候else if (chessPlayClick = 1 && playM
30、an.getName().charAt(1) = '1')Ex = playMan.getX();Ey = playMan.getY();/卒、兵吃规则if (Man > 15 && Man < 26)rule.armsRule(playMan,playi);/炮吃规则else if (Man > 25 && Man < 30)rule.cannonRule(0,playMan,playi,play,me);/车吃规则else if (Man >=0 && Man < 4)rule.cannon
31、Rule(1,playMan,playi,play,me);/马吃规则else if (Man > 3 && Man < 8)rule.horseRule(playMan,playi,play,me);/相、象吃规则else if (Man > 7 && Man < 12)rule.elephantRule(playMan,playi,play);/士、仕吃棋规则else if (Man > 11 && Man < 16)rule.chapRule(Man,playMan,playi,play);/将、帅吃棋规
32、则else if (Man = 30 | Man = 31)rule.willRule(Man,playMan,playi,play);playMan.setVisible(true);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() && Ey = playMan.getY() text.setText(" 黑棋走棋");chessPlayClick=1; break; else text.setText(" 红棋走棋");chessPlayClick=2; break; /else if/if/for
33、/是否胜利if (!play31.isVisible()JOptionPane.showConfirmDialog(this," 黑棋胜利"," 玩家一胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);/双方都不可以在走棋了chessPlayClick=3;text.setText(" 黑棋胜利");/ifelse if (!play30.isVisible()JOptionPane.showConfirmDialog(this," 红棋胜利",
34、" 玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3; text.setText(" 红棋胜利");/else if/else/elsepublic void mousePressed(MouseEvent me) public void mouseReleased(MouseEvent me) public void mouseEntered(MouseEvent me) public void mouseExited(MouseEvent m
35、e)/* 单击按扭*/public void actionPerformed(ActionEvent ae)/重新开始if (ae.getSource().equals(anew)int i,k;/重新排列每个棋子的位置/车for (i=0,k=10;i<2;i+,k+=385)playi.setBounds(k,10,40,40);/马for (i=4,k=60;i<6;i+,k+=285)playi.setBounds(k,10,40,40);/相for (i=8,k=105;i<10;i+,k+=195)playi.setBounds(k,10,40,40);/士for
36、 (i=12,k=155;i<14;i+,k+=95)playi.setBounds(k,10,40,40);/卒for (i=16,k=10;i<21;i+,k+=96.5)playi.setBounds(k,160,40,40);/炮for (i=26,k=60;i<28;i+,k+=289)playi.setBounds(k,110,40,40);/将play30.setBounds(205,10,40,40);/红色棋子/车for (i=2,k=10;i<4;i+,k+=385)playi.setBounds(k,450,40,40);/马for (i=6,k=
37、60;i<8;i+,k+=285)playi.setBounds(k,450,40,40);/相for (i=10,k=105;i<12;i+,k+=195)playi.setBounds(k,450,40,40);/士for (i=14,k=155;i<16;i+,k+=95)playi.setBounds(k,450,40,40);/兵for (i=21,k=10;i<26;i+,k+=96.5)playi.setBounds(k,300,40,40);/炮for (i=28,k=60;i<30;i+,k+=289)playi.setBounds(k,350,
38、40,40);/帅play31.setBounds(205,450,40,40);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i+)playi.setVisible(true);for (i=0;i<Var.size();i+)Var.remove(i);/悔棋else if (ae.getSource().equals(repent)try/获得 setVisible 属性值String S = (String)Var.get(Var.size()-4);/获彳X X坐标int x = Inte
39、ger.parseInt(String)Var.get(Var.size()-3);/获彳Y Y坐标int y = Integer.parseInt(String)Var.get(Var.size()-2);/获得索引int M = Integer.parseInt(String)Var.get(Var.size()-1);/赋给棋子playM.setVisible(true);playM.setBounds(x,y,40,40);if (playM.getName().charAt(1) = '1') text.setText(" 黑棋走棋");chess
40、PlayClick = 1;else text.setText(" 红棋走棋");chessPlayClick = 2;/删除用过的坐标Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.remove(Var.size()-2);Var.remove(Var.size()-1);/停止旗子闪烁chessManClick=false;catch(Exception e)/打开棋局else if (ae.getSource().equals(showOpen)try/打开对话框JFileChooser jfcOpen =
41、new JFileChooser(" 打开棋局");int v=jfcOpen.showOpenDialog(this);if (v != JFileChooser.CANCEL_OPTION)/删除集合所有信息Var.removeAllElements();FileVar.removeAllElements();/打开文件获得所有数据FileInputStream fileIn = new FileInputStream(jfcOpen.getSelectedFile();ObjectInputStream objIn = new ObjectInputStream(fi
42、leIn);FileVar = (Vector)objIn.readObject();fileIn.close();objIn.close();/集合内容对应棋子坐标int k=0;for (int i=0;i<32;i+) playi.setBounds(Integer)FileVar.get(k).intValue(),(Integer)FileVar.get(k+1).intValue(),40,40);/被吃掉的棋子不显示if (!(Boolean)FileVar.elementAt(k+2).booleanValue() playi.setVisible(false); k+=
43、3;/当前该哪方棋子走棋if (String)FileVar.lastElement().toString().equals(" 红棋走棋")text.setText(String)FileVar.lastElement().toString();chessPlayClick = 2;else if (String)FileVar.lastElement().toString().equals(" 黑棋走棋")text.setText(String)FileVar.lastElement().toString();chessPlayClick = 1;e
44、lse if (String)FileVar.lastElement().toString().substring(5).equals(" 利 ") text.setText(String)FileVar.lastElement().toString();chessPlayClick = 3;catch(Exception e)System.out.println("ERROR ShowOpen");/保存当前棋局else if (ae.getSource().equals(showSave)try/保存对话框JFileChooser jfcSave =
45、 new JFileChooser(" 保存当前棋局");int v=jfcSave.showSaveDialog(this);if (v != JFileChooser.CANCEL_OPTION) FileVar.removeAllElements();/保存所有棋子的坐标和是否可见for (int i=0;i<32;i+) FileVar.addElement(new Integer(playi.getX();FileVar.addElement(new Integer(playi.getY();FileVar.addElement(new Boolean(pl
46、ayi.isVisible();/保存当前该哪方吃棋FileVar.add(text.getText();/保存到文件FileOutputStream fileOut = new FileOutputStream(jfcSave.getSelectedFile();ObjectOutputStream objOut = new ObjectOutputStream(fileOut);objOut.writeObject(FileVar);objOut.close();fileOut.close();catch(Exception e)System.out.println("ERROR
47、 ShowSave");/退出else if (ae.getSource().equals(exit) int j=JOptionPane.showConfirmDialog(this," 真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION) System.exit(0);/* 规则类*/class ChessRule/* 卒移动规则*/ public void armsRule(int Man,JLa
48、bel play,MouseEvent me) /黑卒向下 if (Man < 21)/向下移动、得到终点的坐标模糊成合法的坐标if (me.getY()-play.getY() > 40 && (me.getY()-play.getY() < 80 && (me.getX()-play.getX() < 30 && (me.getX()-play.getX() > 0)/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.val
49、ueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);play.setBounds(play.getX(),play.getY()+45,40,40); /向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() >= 250 && (me.getX() - play.getX() >= 30 && (me.getX() - play.getX() <= 90)play.setBounds(play.get
50、X()+48,play.getY(),40,40);/向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() >= 250 && (play.getX() - me.getX() >= 20 && (play.getX() -me.getX() <=90)/模糊坐标play.setBounds(play.getX()-48,play.getY(),40,40);/红卒向上else/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(St
51、ring.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);/向上移动、得到终点的坐标模糊成合法的坐标if (me.getX()-play.getX() > 0 && (me.getX()-play.getX() < 30 &&(play.getY()-me.getY() >20 && play.getY()-me.getY() < 70)play.setBounds(play.getX(),play.get
52、Y()-48,40,40);/向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 210 && (me.getX() - play.getX() >= 30 && (me.getX() - play.getX() <= 90)play.setBounds(play.getX()+50,play.getY(),40,40);/向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 210 && (play.getX() - me.getX
53、() >= 20 && (play.getX() - me.getX() <=60)play.setBounds(play.getX()-52,play.getY(),40,40);/*卒吃棋规则/ 卒移动结束*/public void armsRule(JLabel play1,JLabel play2) /向右走if (play2.getX() - play1.getX() <= 60 && (play2.getX() - play1.getX() >= 40 && (play1.getY() - play2.getY
54、() < 10 && (play1.getY() - play2.getY() > -10 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)/黑棋要过河才能右吃棋if (play1.getName().charAt(1) = '1' && play1.getY() >= 250 && play1.getName().charAt(1) != play2.getName().cha
55、rAt(1)play2.setVisible(false); /把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);/红棋要过河才左能吃棋else if (play1.getName().charAt(1) = '2' && play1.getY() <= 210 && play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);/向左走else if (play1.getX() - play2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地下室考试题及答案
- 地理地图考试题目及答案
- 导游考试题诠释题及答案
- 单招药学考试题及答案
- 大专心理考试题及答案
- 中国偏硼酸钡项目商业计划书
- 大林和小林考试题及答案
- 村委后备书记考试题及答案
- 2025房产交易买卖合同模板
- 审查行政协议书
- 消化内镜教学课件
- 垂钓园转让合同(标准版)
- 医疗耗材采购流程及合同范本
- 智算产业园人才引进与培养方案
- 2024贵州省社区《网格员》备考题汇编(含答案)
- 无人机侦察机课件
- 西藏公务员2025年真题
- 安全生产第二季度会议纪要
- 2025年《医疗器械生产监督管理办法》培训考核试题附答案
- (正式版)DB46∕710-2025 《天然橡胶初加工行业污染物排放标准》
- GB/T 45762-2025精细陶瓷室内照明环境下半导体光催化材料测试用光源
评论
0/150
提交评论