今天就跟大家聊聊有關(guān)如何進行基于以太坊的Pokemon游戲開發(fā)實戰(zhàn),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、成都網(wǎng)站建設(shè)、微信開發(fā)、微信平臺小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。核心團隊均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗,服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類型包括:成都衛(wèi)生間隔斷等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗,同時也獲得了客戶的一致稱揚!
我們將學(xué)習(xí)如何開發(fā)一個基于ERC721的妖怪戰(zhàn)斗小游戲,它類似于去中心化版本的Pokémon游戲。教程中使用的開發(fā)工具為Truffle,開發(fā)語言為Solidity,第三方庫為OpenZeppelin。
我們使用Truffle開發(fā)框架創(chuàng)建這個基于ERC721的Pokemon游戲項目。
首先創(chuàng)建一個新的文件夾,然后初始化Truffle項目:
~$ mkdir ethermon ~$ cd ethermon/ ~/ethermon$ truffle init
為了使用OpenZepplin,我們需要利用npm導(dǎo)入這個庫。讓我們先初始化npm,然后獲取正確版本的OpenZeppelin。我們使用的是2.5.0版本的OpenZeppelin,因此你需要使用0.5.5版本的Solidity編譯器:
~/ethermon$ npm init ~/ethermom$ npm install @openzeppelin/contracts@2.5.0 --save
在我們的contracts/文件夾,先創(chuàng)建一個新的文件ethermon.sol。要使用OpenZeppelin代碼中的功能,我們需要引入并擴展ERC721.sol。
下面的代碼展示了目前為止Ethermon.sol的內(nèi)容:
pragma solidity ^0.5.5; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract Ethermon is ERC721 { }
首先使用truffle compile
檢查并確保我們的合約可以正確編譯。接下來,我們編寫遷移腳本以便將合約部署到本地區(qū)塊鏈。在migrations/目錄 創(chuàng)建一個新的遷移文件2_deploy_contracts.js,內(nèi)容如下:
const Ethermon = artifacts.require("Ethermon"); module.exports = function(deployer) { deployer.deploy(Ethermon); };
確保你的truffle-config.js的配置可以正確連接本地區(qū)塊鏈,你可以使用truffle test
先測試一下。
我們需要Ethermon合約實現(xiàn)如下功能:
創(chuàng)建新的妖怪
將妖怪分配給主人
主人可以安排妖怪戰(zhàn)斗
讓我們先實現(xiàn)第一個功能。我們需要在Ethermon合約中用一個數(shù)組保存所有的妖怪。需要保存的妖怪相關(guān)的數(shù)據(jù)包括名字、級別等。因此我們使用一個結(jié)構(gòu)。
到目前為止Ethermon合約的代碼如下所示:
pragma solidity ^0.5.5; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract Ethermon is ERC721 { struct Monster { string name; uint level; } Monster[] public monsters; address public gameOwner; constructor() public { gameOwner = msg.sender; } function createNewMonster(string memory _name, address _to) public { require(msg.sender == gameOwner, "Only game owner can create new monsters"); uint id = monsters.length; monsters.push(Monster(_name, 1)); _safeMint(_to, id); } }
Monster結(jié)構(gòu)在第7行定義,數(shù)組在第12行定義。我們也添加了一個gameOwner變量來保存Ethermon合約的部署賬戶。第19行開始是createNewMonster()函數(shù)的實現(xiàn),該函數(shù)負責(zé)創(chuàng)建新的妖怪。
首先,它會檢查這個函數(shù)是否是由合約的部署賬號調(diào)用的。然后為新妖怪生成一個ID,并將新妖怪存入數(shù)組,最后使用_safeMint()函數(shù)將這個新創(chuàng)建的妖怪分配給其主人。
_safeMint() 是我們繼承的ERC721合約中實現(xiàn)的函數(shù)。它可以安全地將一個ID分配給指定的賬號,在分配之前會檢查ID是否已經(jīng)存在。
好了,現(xiàn)在我們已經(jīng)可以創(chuàng)建新的妖怪并將其分配給指定的賬號。該進行第三步了:戰(zhàn)斗邏輯。
正如之前所述,我們的戰(zhàn)斗邏輯決定了一個妖怪可以晉升多少等級。較高等級的妖怪可以獲勝并升兩級,失敗的妖怪升一級。如果兩個妖怪處于同一等級,那么進攻者獲勝。下面的代碼展示了合約中戰(zhàn)斗邏輯的實現(xiàn):
pragma solidity ^0.5.5; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract Ethermon is ERC721 { struct Monster { string name; uint level; } Monster[] public monsters; address public gameOwner; constructor() public { gameOwner = msg.sender; } function battle(uint _attackingMonster, uint _defendingMonster) public { Monster storage attacker = monsters[_attackingMonster]; Monster storage defender = monsters[_defendingMonster]; if (attacker.level >= defender.level) { attacker.level += 2; defender.level += 1; } else{ attacker.level += 1; attacker.level += 2; } } function createNewMonster(string memory _name, address _to) public { require(msg.sender == gameOwner, "Only game owner can create new monsters"); uint id = monsters.length; monsters.push(Monster(_name, 1)); _safeMint(_to, id); } }
第19行開始展示了妖怪的戰(zhàn)斗邏輯。目前任何賬號都可以調(diào)用battle()方法。然而我們需要對此加以限制,只允許發(fā)起進攻的妖怪的主人調(diào)用該方法。為此,我們可以添加一個修飾符,該修飾符利用ERC721.sol合約中的ownerOf()函數(shù)來檢查調(diào)用賬號。下面的代碼展示了這部分的修改:
pragma solidity ^0.5.5; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; contract Ethermon is ERC721 { struct Monster { string name; uint level; } Monster[] public monsters; address public gameOwner; constructor() public { gameOwner = msg.sender; } modifier onlyOwnerOf(uint _monsterId) { require(ownerOf(_monsterId) == msg.sender, "Must be owner of monster to battle"); _; } function battle(uint _attackingMonster, uint _defendingMonster) public onlyOwnerOf(_attackingMonster) { Monster storage attacker = monsters[_attackingMonster]; Monster storage defender = monsters[_defendingMonster]; if (attacker.level >= defender.level) { attacker.level += 2; defender.level += 1; } else{ attacker.level += 1; attacker.level += 2; } } function createNewMonster(string memory _name, address _to) public { require(msg.sender == gameOwner, "Only game owner can create new monsters"); uint id = monsters.length; monsters.push(Monster(_name, 1)); _safeMint(_to, id); } }
好了!我們完成了一個ERC721版本的類似Pokemon的妖怪戰(zhàn)斗游戲,雖然還很粗糙!
看完上述內(nèi)容,你們對如何進行基于以太坊的Pokemon游戲開發(fā)實戰(zhàn)有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
當前文章:如何進行基于以太坊的Pokemon游戲開發(fā)實戰(zhàn)
文章網(wǎng)址:http://bm7419.com/article0/pcohoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、微信公眾號、外貿(mào)網(wǎng)站建設(shè)、微信小程序、ChatGPT、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)