0基礎從前端到Web3 —— Mine Clearance Frontend(二)

在一的基礎上繼續往下,本篇主要是鏈上調用部分,讓整個項目可以進行最基本的掃雷游戲。

S u i M o v e \mathit {Sui\ Move} Sui?Move 鏈上部署的自主實現的簡單掃雷游戲可以點擊查看,只不過這里將區域大小擴大為了 10? × 20 \text {10}\ \times\ \text {20} 10?×?20,更新了雷格判斷是否存在雷的邏輯使其不至于越界報錯,具體內容已經 p u s h \mathit {push} push 到了 G i t h u b \mathit {Github} Github,可以自行查看。

一:創建游戲

在前篇,點擊 G A M E \mathit {GAME} GAME 按鈕只是判斷了是否連接到了 S u i \mathit {Sui} Sui 錢包,在這里,我們往這個按鈕的點擊事件里額外調用兩個函數,一個是清空當前的游戲區域,因為可能殘存上一局的游戲內容,第二個則是鏈上調用,創建一局全新的游戲,并獲取返回的鏈上對象GameInfoID

1.1 ClearCheckerboard

回想前篇,我們是如何繪制雷格的?
將一個個按鈕組合成ButtonGroup再放到一起組合成 10? × 20 \text {10}\ \times\ \text {20} 10?×?20 的區域。
同理,想要改變每一個按鈕的內容,也需要通過循環取用加以修改。

為了讓功能更具有通用性,再來考慮鏈上調用后得到的游戲內容變化會以何種形式呈現?
S u i M o v e \mathit {Sui\ Move} Sui?Move 的合約代碼中會對每一次游戲點擊觸發一個事件,不管游戲成功、失敗還是繼續游戲,都會將最新的方格信息傳回來。前端通過這一事件獲得當前的雷區詳情,而這一信息會以一個字符串數組的形式呈現。

也就是說,我們需要構建一個內容為空的字符串數組,再將其視為當前雷區的實際情形對每一個按鈕的內容進行循環遍歷刪改。

function ChangeCheckerboard(checkerboard: any) {// console.log(checkerboard);// for (let row of checkerboard) {// 	console.log(row);// }const htmlCheckerboard = document.getElementById("Checkerboard")!.children[0].children;let i = 0, j = 0;for (let list of htmlCheckerboard) {// console.log(list);for (let row of list.children) {// console.log(row);// console.log(checkerboard[i][j]);const replace = checkerboard[i][j] !== "-" ? checkerboard[i][j] : " ";ChangeChess(row, replace);i += 1;}j += 1;i = 0;}
}function ChangeChess(html: Element, replace: string) {// console.log(html.innerHTML);const str1 = html.innerHTML.split('<', 1)[0];const str2 = html.innerHTML.substring(str1.length);html.innerHTML = replace.concat(str2);
}function ClearCheckerboard() {const checkerboard = [];for (let i = 0; i < MaxRow; i++) {let rowStr = "";for (let j = 0; j < MaxList; j++)rowStr = rowStr.concat("-");checkerboard.push(rowStr);}ChangeCheckerboard(checkerboard);HiddenFeedBack();
}

1.2 MoveCallStartGame

這個函數會在按鈕的點擊事件中被調用,如果到了那個時候再從一些SDK取值則會報錯,所以我們需要事先聲明,再通過參數的形式傳入。

const account = useCurrentAccount();
const { mutate: signAndExecuteTransactionBlock } = useSignAndExecuteTransactionBlock();
const [gameInfoID, setGameInfoID] = React.useState("");

通過前前篇的文章可以知道,這里的鏈上調用其實跟直接用 T y p e S c r i p t \mathit {TypeScript} TypeScript 來調用沒什么太大的區別,都是往TransactionBlock里面填充一筆筆交易信息,再signAndExecuteTransactionBlock簽名提交交易塊到鏈上執行,重點是如何對成功交易后返回的信息篩選處理,取得我們所需要的值。

首先,需要在signAndExecuteTransactionBlock中,將showObjectChanges設置為true,因為我們的目的是取得某一個對象的ID;接著可以通過onSuccess來截取返回的信息,如果不確定其結構,就將其console.log出來查看,最后不斷通過.層層深入取用。

