⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 代码.txt

📁 相信大家都看过五子棋了吧?这里是一个简单的代码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
package tian;

import java.net.*;
import java.io.*;
import java.util.*;


public class OmokServer {
    private ServerSocket server;

    private BManager bMan = new BManager();//消息广播者

    private Random rnd = new Random();//随机确定黑棋或者白棋

    public OmokServer() {
    }

    void startServer() {//启动服务器
        try {
            server = new ServerSocket(7777);
            while (true) {
                //获取与客户端的连接
                Socket socket = server.accept();
                //创建并启动总线程
                Omok_Thread ot = new Omok_Thread(socket);
                ot.start();
                //向bMan添加线程
                bMan.add(ot);
                System.out.println("连接数: " + bMan.size());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }



    //负责与客户机通信的线程类
    class Omok_Thread extends Thread {
        private int roomNumber = -1;

        private String userName = null;//用户类

        private Socket socket;

        //游戏是否准备就绪
        private boolean ready = false;

        private BufferedReader reader;

        private PrintWriter writer;

        Omok_Thread(Socket socket) {
            this.socket = socket;
        }

        Socket getSocket() {
            return socket;
        }

        int getRoomNumber() {
            return roomNumber;
        }

        String getUserName() {
            return userName;
        }

        boolean isReady() {
            return ready;
        }

        public void run() {
            try {
                reader = new BufferedReader(new InputStreamReader(socket
                        .getInputStream()));
                writer = new PrintWriter(socket.getOutputStream(), true);
                String msg;
                while ((msg = reader.readLine()) != null) {
                    if (msg.startsWith("[NAME]")) {
                        userName = msg.substring(6);
                    } else if (msg.startsWith("[ROOM]")) {
                        int roomNum = Integer.parseInt(msg.substring(6));
                        if (!bMan.isFull(roomNum)) {
                            if (roomNumber != -1)
                                bMan.sendToOthers(this, "[EXIT]" + userName);
                            roomNumber = roomNum;
                            writer.println(msg);
                            writer.println(bMan.getNamesInRoom(roomNumber));
                            bMan.sendToOthers(this, "[ENTER]" + userName);
                        } else
                            writer.println("[FULL]");
                    } else if (roomNumber >= 1 && msg.startsWith("[STONE]"))
                        bMan.sendToOthers(this, msg);
                    else if (msg.startsWith("[MSG]"))
                        bMan.sendToRoom(roomNumber, "[" + userName + "]: "
                                + msg.substring(5));
                    else if (msg.startsWith("[START]")) {
                        ready = true;
                        if (bMan.isReady(roomNumber)) {
                            int a = rnd.nextInt(2);
                            if (a == 0) {
                                writer.println("[COLOR]BLACK");
                                bMan.sendToOthers(this, "[COLOR]WHITE");
                            } else {
                                writer.println("[COLOR]WHITE");
                                bMan.sendToOthers(this, "[COLOR]BLACK");
                            }
                        }
                    } else if (msg.startsWith("[STOPGAME]"))
                        ready = false;
                    else if (msg.startsWith("[DROPGAME]")) {
                        ready = false;
                        bMan.sendToOthers(this, "[DROPGAME]");
                    } else if (msg.startsWith("[WIN]")) {
                        ready = false;
                        writer.println("[WIN]");
                        bMan.sendToOthers(this, "[LOSE]");
                    }
                }
            } catch (Exception e) {
            } finally {//用户断线
                try {
                    bMan.remove(this);
                    if (reader != null)
                        reader.close();
                    if (writer != null)
                        writer.close();
                    if (socket != null)
                        socket.close();
                    reader = null;
                    writer = null;
                    socket = null;
                    System.out.println(userName + "已断线.");
                    System.out.println("连接人数: " + bMan.size());
                    bMan.sendToRoom(roomNumber, "[DISCONNECT]" + userName);
                } catch (Exception e) {
                }
            }
        }
    }

    class BManager extends Vector {
        BManager() {}

        void add(Omok_Thread ot) {
            super.add(ot);
        }

        void remove(Omok_Thread ot) {
            super.remove(ot);
        }

        Omok_Thread getOT(int i) {
            return (Omok_Thread) elementAt(i);
        }

        Socket getSocket(int i) {
            return getOT(i).getSocket();
        }

        void sendTo(int i, String msg) {
            try {
                PrintWriter pw = new PrintWriter(
                        getSocket(i).getOutputStream(), true);
                pw.println(msg);
            } catch (Exception e) {
            }
        }

        int getRoomNumber(int i) {
            return getOT(i).getRoomNumber();
        }

        synchronized boolean isFull(int roomNum) {
            if (roomNum == 0)
                return false;
            int count = 0;
            for (int i = 0; i < size(); i++)
                if (roomNum == getRoomNumber(i))
                    count++;
            if (count >= 2)
                return true;
            return false;
        }

        void sendToRoom(int roomNum, String msg) {
            for (int i = 0; i < size(); i++)
                if (roomNum == getRoomNumber(i))
                    sendTo(i, msg);
        }

        void sendToOthers(Omok_Thread ot, String msg) {
            for (int i = 0; i < size(); i++)
                if (getRoomNumber(i) == ot.getRoomNumber() && getOT(i) != ot)
                    sendTo(i, msg);
        }

        synchronized boolean isReady(int roomNum) {
            int count = 0;
            for (int i = 0; i < size(); i++)
                if (roomNum == getRoomNumber(i) && getOT(i).isReady())
                    count++;
            if (count == 2)
                return true;
            return false;
        }

        String getNamesInRoom(int roomNum) {
            StringBuffer sb = new StringBuffer("[PLAYERS]");
            for (int i = 0; i < size(); i++)
                if (roomNum == getRoomNumber(i))
                    sb.append(getOT(i).getUserName() + ""t");
            return sb.toString();
        }
    }
    
    //调用
    public static void main(String[] args) {
        OmokServer server = new OmokServer();
        server.startServer();
    }
}







package tian; 
 
import java.awt.*; 
import java.net.*; 
import java.io.*; 
import java.util.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
 
class OmokBoard extends Canvas { 
    public static final int BLACK = 1, WHITE = -1; 
 
    private int[][] map; 
 
    private int size, cell; 
 
    private String info = "游戏终止"; 
 
    private int color = BLACK; 
 
    private boolean enable = false; 
 
    private boolean running = false; 
 
    private PrintWriter writer; 
 
    private Graphics gboard, gbuff; 
 
    private Image buff; 
 
    OmokBoard(int s, int c) { 
        this.size = s; 
        this.cell = c; 
        map = new int[size + 2][]; 
        for (int i = 0; i < map.length; i++) 
            map[i] = new int[size + 2]; 
        setBackground(new Color(200, 200, 100)); 
        setSize(size * (cell + 1) + size, size * (cell + 1) + size); 
        addMouseListener(new MouseAdapter() { 
            public void mousePressed(MouseEvent me) { 
                if (!enable) 
                    return; 
                int x = (int) Math.round(me.getX() / (double) cell); 
                int y = (int) Math.round(me.getY() / (double) cell); 
                if (x == 0 || y == 0 || x == size + 1 || y == size + 1) 
                    return; 
                if (map[x][y] == BLACK || map[x][y] == WHITE) 
                    return; 
                writer.println("[STONE]" + x + " " + y); 
                map[x][y] = color; 
                if (check(new Point(x, y), color)) { 
                    info = "获胜."; 
                    writer.println("[WIN]"); 
                } else 
                    info = "等待对方落子."; 
                repaint(); 
                enable = false; 
            } 
        }); 
    } 
 
    public boolean isRunning() { 
        return running; 
    } 
 
    public void startGame(String col) { 
        running = true; 
        if (col.equals("BLACK")) { 
            enable = true; 
            color = BLACK; 
            info = "开始游戏... 请落子"; 
        } else { 
            enable = false; 
            color = WHITE; 
            info = "开始游戏... 请等待."; 
        } 
    } 
 
    public void stopGame() { 
        reset(); 
        writer.println("[STOPGAME]"); 
        enable = false; 
        running = false; 
    } 
 
    public void putOpponent(int x, int y) { 
        map[x][y] = -color; 
        info = "对方已落子 请落子."; 
        repaint(); 
    } 
 
    public void setEnable(boolean enable) { 
        this.enable = enable; 
    } 
 
    public void setWriter(PrintWriter writer) { 
        this.writer = writer; 
    } 
 
    public void update(Graphics g) { 
        paint(g); 
    } 
 
    public void paint(Graphics g) { 
        if (gbuff == null) { 
            buff = createImage(getWidth(), getHeight()); 
            gbuff = buff.getGraphics(); 
        } 
        drawBoard(g); 
    } 
 
    public void reset() { 
        for (int i = 0; i < map.length; i++) 
            for (int j = 0; j < map[i].length; j++) 
                map[i][j] = 0; 
        info = "游戏终止"; 
        repaint(); 
    } 
 
    private void drawLine() { 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -