chinesechess.java
来自「可联机对战的中国象棋java源代码 包括服务器文件和客户端文件」· Java 代码 · 共 1,165 行 · 第 1/4 页
JAVA
1,165 行
//文件名:ChineseChess.java
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.applet.*;
public class ChineseChess extends JFrame //主框架
{
static boolean clicked[]={true};//单击棋子
static int player[]={1};//玩家
static int X,Y,man;//坐标
static int savechessman[][]=new int[10][64];//记录棋谱
static int num=0;//步数
static String name;
static boolean built[]={true};//是否可以建立连接
static boolean first=true;//是否为全局的第一步
static boolean readyhere,readythere;//双方是否准备就绪
static boolean host;//是否为主机
static boolean sound=true;//是否开启音效和音乐
static JLabel chessman[]={new JLabel(new ImageIcon("车2.png")),new JLabel(new ImageIcon("车2.png")),new JLabel(new ImageIcon("马2.png")),
new JLabel(new ImageIcon("马2.png")),new JLabel(new ImageIcon("相2.png")),new JLabel(new ImageIcon("相2.png")),
new JLabel(new ImageIcon("士2.png")),new JLabel(new ImageIcon("士2.png")),new JLabel(new ImageIcon("帅2.png")),
new JLabel(new ImageIcon("炮2.png")),new JLabel(new ImageIcon("炮2.png")),new JLabel(new ImageIcon("兵2.png")),
new JLabel(new ImageIcon("兵2.png")),new JLabel(new ImageIcon("兵2.png")),new JLabel(new ImageIcon("兵2.png")),
new JLabel(new ImageIcon("兵2.png")),new JLabel(new ImageIcon("车1.png")),
new JLabel(new ImageIcon("车1.png")),new JLabel(new ImageIcon("马1.png")),
new JLabel(new ImageIcon("马1.png")),new JLabel(new ImageIcon("相1.png")),new JLabel(new ImageIcon("相1.png")),
new JLabel(new ImageIcon("士1.png")),new JLabel(new ImageIcon("士1.png")),new JLabel(new ImageIcon("将1.png")),
new JLabel(new ImageIcon("炮1.png")),new JLabel(new ImageIcon("炮1.png")),new JLabel(new ImageIcon("卒1.png")),
new JLabel(new ImageIcon("卒1.png")),new JLabel(new ImageIcon("卒1.png")),new JLabel(new ImageIcon("卒1.png")),
new JLabel(new ImageIcon("卒1.png")),new JLabel(new ImageIcon("卒1.png"))};//棋子
JMenuBar tools=new JMenuBar();//菜单
JMenu[]a={new JMenu("游戏"),new JMenu("音乐"),new JMenu("音效")};
JMenuItem[][]ma={{new JMenuItem("建立游戏"),new JMenuItem("加入游戏"),new JMenuItem("保存残局"),new JMenuItem("读取残局"),new JMenuItem("断开连接"),new JMenuItem("退出")}};
JMenuItem musicon=new JMenuItem("开");JMenuItem soundon=new JMenuItem("开");JMenuItem musicoff=new JMenuItem("关");JMenuItem soundoff=new JMenuItem("关");
static Container con;//窗格
JLabel background;//棋盘
static JLabel selected,recent;//选中框
static JLabel beginready;//可以开始
static JLabel began;//已开始
static JLabel peaceable,peaceunable;//和棋
static JLabel red,black,redready,blackready,matchbegin,matchend,givein,giveinready,regret,regretready;//准备栏
static JLabel left,right,top,bottom,mid,left1,right1,top1,bottom1;//修饰
JLabel picture;
JLabel table;
static JTextArea info=new JTextArea(30,10);//连接信息
static JTextArea chart=new JTextArea(30,10);//聊天
static JTextArea chartinput=new JTextArea(2,10);
JButton send=new JButton("发送");
JScrollPane stb=new JScrollPane(chart);
JScrollPane sta=new JScrollPane(info);//滚动条
static ServerSocket server;//服务器
static Socket s;//套接字
static DataOutputStream m_output;
static DataInputStream m_input;
static AudioClip begin;//音效和背景音乐
static AudioClip select;
static AudioClip eat;
static AudioClip go;
static AudioClip dead;
static AudioClip gamewin;
static AudioClip gameover;
static AudioClip backgroundmusic;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public ChineseChess()//构造方法开始
{
super("中国象棋");
setJMenuBar(tools);//添加下拉菜单
tools.add(a[0]);
tools.add(a[1]);
tools.add(a[2]);
a[0].add(ma[0][0]);a[0].add(ma[0][1]);a[0].add(ma[0][2]);a[0].add(ma[0][3]);a[0].add(ma[0][4]);a[0].add(ma[0][5]);
a[1].add(musicon);a[1].add(musicoff);
a[2].add(soundon);a[2].add(soundoff);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1000,850);
this.setVisible(true);
con=this.getContentPane();
con.setLayout(null);
beginready=new JLabel(new ImageIcon("beginready.png"));
began=new JLabel(new ImageIcon("beginned.png"));
picture=new JLabel(new ImageIcon("picture.png"));
table=new JLabel(new ImageIcon("table.png"));
background=new JLabel(new ImageIcon("CChess.png"));
selected=new JLabel(new ImageIcon("selected.gif"));
recent=new JLabel(new ImageIcon("selected.gif"));
red=new JLabel(new ImageIcon("red.png"));
black=new JLabel(new ImageIcon("black.png"));
redready=new JLabel(new ImageIcon("redready.png"));
blackready=new JLabel(new ImageIcon("blackready.png"));
matchbegin=new JLabel(new ImageIcon("begin.png"));
matchend=new JLabel(new ImageIcon("matchend.png"));
peaceable=new JLabel(new ImageIcon("peaceable.png"));
peaceunable=new JLabel(new ImageIcon("peaceunable.png"));
givein=new JLabel(new ImageIcon("givein.png"));
giveinready=new JLabel(new ImageIcon("giveinready.png"));
regret=new JLabel(new ImageIcon("regret.png"));
regretready=new JLabel(new ImageIcon("regretready.png"));
top=new JLabel(new ImageIcon("top.png"));
bottom=new JLabel(new ImageIcon("bottom.png"));
mid=new JLabel(new ImageIcon("top.png"));
left=new JLabel(new ImageIcon("left.png"));
right=new JLabel(new ImageIcon("right.png"));
top1=new JLabel(new ImageIcon("top1.png"));
bottom1=new JLabel(new ImageIcon("bottom1.png"));
left1=new JLabel(new ImageIcon("left1.png"));
right1=new JLabel(new ImageIcon("right1.png"));
background.setBounds(0,0,530,590);
for(int i=0;i<=31;i++)//添加棋子和各种标签
con.add(chessman[i]);
putchessman();
con.add(selected);
con.add(recent);
con.add(sta);sta.setBounds(575,25,300,100);info.setEditable(false);
con.add(background);
con.add(beginready);beginready.setBounds(580,160,60,40);
con.add(redready);redready.setBounds(630,250,50,50);redready.setVisible(false);
con.add(blackready);blackready.setBounds(770,250,50,50);blackready.setVisible(false);
con.add(red);red.setBounds(595,220,120,160);
con.add(black);black.setBounds(735,220,120,160);
con.add(began);began.setBounds(580,160,60,40);began.setVisible(false);
con.add(peaceable);peaceable.setBounds(650,160,60,38);peaceable.setVisible(false);
con.add(peaceunable);peaceunable.setBounds(650,160,60,38);peaceunable.setVisible(true);
con.add(givein);givein.setBounds(720,160,60,37);givein.setVisible(true);
con.add(giveinready);giveinready.setBounds(720,160,60,37);giveinready.setVisible(false);
con.add(regret);regret.setBounds(790,160,60,37);regret.setVisible(true);
con.add(regretready);regretready.setBounds(790,160,60,37);regretready.setVisible(false);
con.add(matchbegin);matchbegin.setBounds(595,400,260,80);matchbegin.setVisible(false);
con.add(matchend);matchend.setBounds(595,400,260,80);matchend.setVisible(false);
con.add(stb);stb.setBounds(585,500,300,200);chart.setEditable(false);
con.add(chartinput);chartinput.setBounds(585,710,240,20);
con.add(send);send.setBounds(825,710,60,20);
con.add(top);top.setBounds(585,490,300,10);
con.add(mid);mid.setBounds(585,700,300,10);
con.add(bottom);bottom.setBounds(585,730,300,10);
con.add(left);left.setBounds(575,490,10,250);
con.add(right);right.setBounds(885,490,10,250);
con.add(top1);top1.setBounds(575,15,300,10);
con.add(bottom1);bottom1.setBounds(575,125,300,10);
con.add(left1);left1.setBounds(565,15,10,120);
con.add(right1);right1.setBounds(875,15,10,120);
con.add(picture);
picture.setBounds(0,610,388,228);
con.add(table);
table.setBounds(0,0,1000,850);//棋盘绘制结束
try{
begin=Applet.newAudioClip(new URL("file:begin.wav"));
select=Applet.newAudioClip(new URL("file:select.wav"));
eat=Applet.newAudioClip(new URL("file:eat.wav"));
go=Applet.newAudioClip(new URL("file:go.wav"));
dead=Applet.newAudioClip(new URL("file:dead.wav"));
gamewin=Applet.newAudioClip(new URL("file:gamewin.wav"));
gameover=Applet.newAudioClip(new URL("file:gameover.wav"));
backgroundmusic=Applet.newAudioClip(new URL("file:backgroundmusic.au"));
}
catch(Exception e){}
backgroundmusic.play();
for(int i=0;i<=31;i++)//棋子注册鼠标事件监听器
{
chessman[i].addMouseListener(new MouseListener()
{
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e)//单击棋子
{
if(rule.winlost(chessman))
{
if(clicked[0])
{
for(man=0;man<=31;man++)//捕捉被单击的棋子
{
if(e.getSource().equals(chessman[man])&&((man<=15&&player[0]==1)||(man>15&&player[0]==0))&&readyhere&&readythere)//点击到棋子
{
recent.setVisible(false);
selected.setVisible(true);
clicked[0]=false;
selected.setBounds(chessman[man].getX(),chessman[man].getY(),41,41);if(sound)select.play();break;
}
}
}
else//吃子
{
if(man<=1||(man>=16&&man<=17))
rule.vehiclemove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=3&&man>=2)||(man>=18&&man<=19))
rule.horsemove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=5&&man>=4)||(man>=20&&man<=21))
rule.ministermove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=7&&man>=6)||(man>=22&&man<=23))
rule.bodyguardmove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=8&&man>=8)||(man>=24&&man<=24))
rule.bodymove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=10&&man>=9)||(man>=25&&man<=26))
rule.cannonmove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=15&&man>=11)||(man>=27&&man<=31))
rule.soldiermove(chessman[man],chessman,background,man,e,selected,clicked,player);
if(player[0]==3||player[0]==2)
{
if(player[0]==3)
{blackready.setVisible(false);redready.setVisible(true);}
else {redready.setVisible(false);blackready.setVisible(true);}
save();if(sound)eat.play();
send();}
}
if(chessman[8].getX()==0||chessman[24].getX()==0)
{
JOptionPane.showMessageDialog(null,"恭喜您获胜了");
if(sound)gamewin.play();
endgame();
}
}
}
}
);
}//棋子监听完毕
background.addMouseListener(new MouseListener()//背景注册鼠标监听器
{
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e)//单击棋盘
{
if(rule.winlost(chessman))
{
if(!clicked[0])
{
if(man<=1||(man>=16&&man<=17))
rule.vehiclemove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=3&&man>=2)||(man>=18&&man<=19))
rule.horsemove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=5&&man>=4)||(man>=20&&man<=21))
rule.ministermove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=7&&man>=6)||(man>=22&&man<=23))
rule.bodyguardmove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=8&&man>=8)||(man>=24&&man<=24))
rule.bodymove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=10&&man>=9)||(man>=25&&man<=26))
rule.cannonmove(chessman[man],chessman,background,man,e,selected,clicked,player);
if((man<=15&&man>=11)||(man>=27&&man<=31))
rule.soldiermove(chessman[man],chessman,background,man,e,selected,clicked,player);
if(player[0]==3||player[0]==2)
{if(player[0]==3){blackready.setVisible(false);redready.setVisible(true);}
else {redready.setVisible(false);blackready.setVisible(true);}
if(sound)go.play();save();send();}
}
}
}
}
);
beginready.addMouseListener(new MouseListener()//开始按钮
{
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e)
{ if(sound)select.play();
if(!built[0])
{
matchend.setVisible(false);
readyhere=true;
try{
m_output=new DataOutputStream(s.getOutputStream());
m_output.writeInt(800);m_output.writeInt(800);m_output.writeInt(800);
beginready.setVisible(false);began.setVisible(true);
if(player[0]==1)redready.setVisible(true);else blackready.setVisible(true);
if(readyhere&&readythere)
{ if(sound)begin.play();
blackready.setVisible(false);
matchbegin.setVisible(true);
peaceable.setVisible(true);
peaceunable.setVisible(false);
giveinready.setVisible(true);
givein.setVisible(false);
regretready.setVisible(true);
regret.setVisible(false);
}
}
catch(Exception f){}
}
else{JOptionPane.showMessageDialog(null,"您还没有对手");}
}
});
peaceable.addMouseListener(new MouseListener()//和棋按钮
{
public void mouseExited(MouseEvent e){}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?