[Java]局域網五子棋

提示: 下面給的代碼有問題哦,能夠本身去調試

可用版 http://pan.baidu.com/s/1i4XvawX(退出程序,端口並無被關閉,可自行修改代碼實現)

img

           


 

src

        Server部分

Server_test.javajava

package 五子棋;

public class Server_test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Server_frame sf =new Server_frame();
    }

}

Server_frame.java緩存

package 五子棋;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.net.ServerSocket;
import java.net.Socket;

import javax.sound.midi.Receiver;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;

public class Server_frame extends JFrame {

    public static  boolean isstart = false;
    public static Socket socket;
    Server_panel_center_qipan qipan;
    Server_panel_west_talk talk;
    public static ServerSocket server;
    public Server_frame() {
        qipan = new Server_panel_center_qipan();
        talk = new Server_panel_west_talk();
        this.setSize(800, 600);
        this.setTitle("五子棋_服務器");
        this.add(qipan, BorderLayout.CENTER);
        this.add(talk, BorderLayout.WEST);
        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        JMenu gameMenu = new JMenu("遊戲(G)"); // 建立遊戲菜單
        JMenu serMenu = new JMenu("幫助(H)"); // 建立遊戲菜單
        gameMenu.setMnemonic('G');
        // 建立遊戲子菜單及監聽
        JMenuItem connect_ser = new JMenuItem("開啓服務器鏈接服務器", 'F');
        connect_ser.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,
                InputEvent.CTRL_MASK));
        connect_ser.addActionListener(new AbstractAction("開啓服務器") {
            public void actionPerformed(ActionEvent event) {
                boolean flag = Serverstart();
                if (flag == false) {
                    JOptionPane.showMessageDialog(null, "開啓失敗", "錯誤",
                            JOptionPane.ERROR_MESSAGE);
                    return;
                } else {
                
                    //服務器開啓成功後開啓線程
                    Recive_thred rth = new Recive_thred(socket,
                            Server_panel_west_talk.chantAear);
                    rth.start();
                }

            }
        });

        JMenuItem exitItem = new JMenuItem("退出", 'E');
        exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,
                InputEvent.CTRL_MASK));
        exitItem.addActionListener(new AbstractAction("退出") {
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        gameMenu.add(connect_ser);
        gameMenu.addSeparator();
        gameMenu.add(exitItem);
        menuBar.add(gameMenu);            
            //客戶端鏈接服務器後纔打開線程
            Recive_thred rth = new Recive_thred(socket,
                    Server_panel_west_talk.chantAear);
            rth.start();
        this.setVisible(true);
    }
    /*
     * 開啓服務器,而且等待客戶端鏈接
     */
    public static boolean Serverstart() {
        try {
            // 開啓服務器
            server = new ServerSocket(6666);
            isstart = true; // 表示服務器開啓了額
            // 發送客戶端用戶基本信息(用戶名和ip地址)
            JOptionPane.showMessageDialog(null, "服務器開始於:"
                    + server.getInetAddress().getLocalHost() + ":"
                    + server.getLocalPort());
            Server_panel_west_talk.chantAear.append("\n" + "服務器開始於:"
                    + server.getInetAddress().getLocalHost() + ":"
                    + server.getLocalPort() + "\n");
            
            socket=server.accept();    //    等待客戶端鏈接
            
            return isstart;
        } catch (Exception e) {
            isstart = false;// 未鏈接上
            return false;
        }
    }

}

Server_panel_center_qipan.java服務器

