Skip to content

Commit

Permalink
Merge pull request CryptozombiesHQ#51 from HangYang/hank-lesson2-improve
Browse files Browse the repository at this point in the history
Hank lesson2 improve
  • Loading branch information
mattkanwisher authored Jan 31, 2018
2 parents 8d01263 + c217756 commit d74db00
Show file tree
Hide file tree
Showing 32 changed files with 221 additions and 222 deletions.
6 changes: 3 additions & 3 deletions zh/1/00-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ header: 人类,欢迎你
roadmap: roadmap.jpg
---

你认为你可以当一个合格的**CryptoZombie**, 嗯?
你认为你可以当一个合格的 **CryptoZombie**, 嗯?

这个教程会教你如何搭建一个以太网的游戏
这个教程会教你如何搭建一个**以太网的游戏**

此课程为 Solidity 初学者设计,需要你对其他的程序语言有所了解(如 JavaScript).
此课程为 Solidity 初学者设计,需要你对其他的程序语言有所了解(如 JavaScript)
8 changes: 4 additions & 4 deletions zh/1/arrays.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ material:
}
---

如果你想建立一个集合,可以用 **_数组_**这样的数据类型. Solidity支持两种数组: **_静态_** 数组和**_动态_** 数组:
如果你想建立一个集合,可以用 **_数组_**这样的数据类型. Solidity 支持两种数组: **_静态_** 数组和**_动态_** 数组:

```
// 固定长度为2的静态数组:
Expand All @@ -60,16 +60,16 @@ Person[] people; // dynamic Array, we can keep adding to it

## 公共数组

你可以定义`public`数组, Solidity 会自动创建 **_getter_** 方法. 语法如下:
你可以定义 `public` 数组, Solidity 会自动创建 **_getter_** 方法. 语法如下:

```
Person[] public people;
```

其它的合约可以从这个数组读取数据(但不能写入数据),所以这在合约中是一个有用的保存公共数据的模式。

# 测试一把
# 实战演习

为了把一个僵尸部队保存在我们的APP里,并且能够让其它APP看到这些僵尸,我们需要一个公共数组。

1. 创建一个数据类型为`Zombie`的结构体数组,用`public`修饰,命名为:`zombies`.
1. 创建一个数据类型为 `Zombie` 的结构体数组,用 `public` 修饰,命名为:`zombies`.
10 changes: 5 additions & 5 deletions zh/1/arraysstructs2.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ material:
}
---

### 创建新的结构体
## 创建新的结构体

还记得上个例子中的 `Person` 结构吗?

Expand All @@ -60,7 +60,7 @@ struct Person {
Person[] public people;
```

现在我们学习创建新的 `Person`结构,然后把它加入到名为`people` 的数组中.
现在我们学习创建新的 `Person` 结构,然后把它加入到名为 `people` 的数组中.

```
// 创建一个新的Person:
Expand All @@ -86,9 +86,9 @@ numbers.push(15);
// numbers is now equal to [5, 10, 15]
```

# 测试一把
# 实战演习

让我们创建名为createZombie的函数来做点儿什么吧
让我们创建名为createZombie的函数来做点儿什么吧

1. 在函数体里新创建一个`Zombie`, 然后把它加入 `zombies` 数组中. 新创建的僵尸的`name``dna`,来自于函数的参数
1. 在函数体里新创建一个 `Zombie` 然后把它加入 `zombies` 数组中 新创建的僵尸的 `name``dna`,来自于函数的参数
2. 让我们用一行代码简洁地完成它。
18 changes: 9 additions & 9 deletions zh/1/contracts.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ material:

从最基本的开始入手:

Solidity的代码都包裹在 **合约**里面. 一份 `合约` 就是以太应币应用的基本模块, 所有的变量和函数都属于一份合约, 它是你所有应用的起点.
Solidity 的代码都包裹在**合约**里面. 一份`合约`就是以太应币应用的基本模块, 所有的变量和函数都属于一份合约, 它是你所有应用的起点.

