iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0

這篇我們來實作firebase部分,先簡單看張圖來理解如何實現雙人連線的架構:

未命名

在一回合內,會發生4個動作:

  1. player1上傳自己移動的棋盤資料(chessboardData)
  2. player1、player2取得儲存在firebase的棋盤資料,並更新雙方的UI
  3. player2上傳自己移動的棋盤資料(chessboardData)
  4. player1、player2取得儲存在firebase的棋盤資料,並更新雙方的UI

我們利用雙方玩家的設備端上傳(uploadData),以及更新UI(getData)的過程,達成模擬雙人連線的效果

所以,設備端會需要實作新增(add)、取得(get)、上傳(upload)、刪除(delete)四種功能,本專案使用MVP架構中Contract及Presenter部分處理回調的資料
image


DatabasePresenter

  • presenter:
    首先設置firebase的變數,以及回調的變數
private FirebaseFirestore database = FirebaseFirestore.getInstance();
    private DatabaseContract.view callback;
    public DatabasePresenter(DatabaseContract.view view) {
        this.callback = view;
    }
  • addData:
    我們建立一個名為RoomData的集合,在集合中建立房間的各項資訊
@Override
    public void addData(String roomNumber,
                        Boolean player1OnlineState,
                        Boolean player2OnlineState,
                        String moveState,
                        HashMap<String,Object> chessboardData,
                        HashMap<String,Object> chessmanMoveData,
                        String turn,
                        HashMap<String,Object> pawnMove1,
                        HashMap<String,Object> pawnMove2,
                        HashMap<String,Object> castlingMove1,
                        HashMap<String,Object> castlingMove2,
                        String date,
                        String player1message,
                        String player2message,
                        String winPlayer){
        HashMap<String,Object> RoomData = new HashMap<>();
        RoomData.put("RoomNumber", roomNumber);
        RoomData.put("Player1OnlineState", player1OnlineState);
        RoomData.put("Player2OnlineState", player2OnlineState);
        RoomData.put("MoveState", moveState);
        RoomData.put("ChessboardData", chessboardData);
        RoomData.put("ChessmanMoveData", chessmanMoveData);
        RoomData.put("Turn", turn);
        RoomData.put("PawnMove1", pawnMove1);
        RoomData.put("PawnMove2", pawnMove2);
        RoomData.put("CastlingMove1", castlingMove1);
        RoomData.put("CastlingMove2", castlingMove2);
        RoomData.put("Date", date);
        RoomData.put("Player1message", player1message);
        RoomData.put("Player2message", player2message);
        RoomData.put("WinPlayer", winPlayer);
        new Thread(() -> {
            database.collection("RoomData")
                    .add(RoomData)
                    .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                        @Override
                        public void onSuccess(DocumentReference documentReference) {
                            callback.addSuccess();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            callback.addError();
                        }
                    });
        }).start();
    }

當中各參數意義:

  • RoomNumber: 本局房間號碼
  • Player1OnlineState: player1的上線狀態,上線設為true,未上限為false
  • Player2OnlineState: player2的上線狀態,上線設為true,未上限為false
  • MoveState: 當前移動方,white或black
  • ChessboardData: 棋盤資料,以座標對應棋子名稱的方式儲存當前盤面資料,EX: { "a1" : wP , "b2" : wN , ... }
  • ChessmanMoveData: 棋譜資料
  • Turn: 當前回合
  • PawnMove1: player1所有士兵的移動狀態,若初始有移動2步設為true,若初始移動1步設為false
  • PawnMove2: player2所有士兵的移動狀態,若初始有移動2步設為true,若初始移動1步設為false
  • CastlingMove1: player1國王與城堡的移動狀態,用於判斷是否允許王車易位,若城堡或國王移動過,則將該城堡或國王的座標設為false
  • CastlingMove2: player2國王與城堡的移動狀態,用於判斷是否允許王車易位,若城堡或國王移動過,則將該城堡或國王的座標設為false
  • Date: 創建房間的日期時間
  • Player1message: player1發送的訊息
  • Player2message: player2發送的訊息
  • WinPlayer: 本局勝利者,white或black

下一篇我們再介紹get方法


上一篇
【DAY 03】drawable - chessImage & ButtonStyle
下一篇
【DAY 05】firebase - DatabasePresenter & DatabaseContract - getData
系列文
基於Firebase整合生成式AI研究開發雙人國際象棋系統(Based on Firebase and AI to research chess system)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言