中国象棋源代码JAVA程序_第1页
中国象棋源代码JAVA程序_第2页
中国象棋源代码JAVA程序_第3页
中国象棋源代码JAVA程序_第4页
中国象棋源代码JAVA程序_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、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("中国象棋:观棋不语真君子,棋死无悔大丈夫");class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable/玩家JLabel

2、play = new JLabel32;/棋盘JLabel image;/窗格Container con;/工具栏JToolBar jmain;/重新开始JButton anew;/悔棋JButton repent;/退出JButton exit;/当前信息JLabel text;/保存当前操作Vector Var;/规则类对象(使于调用方法)ChessRule rule;/* 单击棋子* chessManClick = true 闪烁棋子 并给线程响应* chessManClick = false 吃棋子 停止闪烁 并给线程响应*/boolean chessManClick;/* 控制玩家走

3、棋* chessPlayClick=1 黑棋走棋* chessPlayClick=2 红棋走棋 默认红棋* chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;/控制棋子闪烁的线程Thread tmain;/把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame()new ChessMainFrame("中国象棋");/* 构造函数* 初始化图形用户界面*/ChessMainFrame(String Title)/获行客格引用con = this.getContentPane();con.setL

4、ayout(null);/实例化规则类rule = new ChessRule();Var = new Vector();/创建工具栏jmain = new JToolBar();text = new JLabel("欢迎使用象棋对弈系统");/当鼠标放上显示信息text.setToolTipText("信息提示");anew = new JButton(" 新 游 戏 ");anew.setToolTipText("重新开始新的一局");exit = new JButton(" 退 出 ");

5、exit.setToolTipText("退出象棋程序程序");repent = new JButton(" 悔 棋 ");repent.setToolTipText("返回到上次走棋的位置");/把组件添加到工具栏jmain.setLayout(new GridLayout(0,4);jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);/添加棋子标签drawChessM

6、an();/注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);/注册棋子移动监听for (int i=0;i<32;i+)con.add(playi);playi.addMouseListener(this);/添加棋盘标签con.add(image = new JLabel(new ImageIcon("imageMain.GIF");image.setBounds(0,30,558,620);image.addMouseLis

7、tener(this);/注册窗体关闭监听this.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent we)System.exit(0););/窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();Dimension frameSize = this.getSize();if (frameSize.height > screenSize.height)frameSize.height = screen

8、Size.height;if (frameSize.width > screenSize.width)frameSize.width = screenSize.width;this.setLocation(screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);/设置this.setIconImage(new ImageIcon("image红将.GIF").getImage();this.setResizable(false);

9、this.setTitle(Title);this.setSize(558,670);this.show();/* 添加棋子方法*/public void drawChessMan()/流程控制int i,k;/图标Icon in;/黑色棋子/车in = new ImageIcon("image黑车.GIF");for (i=0,k=24;i<2;i+,k+=456)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName("车1");/马in = new ImageIcon(

10、"image黑马.GIF");for (i=4,k=81;i<6;i+,k+=342)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName("马1");/相in = new ImageIcon("image黑象.GIF");for (i=8,k=138;i<10;i+,k+=228)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName("象1");/士i

11、n = new ImageIcon("image黑士.GIF");for (i=12,k=195;i<14;i+,k+=114)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName("士1");/卒in = new ImageIcon("image黑卒.GIF");for (i=16,k=24;i<21;i+,k+=114)playi = new JLabel(in);playi.setBounds(k,227,55,55);playi.setNa

12、me("卒1" + i);/炮in = new ImageIcon("image黑炮.GIF");for (i=26,k=81;i<28;i+,k+=342)playi = new JLabel(in);playi.setBounds(k,170,55,55);playi.setName("炮1" + i);/将in = new ImageIcon("image黑将.GIF");play30 = new JLabel(in);play30.setBounds(252,56,55,55);play30.setN

13、ame("将1");/红色棋子/车in = new ImageIcon("image红车.GIF");for (i=2,k=24;i<4;i+,k+=456)playi = new JLabel(in);playi.setBounds(k,569,55,55);playi.setName("车2");/马in = new ImageIcon("image红马.GIF");for (i=6,k=81;i<8;i+,k+=342)playi = new JLabel(in);playi.setBounds(

14、k,569,55,55);playi.setName("马2");/相in = new ImageIcon("image红象.GIF");for (i=10,k=138;i<12;i+,k+=228)playi = new JLabel(in);playi.setBounds(k,569,55,55);playi.setName("象2");/士in = new ImageIcon("image红士.GIF");for (i=14,k=195;i<16;i+,k+=114)playi = new JLa

15、bel(in);playi.setBounds(k,569,55,55);playi.setName("士2");/兵in = new ImageIcon("image红卒.GIF");for (i=21,k=24;i<26;i+,k+=114)playi = new JLabel(in);playi.setBounds(k,398,55,55);playi.setName("卒2" + i);/炮in = new ImageIcon("image红炮.GIF");for (i=28,k=81;i<30

16、;i+,k+=342)playi = new JLabel(in);playi.setBounds(k,455,55,55);playi.setName("炮2" + i);/帅in = new ImageIcon("image红将.GIF");play31 = new JLabel(in);play31.setBounds(252,569,55,55);play31.setName("帅2");/* 线程方法控制棋子闪烁*/public void run()while (true)/单击棋子第一下开始闪烁if (chessManCl

17、ick)playMan.setVisible(false);/时间控制trytmain.sleep(200);catch(Exception e)playMan.setVisible(true);/闪烁当前提示信息 以免用户看不见else text.setVisible(false);/时间控制trytmain.sleep(250);catch(Exception e)text.setVisible(true);trytmain.sleep(350);catch (Exception e)/* 单击棋子方法*/public void mouseClicked(MouseEvent me)Sys

18、tem.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 && playMan.getName().charAt(1) = '2')Ex = playMan.getX();Ey = playMan.getY();/移动卒、兵if (Man >

19、; 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 > 3 && Man < 8)rule.horseRule(playMan,play,me);/移动相

