Java象棋人机对弈程序_第1页
Java象棋人机对弈程序_第2页
Java象棋人机对弈程序_第3页
Java象棋人机对弈程序_第4页
Java象棋人机对弈程序_第5页
免费预览已结束,剩余50页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论