链游开发:僵尸大战

本项目来源 https://cryptozombies.io/

0.前言

近期在关注NFT+游戏的相关资讯,决定实际操作一下,基于solidity和web3js,实现erc721协议,开发一个僵尸大战小游戏,在开发过程中,也学习学习solidity和web3js的相关知识。

本篇推文作为本系列的第一篇,主要实现了一个僵尸工厂,能够通过输入的字符串随机产生新的僵尸

1.重点知识

1.所有的 Solidity 源码都必须冠以 “version pragma” — 标明 Solidity 编译器的版本. 以避免将来新的编译器可能破坏你的代码。同时,Solidity 的代码都包裹在合约里面. 一份合约就是以太应币应用的基本模块, 所有的变量和函数都属于一份合约, 它是你所有应用的起点,一段简单的代码如下:

pragma solidity ^0.4.19;
contract ZombieFactory {

}

2.solidity中,状态变量是被永久地保存在合约中。 也就是说它们被写入以太币区块链中. 想象成写入一个数据库,声明变量(uint默认是uint256类型)。如下所示

uint myUnsignedInteger = 100;

3.solidity具有结构体,形式与c语言类似。同时,如果想建立一个集合,可以用数组类型,solidity支持动态和静态,因为以太坊高额的汽油费,所以普遍使用的动态数组,动态数组添加元素使用Push函数。可以用public声明公共数组,其它的合约可以从这个数组读取数据(但不能写入数据),所以这在合约中是一个有用的保存公共数据的模式。

// 固定长度为2的静态数组:
uint[2] fixedArray;
// 固定长度为5的string类型的静态数组:
string[5] stringArray;
// 动态数组,长度不固定,可以动态添加元素:
//给people动态数组添加Person元素
people.push(Person(16, "Vitalik"));
uint[] dynamicArray;
//声明公共数组
Person[] public people;

4.在 Solidity 中函数定义的句法如下:

function eatHamburgers(string _name, uint _amount) {

}

5.函数的更多知识:Solidity 定义的函数的属性默认为公共。 这就意味着任何一方 (或其它合约) 都可以调用你合约里的函数。而在函数名字后面使用关键字 private 可以定义为私有。和函数的参数类似,这意味着只有我们合约中的其它函数才能够调用这个函数。同时,函数还有修饰符,主要应用有两个,一个是view,意味着它只能读取数据不能更改数据: 还有pure, 表明这个函数甚至都不访问应用里的数据。具体如下:

//公共函数、具有返回值
string greeting = "What's up dog";

function sayHello() public returns (string) {
  return greeting;
}
//定义一个具有view修饰的函数
function sayHello() public view returns (string) {

}

//定义一个具有pure修饰的函数
function sayHello() public pure returns (string) {

}

6.散列函数:keccak256()函数接受一个字符串,生成一个段256位的16进制数字,字符串的一个微小变化会引起散列数据极大变化,如:

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");

7.事件 是合约和区块链通讯的一种机制。你的前端应用监听 某些事件,并做出反应,例子:

// 这里建立事件
event IntegersAdded(uint x, uint y, uint result);

function add(uint _x, uint _y) public {
  uint result = _x + _y;
  //触发事件,通知app
  IntegersAdded(_x, _y, result);
  return result;
}

前端监听:

YourContract.IntegersAdded(function(error, result) {
  // 干些事
})

2.代码

代码里面涉及的编程知识都在以上的重点知识里面。 本章中WEB3JS代码主要用于调用生成僵尸的接口,以及对僵尸模型的渲染。

//每个僵尸有16位的DNA,前端根据这16位DNA进行渲染。

//设置版本
pragma solidity ^0.4.19;

contract ZombieFactory {
//设置监听事件。
      event NewZombie(uint zombieId, string name, uint dna);
//用于生成DNA
    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;
//僵尸结构体
    struct Zombie {
        string name;
        uint dna;
    }
//设置公共可查的僵尸数组。
    Zombie[] public zombies;
    
//定义私有函数 生成僵尸。
    function _createZombie(string _name, uint _dna) private {
           uint id = zombies.push(Zombie(_name, _dna)) - 1;
         NewZombie(id, _name, _dna);
    }
//生成随机DNA
    function _generateRandomDna(string _str) private view returns (uint) {
        uint rand = uint(keccak256(_str));
        return rand % dnaModulus;
    }
    
    function createRandomZombie(string _name) public {
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

3.反思

还有一些工作没有完成:

  • 使用remix和以太坊钱包,可以在测试网上很容易的进行系统的调试。下一步会进行这系列尝试。
  • WEB3JS的学习要加强。

猜你喜欢

转载自blog.csdn.net/doreen211/article/details/129170441
今日推荐