package 五子棋;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Server_panel_center_qipan extends JPanel{
    Image board, black, white;
    int hgex, hgey; // 棋子座標的變量
    int bgex, bgey; // 棋子座標的變量
    int cou = 0; // 表示連着棋子的數量
    public static boolean isrenshu = false; // renshu=true表示自認輸了
    public static boolean ishuiqi = false; // huiqi=true表示本身悔棋了
    public static boolean isok = false; // baiqi表示本身準備好了
    public static boolean ischongxinkaishi = false; // 從新開始?
    public static boolean ishei = false; // 黑棋下了???ishei=true表示下了
    boolean isgamestart = false;// true遊戲開始
    private MouseEvent xiaqie;
    ArrayList<String> h_list = new ArrayList<String>(); //
    ArrayList<String> b_list = new ArrayList<String>(); //
    public Server_panel_center_qipan(){
        this.setLayout(null); // 居中
        JButton ks = new JButton("開始/暫停");
        ks.setBounds(10, 460, 100, 25);
        this.add(ks);
        JButton rs = new JButton("認輸");
        rs.setBounds(115, 460, 80, 25);
        this.add(rs);
        JButton ht = new JButton("後退");
        ht.setBounds(200, 460, 80, 25);
        this.add(ht);
        JButton cxks = new JButton("從新開始");
        cxks.setBounds(290, 460, 100, 25);
        this.add(cxks);

        hgex = 0;
        hgey = 0;
        bgex = 0;
        bgey = 0;
        try {
            board = ImageIO.read(new File("img/board.gif"));
            black = ImageIO.read(new File("img/black.gif"));
            white = ImageIO.read(new File("img/white.gif"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 鼠標監聽器,下棋位置
        MouseAdapter mouse = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                xiaqie=e;    //把鼠標點的位置賦值給全局變量

            }
        };
        // 鼠標監聽器--------------開始/暫停
        MouseAdapter start = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                JOptionPane.showMessageDialog(null, "dianjile");
                isok=true;
            }
        };
        MouseAdapter renshu = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                // System.out.println("renshu鼠標按下去了");
                if (h_list.size() < 5)
                    JOptionPane.showMessageDialog(null,
                            "這都還沒走五步就認輸?不給,該誰了,請繼續!!");
                else {
                    isrenshu = true;
                }
            }
        };
        // 後退
        MouseAdapter houtui = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                if (h_list.size() == 0 || b_list.size() == 0)
                    JOptionPane.showMessageDialog(null, "你妹哦,這都沒開始,哪來的讓你毀");
                else {
                    ishuiqi = true;
                }
            }
        };
        // 從新開始
        MouseAdapter chongxinkaishi = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                if (h_list.size() == 0 || b_list.size() == 0)
                    JOptionPane.showMessageDialog(null, "你妹哦,這都沒開始,怎麼會從新有病把");
                else {
                    isrenshu=true;
                    
                }
            }
        };
        this.addMouseListener(mouse);
        cxks.addMouseListener(chongxinkaishi);
        ks.addMouseListener(start); // 開始按鈕與鼠標相連
        rs.addMouseListener(renshu); // 認輸按鈕與鼠標相連
        ht.addMouseListener(houtui); // 後退按鈕與鼠標相連
        
    }
    /*
     * 
     * 獲取鼠標位置 保存鼠標位置到數集裏面
     */
    public void getmouse(MouseEvent e) {
        if (isgamestart ) {// !ishei表示黑棋沒下,到白棋
            int x = e.getX();
            int y = e.getY();
            // 減去邊距,除以格子的寬度,取整,獲得第幾格子
            hgex = (x - 18) / 25;
            hgey = (y - 18) / 25;
            if ((x - 18) % 25 > 12)
                hgex = hgex + 1;
            if ((y - 18) % 25 > 12)
                hgey = hgey + 1;
            // 把格子的x座標和y座標變成字符串用逗號鏈接,保存到list裏面
            if (!h_list.contains(hgex + "," + hgey)
                    && !b_list.contains(hgex + "," + hgey)) {
                h_list.add(hgex + "," + hgey);
                ishei = true;        //黑棋下了,
            }
            repaint();
            if (h_list.size() >= 5) {
                heipanduan();
            }

        }

    }
    /*
     * 
     * 畫棋盤*/
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);
        g.drawImage(board, 0, 0, null);
        // 黑棋獲取鼠標點的位置,畫黑棋
        for (int i = 0; i < h_list.size(); i++) {
            String s = h_list.get(i); // 得到集合裏面的單個字符串
            String[] a = s.split(",");
            hgex = Integer.parseInt(a[0]);
            hgey = Integer.parseInt(a[1]);
            g.drawImage(black, hgex * 25 + 18 - 12, hgey * 25 + 18 - 12, null);
        }
        // 白棋獲取鼠標點的位置,畫白棋
        for (int i = 0; i < b_list.size(); i++) {
            String s = b_list.get(i); // 得到集合裏面的單個字符串
            String[] b = s.split(",");
            bgex = Integer.parseInt(b[0]);
            bgey = Integer.parseInt(b[1]);
            g.drawImage(white, bgex * 25 + 18 - 12, bgey * 25 + 18 - 12, null);
        }
    }

    // 輸贏判斷的方法,黑判斷
    public void heipanduan() {
        // if (h_list.size() > 5) {// 黑棋至少點了五次以後才執行
        // f判斷是白棋仍是黑棋,true表示黑棋,false表示白棋
        System.out.println("黑棋判斷");
        // 黑棋判斷輸贏
        for (int i = 0; i < h_list.size(); i++) {
            cou = 0; // 在判斷每個棋子的時候,都要給cou賦值爲0
            String s = h_list.get(i); // 得到集合裏面的單個字符串
            String[] a = s.split(",");
            hgex = Integer.parseInt(a[0]);
            int tempx = hgex;
            hgey = Integer.parseInt(a[1]);
            int tempy = hgey;
            // 橫向判斷
            // 黑棋的某個點x座標+1,Y不變,表示橫向判斷有沒有五子相連
            for (int j = 0; j < 4; j++) {
                hgex++;
                if (h_list.contains(hgex + "," + hgey)) {
                    cou++;
                }
            }
            System.out.println("黑棋橫向判斷有" + cou + "+1個");
            // 縱向判斷
            if (cou < 4) {
                hgex = tempx;
                hgey = tempy;
                cou = 0;
                for (int j = 0; j < 4; j++) {
                    hgey++;
                    if (h_list.contains(hgex + "," + hgey))
                        cou++;
                }
            }
            System.out.println("黑棋縱向判斷有" + cou + "+1個");
            // 右上方向判斷
            if (cou < 4) { // 小余4表示橫向沒有五子,就把cou值設爲0,從新開始
                cou = 0;
                hgex = tempx;
                hgey = tempy;
                for (int j = 0; j < 4; j++) {
                    hgey--;
                    hgex++;
                    if (h_list.contains(hgex + "," + hgey))
                        cou++;
                }
            }
            System.out.println("黑棋右上判斷有" + cou + "+1個");
            // 右下判斷
            if (cou < 4) {
                cou = 0;
                hgex = tempx;
                hgey = tempy;
                for (int j = 0; j < 4; j++) {
                    hgey++;
                    hgex++;
                    if (h_list.contains(hgex + "," + hgey))
                        cou++;
                }
            }
            System.out.println("黑棋右下判斷有" + cou + "+1個");
            if (cou == 4) {
                JOptionPane.showMessageDialog(null, "黑棋贏啦");
                isgamestart = false;
            }
        }
    }
}

