去中心化Pokemon游戏开发教程【以太坊】

简介: 在这个教程里,我们将学习如何开发一个基于ERC721的妖怪战斗小游戏,它类似于去中心化版本的Pokémon游戏。教程中使用的开发工具为Truffle,开发语言为Solidity,第三方库为OpenZeppelin。

在这个教程里,我们将学习如何开发一个基于ERC721的妖怪战斗小游戏,它类似于去中心化版本的Pokémon游戏。教程中使用的开发工具为Truffle,开发语言为Solidity,第三方库为OpenZeppelin。

用你熟悉的开发语言学习以太坊DApp开发:Java | Php | Python |.Net / C# |Golang |Node.JS |Flutter / Dart

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的妖怪战斗游戏,虽然还很粗糙!


原文链接:ERC721仿Pokémon游戏开发 — 汇智网

目录
相关文章
|
存储 前端开发 区块链
DAPP公链质押LP项目系统开发(成熟案例)|DAPP技术
去中心化应用的开发需要考虑到它们所提供的服务的特点catch(InvocationTargetException it)
|
存储 安全 区块链
BSC链DAPP智能合约系统开发|DAPP矩阵公排系统开发(成熟技术)
区块链系统开发采用了分布式账本技术public class SortList<E&gt
|
区块链 数据管理 安全
DeFi|Dapp去中心化质押LP项目开发(稳定版)(成熟技术)
智能合约的参与方通常是互联网上的陌生人 constructor()public
|
机器人 PyTorch 区块链
dapp/defi智能合约LP质押系统开发(开发说明)丨成熟技术及源码
 .The trading robot will automatically and continuously issue limit orders to profit from the price difference;
|
JSON 前端开发 JavaScript
马蹄链DAPP系统开发Matic智能合约
去中心化app可以由多个智能合约组成,每个智能合约都有各自的地址,类似于以太坊上的一个账户,可以存取以太币;
马蹄链DAPP系统开发Matic智能合约
|
Ubuntu 固态存储 网络安全
国王小组:数字货币交易所开发中使用的开源框架
永续合约/秒合约/合约交易所开发详情,永续合约/秒合约/合约交易所系统开发技术方案 深入分析代币合约流动性质押挖矿分红系统开发实现技术原理及源码部署 交易所系统开发如何开发?数字货币交易所系统开发成熟技术案例 去中心化交易所系统开发技术原理丨数字货币去中心化交易所系统开发(说明案例) 数字货币交易所系统 数字货币交易所系统开发成品案例 数字货币交易所现成源码部署 交易所系统开发案例说明丨数字货币交易所系统开发技术方案详情 数字货币交易所系统开发方案详细丨数字货币交易所开发成品技术源码 合约交易系统设计与开发|永续合约交易所搭建,合约平台开发|永续合约交易所开发技术|特点介绍
|
存储 算法 安全
BSC币安链DAPP智能合约系统开发方案(成熟技术)
BSC币安链DAPP智能合约系统开发方案(成熟技术)
171 0
|
存储 供应链 算法
区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
|
存储 供应链 算法
区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
|
安全 搜索推荐 区块链
BlockChain:《Blockchain Gate》听课笔记——区块链的共识机制—简介、理解、畅谈
BlockChain:《Blockchain Gate》听课笔记——区块链的共识机制—简介、理解、畅谈