java五子棋代码求解 50
五子棋代码和类图我会放在第一个回答的附件里已经有注释了拜托帮我分析一下每一个方法在程序中起什么作用每个类之间的关系...
五子棋代码和类图我会放在第一个回答的附件里
已经有注释了
拜托帮我分析一下每一个方法在程序中起什么作用
每个类之间的关系 展开
已经有注释了
拜托帮我分析一下每一个方法在程序中起什么作用
每个类之间的关系 展开
1个回答
展开全部
服务器
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);//可以分析创建服务器的每个具体步骤
System.out.println("服务器套接字已被创建.");//输出“服务器套接字已被创建”,并换行
while(true){
Socket socket=server.accept();//服务器启动
Omok_Thread ot=new Omok_Thread(socket);//构造Thread 创建Thread的对象
ot.start();//开始
bMan.add(ot);//增加
System.out.println("连接数: "+bMan.size());输出该函数,并换行
}
}catch(Exception e){//代码出现异常,异常在于Exception e
System.out.println(e); //函数将内容输出到屏幕上,并换行
}
}
public static void main(String[] args){//定义公有并静态的方法,返回该对象
OmokServer server=new OmokServer();//构造Server,创建内部类的对象
server.startServer();//服务器启动
}
class Omok_Thread extends Thread{//Omok_Thread继承Thread
private int roomNumber=-1;//局部变量
private String userName=null;//定义用户名为空
private Socket socket;//定义Socket socket
private boolean ready=false;//定义布莱尔类型 两边结果一样
private BufferedReader reader;//定义BufferedReaderreader
private PrintWriter writer;//定义private PrintWriter writer
Omok_Thread(Socket socket){//构造Thread(Socket socket)
this.socket=socket;//成员变量
}
Socket getSocket(){//创建一个新的客户端
return socket; //返回socket
}
int getRoomNumber(){//获取roomNumbe
return roomNumber;//返回roomNumber
}
String getUserName(){//返回由此抽象路径名表示的文件或目录的名称
return userName;//获取属性
}
boolean isReady(){//布莱尔类型
return ready; //返回ready
}
public void run(){//子类复写功能方法
try{//需要被检测的代码
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));//用于读取字符流的抽象类
writer=new PrintWriter(socket.getOutputStream(), true);//while循环语句创建静态对象
String msg;//msg不可变
while((msg=reader.readLine())!=null){//while循环语句,为空
if(msg.startsWith("[NAME]")){//如果输出为NAME就继续
userName=msg.substring(6);//用户名
}
else if(msg.startsWith("[ROOM]")){//该语句执行时,布尔表达式是假的
int roomNum=Integer.parseInt(msg.substring(6));//取整数函数
if( !bMan.isFull(roomNum)){//如果为假就停止
if(roomNumber!=-1)//如果为-1为真就继续
bMan.sendToOthers(this, "[EXIT]"+userName);//向指定目的地发送数据
roomNumber=roomNum;//roomNumber数据跟roomNum一样
writer.println(msg);//向客户端输出内容
writer.println(bMan.getNamesInRoom(roomNumber));//向客户端输出内容
bMan.sendToOthers(this, "[ENTER]"+userName);//向指定目的地发送数据
}
else writer.println("[FULL]");//否则输出"[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)){// if主导
int a=rnd.nextInt(2);//局部变量
if(a==0){//如果a为真就继续
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){//代码出现异常,异常在于Exception e
}finally{//一定会执行的代码
try{
bMan.remove(this);
if(reader!=null) reader.close();//如果reader不等于不等于空,reader关闭
if(writer!=null) writer.close();//如果writer不等于不等于空,writer关闭
if(socket!=null) socket.close();//如果socket不等于不等于空,socket关闭
reader=null; writer=null; socket=null;//reader为空,writer为空,socket为空
System.out.println(userName+"已断线.");//输出该函数,并换行
System.out.println("连接人数: "+bMan.size());//输出该函数,并换行
bMan.sendToRoom(roomNumber,"[DISCONNECT]"+userName);//
}catch(Exception e){}//可以写抛出的具体异常 }
}
}
class BManager extends Vector{//创建一个BManager
BManager(){}//一个类
void add(Omok_Thread ot){//对构造Thread函数加以说明
super.add(ot);//在指定的索引位插入元素
}
void remove(Omok_Thread ot){//对整数函数加以说明
super.remove(ot);//删除合集中指定对象
}
Omok_Thread getOT(int i){//构造Thread 转变路径
return (Omok_Thread)elementAt(i);//返回 构造Thread
}
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;//if判断 返回假
int count=0;//局部变量
for(int i=0;i<size();i++)//for循环
if(roomNum==getRoomNumber(i))count++;//if判断
if(count>=2)return true;//if判断 如果count>=2,则输出
return false;//两边结果一样
}
void sendToRoom(int roomNum, String msg){//对整数函数加以说明
for(int i=0;i<size();i++)//for循环
if(roomNum==getRoomNumber(i))//if判断
sendTo(i, msg);//指定目的地发送数据
}
void sendToOthers(Omok_Thread ot, String msg){//对构造的Thread加以说明
for(int i=0;i<size();i++)//for循环
if(getRoomNumber(i)==ot.getRoomNumber() && getOT(i)!=ot)//if判断
sendTo(i, msg);//向指定目的地发送数据
}
synchronized boolean isReady(int roomNum){//线程获得的是对象锁
int count=0;//局部变量
for(int i=0;i<size();i++)//for循环
if(roomNum==getRoomNumber(i) && getOT(i).isReady())//if判断
count++;
if(count==2)return true;//如果count=5,则输出
return false; // 两边结果一样
}
String getNamesInRoom(int roomNum){//逻辑层面
StringBuffer sb=new StringBuffer("[PLAYERS]");//示例说明
for(int i=0;i<size();i++)//for循环
if(roomNum==getRoomNumber(i))//if判断
sb.append(getOT(i).getUserName()+"\t");//增加用户名
return sb.toString();//结束以一个文本表示
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询