基於HTML5+WebSocket+JAVA的棋牌遊戲開發,從入門到放棄(三)
阿新 • • 發佈:2019-01-23
前言
之前我們已經完成了一個有房間的五指棋遊戲,現在我們將進一步來完善這個東西。這一次我們打算新增的功能有:
- 之前我們增加了房間,但並沒有限制房間只能進入2個人
- 增加一個守護執行緒,統計當前房間的數量,後面我們將繼續完善這個守護執行緒的功能。
- 展示上一個棋子落在何處
- 離開房間後會減少房間的人數,並回收房間
思考
第一個功能應該是發生在建立連線的時候,如果房間裡超過2人,則返回前端一個錯誤。
第二個我們需要建立一個新的執行緒。
第三個是一個純粹的前端開發工作,我們可以新增兩個圖片,並每次標記上一次的位置,當下一個子的時候,畫一個特殊的子,並用一張normal的子覆蓋上一個子。
第四個是發生在斷開連線的時候。
實現
第一個功能。
Room room = roomMap.get(roomId);
if (room.enterRoom(session)){
session.getUserProperties().put("roomId", roomId);
}else{
Result result = new Result();
result.setSuccess(false);
result.setErrMsg("進入房間失敗");
session.getBasicRemote().sendText (new Gson().toJson(result));
}
只要在進入房間失敗的時候返回一個錯誤資訊給前端即可。當然前端也要處理這個錯誤資訊咯。
第二個功能,建立一個簡單的Deamon,我們用一個context來傳入執行時的一些引數。
static {
RunContext context = new RunContext(roomMap);
DeamonThread deamonThread = new DeamonThread(context);
Thread dThread = new Thread(deamonThread);
System.out .println("Create Thread");
dThread.start();
}
我們可以在DeamonThread類中實現各種功能,例如每隔30s統計房間的總數。
public void run() {
while (true){
try{
System.out.println("RoomSize is[" + runContext.getRooms().size() + "]");
Thread.sleep(30000);
}catch (Exception e){
}
}
}
第三個是一個前端功能,我們新增了兩張新的圖片,用last_x, last_y來表示上一個棋子落在何處。一開始我們初始化為-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;
}
第四個,前面我們提到在onClose方法中,有可選的引數Session,我們可以通過這個Session來獲取到房間號。
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一張圖,現在的變成這樣了。。。
總結
我們又往前走了一步。這一次主要都是一些功能的完善吧。雖然還面臨著諸多問題,但沒事,我們可以慢慢地改進。
原始碼下載地址