ClientThread

package com.client;

import java.applet.Applet;

/**
 * 客户端线程类类
 *
 * @author 翱翔团队
 * @version 1.0.0
 */
public class ClientThread extends JFrame implements Runnable
{
    Socket socket = null; // 定义套接字
    
    JTextArea txtMess = null;// 创建多行文本框
    
    DataInputStream dis = null;// 定义数据输入流
    
    DataOutputStream dos = null;// 定义数据输出流
    
    String name = null;
    
    public static List list = new ArrayList();
    
    static ChessFrame frame = null;
    
    public static List empty = new ArrayList();
    
    // 定义一个logger
    static Logger logger = Logger.getLogger(com.client.ClientThread.class.getName());
    
    /**
     * 线程的构造方法
     *
     * @param socket
     *            套接字
     * @param txtMess
     *            文本域
     * @param name
     *            用户名
     */
    public ClientThread(Socket socket, JTextArea txtMess, String name,
            ChessFrame frame)
    {
        // 传入的套接字
        this.socket = socket;
        // 传入的消息文本域
        this.txtMess = txtMess;
        // 传入的玩家
        this.name = name;
        this.frame = frame;
    }
    
    /**
     * 线程的运行方法
     */
    public void run()
    {
        int count = ServerFrame.getCount();
        ServerFrame.setCount(count++);
        System.out.println("客户端监听消息:" + count);
        logger.info("客户端监听消息:" + count);
        // 实例化输入流
        try
        {
            while (true)
            {
                // 实例化输入数据流
                dis = new DataInputStream(socket.getInputStream());
                dos = new DataOutputStream(socket.getOutputStream());
                // 读取输入流的数据
                String mess = dis.readUTF();
                System.out.println("client receive  mess:" + mess);
                logger.info("client receive mess:" + mess);
                // 以#号分隔字符串
                String[] data = mess.split("#");
                
                // 棋子监听的标志位
                int flag = Integer.parseInt(data[0]);
                
                logger.info("client flag:" + flag);
                System.out.println("client flag:" + flag);
                switch (flag)
                {
                    // 网络同步走棋
                    case TypeListInfo.NET_CHESS:
                        // 点击棋子的id
                        int id = Integer.parseInt(data[1]);
                        // 棋子走动信息
                        String str = name + ":" + "点击"
                                + Map.chessMan[id].getName() + "走到" + data[3]
                                + "行" + data[4] + "列";
                        // 把信息追加到文本域
                        txtMess.append(str + "\n");
                        // 调用网络同步走棋的方法
                        Net_Walk(data);
                        frame.time = 0;// 计时器清0;
                        break;
                    // 网络同步悔棋regret
                    case TypeListInfo.NET_REGRET:
                        String backInfo = data[1] + "#" + data[2] + "#"
                                + data[3] + "#" + data[4] + "#" + data[5] + "#"
                                + data[6];
                        // 把悔棋的信息添加到集合中
                        list.add(backInfo);
                        System.out.println("list大小:" + list.size());
                        int result = JOptionPane.showConfirmDialog(frame,
                                "是否同意悔棋?",
                                "系统提示",
                                JOptionPane.YES_NO_OPTION);
                        if (result == JOptionPane.YES_OPTION)
                        {
                            ActionEventOwn.back(list);
                            dos.writeUTF(TypeListInfo.NET_REGRET_YES + "#ok");
                        }
                        else
                        {
                            dos.writeUTF(TypeListInfo.NET_REGRET_NO + "#no");
                        }
                        break;
                    // 同意网络悔棋
                    case TypeListInfo.NET_REGRET_YES:
                        ActionEventOwn.back(ChessFrame.list);
                        break;
                    // 不同意网络悔棋
                    case TypeListInfo.NET_REGRET_NO:
                        JOptionPane.showMessageDialog(this, "对方不同意悔棋");
                        break;
                    // 网络消息的处理
                    case TypeListInfo.NET_MESS:
                        System.out.println("data[1]:" + mess);
                        txtMess.append(data[1] + "\n");
                        break;
                    // 开始
                    case TypeListInfo.NET_START:
                        ServerFrame.setReady(1);
                        if (!frame.btnStart.isEnabled())
                        {
                            logger.info("client send confirm start mess:"
                                    + TypeListInfo.NET_START_YES + "#123");
                            dos.writeUTF(TypeListInfo.NET_START_YES + "#123");
                        }
                        else
                        {
                            logger.info("client start button isEnabled:"
                                    + frame.btnStart.isEnabled());
                            
                        }
                        break;
                    // 收到开始
                    case TypeListInfo.NET_START_YES:
                        if (!frame.btnStart.isEnabled())
                        {
                            // 计时器线程开启
                            new Thread(new TimeTheread(frame)).start();
                            JOptionPane.showMessageDialog(this, "游戏开始!");
                            
                            logger.info("==========================");
                            logger.info("==========游戏开始========");
                            logger.info("==========================");
                            
                            for (int i = 1; i <= Map.CHESSNUM; i++)
                            {
                                // 棋子设为可见
                                ChessFrame.lblChessMan[i].setVisible(true);
                            }
                        }
                        break;
                    case TypeListInfo.NET_GAME_OVER:

                        JOptionPane.showMessageDialog(this, "你太牛了,轻松解决了对方!");
                        
                        logger.info("==========================");
                        logger.info("==========游戏结束========");
                        logger.info("==========================");
                        
                        break;
                    case TypeListInfo.NET_PEACE:
                        int result2 = JOptionPane.showConfirmDialog(frame,
                                "是否同意求和?",
                                "系统提示",
                                JOptionPane.YES_NO_OPTION);
                        if (result2 == JOptionPane.YES_OPTION)
                        {
                            dos.writeUTF(TypeListInfo.NET_PEACE_YES + "#yes");
                        }
                        else
                        {
                            dos.writeUTF(TypeListInfo.NET_PEACE_NO + "#no");
                        }
                        break;
                    case TypeListInfo.NET_PEACE_YES:
                        JOptionPane.showMessageDialog(this, "对方同意求和");
                        dos.writeUTF(TypeListInfo.NET_PEACE_MESS + "#yes");
                        break;
                    case TypeListInfo.NET_PEACE_NO:
                        JOptionPane.showMessageDialog(this, "对方拒绝求和");
                        break;
                    case TypeListInfo.NET_PEACE_MESS:
                        JOptionPane.showMessageDialog(this, "和局!");
                        for (int i = 1; i <= Map.CHESSNUM; i++)
                        {
                            frame.lblChessMan[i].setVisible(false);
                        }
                        break;
                    case TypeListInfo.NET_WIN:
                        for (int i = 1; i <= Map.CHESSNUM; i++)
                        {
                            ChessFrame.lblChessMan[i].setVisible(false);
                        }
                        break;
                    default:
                        break;
                }
                if (mess.equals(TypeListInfo.IS_EXIT + ""))
                {
                    System.exit(0);
                }
            }// while
        }// try
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }// run()
    
