中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

如何進(jìn)行基于以太坊的Pokemon游戲開(kāi)發(fā)實(shí)戰(zhàn)

今天就跟大家聊聊有關(guān)如何進(jìn)行基于以太坊的Pokemon游戲開(kāi)發(fā)實(shí)戰(zhàn),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信平臺(tái)小程序開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。核心團(tuán)隊(duì)均擁有互聯(lián)網(wǎng)行業(yè)多年經(jīng)驗(yàn),服務(wù)眾多知名企業(yè)客戶;涵蓋的客戶類(lèi)型包括:成都衛(wèi)生間隔斷等眾多領(lǐng)域,積累了大量豐富的經(jīng)驗(yàn),同時(shí)也獲得了客戶的一致稱(chēng)揚(yáng)!

我們將學(xué)習(xí)如何開(kāi)發(fā)一個(gè)基于ERC721的妖怪戰(zhàn)斗小游戲,它類(lèi)似于去中心化版本的Pokémon游戲。教程中使用的開(kāi)發(fā)工具為T(mén)ruffle,開(kāi)發(fā)語(yǔ)言為Solidity,第三方庫(kù)為OpenZeppelin。

1、創(chuàng)建ERC721版本的Pokémon游戲項(xiàng)目

我們使用Truffle開(kāi)發(fā)框架創(chuàng)建這個(gè)基于ERC721的Pokemon游戲項(xiàng)目。

首先創(chuàng)建一個(gè)新的文件夾,然后初始化Truffle項(xiàng)目:

~$ mkdir ethermon
~$ cd ethermon/
~/ethermon$ truffle init

2、使用OpenZeppelin成熟的ERC721合約實(shí)現(xiàn)代碼

為了使用OpenZepplin,我們需要利用npm導(dǎo)入這個(gè)庫(kù)。讓我們先初始化npm,然后獲取正確版本的OpenZeppelin。我們使用的是2.5.0版本的OpenZeppelin,因此你需要使用0.5.5版本的Solidity編譯器:

~/ethermon$ npm init
~/ethermom$ npm install @openzeppelin/contracts@2.5.0 --save

3、擴(kuò)展OpenZeppelin的ERC721合約

在我們的contracts/文件夾,先創(chuàng)建一個(gè)新的文件ethermon.sol。要使用OpenZeppelin代碼中的功能,我們需要引入并擴(kuò)展ERC721.sol。

下面的代碼展示了目前為止Ethermon.sol的內(nèi)容:

pragma solidity ^0.5.5;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract Ethermon is ERC721 {
    
}

首先使用truffle compile檢查并確保我們的合約可以正確編譯。接下來(lái),我們編寫(xiě)遷移腳本以便將合約部署到本地區(qū)塊鏈。在migrations/目錄 創(chuàng)建一個(gè)新的遷移文件2_deploy_contracts.js,內(nèi)容如下:

const Ethermon = artifacts.require("Ethermon");

module.exports = function(deployer) {
	deployer.deploy(Ethermon);
};

確保你的truffle-config.js的配置可以正確連接本地區(qū)塊鏈,你可以使用truffle test先測(cè)試一下。

4、編寫(xiě)ERC721版Pokemon的實(shí)現(xiàn)邏輯

我們需要Ethermon合約實(shí)現(xiàn)如下功能:

  • 創(chuàng)建新的妖怪

  • 將妖怪分配給主人

  • 主人可以安排妖怪戰(zhàn)斗

讓我們先實(shí)現(xiàn)第一個(gè)功能。我們需要在Ethermon合約中用一個(gè)數(shù)組保存所有的妖怪。需要保存的妖怪相關(guān)的數(shù)據(jù)包括名字、級(jí)別等。因此我們使用一個(gè)結(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行定義。我們也添加了一個(gè)gameOwner變量來(lái)保存Ethermon合約的部署賬戶。第19行開(kāi)始是createNewMonster()函數(shù)的實(shí)現(xiàn),該函數(shù)負(fù)責(zé)創(chuàng)建新的妖怪。

首先,它會(huì)檢查這個(gè)函數(shù)是否是由合約的部署賬號(hào)調(diào)用的。然后為新妖怪生成一個(gè)ID,并將新妖怪存入數(shù)組,最后使用_safeMint()函數(shù)將這個(gè)新創(chuàng)建的妖怪分配給其主人。

_safeMint() 是我們繼承的ERC721合約中實(shí)現(xiàn)的函數(shù)。它可以安全地將一個(gè)ID分配給指定的賬號(hào),在分配之前會(huì)檢查ID是否已經(jīng)存在。

好了,現(xiàn)在我們已經(jīng)可以創(chuàng)建新的妖怪并將其分配給指定的賬號(hào)。該進(jìn)行第三步了:戰(zhàn)斗邏輯。

5、ERC721版Pokemon游戲的戰(zhàn)斗邏輯實(shí)現(xiàn)

正如之前所述,我們的戰(zhàn)斗邏輯決定了一個(gè)妖怪可以晉升多少等級(jí)。較高等級(jí)的妖怪可以獲勝并升兩級(jí),失敗的妖怪升一級(jí)。如果兩個(gè)妖怪處于同一等級(jí),那么進(jìn)攻者獲勝。下面的代碼展示了合約中戰(zhàn)斗邏輯的實(shí)現(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行開(kāi)始展示了妖怪的戰(zhàn)斗邏輯。目前任何賬號(hào)都可以調(diào)用battle()方法。然而我們需要對(duì)此加以限制,只允許發(fā)起進(jìn)攻的妖怪的主人調(diào)用該方法。為此,我們可以添加一個(gè)修飾符,該修飾符利用ERC721.sol合約中的ownerOf()函數(shù)來(lái)檢查調(diào)用賬號(hà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);
    }
}

好了!我們完成了一個(gè)ERC721版本的類(lèi)似Pokemon的妖怪戰(zhàn)斗游戲,雖然還很粗糙!

看完上述內(nèi)容,你們對(duì)如何進(jìn)行基于以太坊的Pokemon游戲開(kāi)發(fā)實(shí)戰(zhàn)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

當(dāng)前文章:如何進(jìn)行基于以太坊的Pokemon游戲開(kāi)發(fā)實(shí)戰(zhàn)
文章網(wǎng)址:http://www.rwnh.cn/article0/pcohoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站微信公眾號(hào)、外貿(mào)網(wǎng)站建設(shè)、微信小程序、ChatGPT、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
美姑县| 辽阳县| 赣榆县| 宣恩县| 文昌市| 城市| 开化县| 辰溪县| 利辛县| 麻城市| 兴仁县| 鄂尔多斯市| 靖边县| 抚州市| 武鸣县| 湟中县| 吉林省| 玛纳斯县| 麟游县| 河南省| 平舆县| 延庆县| 蓝田县| SHOW| 大宁县| 隆化县| 双峰县| 长岭县| 南汇区| 万盛区| 区。| 历史| 长丰县| 长沙市| 获嘉县| 稷山县| 双江| 襄汾县| 西乡县| 沁水县| 罗江县|