91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行基于以太坊的Pokemon游戲開發實戰

發布時間:2021-12-24 09:45:51 來源:億速云 閱讀:88 作者:柒染 欄目:互聯網科技

今天就跟大家聊聊有關如何進行基于以太坊的Pokemon游戲開發實戰,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

我們將學習如何開發一個基于ERC721的妖怪戰斗小游戲,它類似于去中心化版本的Pokémon游戲。教程中使用的開發工具為Truffle,開發語言為Solidity,第三方庫為OpenZeppelin。

1、創建ERC721版本的Pokémon游戲項目

我們使用Truffle開發框架創建這個基于ERC721的Pokemon游戲項目。

首先創建一個新的文件夾,然后初始化Truffle項目:

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

2、使用OpenZeppelin成熟的ERC721合約實現代碼

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

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

3、擴展OpenZeppelin的ERC721合約

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

下面的代碼展示了目前為止Ethermon.sol的內容:

pragma solidity ^0.5.5;

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

contract Ethermon is ERC721 {
    
}

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

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

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

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

4、編寫ERC721版Pokemon的實現邏輯

我們需要Ethermon合約實現如下功能:

  • 創建新的妖怪

  • 將妖怪分配給主人

  • 主人可以安排妖怪戰斗

讓我們先實現第一個功能。我們需要在Ethermon合約中用一個數組保存所有的妖怪。需要保存的妖怪相關的數據包括名字、級別等。因此我們使用一個結構。

到目前為止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結構在第7行定義,數組在第12行定義。我們也添加了一個gameOwner變量來保存Ethermon合約的部署賬戶。第19行開始是createNewMonster()函數的實現,該函數負責創建新的妖怪。

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

_safeMint() 是我們繼承的ERC721合約中實現的函數。它可以安全地將一個ID分配給指定的賬號,在分配之前會檢查ID是否已經存在。

好了,現在我們已經可以創建新的妖怪并將其分配給指定的賬號。該進行第三步了:戰斗邏輯。

5、ERC721版Pokemon游戲的戰斗邏輯實現

正如之前所述,我們的戰斗邏輯決定了一個妖怪可以晉升多少等級。較高等級的妖怪可以獲勝并升兩級,失敗的妖怪升一級。如果兩個妖怪處于同一等級,那么進攻者獲勝。下面的代碼展示了合約中戰斗邏輯的實現:

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行開始展示了妖怪的戰斗邏輯。目前任何賬號都可以調用battle()方法。然而我們需要對此加以限制,只允許發起進攻的妖怪的主人調用該方法。為此,我們可以添加一個修飾符,該修飾符利用ERC721.sol合約中的ownerOf()函數來檢查調用賬號。下面的代碼展示了這部分的修改:

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的妖怪戰斗游戲,雖然還很粗糙!

看完上述內容,你們對如何進行基于以太坊的Pokemon游戲開發實戰有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤庆县| 哈尔滨市| 永城市| 石林| 英吉沙县| 秀山| 南丰县| 无极县| 达州市| 宾阳县| 许昌市| 甘泉县| 白山市| 南丹县| 彭阳县| 克什克腾旗| 韩城市| 虹口区| 宜兴市| 荔浦县| 治县。| 海丰县| 华阴市| 连州市| 筠连县| 宜昌市| 濉溪县| 南和县| 习水县| 丰顺县| 运城市| 永宁县| 荔浦县| 辉南县| 惠水县| 多伦县| 定结县| 涟水县| 雷波县| 迭部县| 庄河市|