    /**
     * 网络同步走棋的方法
     *
     * @param data
     *            字符串数组
     */
    public static void Net_Walk(String[] data)
    {
        /**
         * 6#1(棋子id)#2(棋子id)#3(row)#4(col)
         */
        // 当前棋子的id
        int id1 = Integer.parseInt(data[1]);
        // 目标位置棋子的id
        int id2 = Integer.parseInt(data[2]);
        // 目标位置的行
        int row = Integer.parseInt(data[3]);
        // 目标位置的列
        int col = Integer.parseInt(data[4]);
        // 影子的原始位置横坐标
        int x0 = Integer.parseInt(data[5]);
        // 原始位置的纵坐标
        int y0 = Integer.parseInt(data[6]);
        // 棋子的宽度
        int chessWidth = ChessFrame.CHESSWIDTH;
        // 棋子的高度
        int chessHeight = ChessFrame.CHESSHEIGHT;
        // 棋子的目标位置
        Location tagert = Map.location[row][col];
        int x = Map.location[row][col].getX();// 获取x坐标位置
        int y = Map.location[row][col].getY();// 获取y坐标位置
        if (id1 == id2)
        {
            ChessFrame.lblEdge1.setBounds(x0, y0, 55, 55);
            ChessFrame.lblEdge2.setBounds(x, y, 55, 55);
            // 同步走棋
            ChessFrame.lblChessMan[id1].setBounds(tagert.getX(),
                    tagert.getY(),
                    chessWidth,
                    chessHeight);
            // 棋子可见
            ChessFrame.lblChessMan[id1].setVisible(true);
            // 保存位置
            Map.chessMan[id1].setLocation(tagert);
        }
        else
        {
            ChessFrame.lblEdge1.setBounds(x0, y0, 55, 55);
            ChessFrame.lblEdge2.setBounds(x, y, 55, 55);
            // 吃棋
            ChessFrame.lblChessMan[id1].setBounds(tagert.getX(),
                    tagert.getY(),
                    chessWidth,
                    chessHeight);
            ChessFrame.lblChessMan[id1].setVisible(true);
            ChessFrame.lblChessMan[id2].setVisible(false);
            Map.chessMan[id2].setDisplay(false);
            Map.chessMan[id1].setLocation(tagert);
            if (ChessFrame.chessSecClick == 17
                    || ChessFrame.chessSecClick == 18)
            {
                try
                {
                    ChessFrame.gameOver = Applet.newAudioClip(new File(
                            "music/gameover.wav").toURI().toURL());
                    ChessFrame.gameOver.play();
                    ChessFrame.win = Applet.newAudioClip(new File(
                            "music/gamewin.wav").toURI().toURL());
                    ChessFrame.win.play();
                    ChessFrame.lblChessMan[ChessFrame.chessFirClick].setVisible(false);
                    ChessFrame.dos.writeUTF(TypeListInfo.NET_WIN + "#ok");
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                JOptionPane.showMessageDialog(frame, "玩家"
                        + Map.chessMan[ChessFrame.chessFirClick].getPlayer()
                        + "赢");
            }
        }
        /**
         * 判断将军
         */
        if (Map.killKing(id1))
        {
            try
            {
                ChessFrame.general = Applet.newAudioClip(new File(
                        "music/General.wav").toURI().toURL());
                ChessFrame.general.play();
                
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            JOptionPane.showMessageDialog(frame, "将军");
        }
        selectPlayer();
        // 悔棋的信息
        
    }
    
    /**
     * 选择玩家的方法
     *
     */
    public static void selectPlayer()
    {
        if (ChessFrame.playerSelect == 1)
        {
            // 选择玩家2
            ChessFrame.playerSelect = 2;
            // 黑将不可见
            ChessFrame.lblGeneral1.setVisible(false);
            // 红将可见
            ChessFrame.lblGeneral2.setVisible(true);
        }
        else
        {
            // 选择玩家1
            ChessFrame.playerSelect = 1;
            // 黑将不可见
            ChessFrame.lblGeneral2.setVisible(false);
            // 红将可见
            ChessFrame.lblGeneral1.setVisible(true);
        }
        // 设置客户端是否能够点击
        ChessFrame.enable = true;
    }
}// ClientThread
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值