java 数独游戏_局域网版数独游戏

这是一个使用Java实现的局域网数独游戏的服务器和客户端线程类。服务器端处理客户端的连接,接收并处理各种命令,如发送用户名、私聊、公聊、游戏大厅列表、创建地图、退出游戏、开始游戏、回答问题和游戏计时等。客户端接收服务器的命令,更新用户列表、消息、游戏地图和计时器状态,并响应游戏操作。
摘要由CSDN通过智能技术生成

package org.jzy.shudu;

import org.jzy.shudu.Server;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.Socket;

import java.util.Vector;

import java.util.logging.Level;

import org.apache.log4j.Logger;

public class ServerThread extends Thread {

private static final Logger log = Logger.getLogger(ServerThread.class);

Socket client;

DataInputStream dis;

boolean isRun = true;

String uname = "";

int map[][] = new int[9][9];

boolean counterFlag=true;

public ServerThread(Socket client) {

try {

this.client = client;

dis = new DataInputStream(client.getInputStream());

} catch (Exception ex) {

ex.printStackTrace();

}

}

@Override

public void run() {

while (isRun) {

try {

int command = dis.readInt();

log.info(command);

switch (command) {

//发送用户名

case Flag.COMMAND_SEND_USERNAME:

String clientName = dis.readUTF();

uname = clientName;

DataOutputStream dos = new DataOutputStream(

client.getOutputStream());

dos.writeInt(Flag.COMMAND_SEND_USERLIST);

dos.writeInt(Server.clints.size());

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

dos.writeUTF(st.uname);

}

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

if (!uname.equals(st.uname)) {

DataOutputStream dos1 = new DataOutputStream(

st.client.getOutputStream());

dos1.writeInt(Flag.COMMAND_SEND_NEWUSER);

dos1.writeUTF(uname);

}

}

Server.sendToAll("用户" + uname + "加入聊天室");

break;

//私聊

case Flag.COMMAND_SEND_CHAT_PRIVATE:

String toname = dis.readUTF();

String msg = dis.readUTF();

Server.sendToClient(toname, uname + "悄悄对你说: " + msg);

break;

//公聊

case Flag.COMMAND_SEND_CHAT_PUBLIC:

msg = dis.readUTF();

log.info("公聊: "+msg);

Server.sendToAll(uname + " 对大家说: " + msg);

break;

//游戏大厅列表

case Flag.COMMAND_GAME_ROOM:

msg = dis.readUTF();

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

DataOutputStream dos2 = new DataOutputStream(

st.client.getOutputStream());

dos2.writeInt(Flag.COMMAND_GAME_ROOM);

dos2.writeUTF(msg);

}

break;

//发送地图

case Flag.COMMAND_GAME_CREATEMAP:

for (int i = 0; i < map.length; i++) { //结收地图

System.out.println();

for (int j = 0; j < map[i].length; j++) {

map[i][j] = dis.readInt();

System.out.print(map[i][j] + "\t");

}

}

for (int k = 0; k < Server.clints.size(); k++) {

ServerThread st = (ServerThread) Server.clints

.get(k);

DataOutputStream dos3 = new DataOutputStream(

st.client.getOutputStream());

dos3.writeInt(Flag.COMMAND_GAME_CREATEMAP);

for (int i = 0; i < map.length; i++) { //发送地图

// System.out.println();

for (int j = 0; j < map[i].length; j++) {

dos3.writeInt(map[i][j]);

// System.out.print(map[i][j] + "\t");

}

}

}

break;

//退出游戏大厅

case Flag.COMMAND_GAME_EXITROOM:

String liveName = dis.readUTF();

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

DataOutputStream dos2 = new DataOutputStream(

st.client.getOutputStream());

dos2.writeInt(Flag.COMMAND_GAME_EXITROOM);

dos2.writeUTF(liveName);

}

break;

//开始游戏

case Flag.COMMAND_GAME_GAMESTART:

boolean play=dis.readBoolean();

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

DataOutputStream dos2 = new DataOutputStream(

st.client.getOutputStream());

dos2.writeInt(Flag.COMMAND_GAME_GAMESTART);

dos2.writeBoolean(play);

}

break;

case Flag.COMMAND_GAME_ANSER:

String userName=dis.readUTF();

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

DataOutputStream dos2 = new DataOutputStream(

st.client.getOutputStream());

dos2.writeInt(Flag.COMMAND_GAME_ANSER);

dos2.writeUTF(userName);

}

//游戏结束

case Flag.COMMAND_GAME_GAMECOMPLETE:

String outName=dis.readUTF();

counterFlag=dis.readBoolean(); //设置计时器终止标志

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

DataOutputStream dos2 = new DataOutputStream(

st.client.getOutputStream());

dos2.writeInt(Flag.COMMAND_GAME_GAMECOMPLETE);

dos2.writeUTF(outName);

}

break;

//游戏计时

case Flag.COMMAND_GAME_TIMECOUNT:

int time = 0;

while (counterFlag) {

try {

Thread.sleep(1000);

} catch (InterruptedException ex) {

ex.printStackTrace();

}

time++;

for (int i = 0; i < Server.clints.size(); i++) {

ServerThread st = (ServerThread) Server.clints

.get(i);

DataOutputStream dos2 = new DataOutputStream(

st.client.getOutputStream());

dos2.writeInt(Flag.COMMAND_GAME_TIMECOUNT);

dos2.writeInt(time);

}

}

