前言
为了学习一下套接字,借鉴老师给出的课题——象棋,我自己用Java写了一个可以局域网对战的象棋,老师当时要求用C++写,完成老师的课题后,我就学着Socket写了一个局域网的,我是从零开始,所以我借鉴了 Java亮剑PDF里的局域网象棋的服务器和客户端线程的代码,这才有了一点思路,了解到是如何传递信息的,可也仅仅知道了如何传递字符串,这里有个投机取巧的地方是用户的昵称只允许0-9个字符,因为在传递聊天信息的时候,读取聊天信息字符串的时候,为了计算内容的大小,需要知道给哪一个客户端发信息,而传递昵称的时候,判断传递的是两个还是三个字符串甚至更多,这样太麻烦了,干脆局限在一个字符好了。一开始打算写个人机博弈的算法,可时间不多,而且我没有那么聪明,不能把自己的想法改写成算法,就不开发人机博弈了。
象棋的界面:
设计思路
整个界面有以下几部分构成,菜单,棋局,时间板,文本框和按钮区,以及聊天列表、按钮,我的开发顺序:
一、可以自由行棋,无规则,所有棋子都保存在9X10的二维数组里
二、添加时间面板,使用Timer倒计时,这里不是很好要是可以使用分钟及秒的那种时间就完美了
三、加入规则判断,行棋是否合法,就是对数组进行计算
四、制作服务器端,客户端,连接通信,Socket的使用,其实就两个,readUTF和writeUTF传递字符串
五、连接客户端行棋,每次都需要使用for循环查找是哪一个客户端接收信息判断传递的字符串的开头进行分类
六、完善聊天框
七、代码优化,对鼠标点击事件进行修改
主类 Chess.java
package chessc;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.Socket;
import java.util.Random;
import java.util.Vector;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListModel;
public class Chess extends JFrame implements ActionListener,MouseListener{
JLabel play[]=new JLabel[32];//棋子
boolean initplay=true;//棋子初始化标志
JLabel table;//棋盘
int BORDER_LEFT=50,BORDER_UP=55;
int UPDOWN=25,RIGLFT=20,SQUARE=58;//上下边界25像素,左右边界20像素,每个格子58像素
int array[][]=new int[9][10];//10行9列数组代表棋子位置
JLabel selected;//被选中标志
JLabel terminus;//走棋后,给棋子标记
int WHO=2;//红色方为2 黑色方为1
JLabel jlHost=new JLabel("主机名");//创建提示输入主机名的标签
JLabel jlPort=new JLabel("端口号");////创建提示输入端口号标签
JLabel jlNickName=new JLabel("昵 称");//创建提示输入昵称的标签
JTextField jtfHost=new JTextField("127.0.0.1");//创建输入主机名的文本框,默认值是"127.0.0.1"
JTextField jtfPort=new JTextField("9999");//创建输入端口号的文本框,默认值是9999
JTextField jtfNickName=new JTextField("Play1");//创建输入昵称的文本框,默认值是Play1
JButton jbConnect=new JButton("连 接");//创建"连接"按钮
JButton jbDisconnect=new JButton("断 开");//创建"断开"按钮
JButton jbFail=new JButton("认 输");//创建"认输"按钮
JButton jbChallenge=new JButton("挑 战");//创建"挑战"按钮
JComboBox jcbNickList=new JComboBox();//创建存放当前用户的下拉列表框
JList jlistChat=new JList();//创建用于显示当前用户的JList
JScrollPane jspx=new JScrollPane(jlistChat);//将显示当前用户的JList放在JScrollPane中
JButton jbYChallenge=new JButton("接受");//创建"接受挑战"按钮
JButton jbNChallenge=new JButton("拒绝");//创建"拒绝挑战"按钮
JMenuBar menubar = new JMenuBar();///*************************************************************************************/
JMenu mehelp= new JMenu("帮助");///*************************www.caeser.cn***********************************************/
JMenu chmodel=new JMenu("模式选择");///*********************************************************************************/
JMenuItem item[] = {new JMenuItem("帮助信息"),new JMenuItem("退出"),new JMenuItem("人人同机"),new JMenuItem("人机博弈"),new JMenuItem("局域网对战") };
JLabel jlt1=new JLabel("红方剩余时间 / 秒"),jlt2=new JLabel("黑方剩余时间 / 秒");
TimeController time[]={new TimeController(),new TimeController()};
JPanel timePane[]={new JPanel(),new JPanel()};
JLabel timeBLUE[]={new JLabel(new ImageIcon("image\\BLUE.PNG")),new JLabel(new ImageIcon("image\\BLUE.PNG"))};
JLabel timSQUARE1;
JLabel jlChat=new JLabel("聊天室");
JTextField jtfChat=new JTextField("输入聊天内容");
JButton jbChat=new JButton("发送(alt+enter)");
int ModelFlag=0;//模式选择
Rules rules;//行棋规则判断
int startX=0,startY=0,endX=0,endY=0;
Socket sc;//声明Socket引用
ClientAgentThread cat;//声明客户端代理线程的引用
String chatTp="";//传递聊天内容
int Pdisappear=0;//让被吃棋子消失
boolean helpFLAG=false;//窗口重复点击提示
boolean serFLAG=false;//窗口重复点击提示
Server serf;//窗口重复点击提示
Help helpf;//窗口重复点击提示
public Chess(){
this.loadp();
this.initialChess();//初始化棋子
this.initialComponent();//初始化控件
this.addListener();//为相应控件注册事件监听器
this.initialState();//初始化状态
this.initialFrame();//初始化窗体
}
public void initialComponent(){
this.setLayout(null);//空布局
selected.setBounds(0, 0, 55, 55);//选中标志
this.add(selected);//添加选中标志到窗口
terminus.setBounds(0, 0, 55, 55);//和选中标志一样
this.add(terminus);//叫终止标志,添加到窗口
this.table.setBounds(0,0, 558, 620);//棋盘
this.add(table);//添加棋盘到窗口
this.chmodel.add(item[2]);//模式选择里添加 菜单选项 人人同机
this.chmodel.add(item[3]);//人机博弈
this.chmodel.add(item[4]);//局域网
this.mehelp.add(item[0]);//帮助信息里添加 菜单选项 帮助
this.mehelp.add(item[1]);//退出
this.menubar.add(chmodel);//菜单栏添加 模式选择
this.menubar.add(mehelp);//帮助信息
this.setJMenuBar(menubar);//设置菜单栏
timePane[0]=time[0].getPane();//黑方时间
timePane[0].setBounds(680, 12, 30, 10);//设置时间位置
this.add(timePane[0]);//添加到窗口
timePane[1]=time[1].getPane();//红方时间
timePane[1].setBounds(680, 582, 30, 10);//设置时间位置
this.add(timePane[1]);//添加到窗口
this.jlt1.setBounds(570, 9, 100, 15);//黑方倒计时
this.jlt1.setForeground(Color.white);//设置字颜色
this.add(jlt1);//添加到窗口
this.jlt2.setBounds(570, 580, 100, 15);//红方倒计时
this.jlt2.setForeground(Color.white);//设置字颜色
this.add(jlt2);//添加到窗口
this.jlHost.setBounds(575, 60, 50, 20);//主机名称
this.add(jlHost);//添加到窗口
this.jtfHost.setBounds(625, 60, 100, 20);//主机名输入
this.add(jtfHost);//添加到窗口
this.jlPort.setBounds(575, 90, 50, 20);//端口
this.add(jlPort);//添加到窗口
this.jtfPort.setBounds(625, 90, 100, 20);//端口号输入
this.add(jtfPort);//添加到窗口
this.jlNickName.setBounds(575, 120, 50, 20);//昵称
this.add(jlNickName);//添加到窗口
this.jtfNickName.setBounds(625, 120, 100, 20);//昵称输入
this.add(jtfNickName);//添加到窗口
this.jbConnect.setBounds(570, 150, 80, 20);//连接按钮
this.add(jbConnect);//添加到窗口
this.jbDisconnect.setBounds(660, 140, 80, 20);//断开按钮
this.add(jbDisconnect);//添加到窗口
this.jbChallenge.setBounds(570, 180, 80, 20);//挑战按钮
this.add(jbChallenge);//添加到窗口
this.jbFail.setBounds(660, 162, 80, 20);//认输按钮
this.add(jbFail);//添加到窗口
this.jcbNickList.setBounds(570, 210, 80, 20);//挑战名单
this.add(jcbNickList);//添加到窗口
this.jbYChallenge.setBounds(660, 184, 80, 20);//接受挑战
this.add(jbYChallenge);//添加到窗口
this.jbNChallenge.setBounds(660, 206, 80, 20);//拒绝挑战
this.add(jbNChallenge);//添加到窗口
timSQUARE1.setBounds(560, 0, 200, 300);//美化标志
this.add(timSQUARE1);//添加到窗口
this.jlChat.setBounds(570, 265, 50, 20);//聊天室
this.add(jlChat);//添加到窗口
this.jspx.setBounds(570, 285, 180, 200);//聊天内容
this.add(jspx);//添加到窗口
this.jtfChat.setBounds(570, 490, 180, 20);//输入聊天
this.add(jtfChat);//添加到窗口
this.jbChat.setBounds(600, 520, 150, 20);//发送按钮
this.jbChat.setMnemonic(KeyEvent.VK_ENTER);//设置为快捷键alt+enter
this.add(jbChat);//添加到窗口
this.timeBLUE[0].setBounds(550, 0, 220, 35);//时间面板背景
this.add(timeBLUE[0]);//添加到窗口
this.timeBLUE[1].setBounds(550, 570, 220, 35);//时间面板背景
this.add(timeBLUE[1]);//添加到窗口
}
public void addListener(){
for(int a=0;a<item.length;a++){//给菜单二级选项添加监听
item[a].addActionListener(this);
}//添加监听
this.jtfChat.addActionListener(this);//聊天输入框
this.jtfHost.addActionListener(this);//主机号
this.jtfNickName.addActionListener(this);//昵称
this.jtfPort.addActionListener(this);//端口
this.jbChallenge.addActionListener(this);//挑战按钮
this.jbChat.addActionListener(this);//发生聊天按钮
this.jbConnect.addActionListener(this);//连接按钮
this.jbDisconnect.addActionListener(this);//断开按钮
this.jbFail.addActionListener(this);//认输按钮
this.jbNChallenge.addActionListener(this);//拒绝挑战按钮
this.jbYChallenge.addActionListener(this);//接受挑战按钮
this.table.addMouseListener(this);//棋盘
for(int a=0;a<play.length;a++){//棋子
play[a].addMouseListener(this);
}
}
public void initialState(){
selected.setVisible(false);
terminus.setVisible(false);
timePane[1].setVisible(true);
timePane[0].setVisible(true);
this.jtfHost.setEditable(true);
this.jtfNickName.setEditable(true);
this.jtfPort.setEditable(true);
this.jbChallenge.setEnabled(false);
this.jbConnect.setEnabled(false);
this.jbDisconnect.setEnabled(false);
this.jbFail.setEnabled(false);
this.jbNChallenge.setEnabled(false);
this.jbYChallenge.setEnabled(false);
this.jtfChat.setEditable(false);
this.jbChat.setEnabled(false);
this.jtfChat.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
JTextField src = (JTextField) e.getSource();
if (src.getText().equals("输入聊天内容")) {
src.setText(null);
}//这里实现文本框未输入信息时显示提示信息
}
public void focusLost(FocusEvent e) {
JTextField src = (JTextField) e.getSource();
if (src.getText().trim().isEmpty()) {
src.setText("输入聊天内容");
}//当文本框内容被清空时显示提示信息
}
});
}
public void initialChess(){
WHO=2;
initArray();//初始化数组
drawChess();
this.selected.setVisible(false);
this.terminus.setVisible(false);
}
public void drawChess(){
int i,j;
for(i=0;i<9;i++){//根据数组将棋子显示并移动到相应的位置
for(j=0;j<10;j++){
if(array[i][j]==-1){
continue;
}
play[array[i][j]].setVisible(true);//(1)设置可见
play[array[i][j]].setBounds(RIGLFT+i*SQUARE,UPDOWN+j*SQUARE, 55, 55);
if(this.initplay){
this.add(play[array[i][j]]);//(2)添加棋子到窗口
}
}
}//执行初始化后将(1)设置可见和(2)添加棋子到窗口动作取消
this.initplay=false;
}
public void initArray(){
int i,j;
for(i=0;i<9;i++){//初始化数组使每一个值都为-1
for(j=0;j<10;j++){
array[i][j]=-1;
}
}
//色方
for(i=0;i<9;i++){//赋值車、马、象、士、帅
array[i][9]=i;
}
array[1][7]=i++;//赋值炮
//i++;
array[7][7]=i++;//赋值炮
//i++;
for(j=0;i<16;i++){//赋值兵
array[j][6]=i;j+=2;
}
//色方
for(j=0;i<25;i++){//赋值車、马、象、士、将
array[j++][0]=i;
}
array[1][2]=i++;//赋值炮
array[7][2]=i++;//赋值炮
for(j=0;i<32;i++){//赋值卒
array[j][3]=i;j+=2;
}
}
public void initime(){
this.time[0].initime();
this.time[1].initime();
this.time[0].spTime();
this.time[1].spTime();
}
public void loadp(){
table=new JLabel(new ImageIcon("image\\Main.GIF"));
selected=new JLabel(new ImageIcon("image\\SELECTED1.GIF"));
terminus=new JLabel(new ImageIcon("image\\SELECTED1.GIF"));
play[0]=new JLabel(new ImageIcon("image\\黑车.GIF"));
play[1]=new JLabel(new ImageIcon("image\\黑马.GIF"));
play[2]=new JLabel(new ImageIcon("image\\黑象.GIF"));
play[3]=new JLabel(new ImageIcon("image\\黑士.GIF"));
play[4]=new JLabel(new ImageIcon("image\\黑将.GIF"));
play[5]=new JLabel(new ImageIcon("image\\黑士.GIF"));
play[6]=new JLabel(new ImageIcon("image\\黑象.GIF"));
play[7]=new JLabel(new ImageIcon("image\\黑马.GIF"));
play[8]=new JLabel(new ImageIcon("image\\黑车.GIF"));
play[9]=new JLabel(new ImageIcon("image\\黑炮.GIF"));
play[10]=new JLabel(new ImageIcon("image\\黑炮.GIF"));
for(int p=11;p<16;p++){
play[p]=new JLabel(new ImageIcon("image\\黑卒.GIF"));
}
play[16]=new JLabel(new ImageIcon("image\\红车.GIF"));
play[17]=new JLabel(new ImageIcon("image\\红马.GIF"));
play[18]=new JLabel(new ImageIcon("image\\红象.GIF"));
play[19]=new JLabel(new ImageIcon("image\\红士.GIF"));
play[20]=new JLabel(new ImageIcon("image\\红将.GIF"));
play[21]=new JLabel(new ImageIcon("image\\红士.GIF"));
play[22]=new JLabel(new ImageIcon("image\\红象.GIF"));
play[23]=new JLabel(new ImageIcon("image\\红马.GIF"));
play[24]=new JLabel(new ImageIcon("image\\红车.GIF"));
play[25]=new JLabel(new ImageIcon("image\\红炮.GIF"));
play[26]=new JLabel(new ImageIcon("image\\红炮.GIF"));
for(int p=27;p<32;p++){
play[p]=new JLabel(new ImageIcon("image\\红卒.GIF"));
}
timSQUARE1=new JLabel(new ImageIcon("image\\时间矩形.GIF"));
rules=new Rules(array);
}
public void initialFrame(){
this.setTitle("中国象棋--客户端");
this.setBounds(300,0,780,680);//设置窗体大小
this.setVisible(true);//设置可见性
//this.setDefaultCloseOperation(EXIT_ON_CLOSE);//关闭窗口
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.addWindowListener(//为窗体添加监听器
new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
if(cat==null)//客户端代理线程为空,直接退出
{
System.exit(0);
return;
}
try
{
if(cat.challenger!=null)//正在下棋中
{
try
{
//发送认输信息
cat.dout.writeUTF("<#RENSHU#>"+cat.challenger);
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
cat.dout.writeUTF("<#CLIENT_LEAVE#>");//向服务器发送离开信息
cat.flag=false;//终止客户端代理线程
cat=null;
}
catch(Exception ee)
{
ee.printStackTrace();
}
System.exit(0);
}
}
);
}
public void actionPerformed(ActionEvent ae) {//定义按钮的事件响应
try{
if(ae.getSource()==item[0]){//帮助信息
if(!this.helpFLAG){
helpf=new Help(this);
this.helpFLAG=true;
}else{
helpf.setVisible(false);
helpf.setVisible(true);
}
}else if(ae.getSource()==item[1]){//退出
System.exit(0);
}else if(ae.getSource()==item[2]){//人人同机
JOptionPane.showMessageDialog(this, "红旗先行","提示",JOptionPane.INFORMATION_MESSAGE);
this.initialChess();
this.ModelFlag=1;
this.initime();
this.jtfChat.setEditable(false);//聊天输入框设置为不可用
this.jtfHost.setEnabled(false);//将用于输入主机名的文本框设为不可用
this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
this.jtfNickName.setEnabled(false);//将用于输入昵称的文本框设为不可用
this.jbConnect.setEnabled(false);//将"连接"按钮设为不可用
this.jbDisconnect.setEnabled(false);//将"断开"按钮设为可用
this.jbChallenge.setEnabled(false);//将"挑战"按钮设为可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(false);//将"认输"按钮设为不可用
}else if(ae.getSource()==item[3]){//人机博弈
JOptionPane.showMessageDialog(this, "该功能暂未开发","提示",JOptionPane.INFORMATION_MESSAGE);
return;
}else if(ae.getSource()==item[4]){//局域网对战
this.initialChess();
this.ModelFlag=3;
this.initime();
this.jtfHost.setEnabled(true);//将用于输入主机名的文本框设为不可用
this.jtfPort.setEnabled(true);//将用于输入端口号的文本框设为不可用
this.jtfNickName.setEnabled(true);//将用于输入昵称的文本框设为不可用
this.jbConnect.setEnabled(true);//将"连接"按钮设为不可用
this.jtfChat.setEditable(false);
this.jbDisconnect.setEnabled(false);//将"断开"按钮设为可用
this.jbChallenge.setEnabled(false);//将"挑战"按钮设为可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(false);//将"认输"按钮设为不可用
if(!this.serFLAG){
this.serf=new Server(this);
this.serFLAG=true;
}else{
serf.setVisible(false);
serf.setVisible(true);
}
}
if(ae.getSource()==this.jbConnect){
this.jbConnect_event();
}else if(ae.getSource()==this.jbChallenge){
this.jbChallenge_event();
}else if(ae.getSource()==this.jbChat){
this.jbChat_event();
}else if(ae.getSource()==this.jbDisconnect){
this.jbDisconnect_event();
}else if(ae.getSource()==this.jbFail){
this.jbFail_event();
}else if(ae.getSource()==this.jbNChallenge){
this.jbNChallenge_event();
}else if(ae.getSource()==this.jbYChallenge){
this.jbYChallenge_event();
}
}catch(Exception ee){
ee.printStackTrace();
}
}
public void jbChat_event(){
int itTp;
Vector v=new Vector();
chatTp=this.jtfChat.getText().trim();
if(chatTp.equals("")){
JOptionPane.showMessageDialog(this,"不能发生空消息","提示",JOptionPane.ERROR_MESSAGE);
//return;
}else{
ListModel myList=this.jlistChat.getModel();//提取JList内容
for(int i=0;i<myList.getSize();i++){
v.add(myList.getElementAt(i));//将之前的聊天内容保存在V里
}
v.add(chatTp);//添加新的聊天内容
chatTp="玩家"+this.jtfNickName.getText().trim()+":"+chatTp;
this.jlistChat.setListData(v);//显示聊天内容
itTp=this.cat.challenger.length();
this.jtfChat.setText("");
this.jlistChat.setListData(v);
try{
this.cat.dout.writeUTF("<#CHAT#>"+this.cat.challenger+chatTp+itTp);
}catch(Exception e){
e.printStackTrace();
}
}
}
public void jbConnect_event()
{//对单击"连接"按钮事件的业务处理代码
int port=0;
try
{//获得用户输入的断口号并转化为整型
port=Integer.parseInt(this.jtfPort.getText().trim());
}
catch(Exception ee)
{//不是整数,给出错误提示
JOptionPane.showMessageDialog(this,"端口号只能是整数","错误",
JOptionPane.ERROR_MESSAGE);
return;
}
if(port>65535||port<0)
{//端口号不合法,给出错误提示
JOptionPane.showMessageDialog(this,"端口号只能是0-65535的整数","错误",
JOptionPane.ERROR_MESSAGE);
return;
}
String name=this.jtfNickName.getText().trim();//获得昵称
if(name.length()==0)
{//昵称为空,给出错误提示信息
JOptionPane.showMessageDialog(this,"玩家姓名不能为空","错误",
JOptionPane.ERROR_MESSAGE);
return;
}
if(name.length()>9)
{//昵称为空,给出错误提示信息
JOptionPane.showMessageDialog(this,"玩家姓名不能超过10个字符","错误",
JOptionPane.ERROR_MESSAGE);
return;
}
try
{
sc=new Socket(this.jtfHost.getText().trim(),port);//创建Socket对象
cat=new ClientAgentThread(this);//创建客户端代理线程
cat.start();//启动客户端代理线程
this.jbChat.setEnabled(true);
this.jtfHost.setEnabled(false);//将用于输入主机名的文本框设为不可用
this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
this.jtfNickName.setEnabled(false);//将用于输入昵称的文本框设为不可用
this.jbConnect.setEnabled(false);//将"连接"按钮设为不可用
this.jbDisconnect.setEnabled(true);//将"断开"按钮设为可用
this.jbChallenge.setEnabled(true);//将"挑战"按钮设为可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(false);//将"认输"按钮设为不可用
JOptionPane.showMessageDialog(this,"已连接到服务器","提示",
JOptionPane.INFORMATION_MESSAGE);//连接成功,给出提示信息
}
catch(Exception ee)
{
JOptionPane.showMessageDialog(this,"连接服务器失败","错误",
JOptionPane.ERROR_MESSAGE);//连接失败,给出提示信息
return;
}
}
public void jbDisconnect_event()
{//对单击"断开"按钮事件的业务处理代码
try
{
this.cat.dout.writeUTF("<#CLIENT_LEAVE#>");//向服务器发送离开的信息
this.cat.flag=false;//终止客户端代理线程
this.cat=null;
this.jtfHost.setEnabled(true);//将用于输入主机名的文本框设为可用
this.jtfPort.setEnabled(true);//将用于输入端口号的文本框设为可用
this.jtfNickName.setEnabled(true);//将用于输入昵称的文本框设为可用
this.jbConnect.setEnabled(true);//将"连接"按钮设为可用
this.jbDisconnect.setEnabled(false);//将"断开"按钮设为不可用
this.jbChallenge.setEnabled(false);//将"挑战"按钮设为不可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(false);//将"认输"按钮设为不可用
}
catch(Exception ee)
{
ee.printStackTrace();
}
}
public void jbChallenge_event(){
//获得用户选中的挑战对象
Object o=this.jcbNickList.getSelectedItem();
if(o==null||((String)o).equals("")) {
JOptionPane.showMessageDialog(this,"请选择对方名字","错误",
JOptionPane.ERROR_MESSAGE);//当未选中挑战对象,给出错误提示信息
}
else{
String name2=(String)this.jcbNickList.getSelectedItem();//获得挑战对象
try{
this.jtfHost.setEnabled(false);//将用于输入主机名的文本框设为不可用
this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
this.jtfNickName.setEnabled(false);//将用于输入昵称的文本框设为不可用
this.jbConnect.setEnabled(false);//将"连接"按钮设为不可用
this.jbDisconnect.setEnabled(false);//将"断开"按钮设为不可用
this.jbChallenge.setEnabled(false);//将"挑战"按钮设为不可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(false);//将"认输"按钮设为不可用
this.cat.challenger=name2;//设置挑战对象
this.WHO=3;
this.cat.dout.writeUTF("<#TIAO_ZHAN#>"+name2);//发送挑战信息
JOptionPane.showMessageDialog(this,"已提出挑战,请回复 ...","提示",
JOptionPane.INFORMATION_MESSAGE);//给出信息发出的提示信息
}
catch(Exception ee){ee.printStackTrace();}
}
}
public void jbYChallenge_event(){
try{ //发送同意挑战的信息
this.cat.dout.writeUTF("<#TONG_YI#>"+this.cat.challenger);
this.jtfHost.setEnabled(false);//将用于输入主机名的文本框设为不可用
this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
this.jtfNickName.setEnabled(false);//将用于输入昵称的文本框设为不可用
this.jbConnect.setEnabled(false);//将"连接"按钮设为不可用
this.jbDisconnect.setEnabled(!true);//将"断开"按钮设为不可用
this.jbChallenge.setEnabled(!true);//将"挑战"按钮设为不可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(!false);//将"认输"按钮设为可用
this.jbChat.setEnabled(true);
this.jtfChat.setEditable(true);
}
catch(Exception ee){ee.printStackTrace();}
}
public void jbNChallenge_event(){
try{ //发送拒绝挑战的信息
this.cat.dout.writeUTF("<#BUTONG_YI#>"+this.cat.challenger);
this.cat.challenger=null;//将tiaoZhanZhe设为空
this.jtfHost.setEnabled(false);//将用于输入主机名的文本框设为不可用
this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
this.jtfNickName.setEnabled(false);//将用于输入昵称的文本框设为不可用
this.jbConnect.setEnabled(false);//将"连接"按钮设为不可用
this.jbDisconnect.setEnabled(true);//将"断开"按钮设为可用
this.jbChallenge.setEnabled(true);//将"挑战"按钮设为可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(false);//将"认输"按钮设为不可用
this.jbChat.setEnabled(false);
}
catch(Exception ee){ee.printStackTrace();}
}
public void jbFail_event(){
try{ //发送认输的信息
this.cat.dout.writeUTF("<#RENSHU#>"+this.cat.challenger);
this.cat.challenger=null;//将tiaoZhanZhe设为空
this.initialChess();
this.time[0].initime();
this.time[1].initime();
this.jtfHost.setEnabled(false);//将用于输入主机名的文本框设为不可用
this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
this.jtfNickName.setEnabled(false);//将用于输入昵称的文本框设为不可用
this.jbConnect.setEnabled(false);//将"连接"按钮设为不可用
this.jbDisconnect.setEnabled(true);//将"断开"按钮设为可用
this.jbChallenge.setEnabled(true);//将"挑战"按钮设为可用
this.jbYChallenge.setEnabled(false);//将"接受挑战"按钮设为不可用
this.jbNChallenge.setEnabled(false);//将"拒绝挑战"按钮设为不可用
this.jbFail.setEnabled(false);//将"认输"按钮设为不可用
}
catch(Exception ee){ee.printStackTrace();}
}
public void mouseClicked(MouseEvent me){//单击棋子或棋盘
if(this.ModelFlag!=0){
if(WHO==1){//黑色
MouseClicke(me,0,16,16,32);
}else if(this.WHO==2){//红色
MouseClicke(me,16,32,0,16);
}
}else{
JOptionPane.showMessageDialog(this, "请选择模式","提示",JOptionPane.INFORMATION_MESSAGE);
return;
}
}
public void MouseClicke(MouseEvent me,int pA,int pB,int pC,int pD){
int[] tmp=new int[2];
for(int i=pA;i<pB;i++){
if(me.getSource().equals(play[i])){
tmp=getPlayPos(i);
this.startX=tmp[0];
this.startY=tmp[1];
this.terminus.setVisible(false);
this.selected.setVisible(true);
this.selected.setBounds(play[i].getX(),play[i].getY(),55,55);
return;
}
}
if(array[startX][startY]>=pA&&array[startX][startY]<=pB){
tmp=this.getPos(me);
endX=tmp[0];endY=tmp[1];
for(int j=pC;j<pD;j++){
if(me.getSource().equals(play[j])){
tmp=getPlayPos(j);
endX=tmp[0];endY=tmp[1];
break;
}
}
if(rules.ifMove(startX,startY,endX,endY,array[startX][startY])){
EndMove(startX,startY,endX,endY);
if(ModelFlag==1){
if(WHO==1){
this.time[0].stTime();
this.time[1].spTime();
this.WHO=2;
}
else{
this.time[1].stTime();
this.time[0].spTime();
this.WHO=1;
}
}else if(ModelFlag==3){
if(this.WHO==1){
this.WHO=3;
this.time[0].stTime();
this.time[1].spTime();
}
else{
this.WHO=4;
this.time[1].stTime();
this.time[0].spTime();
}
try{
this.cat.dout.writeUTF("<#MOVE#>"+this.cat.challenger+startX+startY+endX+endY);
}catch(Exception ee){ee.printStackTrace();}
}
if(this.FaceToFace()){
JOptionPane.showMessageDialog(this, "照将","提示",JOptionPane.INFORMATION_MESSAGE);
if(ModelFlag==1){
this.initialChess();
this.initime();
}else if(ModelFlag==3){
try{
this.cat.dout.writeUTF("<#RENSHU#>"+this.cat.challenger);
this.cat.dout.writeUTF("<#VICTOR#>"+this.jtfNickName.getText().trim());
}catch(Exception ee){ee.printStackTrace();}
}
}
}
}
}
public int[] getPlayPos(int target){
int[] pos=new int[2];
pos[0]=-1;
pos[1]=-1;
for(int i=0;i<9;i++){
for(int j=0;j<10;j++){
if(array[i][j]==target){
pos[0]=i;
pos[1]=j;
return pos;
}
}
}
return pos;
}
public int[] getPos(MouseEvent e){
int[] pos=new int[2];
pos[0]=-1;
pos[1]=-1;
Point p=e.getPoint();//获得事件发生的坐标点
double x=p.getX();
double y=p.getY();
if(Math.abs((x-BORDER_LEFT)/1%(SQUARE-1))<=25){//获得对应于数组x下标的位置
pos[0]=Math.round((float)(x-BORDER_LEFT))/(SQUARE-1);
}
else if(Math.abs((x-BORDER_LEFT)/1%(SQUARE-1))>=35){
pos[0]=Math.round((float)(x-BORDER_LEFT))/(SQUARE-1)+1;
}
if(Math.abs((y-BORDER_UP)/1%(SQUARE-1))<=25){//获得对应于数组y下标的位置
pos[1]=Math.round((float)(y-BORDER_UP))/(SQUARE-1);
}
else if(Math.abs((y-BORDER_UP)/1%(SQUARE-1))>=35){
pos[1]=Math.round((float)(y-BORDER_UP))/(SQUARE-1)+1;
}
return pos;
}
public void EndMove(int startX,int startY,int endX, int endY){
//存在的显示不存在的让它消失
Pdisappear=array[endX][endY];
array[endX][endY]=array[startX][startY];
array[startX][startY]=-1;
this.drawChess();
if(Pdisappear!=-1){
play[Pdisappear].setVisible(false);
}
this.terminus.setVisible(true);//显示终点选中框
this.selected.setVisible(true);//显示起点选中框
this.selected.setBounds(RIGLFT+startX*SQUARE,UPDOWN+startY*SQUARE, 55, 55);
this.terminus.setBounds(RIGLFT+endX*SQUARE,UPDOWN+endY*SQUARE, 55, 55);
}
public boolean FaceToFace(){
boolean FLAG=false;
int B_K_X=0,B_K_Y=0,R_K_X=0,R_K_Y=0;
int[] tmp=new int[2];
tmp=getPlayPos(4);
B_K_X=tmp[0];B_K_Y=tmp[1];
tmp=getPlayPos(20);
R_K_X=tmp[0];R_K_Y=tmp[1];
if(B_K_X==R_K_X){
FLAG=true;
for(int i=R_K_Y+1;i<B_K_Y;i++){
if(array[B_K_X][i]!=-1){
FLAG=false;
break;
}
}
}
return FLAG;
}
public void mousePressed(MouseEvent me){}
public void mouseReleased(MouseEvent me){}
public void mouseEntered(MouseEvent me){}
public void mouseExited(MouseEvent me){}
public static void main(String args[]){
new Chess();
}
}