1. 程式人生 > >基於HTML5+WebSocket+JAVA的棋牌遊戲開發,從入門到放棄(三)

基於HTML5+WebSocket+JAVA的棋牌遊戲開發,從入門到放棄(三)

前言

之前我們已經完成了一個有房間的五指棋遊戲,現在我們將進一步來完善這個東西。這一次我們打算新增的功能有:

  • 之前我們增加了房間,但並沒有限制房間只能進入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一張圖,現在的變成這樣了。。。

遊戲介面

總結

我們又往前走了一步。這一次主要都是一些功能的完善吧。雖然還面臨著諸多問題,但沒事,我們可以慢慢地改進。
原始碼下載地址