# Scratch 积木代码生成规范

> **重要**: 生成积木代码前必须参考此文档，确保格式、标点、嵌套规则正确。

---

## 一、标点符号使用规则

### 1.1 必须使用英文标点的情况

| 类型 | 示例 | 说明 |
|------|------|------|
| 尖括号内条件 | `<按下鼠标?>` | 布尔条件必须用英文 `?` |
| 比较运算符 | `<(n) = (1)>` | 等于、大于、小于用英文符号 |
| 数学运算 | `(n) / (2)` | 除法、乘法等用英文符号 |

### 1.2 官方翻译保留中文标点的情况

| 类型 | 示例 | 说明 |
|------|------|------|
| 字符串参数内 | `[你叫什么名字？]` | 参数内容按原文 |
| 独立布尔积木 | `响声？` | 官方翻译本身就是中文 |
| 运算包含判断 | `<[你好] 包含 [你]?>` | 官方翻译格式 |

---

## 二、积木代码示例（按分类）

### 2.1 事件 Events

```
English: when green flag clicked
中文: 当 @greenFlag 被点击

English: when [space v] key pressed
中文: 当按下 [空格 v] 键

English: when this sprite clicked
中文: 当角色被点击

English: when backdrop switches to [backdrop1 v]
中文: 当背景换成 [背景1 v]

English: broadcast [message v]
中文: 广播 [消息 v]

English: broadcast [message v] and wait
中文: 广播 [消息 v] 并等待
```

### 2.2 控制 Control

```
English: wait (1) seconds
中文: 等待 (1) 秒

English: repeat (10)
    . . .
end
中文: 重复执行 (10) 次
    . . .
end

English: forever
    . . .
end
中文: 重复执行
    . . .
end

English: if <mouse down?> then
    . . .
end
中文: 如果 <按下鼠标?> 那么
    . . .
end

English: if <mouse down?> then
    . . .
else
    . . .
end
中文: 如果 <按下鼠标?> 那么
    . . .
否则
    . . .
end

English: wait until <mouse down?>
中文: 等待 <按下鼠标?>

English: repeat until <mouse down?>
    . . .
end
中文: 重复执行直到 <按下鼠标?>
    . . .
end

English: stop [all v]
中文: 停止 [全部 v]

English: stop [this script v]
中文: 停止 [这个脚本 v]

English: stop [other scripts in sprite v]
中文: 停止 [其他脚本 v]

English: when I start as a clone
中文: 当作为克隆体启动时

English: create clone of [Sprite1 v]
中文: 克隆 [Sprite1 v]

English: delete this clone
中文: 删除此克隆体
```

### 2.3 运动 Motion

```
English: move (10) steps
中文: 移动 (10) 步

English: turn @turnRight (15) degrees
中文: 右转 @turnRight (15) 度

English: turn @turnLeft (15) degrees
中文: 左转 @turnLeft (15) 度

English: point in direction (90)
中文: 面向 (90) 方向

English: point towards [Sprite1 v]
中文: 面向 [Sprite1 v]

English: go to x: (0) y: (0)
中文: 移到 x: (0) y: (0)

English: go to [random position v]
中文: 移到 [随机位置 v]

English: go to [mouse-pointer v]
中文: 移到 [鼠标指针 v]

English: glide (1) secs to x: (0) y: (0)
中文: 在 (1) 秒内滑行到 x: (0) y: (0)

English: glide (1) secs to [Sprite1 v]
中文: 在 (1) 秒内滑行到 [Sprite1 v]

English: change x by (10)
中文: 将x坐标增加 (10)

English: set x to (0)
中文: 将x坐标设为 (0)

English: change y by (10)
中文: 将y坐标增加 (10)

English: set y to (0)
中文: 将y坐标设为 (0)

English: set rotation style [left-right v]
中文: 将旋转方式设为 [左右翻转 v]

English: set rotation style [don't rotate v]
中文: 将旋转方式设为 [不可旋转 v]

English: set rotation style [all around v]
中文: 将旋转方式设为 [任意旋转 v]

English: if on edge, bounce
中文: 碰到边缘就反弹

English: x position
中文: x 坐标

English: y position
中文: y 坐标

English: direction
中文: 方向
```

### 2.4 外观 Looks