Server_panel_west_talk.javaapp

package 五子棋;

import java.awt.TextArea;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Server_panel_west_talk extends JPanel{
    public static String who="服務器說:";
    public static  TextArea chantAear;
    private JTextField txt_message;
    private String message="ok"; // 要發送客戶端的內容
    public static Socket client;
    Send_message sendmessage;        //發送的方法
    public Server_panel_west_talk(){
            sendmessage = new Send_message(message, Server_frame.socket);
            JButton jb_send = new JButton("發送");
            txt_message = new JTextField("請輸入你要發的內容");
            chantAear = new TextArea("------------------\n", 15, 40);
            MouseAdapter send = new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    // TODO Auto-generated method stub
                    super.mouseClicked(e);
                    send(); // 服務在本身的textarea輸出信息
                }
            };
            
            jb_send.addMouseListener(send);
            this.add(chantAear);
            this.add(txt_message);
            this.add(jb_send);
    }


    private void send() {
        // TODO Auto-generated method stub
        if (!Server_frame.isstart) {
            JOptionPane.showMessageDialog(null, "服務器還未啓動,不能發送消息!", "錯誤",
                    JOptionPane.ERROR_MESSAGE);
            return;
        } else {
            String message = txt_message.getText();
            if (message == null || message.equals("")) {
                JOptionPane.showMessageDialog(null, "消息不能爲空!", "錯誤",
                        JOptionPane.ERROR_MESSAGE);
                return;
            }
            chantAear.append("\n服務器說:" + txt_message.getText() + "");
            message = "CHANT" + "-" +who+ txt_message.getText() + "\n";
            //System.out.println("服務器要發送的的message爲"+message);
            sendmessage.send(message, Server_frame.socket);
        }
    }

}

        Client部分