function MoveCallStartGame(signAndExecuteTransactionBlock: any, setGameInfoID: any) {const txb = new TransactionBlock();const [coin] = txb.splitCoins(txb.gas, [666]);txb.moveCall({target: `${Package}::player::start_game`,arguments: [txb.object(GameCap),coin,]});signAndExecuteTransactionBlock({transactionBlock: txb,chain: `sui:$network`,options: {showObjectChanges: true,}},{onSuccess: (result: any) => {// console.log(result.objectChanges);for (let obj of result.objectChanges) {// console.log(obj);if (obj.type === "created") {// console.log(obj.objectId);setGameInfoID(obj.objectId);break;}}}});
}

一切順利的情況下,在編寫該按鈕點擊事件的函數當中,一個名為gameInfoID的變量就已經被設置成了我們所需要的值。

二:享受游戲

在前篇當中,雷區的按鈕點擊邏輯就是顯現一行提示語,再將其填充進 X \mathit {X} X,在這里,我們完善這一邏輯。

第一步,點擊相當于鏈上調用,其中有個關鍵的參數就是需要知道玩家點擊的是第幾行第幾列的方格。
在按鈕中,有一個button-key的屬性,可以通過點擊事件的event.target.getAttribute('button-key')取得,如果是其父節點則是const l = event.target.parentElement.getAttribute('button-key')
我們將這兩個值,按照按鈕排列方式,一個設成行,一個設成列(生成區域時從循環的i, j來賦值),此時取出轉換為數字類型傳參即可。

已知點擊過后的游戲區域的詳細信息會通過鏈上事件的方式觸發,那么這第二步就是從這信息當中截取我們所需要的,也就是從中找出存儲有雷區揭示情形的字符串數組,通過上面的方法將其顯現到前端。
看過該合約的一定也知道,一旦游戲成功或者失敗,是會額外觸發一個對應的事件的,這一點就可以用來判斷該顯示哪一句提示(勝利、繼續、失敗)。

function MoveCallGameClick(r: number, l: number, gameInfoID: string, signAndExecuteTransactionBlock: any) {const txb = new TransactionBlock();txb.moveCall({target: `${Package}::player::game_click`,arguments: [txb.pure(r),txb.pure(l),txb.object(gameInfoID),]});signAndExecuteTransactionBlock({transactionBlock: txb,chain: `sui:$network`,options: {showEvents: true,}},{onSuccess: (result: any) => {// console.log(result);let showed = false;for (let event of result.events) {if (event.type === GameEvent) {// console.log(event.parsedJson.checkerboard);ChangeCheckerboard(event.parsedJson.checkerboard);} else if (event.type === GameSuccessEvent) {ShowFeedBack("success_alert");showed = true;} else {ShowFeedBack("failure_alert");showed = true;}}if (!showed)ShowFeedBack("encourage_alert");}});
}

三:實機演示

在這里插入圖片描述

在這里插入圖片描述

四:加入組織,共同進步!

  • Sui 中文開發群(TG)
  • M o v e \mathit{Move} Move 語言學習交流群: 79489587

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/14418.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/14418.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/14418.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣Hot100-73矩陣置零(標記數組)

給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 輸入&…

大模型面試--大模型(LLMs)基礎面

大模型&#xff08;LLMs&#xff09;基礎面 1. 目前主流的開源模型體系有哪些&#xff1f; 目前主流的開源大模型體系有以下幾種&#xff1a; 1. Transformer 系列 Transformer 模型是深度學習中的一類重要模型&#xff0c;尤其在自然語言處理&#xff08;NLP&#xff09;領…

JavaWeb Sevelet學習 創建Sevelet程序

Servlet 是JavaWeb中的開發動態Web一門技術 是由Sun公司提供的一個接口&#xff0c;允許開發者編寫運行在服務器&#xff08;Tomcat&#xff09;上的Java程序&#xff0c;這些程序可以 生成動態網頁內容&#xff0c; 響應客戶端的請求。簡單來說&#xff0c;Servlet就是Java E…

今日arXiv最熱大模型論文:LoRA又有新用途,學得少忘得也少,成持續學習關鍵!

自大模型&#xff08;LLM&#xff09;誕生以來&#xff0c;苦于其高成本高消耗的訓練模式&#xff0c;學界和業界也在努力探索更為高效的參數微調方法。其中Low-Rank Adaptation&#xff08;LoRA&#xff09;自其誕生以來&#xff0c;就因其較低的資源消耗而受到廣泛關注和使用…

Spring MVC八股文面試題及參考答案(4萬字長文)

目錄 什么是Spring MVC? 解釋MVC模式及其在Spring MVC中的實現。 Spring MVC和Struts的區別是什么?

瑞芯微RV1126——交叉編譯與移植

一、搭建這個nfs服務掛載 (1) sudo apt install nfs-kernel-server (2) 然后在你的ubuntu創建一個nfs共享目錄&#xff1a; (3) sudo /etc/init.d/nfs-kernel-server restart 重啟nfs服務 (4) 修改配置文件: sudo vim /etc/exports 在這個配置文件里面添加&#xff1a;/hom…

C語言/數據結構——每日一題(設計循環隊列)

一.前言 上一次我們分享了關于隊列的基本實現——https://blog.csdn.net/yiqingaa/article/details/139033067?spm1001.2014.3001.5502 現在我們將使用隊列知識來解決問題——設計循環隊列&#xff1a;https://leetcode.cn/problems/design-circular-queue/submissions/533299…

50.WEB滲透測試-信息收集-CDN識別繞過(3)

免責聲明&#xff1a;內容僅供學習參考&#xff0c;請合法利用知識&#xff0c;禁止進行違法犯罪活動&#xff01; 內容參考于&#xff1a; 易錦網校會員專享課 上一個內容&#xff1a;49.WEB滲透測試-信息收集-CDN識別繞過&#xff08;2&#xff09; 關于cdn的識別方法內容…

Leecode熱題100--73:矩陣置零

題目&#xff1a; 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 C&#xff1a; 思路&#xff1a; 可以使用兩個數組來記錄哪些行和列需要被置零。 首先&#xff0c;我們遍歷整個矩陣&#xff0c;…

設計模式--享元模式

引言 享元模式&#xff08;Flyweight Pattern&#xff09;作為一種高效節省內存的結構型設計模式&#xff0c;其核心在于通過共享技術有效支持大量細粒度對象的重用&#xff0c;從而減少內存占用&#xff0c;提高系統性能。特別是在處理大量相似對象的場景下&#xff0c;享元模…

智慧監獄人員行為識別監測系統

智慧監獄人員行為識別監測系統是基于神經網絡AI視覺智能分析算法開發的技術。智慧監獄人員行為識別監測系統利用現場監控攝像頭&#xff0c;通過對人體活動骨架的結構化分析&#xff0c;根據人體運動軌跡定義了多種異常行為&#xff0c;從而實現對監舍內的靜坐不動、離床、攀高…

Tron節點監控腳本使用說明

文章目錄 一、配置二、腳本編寫2.1 Python腳本--監控節點是否正在同步2.1.1 pyton腳本腳本示例2.1.2 使用說明2.2.3 腳本監控內容說明 2.2 Shell腳本--綜合情況監控2.2.1 shell腳本示例2.2.2 使用說明2.2.3 腳本監控內容說明 最近搭建了TRON節點&#xff0c;為了防止節點在生產…

Mixiy(米思齊)安裝

Mixiy(米思齊)安裝 官網地址&#xff1a;愛上米思齊 打開官網&#xff0c;選擇下圖的軟件進行下載 復制提取碼&#xff0c;點擊鏈接跳轉到網盤進行下載&#xff0c;選擇(RC4完整版) 下載完成后&#xff0c;解壓到合適的位置&#xff0c;進入文件夾&#xff0c;雙擊Mixly.exe即…

Docker 部署Jenkins

1、運行鏡像 docker run --namejenkins \--restartalways \--privilegedtrue \-u root \-p 8080:8080 \-p 50000:50000 \-v /home/docker/jenkins/jenkins_home:/var/jenkins_home \-v /usr/bin/docker:/usr/bin/docker \-v /var/run/docker.sock:/var/run/docker.sock \-e TZ…

【Crypto】MD5

文章目錄 MD5解題感悟 MD5 提示的很明顯MD5 小小flag&#xff0c;拿下&#xff01; 解題感悟 沒啥感悟…

Java輸入與輸出詳解

Java輸入和輸出 前言一、Java打印Hello World二、輸出到控制臺基本語法代碼示例格式化字符串 三、從鍵盤輸入讀入一個字符正確寫法 使用 Scanner 讀取字符串/整數/浮點數使用 Scanner 循環讀取 N 個數字 前言 推薦一個網站給想要了解或者學習人工智能知識的讀者&#xff0c;這…

使用 Java 和 MyBatis 實現動態排序的多表查詢

相關 java實現一個根據字段和排序方式進行排序 java實現自定義排序 自定義動態排序 前言 在Web開發中&#xff0c;前端通常會傳遞一些參數來決定數據的排序方式&#xff0c;例如排序字段和排序方向。本文將展示如何在 Java 項目中結合 MyBatis 實現動態排序&#xff0c;尤其…

MySQL-性能分析

1、數據庫服務器的優化步驟 2、查看系統性能參數 可以使用show status語句查詢一些MySQL數據庫服務器的性能參數 執行頻率語法格式&#xff1a;show [ global | session ] status like 參數 &#xff1b;常用性能參數如下所示 參數名說明connection連接MySQL服務器的次數upti…

Autodesk 3ds Max下載,3ds MAX 2024三維建模渲染軟件安裝包下載安裝

3ds MAX中文版&#xff0c;其強大的功能和靈活的操作為廣大用戶提供了無限的創意空間&#xff0c;使得高質量動畫、最新游戲、設計效果等領域的制作需求得以完美滿足。 ? 作為一款三維建模軟件&#xff0c;3ds MAX中文版具備極高的建模精度和渲染質量。它支持多種建模方式&am…

【Fiddler抓包工具】第四節.斷點設置和弱網測試

文章目錄 前言一、斷點設置 1.1 全局斷點 1.2 局部斷點 1.3 打斷點的幾種常用命令 1.4 篡改響應報文二、弱網測試 2.1 網絡限速 2.2 精準限速總結 前言 一、斷點設置 1.1 全局斷點 特點&#xff1a; 中斷Fiddler捕獲的所有請求&#xff0c;包括…