iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0

昨天的傳值成功的 patch 展示完、發完文之後,目前為止只累積了一點點的進展。

從座標改成單一數值

座標傳到 web_server,也還得作為代理人跟遊戲伺服器溝通接下來的著手為何,這樣太麻煩了。所以這個 patch 先試試看 javascript 端的計算能不能用。

原本是傳遞兩個有號整數,改成傳遞一個單一位元組(u8),很 OK。

分別處理疫途的兩個棋盤

接下來補上的這個 patch,主要功能就是直接在前端將座標值換算成選點值。先前不確定介紹過沒有,代理人一次只對遊戲伺服器傳遞一個位元組的資料,其中若是 0~36 的數值就是棋盤上的著點,若是 100~125 就是羅盤上的著點,其他還有些特殊的值略過不提。幸好當初沒有自作聰明,讓遊戲引擎裡面內建標準回合內階段的狀態去解析不同時候的 0~25 分別代表棋盤或是羅盤。

總之,因為在前端的部份為兩個棋盤註冊了不同的事件處理程式,所以理所當然可以在 handleClick6x6 做棋盤座標的換算,而在 handleClick5x5 做羅盤座標的換算,如,

    function handleClick6x6(cell) {
        console.log(`6x6 Grid clicked at (${cell.dataset.row}, ${cell.dataset.col})`);
        const c = Number(6*(cell.dataset.row)) + Number(cell.dataset.col);
        const payload = JSON.stringify({ coord: c });

        fetch('/click', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: payload,
        })
        .then(response => response.text())
        .then(data => {
            console.log('Server response:', data);
        })
        .catch((error) => {
            console.error('Error:', error);
        });
    }

    // Handle click on the 5x5 grid
    function handleClick5x5(row, col) {
        console.log(`5x5 Grid clicked at (${row}, ${col})`);
        const c = 5*(row + 2) + (col + 2) + 100;
        const payload = JSON.stringify({ coord: c });

        fetch('/click', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: payload,
        })
        .then(response => response.text())
        .then(data => {
            console.log('Server response:', data);
        })
        .catch((error) => {
            console.error('Error:', error);
        });
    }

兩個事件處理程式的標頭不同,也是延續自當時讀譜程式一邊在 javascript 裡面做實驗的結果,但沒有什麼核心的差別。

在遊戲迴圈裡面也可以直接使用這個回傳的值來遊玩,外面那一整套製造虛擬著手的 c 值就可以刪去了。

                if let Ok(c) = click_rx.recv() {
                    println!("Received {} from web interface.", c);
+                    stream.write(&[c])?;
                }
-                stream.write(&[c])?;

另外,一開始以為先代換 app.js 的部份就足夠,但為了讓它顯示,還是 index.html 也帶了過來;而由於網頁部份的邏輯已然不同,所以連 web_server 部份也修正了路徑與服務的位址


        App::new()
            .app_data(click_tx_data.clone())
            .service(receive_click)
-            .service(fs::Files::new("/", "./static").index_file("index.html"))
+            .route("/", web::get().to(index))
+            .service(fs::Files::new("/static", "static").show_files_listing())
    })
    .bind(("127.0.0.1", 8080))
    .expect("Can not bind to port 8080")

但是如果用這個狀態去開,則會發現還是空蕩蕩的棋盤,因為顯示部份還沒有做,回饋也不夠,無法知道如何下。

希望這是明天可以處理掉的內容。


上一篇
對戰網頁實作:多串一點點
系列文
DeltaPathogen:國產雙人不對稱抽象棋「疫途」之桌遊 AI 實戰26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言