```
English: say [Hello!] for (2) seconds
中文: 说 [你好！] (2) 秒

English: say [Hello!]
中文: 说 [你好！]

English: think [Hmm...] for (2) seconds
中文: 思考 [嗯...] (2) 秒

English: think [Hmm...]
中文: 思考 [嗯...]

English: show
中文: 显示

English: hide
中文: 隐藏

English: switch costume to [costume1 v]
中文: 换成 [造型1 v] 造型

English: next costume
中文: 下一个造型

English: switch backdrop to [backdrop1 v]
中文: 换成 [背景1 v] 背景

English: next backdrop
中文: 下一个背景

English: change [color v] effect by (25)
中文: 将 [颜色 v] 特效增加 (25)

English: set [color v] effect to (0)
中文: 将 [颜色 v] 特效设定为 (0)

English: clear graphic effects
中文: 清除图形特效

English: change size by (10)
中文: 将大小增加 (10)

English: set size to (100)%
中文: 将大小设为 (100)%

English: go to [front v] layer
中文: 移到最 [前面 v]

English: go [forward v] (1) layers
中文: [前移 v] (1) 层

English: costüm [number v]
中文: 造型 [编号 v]

English: backdrop [name v]
中文: 背景 [名称 v]

English: size
中文: 大小
```

### 2.5 声音 Sound

```
English: play sound [pop v]
中文: 播放声音 [pop v]

English: play sound [pop v] until done
中文: 播放声音 [pop v] 等待播完

English: stop all sounds
中文: 停止所有声音

English: change [volume v] effect by (10)
中文: 将 [音调 v] 音效增加 (10)

English: set [volume v] effect to (100)
中文: 将 [音调 v] 音效设为 (100)

English: clear sound effects
中文: 清除音效

English: change volume by (-10)
中文: 将音量增加 (-10)

English: set volume to (100)%
中文: 将音量设为 (100)%

English: volume
中文: 音量
```

### 2.6 画笔 Pen

```
English: clear
中文: 全部擦除

English: stamp
中文: 图章

English: pen down
中文: 落笔

English: pen up
中文: 抬笔

English: set pen color to [#1540bf]
中文: 将笔的颜色设为 [#1540bf]

English: change pen (color v) by (10)
中文: 将笔的 (颜色 v) 增加 (10)

English: set pen (color v) to (0)
中文: 将笔的 (颜色 v) 设为 (0)

English: change pen size by (1)
中文: 将笔的粗细增加 (1)

English: set pen size to (1)
中文: 将笔的粗细设为 (1)
```

### 2.7 侦测 Sensing

```
English: ask [What's your name?] and wait
中文: 询问 [你叫什么名字？] 并等待

English: answer
中文: 回答

English: key [space v] pressed?
中文: 按下 [空格 v] 键?

English: mouse down?
中文: 按下鼠标?

English: mouse x
中文: 鼠标的x坐标

English: mouse y
中文: 鼠标的y坐标

English: set drag mode [draggable v]
中文: 将拖动模式设为 [可拖动 v]

English: loudness
中文: 响度

English: timer
中文: 计时器

English: reset timer
中文: 计时器归零

English: ([costume # v] of [Sprite1 v])
中文: ([造型编号 v] 属于 [Sprite1 v])

English: current [year v]
中文: 当前时间的 [年 v]

English: days since 2000
中文: 2000年至今的天数

English: username
中文: 用户名

English: loud?
中文: 响声？

English: touching [mouse-pointer v]?
中文: 碰到 [鼠标指针 v] ?

English: touching [edge v]?
中文: 碰到 [边缘 v] ?

English: touching color [#FF0000]?
中文: 碰到颜色 [#FF0000] ?

English: color [#FF0000] is touching [#00FF00]?
中文: 颜色 [#FF0000] 碰到 [#00FF00] ?

English: distance to [mouse-pointer v]
中文: 到 [鼠标指针 v] 的距离

English: distance to [Sprite1 v]
中文: 到 [Sprite1 v] 的距离
```

### 2.8 运算 Operators

