---
# System prepended metadata

title: Minecraft Python 4A2

---

# Minecraft Python 4A2
## 🎯 學習重點

* Python 的輸出
* Minecraft 座標系統
* `getTilePos()`：取得玩家位置
* `setBlock()`：放置方塊

---


## 💬 標準輸出 vs. Minecraft 聊天輸出

```python
message = "Hello Python"

print(message)        # 標準輸出
mc.postToChat(message)  # Minecraft 聊天視窗輸出
```



---

## 🧭 Minecraft 座標系統

* 世界由 **x, y, z 三維座標**表示
* 可按 **F3** 檢視當前座標與方向

---

## 📍 取得自己的座標

```python
import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

pos = mc.player.getTilePos()
mc.postToChat(pos)
```

* `pos` 物件存放 `(x, y, z)`
* 透過 `mc.postToChat()` 在 Minecraft 聊天顯示座標

---

## 📝 課堂範例 1：我在哪？

```python
# 匯入需要的工具
import mcpi.minecraft as minecraft

# 連結 Minecraft 世界
mc = minecraft.Minecraft.create()

# 取得目前位置
pos = mc.player.getTilePos()

# 輸出到 Minecraft 世界
mc.postToChat("Hello Minecraft!")
mc.postToChat(pos)
```



---

## 💡 延伸練習 1：What’s your name?

* 建立一個 Python 檔案
* 在 Minecraft 世界中顯示 **自己的英文名字**

---

## 🧱 用 Python 製造方塊

### API

```python
mc.setBlock(x, y, z, Block_ID, data)
```

* `(x, y, z)`：方塊座標
* `Block_ID`：方塊 ID（例如 20=玻璃, 79=冰塊）
* `data`：屬性（可省略）

### 範例：在玩家四周放玻璃

```python
import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()
pos = mc.player.getTilePos()

mc.setBlock(pos.x + 1, pos.y, pos.z, 20)
mc.setBlock(pos.x - 1, pos.y, pos.z, 20)
mc.setBlock(pos.x, pos.y, pos.z + 1, 20)
mc.setBlock(pos.x, pos.y, pos.z - 1, 20)
```



---

## 🏠 課堂範例 2：迷你冰屋

* 建立新 Python 檔案
* 用冰塊（ID=79）將自己完全封起來
* 提醒：Minecraft 人物高度 = **2 方塊**
```python
#匯入需要的工具
import mcpi.minecraft as minecraft
import mcpi.block as block
#連結Minecraft世界
mc = minecraft.Minecraft.create()
#取得目前位置
pos = mc.player.getTilePos()

mc.setBlock(pos.x + 1, pos.y, pos.z, 79)
mc.setBlock(pos.x - 1, pos.y, pos.z, 79)
mc.setBlock(pos.x, pos.y, pos.z + 1, 79)
mc.setBlock(pos.x, pos.y, pos.z - 1, 79)

#y+1 往上蓋一層，因為人物的身高是2個方塊高度
mc.setBlock(pos.x + 1, pos.y + 1, pos.z, 79)
mc.setBlock(pos.x - 1, pos.y + 1, pos.z, 79)
mc.setBlock(pos.x, pos.y + 1, pos.z + 1, 79)
mc.setBlock(pos.x, pos.y + 1, pos.z - 1, 79)

#把上面封起來
mc.setBlock(pos.x, pos.y + 2, pos.z, 79)
#把下面封起來
mc.setBlock(pos.x, pos.y - 1, pos.z, 79)

```


## 🧪 觀念實作複習：位置 → 放 TNT

```python
import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

# 1) 在聊天視窗印出目前位置
pos = mc.player.getTilePos()
mc.postToChat(f"My position: {pos}")

# 2) 在目前位置生成一顆 TNT（ID 46）
TNT = 46
mc.setBlock(pos.x, pos.y, pos.z, TNT)
```



---


## 🌀 新觀念 1：用 Python 瞬間移動

API：

```python
mc.player.setTilePos(x, y, z)
```

範例：往 +x 方向瞬移 10 格

```python
import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

#取得角色位置
pos = mc.player.getTilePos()
#將角色傳送到指定座標。新座標距離原座標10格
mc.player.setTilePos(pos.x + 10, pos.y, pos.z)

```

> `pos` 是含有 `x,y,z` 的物件；`pos.x` 代表 x 座標。 &#x20;

---

## 🧩 新觀念 2：Python 特色（縮排）

* 從圖形拖拉式 → 文字式：邏輯相通，但 Python 更強大
* **縮排（4 空白或 1 個 TAB）代表區塊**，對應 Scratch 的插槽 &#x20;

---

## 📦 新觀念 3：作用域（Effective Range）