Client_test.javasocket

package 五子棋;

public class Client_test {
    public static void main(String[] args) {
        Client_frame cf=new Client_frame();
    }
}

Client_frame.javaide

package 五子棋;

import java.awt.BorderLayout;
import java.awt.Frame;

import javax.swing.JFrame;

public class Client_frame extends JFrame{
    Client_panel_center_qipan qipan;
    Cilent_panel_west_talk talk;
    public Client_frame(){
        qipan=new Client_panel_center_qipan(); 
        talk=new Cilent_panel_west_talk();
        this.setSize(1000, 600);
        //設置關閉
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //設置居中
    //    this.setLocationRelativeTo(null);
        this.setTitle("五子棋_客戶端");
        this.add(qipan,BorderLayout.CENTER); 
        this.add(talk,BorderLayout.WEST);
        
        this.setVisible(true);
    }
}

Client_panel_center_qipan.javaui

package 五子棋;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.ArrayList;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Client_panel_center_qipan extends JPanel{

    Image board, black, white;
    int bgex, bgey; // 白棋子座標的變量
    int hgex, hgey; // 黑棋子座標的變量
    static boolean xiaqi = true; // xiaqu=true,黑棋下,不然不能下白棋下
    int cou = 0; // 表示連着棋子的數量
    static int c=1;
    static boolean f = true; // 判斷是白棋仍是黑棋,true表示黑棋,false表示白棋
    static boolean isgamestart = false;// true遊戲開始
    private static String message;        //發送的消息
    Send_message sendmessage;        //發送的方法
    public static boolean isrenshu = false; // renshu=true表示自認輸了
    public static boolean ishuiqi = false; // huiqi=true表示本身悔棋了
    public static boolean isok = false; // baiqi表示本身準備好了
    public static boolean ischongxinkaishi = false; // 從新開始?
    public static boolean isbai = false; // 白棋下了??isbai=true
    private MouseEvent xiaqie;    //下白棋的時候,白棋點的鼠標位置的全局變量
    ArrayList<String> h_list = new ArrayList<String>(); //
    ArrayList<String> b_list = new ArrayList<String>(); //

    public Client_panel_center_qipan() {
        sendmessage = new Send_message(message, Cilent_panel_west_talk.socket);
        this.setLayout(null); // 居中
        JButton ks = new JButton("開始/暫停");
        ks.setBounds(10, 460, 100, 25);
        this.add(ks);
        JButton rs = new JButton("認輸");
        rs.setBounds(115, 460, 80, 25);
        this.add(rs);
        JButton ht = new JButton("後退");
        ht.setBounds(200, 460, 80, 25);
        this.add(ht);
        JButton cxks = new JButton("從新開始");
        cxks.setBounds(290, 460, 100, 25);
        this.add(cxks);

        bgex = 0;
        bgey = 0;
        hgex = 0;
        hgey = 0;
        try {
            board = ImageIO.read(new File("img/board.gif"));
            black = ImageIO.read(new File("img/black.gif"));
            white = ImageIO.read(new File("img/white.gif"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 鼠標監聽器,下棋位置
        MouseAdapter mouse = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                // System.out.println("xiaqi鼠標按下去了");
                if (isok && Server_panel_center_qipan.isok)
                    xiaqie=e;        //將鼠標點的位置賦值給全局變量
                    getmouse(xiaqie);
            }

        };
        // 鼠標監聽器--------------開始/暫停
        MouseAdapter start = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                // System.out.println("kaishi鼠標按下去了");
                message="ANNIU"+"-"+"START";
                sendmessage.send(message, Cilent_panel_west_talk.socket);
            }
        };
        MouseAdapter renshu = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                // System.out.println("renshu鼠標按下去了");
                if (h_list.size() < 5)
                    JOptionPane.showMessageDialog(null,
                            "這都還沒走五步就認輸?不給,該誰了,請繼續!!");
                else {
                    if (h_list.size() < 5)
                        JOptionPane.showMessageDialog(null,
                                "這都還沒走五步就認輸?不給,該誰了,請繼續!!");
                    else {
                        isrenshu = true;
                    }
                }
            }
        };
        // 後退
        MouseAdapter houtui = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                // int x=b_list.size();
                if (h_list.size() == 0 || b_list.size() == 0)
                    JOptionPane.showMessageDialog(null, "你妹哦,這都沒開始,哪來的讓你毀");
                else {
                    ishuiqi = false;
                }
            }
        };
        // 從新開始
        MouseAdapter chongxinkaishi = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                // int x=b_list.size();
                if (h_list.size() == 0 || b_list.size() == 0)
                    JOptionPane.showMessageDialog(null, "你妹哦,這都沒開始,怎麼會從新有病把");
                else {
                    isrenshu = true;
                }
            }
        };
        this.addMouseListener(mouse);
        ks.addMouseListener(start); // 開始按鈕與鼠標相連
        rs.addMouseListener(renshu); // 認輸按鈕與鼠標相連
        ht.addMouseListener(houtui); // 後退按鈕與鼠標相連
        cxks.addMouseListener(chongxinkaishi);

    }
