📄 gobangroom.java
字号:
package com.j2medev.chapter5;
import java.util.ArrayList;
import java.util.List;
public class GoBangRoom implements Room {
private List players = new ArrayList();
public GoBangRoom() {
}
//最多容纳两个用户
public int maxPlayer() {
return 2;
}
public boolean canJoin() {
return players.size()<2;
}
//添加一个用户,如果达到两个用户则开始游戏
public synchronized void addPlayer(Session s) {
players.add(s);
s.setSessionId(players.size());
s.setRoom(this);
s.start();
if(players.size()== maxPlayer()){
//开始游戏,最先加入的用户先走
startGame(1);
}
}
private void clean(){
for(int i = 0;i<players.size();i++){
try{
((Session)players.get(i)).join();
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
for(int i = 0;i<players.size();i++){
((Session)players.get(i)).closeSession();
}
//等session结束后,清除房间
players.clear();
System.out.println("the room is clear");
}
public void startGame(int id){
//休眠1s
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
//让客户端起动
for(int i = 0;i<players.size();i++){
((Session)players.get(i)).startGame(id);
}
}
//代理客户端发送过来的数据
public synchronized void delegate(int data) {
int type = (data&0xFF000000)>>24;
int id = (data&0x00FF0000)>>16;
for(int i=0;i<players.size();i++){
Session s = (Session)players.get(i);
if(type == Protocol.QUIT || type == Protocol.WIN){
try {
//发送给所有用户
Thread.sleep(500);
s.send(data);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}else if(type == Protocol.STEP){
if(s.getSessionId() != id){
//对手走了一步,发给另一个用户
s.send(data);
}
}
}
//准备清理房间了
if(type == Protocol.QUIT || type == Protocol.WIN){
new Thread(){
public void run(){
clean();
}
}.start();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -