iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

這篇我們要來實作Player1ChessGame的程式,這邊會是放主要功能的地方


Player1ChessGame

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player1_chess_game);

        tv_show_room_number = findViewById(R.id.tv_show_room_number);
        tv_message = findViewById(R.id.tv_message);
        tv_systemMessage = findViewById(R.id.tv_systemMessage);
        tv_moveData = findViewById(R.id.tv_moveData);
        btn_back = findViewById(R.id.btn_back);
        btn_setting = findViewById(R.id.btn_setting);
        grid_playerChessboard = findViewById(R.id.grid_playerChessboard);
        grid_playerChessman = findViewById(R.id.grid_playerChessman);
        grid_playerChessmanSelect = findViewById(R.id.grid_playerChessmanSelect);
        

        // 取得上個頁面的資料
        getLastPageData();
        // 設置返回功能
        back();
        // 設置"設置"功能
        setting();
        // 先取得一次資料庫中的資料
        dbp.getData(roomNumber);
        // 設置房間號碼
        tv_show_room_number.setText(roomNumber);
        // 創建棋盤
        createBoard.createChessboard(grid_playerChessboard,colorList);
        // 設置資料變動監聽器
        listenConversations();
    }

dbp是DatabasePresenter類的變數,用來調用我們定義的修改資料庫的方法,需要先創建變數:

private DatabasePresenter dbp = new DatabasePresenter(this);

接著要implements DatabaseContract.view:

public class Player1ChessGame extends AppCompatActivity implements DatabaseContract.view

最後需要實作回調的四種方法:

public void addSuccess(){
        Log.d("TAG", "資料上傳成功");
    }
    public void addError(){
        Log.d("TAG", "資料上傳失敗");
    }
    public void getSuccess(String getId,
                           String getRoomNumber,
                           Boolean getPlayer1OnlineState,
                           Boolean getPlayer2OnlineState,
                           String getMoveState,
                           HashMap<String,Object> getChessboardData,
                           HashMap<String,Object> getChessmanMoveData,
                           String getTurn,
                           HashMap<String,Object> getPawnMove1,
                           HashMap<String,Object> getPawnMove2,
                           HashMap<String,Object> getCastlingMove1,
                           HashMap<String,Object> getCastlingMove2,
                           String getDate,
                           String getPlayer1message,
                           String getPlayer2message,
                           String getWinPlayer){
        Log.d("TAG", "資料獲取成功");
	// 回調的變數對應到全域變數
        roomKey = getId;
        player1OnlineState = getPlayer1OnlineState;
        player2OnlineState = getPlayer2OnlineState;
        moveState = getMoveState;
        chessboardData = getChessboardData;
        chessmanMoveData = getChessmanMoveData;
        turn = Integer.parseInt(getTurn);
        pawnMove1 = getPawnMove1;
        pawnMove2 = getPawnMove2;
        castlingMove1 = getCastlingMove1;
        castlingMove2 = getCastlingMove2;
        date = getDate;
        player1message = getPlayer1message;
        player2message = getPlayer2message;
        winPlayer = getWinPlayer;
    }
    public void getError(){
        Log.d("TAG", "資料獲取失敗");
    }
    public void uploadSuccess(){
        Log.d("TAG", "資料修改成功");
    }
    public void uploadError(){
        Log.d("TAG", "資料修改失敗");
    }
    public void deleteSuccess(){
        Log.d("TAG", "資料刪除成功");
    }
    public void deleteError(){
        Log.d("TAG", "資料刪除失敗");
    }

除了綁定先前layout的元件,我們可以先增加幾個function:

  • getLastPageData(): 取得上個頁面的資料
  • back(): 設置返回功能
  • setting(): 設置"設置"功能
  • createBoard.createChessboard(): 創建棋盤
  • listenConversations(): 設置資料變動監聽器

getLastPageData()

public void getLastPageData(){
        roomKey = getIntent().getStringExtra("roomKey");
        musicList = getIntent().getIntegerArrayListExtra("musicData");
        colorList = getIntent().getIntegerArrayListExtra("colorData");
        gameMode = getIntent().getStringExtra("gameMode");
        if(getIntent().getStringExtra("RoomNumber") != null){
            roomNumber = getIntent().getStringExtra("RoomNumber");
        }
        if(getIntent().getStringExtra("room_number") != null){
            roomNumber = getIntent().getStringExtra("room_number");
        }
    }