public static boolean   clientisok(){
    if(c==2)
        isok=true;
    return isok;
}
    /*
     * 
     * 獲取鼠標位置 保存鼠標位置到數集裏面
     */
    public void getmouse(MouseEvent e) {
        if (isgamestart && !isbai && Server_panel_center_qipan.ishei) {// !ishei表示黑棋沒下,到白棋
            int x = e.getX();
            int y = e.getY();
            // 減去邊距,除以格子的寬度,取整,獲得第幾格子
            bgex = (x - 18) / 25;
            bgey = (y - 18) / 25;
            if ((x - 18) % 25 > 12)
                bgex = bgex + 1;
            if ((y - 18) % 25 > 12)
                bgey = bgey + 1;
            // 把格子的x座標和y座標變成字符串用逗號鏈接,保存到list裏面
            if (!b_list.contains(hgex + "," + hgey)
                    && !b_list.contains(hgex + "," + hgey)) {
                b_list.add(bgex + "," + bgey);
                isbai = true;
                Server_panel_center_qipan.ishei = false;
            }
            repaint();
            if (h_list.size() >= 5) {
                baipanduan();
            }

        }

    }

    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        super.paintComponent(g);
        g.drawImage(board, 0, 0, null);
        // 畫黑棋
        for (int i = 0; i < h_list.size(); i++) {
            String s = h_list.get(i); // 得到集合裏面的單個字符串
            String[] a = s.split(",");
            hgex = Integer.parseInt(a[0]);
            hgey = Integer.parseInt(a[1]);
            g.drawImage(black, hgex * 25 + 18 - 12, hgey * 25 + 18 - 12, null);
        }
        // 畫白棋
        for (int i = 0; i < b_list.size(); i++) {
            String s = b_list.get(i); // 得到集合裏面的單個字符串
            String[] b = s.split(",");
            bgex = Integer.parseInt(b[0]);
            bgey = Integer.parseInt(b[1]);
            g.drawImage(white, bgex * 25 + 18 - 12, bgey * 25 + 18 - 12, null);
        }
    }

    /*
     * 
     * 白棋判斷輸贏
     */
    public void baipanduan() {
        if (isgamestart == true) {
            while (true) {
                System.out.print("開始判斷了");

                System.out.println("f=false,白棋下了");

                // if (h_list.size() > 5) {// 白棋至少點了五次以後才執行
                // f判斷是白棋仍是黑棋,true表示黑棋,false表示白棋
                System.out.println("白棋判斷");
                // 白棋判斷輸贏
                for (int i = 0; i < b_list.size(); i++) {
                    cou = 0; // 在判斷每個棋子的時候,都要給cou賦值爲0
                    String s = b_list.get(i); // 得到集合裏面的單個字符串
                    String[] a = s.split(",");
                    bgex = Integer.parseInt(a[0]);
                    int tempx = bgex;
                    bgey = Integer.parseInt(a[1]);
                    int tempy = bgey;
                    // 橫向判斷
                    // 黑棋的某個點x座標+1,Y不變,表示橫向判斷有沒有五子相連
                    for (int j = 0; j < 4; j++) {
                        bgex++;
                        if (b_list.contains(bgex + "," + bgey)) {
                            cou++;
                        }
                    }
                    System.out.println("白棋橫向判斷有" + cou + "+1個");
                    // 縱向判斷
                    if (cou < 4) {
                        bgex = tempx;
                        bgey = tempy;
                        cou = 0;
                        for (int j = 0; j < 4; j++) {
                            bgey++;
                            if (b_list.contains(bgex + "," + bgey))
                                cou++;

                        }
                    }
                    System.out.println("白棋縱向判斷有" + cou + "+1個");
                    // 右上方向判斷
                    if (cou < 4) { // 小余4表示橫向沒有五子,就把cou值設爲0,從新開始
                        cou = 0;
                        bgex = tempx;
                        bgey = tempy;
                        for (int j = 0; j < 4; j++) {
                            bgey--;
                            bgex++;
                            if (b_list.contains(bgex + "," + bgey))
                                cou++;

                        }
                    }
                    System.out.println("白棋右上判斷有" + cou + "+1個");
                    // 右下判斷
                    // 右下判斷
                    if (cou < 4) {
                        cou = 0;
                        bgex = tempx;
                        bgey = tempy;
                        for (int j = 0; j < 4; j++) {
                            bgey++;
                            bgex++;
                            if (b_list.contains(bgex + "," + bgey))
                                cou++;

                        }
                    }
                    System.out.println("白棋右下判斷有" + cou + "+1個");
                    if (cou == 4) {
                        JOptionPane.showMessageDialog(null, "白棋贏啦");
                        isgamestart = false;
                        return;
                    }

                }

            }

        }
    }
}