區塊內的程式才屬於該結構（如 `while`）的作用域：

```python
import mcpi.minecraft as minecraft
import mcpi.block as block

mc = minecraft.Minecraft.create()

while True:
    pos = mc.player.getTilePos()
    mc.postToChat(pos)

print("I'm not in the effective range.")
```

> 迴圈外的 `print()` 不屬於 `while` 的作用域。 &#x20;

---

## 📝 新觀念 4：註解（單行、多行）

```python
while True:
    """
    這是多行註解：
    下面會將你的所在位置印在聊天視窗中
    """
    # 這是單行註解
    pos = mc.player.getTilePos()
    mc.postToChat(pos)
```



---

## 📚 新觀念 5：匯入函式庫（packages）

```python
import mcpi.minecraft as minecraft
import mcpi.block as block
import mcpi.minecraftturtle as minecraftturtle
# import the files you need

mc = minecraft.Minecraft.create()
pos = mc.player.getTilePos()
```



---

## 🥷 課堂範例 1：像忍者一樣瞬移



```python
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()

#取得角色位置
pos = mc.player.getTilePos()

#將當前位置傳送到Minecraft對話框
mc.postToChat(pos)

#傳送到距離初始位置x+10、z+10的地方
mc.player.setTilePos(pos.x + 10, pos.y, pos.z + 10)

#重新取得角色位置
pos = mc.player.getTilePos()

#將當前位置傳送到Minecraft對話框
mc.postToChat(pos)


```



---

## 🧭 延伸練習 1：多軸位移

需求：`move | start` → 瞬移到 `x+10, y+2, z-5` → `move | end`

```python
import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()

start = mc.player.getTilePos()
mc.postToChat(f"move | start: {start}")

mc.player.setTilePos(start.x + 10, start.y + 2, start.z - 5)

end = mc.player.getTilePos()
mc.postToChat(f"move | end:   {end}")
```



---

## 🧾 新觀念 6：變數（宣告、賦值、遞增／遞減）

```python
a = 99.9      # a: 99.9
a = 0         # a: 0
num = a + 1   # num: 1
num += 1      # num: 2
num -= 5      # num: -3
```

命名規則（示例）：

```python
clientNum = 10     # OK（駝峰命名）
phoneNum1 = "0800" # OK
age = 5            # OK
Xxx = "kite"       # 語法有效但不具意義
# a@/ = 5.5        # 不可：非法字元
# 1ab = 5          # 不可：數字開頭
```



---

## 🧪 新觀念 7：資料型別（type）

基本型別：

```python
# int / float / str / bool
i = 3
f = 0.125
s = "Hello"
b = True

print(type(i))  # <class 'int'>
print(type(f))  # <class 'float'>
print(type(s))  # <class 'str'>
print(type(b))  # <class 'bool'>
```

自訂型別（由套件提供）：

```python
import mcpi.minecraft as minecraft
mc = minecraft.Minecraft.create()
pos = mc.player.getTilePos()
print(type(mc))   # e.g., <class 'Minecraft'>
print(type(pos))  # e.g., <class 'Vec3'>
```



---

## 🧑‍💻 課堂範例 2：用 `type()` 看型別

```python
import mcpi.minecraft as minecraft

mc = minecraft.Minecraft.create()
pos = mc.player.getTilePos()

print(type(mc))
print(type(pos))
```



---

## ➕ 延伸練習 2：同值不同型

```python
a = 100       # int
b = '100'     # str

print(type(a))  # <class 'int'>
print(type(b))  # <class 'str'>
```



---

## ⌨️ `input()` 與 `int()`：輸入字串、轉整數

```python
age = int(input("輸入你的年齡: "))
print(age)
```

> `input()` 讀進來是 **字串**，若要做數值運算需用 `int()` 轉為 **整數**。 &#x20;

---

## 🧩 回家作業

需求：

1. 先輸出原始座標
2. 依序讀入 `x,y,z`（提示文字）
3. 三個座標各自 **+1** 後輸出（格式：`x , y , z`）

參考骨架：

~~import mcpi.minecraft as minecraft~~

~~mc = minecraft.Minecraft.create()~~

~~pos = mc.player.getTilePos()
print(f"原始座標：{pos.x} , {pos.y} , {pos.z}")~~

~~x = int(input("請輸入 x 座標："))
y = int(input("請輸入 y 座標："))
z = int(input("請輸入 z 座標："))~~

~~x += 1
y += 1
z += 1~~

~~print(x, ",", y, ",", z)~~


> 提醒：`input()` 的回傳值是字串，需 `int()` 轉型。 &#x20;

---

## 🧷 小抄：常用方塊 ID（片段）

```text
TNT = 46
GLASS = 20
STONE = 1
GRASS = 2
```

---