```
English: (() + ())
中文: (() + ())

English: (() - ())
中文: (() - ())

English: (() * ())
中文: (() * ())

English: (() / ())
中文: (() / ())

English: (pick random (1) to (10))
中文: (在 (1) 和 (10) 之间取随机数)

English: <() < ()>
中文: <() < ()>

English: <() = ()>
中文: <() = ()>

English: <() > ()>
中文: <() > ()>

English: <<> and <>>
中文: <<> 与 <>>

English: <<> or <>>
中文: <<> 或 <>>

English: <not <>>
中文: <不成立 <>>

English: (join [hello ] [world])
中文: (连接 [你好 ] 和 [世界])

English: (letter (1) of [world])
中文: ([世界] 的第 (1) 个字符)

English: (length of [world])
中文: ([世界] 的字符数)

English: (() mod ())
中文: (() 除以 () 的余数)

English: (round ())
中文: (四舍五入 ())

English: ([sqrt v] of ())
中文: ([平方根 v] of ())

English: <[world] contains [a]?>
中文: <[你好] 包含 [你]?>
```

### 2.9 变量 Variables

```
English: set [my variable v] to (0)
中文: 将 [我的变量 v] 设为 (0)

English: change [my variable v] by (1)
中文: 将 [我的变量 v] 增加 (1)

English: show variable [my variable v]
中文: 显示变量 [我的变量 v]

English: hide variable [my variable v]
中文: 隐藏变量 [我的变量 v]
```

### 2.10 列表 List

```
English: add [thing] to [my list v]
中文: 将 [苹果] 加入 [我的列表 v]

English: delete (1) of [my list v]
中文: 删除 [我的列表 v] 的第 (1) 项

English: delete all of [my list v]
中文: 删除 [我的列表 v] 的全部项目

English: insert [thing] at (1) of [my list v]
中文: 在 [我的列表 v] 的第 (1) 项前插入 [thing]

English: replace item (1) of [my list v] with [thing]
中文: 将 [我的列表 v] 的第 (1) 项替换为 [thing]

English: (item (1) of [my list v])
中文: ([我的列表 v] 的第 (1) 项)

English: (item # of [apple] in [my list v])
中文: ([我的列表 v] 中第一个 [苹果] 的编号)

English: (length of [my list v])
中文: ([我的列表 v] 的项目数)

English: <[my list v] contains [thing]?>
中文: <[我的列表 v] 包含 [thing]?>

English: show list [my list v]
中文: 显示列表 [我的列表 v]

English: hide list [my list v]
中文: 隐藏列表 [我的列表 v]
```

---

## 三、HTML 转义规则

在 HTML 中显示尖括号时必须转义：

| 字符 | 转义后 | 示例 |
|------|--------|------|
| `<` | `&lt;` | `&lt;mouse down?&gt;` |
| `>` | `&gt;` | `&lt;mouse down?&gt;` |

**错误示例**:
```html
<pre class="blocks scratch3">if <mouse down?> then</pre>
```

**正确示例**:
```html
<pre class="blocks scratch3">if &lt;mouse down?&gt; then</pre>
```

---

## 四、C 型积木嵌套规则

### 4.1 基本 C 型积木

```scratch
repeat (10)
    move (5) steps
end

forever
    move (5) steps
end
```

### 4.2 if 条件判断

```scratch
if <mouse down?> then
    change [分数 v] by (1)
end
```

### 4.3 if-else 条件判断

```scratch
if <touching [mouse-pointer v]?> then
    say [碰到了！] for (2) seconds
else
    say [没碰到] for (2) seconds
end
```

### 4.4 嵌套 if-else（重要！）

**Scratch 不支持 `else if`，必须使用嵌套！**

```scratch
if <(分数) > (90)> then
    say [优秀] for (2) seconds
else
    if <(分数) > (60)> then
        say [及格] for (2) seconds
    else
        say [不及格] for (2) seconds
    end
end
```

### 4.5 条件组合

```scratch
<<mouse down?> and <(分数) > (10)>>

<<key [space v] pressed?> or <touching [edge v]>>

<not <mouse down?>>
```

---

## 五、常见错误对照表

| 错误写法 | 正确写法 | 说明 |
|----------|----------|------|
| `<mouse down？>` | `<按下鼠标?>` | 条件内用英文 `?` |
| `if <mouse down?>` | `if &lt;mouse down?&gt;` | HTML 需转义 |
| `否则如果` | 嵌套 `if...else...end` | Scratch 不支持 else if |
| `[变量]` | `(变量)` | 变量引用用圆括号 |
| `移动10步` | `移动 (10) 步` | 参数用圆括号 |
| `停止 全部` | `停止 [全部 v]` | 下拉菜单格式 |
| `重复执行10次` | `重复执行 (10) 次` | 参数格式 |
| `询问 你叫什么` | `询问 [你叫什么？] 并等待` | 字符串参数 |