Cilent_panel_west_talk.javathis

package 五子棋;

import java.awt.TextArea;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Cilent_panel_west_talk extends JPanel {

    public static boolean connect = false; // 給出鏈接服務器的boolean,true表示鏈接成功了
    static TextArea chatAear; // 全部消息內容區域
    public static Socket socket; // 鏈接服務器的socket = new
                        // Socket(serverip.getText(), 5555);
    private String message="ok"; // 要發送給服務器的內容
    Send_message sendmessage;        //發送的方法
    private String who = "客戶端說:";
    private JTextField txt_message; // 將要發送給服務器的內容
    private JTextField serverip; // 服務器的IP地址

    public Cilent_panel_west_talk() {
        sendmessage = new Send_message(message, socket);
        chatAear = new TextArea("----------------------\n", 15, 40);
        txt_message = new JTextField("請輸入你要發送的消息");
        JButton jb_connectserver = new JButton("鏈接服務器");
        serverip = new JTextField("127.0.0.1");
        JButton jb_send = new JButton("發送");
        MouseAdapter connect = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                if (connectserver()) {
                    
                    JOptionPane.showMessageDialog(null, "我成功鏈接!!!!");
                    message = "CHANT" + "-" + "我是客戶端,我已經鏈接成功了" + "\n";
                    System.out.println("客戶端的message爲"+message);
                    //客戶端鏈接服務器後纔打開線程
                    Recive_thred rth = new Recive_thred(socket,
                            chatAear);
                    rth.start();
                    sendmessage.send(message, socket);
                }
            }

        };
        // 給服務器發送消息按鈕
        MouseAdapter send = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // TODO Auto-generated method stub
                super.mouseClicked(e);
                chatAear.append("\n客戶端說"+txt_message.getText());
                message = "CHANT" + "-" + who + txt_message.getText() + "\n";
                System.out.println("客戶端要發送的的message爲"+message);
                sendmessage.send(message, socket);
            }
        };
        this.add(serverip);
        jb_connectserver.addMouseListener(connect);
        this.add(jb_connectserver);

        jb_send.addMouseListener(send);
        this.add(chatAear);
        this.add(txt_message);
        this.add(jb_send);

    }

    public boolean connectserver() {
        try {
            // 獲取輸入的IP地址,而且進行鏈接
            socket = new Socket(serverip.getText(), 6666);
            connect = true;
            return connect;
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            chatAear.append("\n鏈接失敗");
        }
        return false;
    }
}

      公共部分