一份名为`HelloWorld`的空合约如下:
一份名为 `HelloWorld` 的空合约如下:

```
contract HelloWorld {
Expand All @@ -31,9 +31,9 @@ contract HelloWorld {

## 版本指令

所有的solidity源码都必须冠以 "version pragma" — 标明 Solidity 编译器的版本. 以避免将来新的编译器可能破坏你的代码。
所有的 Solidity 源码都必须冠以 "version pragma" — 标明 Solidity 编译器的版本. 以避免将来新的编译器可能破坏你的代码。

例如: `pragma solidity ^0.4.19;` (当前 solidity 的最新版本是 0.4.19).
例如: `pragma solidity ^0.4.19;` (当前 Solidity 的最新版本是 0.4.19).

综上所述, 下面就是一个最基本的合约 — 每次建立一个新的项目时的第一段代码:

Expand All @@ -45,12 +45,12 @@ contract HelloWorld {
}
```

# 测试一把
# 实战演习

为了建立我们的僵尸部队, 让我们先建立一个基础合约,称为 `ZombieFactory`.
为了建立我们的僵尸部队, 让我们先建立一个基础合约,称为 `ZombieFactory`

1. 在右边的输入框里输入`0.4.19`,我们的合约基于这个版本的编译器
1. 在右边的输入框里输入 `0.4.19`,我们的合约基于这个版本的编译器

2. 建立一个空合约`ZombieFactory`.
2. 建立一个空合约 `ZombieFactory`

一切完毕,点击下面 "答案" . 如果没效果,点击 "提示".
一切完毕,点击下面 "答案" . 如果没效果,点击 "提示"
12 changes: 6 additions & 6 deletions zh/1/datatypes.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ material:

真棒!我们已经为我们的合约做了一个外壳, 下面学习 Solidity 中如何使用变量。

**_状态变量_** 是被永久地保存在合约中。也就是说它们被写入以太币区块链中. 想象成写入一个数据库。
**_状态变量_**是被永久地保存在合约中。也就是说它们被写入以太币区块链中. 想象成写入一个数据库。

##### 例子:
```
Expand All @@ -35,16 +35,16 @@ contract Example {
}
```

在上面的例子中,定义`myUnsignedInteger``uint`类型,并赋值100。
在上面的例子中,定义 `myUnsignedInteger``uint` 类型,并赋值100。

## 无符号整数: `uint`

`uint` 无符号数据类型, 指 **其值不能是负数**,对于有符号的整数存在名为 `int`的数据类型
`uint` 无符号数据类型, 指**其值不能是负数**,对于有符号的整数存在名为 `int` 的数据类型

> 注: Solidity中, `uint` 实际上是 `uint256`代名词, 一个256位的无符号整数。你也可以定义位数少的uints — `uint8`, `uint16`, `uint32`, 等.. 但一般来讲你愿意使用简单的`uint` 除非在某些特殊情况下,这我们后面会讲。
> 注: Solidity中 `uint` 实际上是 `uint256`代名词 一个256位的无符号整数。你也可以定义位数少的uints — `uint8` `uint16` `uint32`, 等…… 但一般来讲你愿意使用简单的 `uint` 除非在某些特殊情况下,这我们后面会讲。
# 测试一把
# 实战演习

我们的僵尸DNA将由一个十六位数字组成。

定义`dnaDigits``uint`数据类型, 并赋值 `16`
定义 `dnaDigits``uint` 数据类型, 并赋值 `16`
10 changes: 5 additions & 5 deletions zh/1/events.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ material:

我们的合约几乎就要完成了!让我们加上一个**事件**.

**事件** 是合约和区块链通讯的一种机制。你的前端应用‘监听’某些事件,并做出反应。
**事件** 是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。

例子:

