iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0

這篇我們將實作之前提到的監聽器,以偵測是否有資料變動並抓取


listenConversations

為了達成雙方玩家的資訊的交互,我們需要實時監測資料庫中的哪些值有被修改,雙方玩家都會去監聽資料庫,若當中移動方輪到白方,則黑方的行動都會被關閉,白方開啟,反之亦然

private void listenConversations(){
        // 創建資料庫監聽器
        database.collection("RoomData")
                .whereEqualTo("RoomNumber", roomNumber)
                .addSnapshotListener(eventListener);
    }
private final EventListener<QuerySnapshot> eventListener = (value, error) -> {
        if (error != null){
            return;
        }
        if (value != null){
            for (DocumentChange documentChange : value.getDocumentChanges()){
                if (documentChange.getType() == DocumentChange.Type.MODIFIED){
                    // 只要有資料變動,即抓取資料
                    dbp.getData(roomNumber);
                    // 如果是黑方的移動時間,將自己的移動按鈕關閉
                    if(documentChange.getDocument().getString("MoveState").equals("black")){
                        chessmanEnable = false;
                    }
                    // 如果是白方的移動時間,將自己的移動按鈕開啟
                    else{
                        chessmanEnable = true;
                    }
                    if(!gameMode.equals("ai")){
                        // 如果對方未上線,跳出對話框
                        if(documentChange.getDocument().getBoolean("Player2OnlineState") == false){
                            dialogData.showBackDialog("對方玩家未上線");
                        }
                        // 如果對方已上線,對話框消失
                        else{
                            dialogData.dismissBackDialog();
                        }
                    }
                    // 如果兩方都不在線上,則刪除此房間並結束頁面
                    if(documentChange.getDocument().getBoolean("Player1OnlineState") == false
                            && documentChange.getDocument().getBoolean("Player2OnlineState") == false){
                        dbp.deleteData(roomKey);
                        finish();
                    }
                    // 如果WinPlayer為白方則白方勝利
                    if(documentChange.getDocument().getString("WinPlayer").equals("white")){
                        dialogData.showBackDialog("白方勝利");
                    }
                    // 如果WinPlayer為黑方則黑方勝利
                    else if(documentChange.getDocument().getString("WinPlayer").equals("black")){
                        dialogData.showBackDialog("黑方勝利");
                    }
                }
            }
        }
    };

這樣我們就成功創建一個監聽器,並設定資料庫只要資料有變動就抓取資料,以達到更新變數及介面的功能


上一篇
【DAY 17】activity - Player1ChessGame - createChessboard
下一篇
【DAY 19】activity - Player1ChessGame - selectChessmanListen
系列文
基於Firebase整合生成式AI研究開發雙人國際象棋系統(Based on Firebase and AI to research chess system)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言