📄 代码.txt
字号:
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 + -