back()

public void back(){
        btn_back.setOnClickListener(v -> {
            dialogData.showExitDialog("確定退出對局?","確定","取消");
        });
    }

setting()

public void setting(){
        btn_setting.setOnClickListener(v -> {
            // 跳出設置對話框
            showSettingDialog();
        });
    }

createChessboard():

我們在先前的CreateBoardData.class中加上一個function,用來創建棋盤最外圍部分

private ArrayList<TextView> chessboard = new ArrayList<>();
private String[] board_coordinate;
public void createChessboard(GridLayout grid_playerChessboard,
                                 ArrayList colorList){
        // 創建棋盤(最外圍,包括座標)
        // 設定GridLayout的列數和行數
        grid_playerChessboard.setColumnCount(10);
        grid_playerChessboard.setRowCount(10);

        // 動態建立Textview並添加到GridLayout中
        for (int i = 0; i < 100; i++) {
            chessboard.add(new TextView(activity));

            // 讀取螢幕大小,並根據大小調整按鈕比例
            DisplayMetrics displayMetrics = new DisplayMetrics();
            activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            int newWidth = (int) (displayMetrics.widthPixels * 0.1f);
            int newHeight = (int) (newWidth);
            int newMarginsWidth = (int) (displayMetrics.widthPixels * 0);
            int newMarginsHeight = (int) (newMarginsWidth);

            // 設定Textview的Layout參數
            GridLayout.LayoutParams params = new GridLayout.LayoutParams();
            params.width = newWidth;
            params.height = newHeight;
            params.setMargins(newMarginsWidth, newMarginsHeight, newMarginsWidth, newMarginsHeight);
            params.setGravity(Gravity.CENTER);

            // 設定Textview的列和行位置
            params.rowSpec = GridLayout.spec(i / 10);
            params.columnSpec = GridLayout.spec(i % 10);

            chessboard.get(i).setTypeface(null, Typeface.BOLD);
            chessboard.get(i).setGravity(Gravity.CENTER);

            if(colorList == null || colorList.size() == 0){
                colorList = new ArrayList();
                colorList.add(0);
            }

            // 設定棋盤顏色
            if((i % 20 == 11 || i % 20 == 13 || i % 20 == 15 || i % 20 == 17 ||
                    i % 20 == 2 || i % 20 == 4 || i % 20 == 6 || i % 20 == 8 )&& i > 10 && i < 89){
                chessboard.get(i).setBackgroundResource(colorData.light_color[(int)colorList.get(0)]);
            } else if (i < 10) {
                chessboard.get(i).setText(board_coordinate[i]);
                chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
                chessboard.get(i).setBackgroundResource(R.drawable.black);
            } else if (i >= 10 && i <= 89 && i % 10 == 0) {
                chessboard.get(i).setText(board_coordinate[9+i/10]);
                chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
                chessboard.get(i).setBackgroundResource(R.drawable.black);
            } else if (i >= 10 && i <= 89 && i % 10 == 9) {
                chessboard.get(i).setText(board_coordinate[17+(i - 9) / 10]);
                chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
                chessboard.get(i).setBackgroundResource(R.drawable.black);
            } else if (i > 89) {
                chessboard.get(i).setText(board_coordinate[26+i % 90]);
                chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
                chessboard.get(i).setBackgroundResource(R.drawable.black);
            } else {
                chessboard.get(i).setBackgroundResource(colorData.dark_color[(int)colorList.get(0)]);
            }

            // 將Textview添加到GridLayout中
            grid_playerChessboard.addView(chessboard.get(i),params);
        }
    }

傳入2個參數,包括:

  • Gridlayout: 創建10 X 10的棋盤盤面
  • ArrayList: 選擇的棋盤顏色樣式

監聽器以及設置選單的部分下一篇我們再做介紹及實作


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

尚未有邦友留言

立即登入留言