20、、象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,me);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() && Ey = play

21、Man.getY()text.setText(" 红棋走棋");chessPlayClick=2;else text.setText(" 黑棋走棋");chessPlayClick=1;/if/该黑棋走棋的时候else if (chessPlayClick = 1 && playMan.getName().charAt(1) = '1')Ex = playMan.getX();Ey = playMan.getY();/移动卒、兵if (Man > 15 && Man < 26)rule.arms

22、Rule(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 > 3 && Man < 8)rule.horseRule(playMan,play,me);/移动相、象else if (Man > 7 && Man

23、< 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,me);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() && Ey = playMan.getY()text.setText(" 黑棋走棋&qu

24、ot;);chessPlayClick=1;else text.setText(" 红棋走棋");chessPlayClick=2;/else if/当前没有操作(停止闪烁)chessManClick=false;/if/单击棋子else/第一次单击棋子(闪烁棋子)if (!chessManClick)for (int i=0;i<32;i+)/被单击的棋子if (me.getSource().equals(playi)/告诉线程让该棋子闪烁Man=i;/开始闪烁chessManClick=true;break;/for/if/第二次单击棋子(吃棋子)else if

25、(chessManClick)/当前没有操作(停止闪烁)chessManClick=false;for (i=0;i<32;i+)/找到被吃的棋子if (me.getSource().equals(playi)/该红棋吃棋的时候if (chessPlayClick = 2 && playMan.getName().charAt(1) = '2')Ex = playMan.getX();Ey = playMan.getY();/卒、兵吃规则if (Man > 15 && Man < 26)rule.armsRule(playMan

26、,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);/马吃规则else if (Man > 3 && Man < 8)rule.horseRule(playMan,playi,play,me);/相、象吃规则else if (Man > 7 &a

27、mp;& 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.willRule(Man,playMan,playi,play);playMan.setVisible(true);/是否走棋错误(是否在原地没有动)if (Ex = playMan.getX() &&

28、 Ey = playMan.getY()text.setText(" 红棋走棋");chessPlayClick=2;break;elsetext.setText(" 黑棋走棋");chessPlayClick=1;break;/if/该黑棋吃棋的时候else if (chessPlayClick = 1 && playMan.getName().charAt(1) = '1')Ex = playMan.getX();Ey = playMan.getY();/卒吃规则if (Man > 15 && M

29、an < 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);/马吃规则else if (Man > 3 && Man < 8)rule.horseRule(playMan,playi,play,m

30、e);/相、象吃规则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.willRule(Man,playMan,playi,play);playMan.setVisible(true);/是否走棋错误(是否在原地没有动)if

31、 (Ex = playMan.getX() && Ey = playMan.getY()text.setText(" 黑棋走棋");chessPlayClick=1;break;else text.setText(" 红棋走棋");chessPlayClick=2;break;/else if /if/for/是否胜利if (!play31.isVisible()JOptionPane.showConfirmDialog(this,"黑棋胜利","玩家一胜利",JOptionPane.DEFAULT

32、_OPTION,JOptionPane.WARNING_MESSAGE);/双方都不可以在走棋了chessPlayClick=3;text.setText(" 黑棋胜利");/if else if (!play30.isVisible()JOptionPane.showConfirmDialog(this,"红棋胜利","玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText(" 红棋胜利&quo

33、t;);/else if/else/elsepublic void mousePressed(MouseEvent me)public void mouseReleased(MouseEvent me)public void mouseEntered(MouseEvent me)public void mouseExited(MouseEvent me)/* 定义按钮的事件响应*/public void actionPerformed(ActionEvent ae) /重新开始按钮if (ae.getSource().equals(anew)int i,k;/重新排列每个棋子的位置/黑色棋子/

34、车for (i=0,k=24;i<2;i+,k+=456)playi.setBounds(k,56,55,55);/马for (i=4,k=81;i<6;i+,k+=342)playi.setBounds(k,56,55,55);/相for (i=8,k=138;i<10;i+,k+=228)playi.setBounds(k,56,55,55);/士for (i=12,k=195;i<14;i+,k+=114)playi.setBounds(k,56,55,55);/卒for (i=16,k=24;i<21;i+,k+=114)playi.setBounds(k

35、,227,55,55);/炮for (i=26,k=81;i<28;i+,k+=342)playi.setBounds(k,170,55,55);/将play30.setBounds(252,56,55,55);/红色棋子/车for (i=2,k=24;i<4;i+,k+=456)playi.setBounds(k,569,55,55);/马for (i=6,k=81;i<8;i+,k+=342)playi.setBounds(k,569,55,55);/相for (i=10,k=138;i<12;i+,k+=228)playi.setBounds(k,569,55,5

36、5);/士for (i=14,k=195;i<16;i+,k+=114)playi.setBounds(k,569,55,55);/兵for (i=21,k=24;i<26;i+,k+=114)playi.setBounds(k,398,55,55);/炮for (i=28,k=81;i<30;i+,k+=342)playi.setBounds(k,455,55,55);/帅play31.setBounds(252,569,55,55);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i+

37、)playi.setVisible(true);/清除Vector中的内容Var.clear();/悔棋按钮else if (ae.getSource().equals(repent)try/获得setVisible属性值String S = (String)Var.get(Var.size()-4);/获得X坐标int x = Integer.parseInt(String)Var.get(Var.size()-3);/获得Y坐标int y = Integer.parseInt(String)Var.get(Var.size()-2);/获得索引int M = Integer.parseIn

38、t(String)Var.get(Var.size()-1);/赋给棋子playM.setVisible(true);playM.setBounds(x,y,55,55);if (playM.getName().charAt(1) = '1')text.setText(" 黑棋走棋");chessPlayClick = 1; elsetext.setText(" 红棋走棋");chessPlayClick = 2;/删除用过的坐标Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.r

39、emove(Var.size()-2);Var.remove(Var.size()-1);/停止旗子闪烁chessManClick=false;catch(Exception e)/退出else if (ae.getSource().equals(exit)int j=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j = JOptionPane.YES_OPTION)System.exit

40、(0);/*定义中国象棋规则的类*/class ChessRule /*卒子的移动规则*/public void armsRule(int Man,JLabel play,MouseEvent me)/黑卒向下if (Man < 21)/向下移动、得到终点的坐标模糊成合法的坐标if (me.getY()-play.getY() > 27 && (me.getY()-play.getY() < 86 && (me.getX()-play.getX() < 55 && (me.getX()-play.getX() > 0

41、)/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);play.setBounds(play.getX(),play.getY()+57,55,55);/向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (me.getX() - play.getX() >

42、= 57 && (me.getX() - play.getX() <= 112)play.setBounds(play.getX()+57,play.getY(),55,55);/向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (play.getX() - me.getX() >= 2 && (play.getX() - me.getX() <=58)/模糊坐标play.setBounds(play.getX()-57,play.getY(),55,55);/红

43、卒向上else/当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible();Var.add(String.valueOf(play.getX();Var.add(String.valueOf(play.getY();Var.add(String.valueOf(Man);/向上移动、得到终点的坐标模糊成合法的坐标if (me.getX()-play.getX() >= 0 && (me.getX()-play.getX() <= 55 && (play.getY()-me.getY() >27

44、&& play.getY()-me.getY() < 86)play.setBounds(play.getX(),play.getY()-57,55,55);/向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (me.getX() - play.getX() >= 57 && (me.getX() - play.getX() <= 112)play.setBounds(play.getX()+57,play.getY(),55,55);/向左移动、得到终点的坐标

45、模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (play.getX() - me.getX() >= 3 && (play.getX() - me.getX() <=58)play.setBounds(play.getX()-57,play.getY(),55,55);/卒移动结束/*卒吃棋规则*/public void armsRule(JLabel play1,JLabel play2)/向右走if (play2.getX() - play1.getX() <= 112 &&

46、(play2.getX() - play1.getX() >= 57 && (play1.getY() - play2.getY() < 22 && (play1.getY() - play2.getY() > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)/黑棋要过河才能右吃棋if (play1.getName().charAt(1) = '1' && play1.g

47、etY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);/红棋要过河才左能吃棋else if (play1.getName().charAt(1) = '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)play2.setVisible(false);/把对方的位置给自己play1.setB

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论