Expand All @@ -99,12 +99,12 @@ YourContract.IntegersAdded(function(error, result) {
}
```

# 测试一把
# 实战演习

我们想每当一个僵尸创造出来时,我们的前端都能监听到这个事件,并将它显示出来。

1. 定义一个 `事件` 叫做 `NewZombie`. 它有3个参数: `zombieId` (`uint`), `name` (`string`),`dna` (`uint`).
1 定义一个 `事件` 叫做 `NewZombie` 它有3个参数: `zombieId` (`uint`) `name` (`string`)`dna` (`uint`)

2. 修改 `_createZombie` 函数使得当新僵尸造出来并加入`zombies`数组后,生成事件`NewZombie`
2 修改 `_createZombie` 函数使得当新僵尸造出来并加入`zombies`数组后,生成事件`NewZombie`

3. 需要定义僵尸`id``array.push()` 返回数组的长度类型是`uint` - 因为数组的第一个元素的索引是 0, `array.push() - 1` 将是我们加入的僵尸的索引。 `zombies.push() - 1` 就是 `id`,数据类型是`uint`。在下一行中你可以把它用到`NewZombie` 事件中。
3 需要定义僵尸`id``arraypush()` 返回数组的长度类型是`uint` - 因为数组的第一个元素的索引是 0, `arraypush() - 1` 将是我们加入的僵尸的索引。 `zombiespush() - 1` 就是 `id`,数据类型是`uint`。在下一行中你可以把它用到`NewZombie` 事件中。
2 changes: 1 addition & 1 deletion zh/1/functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ function eatHamburgers(string _name, uint _amount) {
eatHamburgers("vitalik", 100);
```

# 测试一把
# 实战演习

在我们的应用里,我们要能创建一些僵尸,让我们写一个函数做这件事吧!

Expand Down
6 changes: 3 additions & 3 deletions zh/1/functions2.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ function _addToArray(uint _number) private {

这意味着只有我们合约中的其它函数才能够调用这个函数,给 `numbers` 数组添加新成员。

可以看到,在函数名字后面使用关键字 `private` 即可。和函数的参数类似, 私有函数的名字用(`_`)起始.
可以看到,在函数名字后面使用关键字 `private` 即可。和函数的参数类似,私有函数的名字用(`_`)起始

# 测试一把
# 实战演习

我们合约的函数`createZombie` 的默认属性是公共的,这意味着任何一方都可以调用它去创建一个僵尸。 咱们来把它变成私有吧!
我们合约的函数 `createZombie` 的默认属性是公共的,这意味着任何一方都可以调用它去创建一个僵尸。 咱们来把它变成私有吧!

1.`createZombie` 为私有函数,不要忘记遵守命名的规矩哦!
8 changes: 4 additions & 4 deletions zh/1/functions3.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,23 +79,23 @@ Solidity 里,函数的定义里可包含返回值的数据类型(如本例中
function sayHello() public view returns (string) {
```

Solidity 还支持 **_pure_** 函数, 表明这个函数甚至都不能访问程序里的数据,例如:
Solidity 还支持 **_pure_** 函数, 表明这个函数甚至都不访问应用里的数据,例如:

```
function _multiply(uint a, uint b) private pure returns (uint) {
return a * b;
}
```

这个函数甚至都不能读取程序里的状态 — 它的返回值完全取决于它的输入参数,在这种情况下我们把函数定义为 **_pure_**.
这个函数甚至都不读取应用里的状态 — 它的返回值完全取决于它的输入参数,在这种情况下我们把函数定义为 **_pure_**.

> 注:可能很难记住何时把函数标记为 pure/view。 幸运的是, Solidity 编辑器会给出提示,提醒你使用这些修饰符。
# 测试一把
# 实战演习

我们想建立一个帮助函数,它根据一个字符串随机生成一个DNA数据。

1. 创建一个`private` 函数,命名为 `_generateRandomDna`。它只接收一个输入变量`_str` (类型`string`), 返回一个`uint`类型的数值。
1. 创建一个 `private` 函数,命名为 `_generateRandomDna`。它只接收一个输入变量 `_str` (类型 `string`), 返回一个 `uint` 类型的数值。

2. 此函数只读取我们合约中的一些变量,所以标记为`view`

Expand Down
10 changes: 5 additions & 5 deletions zh/1/keccak256.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,12 @@ uint8 c = a * b;
uint8 c = a * uint8(b);
```

上面, `a * b` 返回类型是 `uint`, 但是当我们尝试用`uint8`类型接收时, 就会造成潜在的错误。如果把它的数据类型转换为`uint8`, 就可以了,编译器也不会出错。
上面, `a * b` 返回类型是 `uint`, 但是当我们尝试用 `uint8` 类型接收时, 就会造成潜在的错误。如果把它的数据类型转换为 `uint8`, 就可以了,编译器也不会出错。

# 测试一把
# 实战演习

`_generateRandomDna` 函数添加代码! 它应该完成如下功能:
`_generateRandomDna` 函数添加代码! 它应该完成如下功能:

1. 第一行代码取`_str``keccak256`散列值,伪随机十六进制数。类型转换为`uint`, 最后保存在类型为 `uint` 名为 `rand`的变量中。
1. 第一行代码取 `_str``keccak256` 散列值生成一个伪随机十六进制数,类型转换为 `uint`, 最后保存在类型为 `uint` 名为 `rand` 的变量中。

2. 我们只想让我们的DNA的长度为16位 (还记得 `dnaModulus`?)。所以第二行代码应该`return` 上面计算的数值对 `dnaModulus`求余数(`%`).
2. 我们只想让我们的DNA的长度为16位 (还记得 `dnaModulus`?)。所以第二行代码应该 `return` 上面计算的数值对 `dnaModulus` 求余数(`%`)
4 changes: 2 additions & 2 deletions zh/1/lessonoverview.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ material:

在右边页面,移动头基因`head gene` 滑块到第七位置(圣诞帽)可见`83`所对应的特点。

# 测试一把
# 实战演习

1. 玩一下页面右侧的滑块。检验一下不同的数字对应不同的僵尸的长相。

好了,这已经足够你玩一会儿了。 当你想继续的时候,点击下面的"下一章" ,让我们来钻研 Solidity!
好了,这已经足够你玩一会儿了。 当你想继续的时候,点击下面的"下一章",让我们来钻研 Solidity
4 changes: 3 additions & 1 deletion zh/1/math.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,10 @@ material:

Solidity 还支持 **_乘方操作_** (如:x 的 y次方) // 例如: 5 ** 2 = 25
```
uint x = 5 ** 2; // equal to 5^2 = 25
```

# 测试一把
# 实战演习

为了保证我们的僵尸的DNA只含有16个字符,我们先造一个`uint`数据,让它等于10^16。这样一来以后我们可以用模运算符 `%` 把一个整数变成16位。

Expand Down
8 changes: 4 additions & 4 deletions zh/1/puttingittogether.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,12 @@ material:

写一个公共函数,它有一个参数,用来接收僵尸的名字,之后用它生成僵尸的DNA。

# 测试一把
# 实战演习

1. 创建一个 `public` 函数,命名为` createRandomZombie`. 它将被传入一个变量 `_name` (数据类型是 `string`). _(注: 定义公共函数 `public` 和定义一个私有 `private` 函数的做法一样)_
1. 创建一个 `public` 函数,命名为` createRandomZombie`. 它将被传入一个变量 `_name` (数据类型是 `string`) _(注: 定义公共函数 `public` 和定义一个私有 `private` 函数的做法一样)_

2. 函数的第一行应该调用 `_generateRandomDna` 函数,传入 `_name` 参数, 结果保存在一个类型为 `uint` 的变量里,命名为 `randDna`.
2. 函数的第一行应该调用 `_generateRandomDna` 函数,传入 `_name` 参数, 结果保存在一个类型为 `uint` 的变量里,命名为 `randDna`

3. 第二行调用 `_createZombie` 函数, 传入参数: `_name``randDna`.
3. 第二行调用 `_createZombie` 函数, 传入参数: `_name``randDna`

4. 整个函数应该是4行代码 (包括函数的结束符号 `}` )。
4 changes: 2 additions & 2 deletions zh/1/structs.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ struct Person {

结构体允许你生成一个更复杂的数据类型,它有多个属性。

> 注:我们刚刚引进了一个新类型, `string`。 字符串用于保存任意长度的 UTF-8 编码数据。 如: `string greeting = "Hello world!"`
> 注:我们刚刚引进了一个新类型, `string`。 字符串用于保存任意长度的 UTF-8 编码数据。 如: `string greeting = "Hello world!"`
# 测试一把
# 实战演习

在我们的程序中,我们将创建一些僵尸!每个僵尸将拥有多个属性,所以这是一个展示结构体的完美例子。

Expand Down
4 changes: 2 additions & 2 deletions zh/1/web3js.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ material:

我们的 Solidity 合约完工了! 现在我们要写一段 JavaScript 前端代码来调用这个合约。

以太坊有一个 JavaScript 库,名为**_Web3.js_**.
以太坊有一个 JavaScript 库,名为**_Web3.js_**

在后面的课程里,我们会进一步地教你如何安装一个合约,如何设置Web3.js. 但是现在我们通过一段代码来了解 Web3.js 是如何和我们发布的合约交互的吧。
在后面的课程里,我们会进一步地教你如何安装一个合约,如何设置Web3.js 但是现在我们通过一段代码来了解 Web3.js 是如何和我们发布的合约交互的吧。

如果下面的代码你不能全都理解,不用担心。
```
Expand Down
6 changes: 3 additions & 3 deletions zh/2/00-overview.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
---
title: 僵尸攻击人类
header: 所以,你需要晋级至第二课
header: 你成功晋升到第二课啦
roadmap: roadmap2.jpg
---

厉害了,我的人类! 你比我设想的更会编程!
第二课中,你会学到如何通过吞噬其他生物,扩张你的僵尸军团
在这一课里,我们会使用到一些高级的Solidity概念,所以你一定要先完成第一课。
第二课中,你会学到如何通过猎食其他生物,扩张你的僵尸军团
在这一课里,我们会使用到一些高级的 Solidity 概念,所以你一定要先完成第一课。
6 changes: 3 additions & 3 deletions zh/2/1-overview.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: Lesson 2 Overview
title: 第二课概览
actions: ['checkAnswer', 'hints']
material:
saveZombie: false
Expand All @@ -12,13 +12,13 @@ material:
---

在第一课中,我们创建了一个命名函数用来生成僵尸,并且将它放入区块链上的僵尸数据库中。
在第二课里,我们会让我们的app看起来更像一个游戏: 它得支持多用户,并且采用更加有趣--而不仅仅随机--的方式,来生成新的僵尸。
在第二课里,我们会让我们的 app 看起来更像一个游戏: 它得支持多用户,并且采用更加有趣--而不仅仅随机--的方式,来生成新的僵尸。

如何生成新的僵尸呢?通过让现有的僵尸猎食其他生物!

## 僵尸猎食

僵尸猎食的时候, 僵尸病毒侵入猎物, 这些病毒会将猎物变为新的僵尸,加入你的Solidity。系统会通过猎物和猎食者僵尸的DNA计算出新僵尸的DNA。
僵尸猎食的时候,僵尸病毒侵入猎物,这些病毒会将猎物变为新的僵尸,加入你的僵尸大军。系统会通过猎物和猎食者僵尸的DNA计算出新僵尸的DNA。

僵尸最喜欢猎食什么物种呢?
等你学完第二课就知道了!
Expand Down
Loading

0 comments on commit d74db00

Please sign in to comment.