---

## 六、Block ID 参考

| Block ID | 功能 |
|----------|------|
| MOTION_MOVESTEPS | 移动步数 |
| MOTION_TURNRIGHT | 右转 |
| MOTION_TURNLEFT | 左转 |
| MOTION_POINTINDIRECTION | 面向方向 |
| MOTION_POINTTOWARDS | 面向角色 |
| MOTION_GOTOXY | 移到坐标 |
| MOTION_GOTO | 移到 |
| MOTION_GLIDESECSTOXY | 滑行到坐标 |
| MOTION_GLIDETO | 滑行到 |
| MOTION_IFONEDGEBOUNCE | 碰到边缘就反弹 |
| LOOKS_SAYFORSECS | 说...秒 |
| LOOKS_SAY | 说 |
| LOOKS_THINKFORSECS | 思考...秒 |
| LOOKS_THINK | 思考 |
| LOOKS_SHOW | 显示 |
| LOOKS_HIDE | 隐藏 |
| LOOKS_SWITCHCOSTUMETO | 换成造型 |
| LOOKS_NEXTCOSTUME | 下一个造型 |
| LOOKS_NEXTBACKDROP_BLOCK | 下一个背景 |
| LOOKS_SWITCHBACKDROPTO | 换成背景 |
| SOUND_PLAY | 播放声音 |
| SOUND_PLAYUNTILDONE | 播放声音等待播完 |
| SOUND_STOPALLSOUNDS | 停止所有声音 |
| CONTROL_WAIT | 等待 |
| CONTROL_REPEAT | 重复执行 |
| CONTROL_FOREVER | 重复执行 |
| CONTROL_IF | 如果...那么 |
| CONTROL_WAITUNTIL | 等待... |
| CONTROL_REPEATUNTIL | 重复执行直到 |
| CONTROL_STOP | 停止 |
| CONTROL_ELSE | 否则 |
| CONTROL_STARTASCLONE | 当作为克隆体启动时 |
| CONTROL_CREATECLONEOF | 克隆 |
| CONTROL_DELETETHISCLONE | 删除此克隆体 |
| SENSING_ASKANDWAIT | 询问并等待 |
| SENSING_ANSWER | 回答 |
| SENSING_KEYPRESSED | 按下键? |
| SENSING_MOUSEDOWN | 按下鼠标? |
| SENSING_TOUCHINGOBJECT | 碰到 |
| SENSING_LOUD | 响声? |
| OPERATORS_ADD | 加 |
| OPERATORS_SUBTRACT | 减 |
| OPERATORS_MULTIPLY | 乘 |
| OPERATORS_DIVIDE | 除 |
| OPERATORS_RANDOM | 取随机数 |
| OPERATORS_LT | 小于 |
| OPERATORS_GT | 大于 |
| OPERATORS_AND | 且 |
| OPERATORS_OR | 或 |
| OPERATORS_NOT | 不成立 |
| OPERATORS_JOIN | 连接 |
| OPERATORS_LETTEROF | 第几个字符 |
| OPERATORS_LENGTH | 字符数 |
| OPERATORS_MOD | 余数 |
| OPERATORS_ROUND | 四舍五入 |
| OPERATORS_CONTAINS | 包含 |
| DATA_SETVARIABLETO | 将变量设为 |
| DATA_CHANGEVARIABLEBY | 将变量增加 |
| DATA_SHOWVARIABLE | 显示变量 |
| DATA_HIDEVARIABLE | 隐藏变量 |
| DATA_ADDTOLIST | 加入列表 |
| DATA_DELETEOFLIST | 删除列表项 |
| DATA_DELETEALLOFLIST | 删除列表全部 |
| DATA_INSERTATLIST | 插入列表项 |
| DATA_REPLACEITEMOFLIST | 替换列表项 |
| DATA_ITEMOFLIST | 列表第几项 |
| DATA_ITEMNUMOFLIST | 列表中第一个的编号 |
| DATA_LENGTHOFLIST | 列表项目数 |
| DATA_LISTCONTAINSITEM | 列表包含 |
| DATA_SHOWLIST | 显示列表 |
| DATA_HIDELIST | 隐藏列表 |
| pen.clear | 全部擦除 |
| pen.stamp | 图章 |
| pen.penDown | 落笔 |
| pen.penUp | 抬笔 |
