前言
之前我們已經(jīng)完成了一個(gè)有房間的五指棋游戲,現(xiàn)在我們將進(jìn)一步來完善這個(gè)東西。這一次我們打算新增的功能有:
- 之前我們?cè)黾恿朔块g,但并沒有限制房間只能進(jìn)入2個(gè)人
- 增加一個(gè)守護(hù)線程,統(tǒng)計(jì)當(dāng)前房間的數(shù)量,后面我們將繼續(xù)完善這個(gè)守護(hù)線程的功能。
- 展示上一個(gè)棋子落在何處
- 離開房間后會(huì)減少房間的人數(shù),并回收房間
思考
第一個(gè)功能應(yīng)該是發(fā)生在建立連接的時(shí)候,如果房間里超過2人,則返回前端一個(gè)錯(cuò)誤。
第二個(gè)我們需要?jiǎng)?chuàng)建一個(gè)新的線程。
第三個(gè)是一個(gè)純粹的前端開發(fā)工作,我們可以新增兩個(gè)圖片,并每次標(biāo)記上一次的位置,當(dāng)下一個(gè)子的時(shí)候,畫一個(gè)特殊的子,并用一張normal的子覆蓋上一個(gè)子。
第四個(gè)是發(fā)生在斷開連接的時(shí)候。
實(shí)現(xiàn)
第一個(gè)功能。
Room room = roomMap.get(roomId);
if (room.enterRoom(session)){
session.getUserProperties().put("roomId", roomId);
}else{
Result result = new Result();
result.setSuccess(false);
result.setErrMsg("進(jìn)入房間失敗");
session.getBasicRemote().sendText(new Gson().toJson(result));
}
只要在進(jìn)入房間失敗的時(shí)候返回一個(gè)錯(cuò)誤信息給前端即可。當(dāng)然前端也要處理這個(gè)錯(cuò)誤信息咯。
第二個(gè)功能,創(chuàng)建一個(gè)簡單的Deamon,我們用一個(gè)context來傳入運(yùn)行時(shí)的一些參數(shù)。
static {
RunContext context = new RunContext(roomMap);
DeamonThread deamonThread = new DeamonThread(context);
Thread dThread = new Thread(deamonThread);
System.out.println("Create Thread");
dThread.start();
}
我們可以在DeamonThread類中實(shí)現(xiàn)各種功能,例如每隔30s統(tǒng)計(jì)房間的總數(shù)。
public void run() {
while (true){
try{
System.out.println("RoomSize is[" + runContext.getRooms().size() + "]");
Thread.sleep(30000);
}catch (Exception e){
}
}
}
第三個(gè)是一個(gè)前端功能,我們新增了兩張新的圖片,用last_x, last_y來表示上一個(gè)棋子落在何處。一開始我們初始化為-1。
if (x >= 0 && x < 15 && y >= 0 && y < 15) {
if (chess == 1) {
if (last_x > 0 && last_y > 0){
context.drawImage(img_b, last_x * 40 + 20, last_y * 40 + 20);
}
context.drawImage(img_w_now, x * 40 + 20, y * 40 + 20);//繪制白棋
chessData[x][y] = 1;
}
else {
if (last_x > 0 && last_y > 0){
context.drawImage(img_w, last_x * 40 + 20, last_y * 40 + 20);
}
context.drawImage(img_b_now, x * 40 + 20, y * 40 + 20);
chessData[x][y] = 2;
}
judge(x, y, chess);
last_x = x;
last_y = y;
}
第四個(gè),前面我們提到在onClose方法中,有可選的參數(shù)Session,我們可以通過這個(gè)Session來獲取到房間號(hào)。
String roomId = (String)session.getUserProperties().get("roomId");
Room room = roomMap.get(roomId);
if (room != null){
room.leaveRoom(session);
if (room.getNowNumber() <= 0){
roomMap.remove(roomId);
}
}
System.out.println("Connection closed");
PO一張圖,現(xiàn)在的變成這樣了。。。

總結(jié)
我們又往前走了一步。這一次主要都是一些功能的完善吧。后面我們對(duì)一些功能繼續(xù)完善。
源代碼下載地址