break;

}

} catch (Exception ex) {

ex.printStackTrace();

Server.clints.remove(this);

isRun = false;

for (int i = 0; i < Server.clints.size(); i++) {

try {

ServerThread st = (ServerThread) Server.clints

.get(i);

DataOutputStream dos1 = new DataOutputStream(

st.client.getOutputStream());

dos1.writeInt(Flag.COMMAND_SEND_USERLOGOUT);

dos1.writeUTF(uname);

} catch (Exception e) {

e.printStackTrace();

}

}

Server.sendToAll("用户" + uname + "离开聊天室");

}

}

}

}

package org.jzy.shudu;

import java.awt.MenuItem;

import org.jzy.shudu.Flag;

import java.io.DataInputStream;

import java.io.ObjectInputStream;

import java.net.Socket;

import java.util.Timer;

import java.util.TimerTask;

import javax.swing.DefaultListModel;

import javax.swing.JButton;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import org.apache.log4j.Logger;

public class ClientThread extends Thread {

private static final Logger log = Logger.getLogger(ClientThread.class);

public int[][] serverMap = new int[9][9];

Socket client;

DataInputStream dis;

JList onlineUserLIst;

JList msgList;

JList gameRoom;

JLabel gameTimer;

ShuDuJFrame sdf;

MapPanel mapPanel;

JButton createGame;

public ClientThread(Socket client, JList onlineUserLIst, JList msgList, JList gameRoom, JLabel gameTimer, ShuDuJFrame sdf, MapPanel mapPanel, JButton createGame) {

try {

this.client = client;

this.onlineUserLIst = onlineUserLIst;

this.msgList = msgList;

this.gameRoom = gameRoom;

this.gameTimer = gameTimer;

this.sdf = sdf;

this.mapPanel = mapPanel;

this.createGame = createGame;

dis = new DataInputStream(client.getInputStream());

} catch (Exception ex) {

ex.printStackTrace();

}

}

@Override

public void run() {

while (true) {

try {

int command = dis.readInt();

switch (command) {

// 发送用户列表

case Flag.COMMAND_SEND_USERLIST:

int ucounter = dis.readInt();

for (int i = 0; i < ucounter; i++) {

String name = dis.readUTF();

DefaultListModel model = (DefaultListModel) onlineUserLIst

.getModel();

model.addElement(name);

}

break;

//�聊天������������������

case Flag.COMMAND_CHAT:

String msg = dis.readUTF();

DefaultListModel model = (DefaultListModel) msgList.getModel();

model.addElement(msg);

break;

//��新用户

case Flag.COMMAND_SEND_NEWUSER:

String newUName = dis.readUTF();

model = (DefaultListModel) onlineUserLIst.getModel();

model.addElement(newUName);

break;

//用户离线

case Flag.COMMAND_SEND_USERLOGOUT:

String logoutName = dis.readUTF();

model = (DefaultListModel) onlineUserLIst.getModel();

model.removeElement(logoutName);

model = (DefaultListModel) gameRoom.getModel();

model.removeElement(logoutName);

break;

//游戏大厅列表

case Flag.COMMAND_GAME_ROOM:

String roomUser = dis.readUTF();

model = (DefaultListModel) gameRoom.getModel();

model.addElement(roomUser);

createGame.setEnabled(false);

break;

//创建地图

case Flag.COMMAND_GAME_CREATEMAP:

for (int i = 0; i < serverMap.length; i++) {

for (int j = 0; j < serverMap[i].length; j++) {

serverMap[i][j] = dis.readInt();

}

}

mapPanel.map = serverMap;

for (int i = 0; i < 9; i++) { //清空playmap中保存的上次地图,以供下次使用(初始化)

for (int j = 0; j < 9; j++) {

mapPanel.playmap[i][j]=0;

}

}

if (mapPanel.play) { //保护生成的地图,使他不能被用户改变

mapPanel.playsk = new ShuDu();

mapPanel.playmap = new int[9][9];

for (int i = 0; i < 9; i++) {

for (int j = 0; j < 9; j++) {

mapPanel.playmap[i][j] = mapPanel.map[i][j];

}

}

// mapPanel.playsk.initMap(mapPanel.playmap);

}

mapPanel.repaint();

break;

//离开游戏

case Flag.COMMAND_GAME_EXITROOM:

String livetName = dis.readUTF();

model = (DefaultListModel) gameRoom.getModel();

model.removeElement(livetName);

model = (DefaultListModel) msgList.getModel();

model.addElement(livetName + " 离开游戏大厅!");

JOptionPane.showMessageDialog(mapPanel, livetName + " 离开游戏大厅");

break;

//游戏计时

case Flag.COMMAND_GAME_TIMECOUNT:

final int time = dis.readInt();

String timeCount = "用时:" + time + "秒";

gameTimer.setText(timeCount);

break;

//游戏开始

case Flag.COMMAND_GAME_GAMESTART:

boolean play = dis.readBoolean();

JOptionPane.showMessageDialog(mapPanel, "游戏开始");

mapPanel.play = play;

break;

//游戏结束

case Flag.COMMAND_GAME_GAMECOMPLETE:

String userName = dis.readUTF();

JOptionPane.showMessageDialog(mapPanel, userName + " 完成游戏");

break;

case Flag.COMMAND_GAME_ANSER:

String liveName = dis.readUTF();

JOptionPane.showMessageDialog(mapPanel, liveName + " 投降退出游戏");

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

}

}

99c3b39d409c33f52cacf5f9e3366ee0.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值