Recive_thred.javaspa

package 五子棋;

import java.awt.TextArea;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JTextField;

public class Recive_thred extends Thread {
    private Socket socket;
    TextArea chantAear;

    public Recive_thred(Socket socket, TextArea chantAear) {
        this.socket = socket;
        this.chantAear = chantAear;

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        InputStream is;
        try {
            is = socket.getInputStream();
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is));
            while (true) {
                String msg = reader.readLine();
                System.out.println("recive線程類接受到的信息" + msg);
                String[] split = msg.split("-");
                System.out.println("split[0]==" + split[0] + "==");
                System.out.println("split[1]==" + split[1] + "==");
                if (split[0] == "ANNIU") {
                    // 按鈕控制
                    if (split[1].equals("START")) {
                        // 對方按下開始按鈕
                        System.out.println("客戶端按下開始了");
                    } else if (split[1].equals("TOUXIANG")) {
                        // 按下認輸按鈕
                    } else if (split[1].equals("HUIQI")) {
                        // 按下悔棋按鈕
                    } else if (split[1].equals("CHONGXINLAI")) {
                        // 按下從新來按鈕
                    }
                } 
                if (split[0].equals("CHANT")) {
                    // 聊天控制
                    System.out.println(split[1]);
                    // chantAear.append(split[1]);
                    chantAear.append("\n"+split[1]);
                } 
                if (split[0] == "XIAQI")// a==2
                {
                    // 下棋控制
                } 
            //    System.out.println("recive類接受錯誤");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

Send_message.java.net

package 五子棋;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

public class Send_message {
    Socket socket;
    String message;

    public Send_message(String message, Socket socket) {
        this.message = message;
        this.socket = socket;
    }

    public void send(String message, Socket socket) {
        OutputStream os;
        try {
            os = socket.getOutputStream();
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
            System.out.println("send類裏面要發送給對方的消息是"+message);    
            //用輸出流把它給輸出去
            bw.write(message);
            //令起一行
            bw.newLine();
            bw.flush(); // 清空緩存
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
相關文章
相關標籤/搜索