# Bài 1: Bản sao là gì?
## Mục tiêu bài học
Học xong bài này, em sẽ:
- Hiểu bản sao (clone) là gì và vì sao cần dùng bản sao.
- Biết dùng 3 khối lệnh: **tạo bản sao**, **khi tôi bắt đầu là một bản sao**, **xóa bản sao này**.
- Tự làm được chương trình có nhiều vật giống nhau chuyển động, ví dụ tuyết rơi, mưa rơi.
## 1. Bản sao là gì?
**Bản sao** là một nhân vật được Scratch "photo" ra từ một nhân vật có sẵn. Nhân vật có sẵn ban đầu gọi là **bản gốc**.
Hãy tưởng tượng em có một con dấu hình ngôi sao. Mỗi lần đóng dấu, trên giấy lại có thêm một ngôi sao giống hệt. Con dấu là **bản gốc**, mỗi ngôi sao trên giấy là một **bản sao**.
### Vì sao cần bản sao?
Giả sử em muốn làm cảnh tuyết rơi với 50 bông tuyết.
- **Không dùng bản sao:** em phải tạo 50 nhân vật và viết code cho từng nhân vật. Rất mất công, sửa một chỗ phải sửa 50 lần.
- **Dùng bản sao:** em chỉ cần **1 nhân vật bông tuyết** và viết code **1 lần**. Scratch sẽ tự tạo ra bao nhiêu bông tuyết cũng được.
### Bản sao có gì đặc biệt?
- Bản sao **giống hệt bản gốc** lúc vừa được tạo: cùng hình dáng, cùng vị trí, cùng kích thước.
- Bản sao **không có tên riêng** và **không hiện trong danh sách nhân vật** bên dưới sân khấu.
- Bản sao chỉ tồn tại khi chương trình đang chạy. Bấm nút dừng đỏ là tất cả bản sao biến mất.
## 2. Ba khối lệnh về bản sao
Cả 3 khối đều nằm trong nhóm **Điều khiển** (màu cam), ở cuối danh sách.
| Khối lệnh | Dùng để làm gì | Ví dụ dễ hiểu |
| --- | --- | --- |
| **tạo bản sao của [bản thân tôi]** | Tạo ra một bản sao mới | Đóng thêm một con dấu |
| **khi tôi bắt đầu là một bản sao** | Mở đầu đoạn code mà chỉ bản sao làm theo | "Bộ não" của bản sao |
| **xóa bản sao này** | Làm bản sao biến mất | Tẩy ngôi sao trên giấy |
### Khối 1: tạo bản sao của [bản thân tôi]
- Mỗi lần chạy khối này, Scratch tạo thêm **1 bản sao**.
- Muốn tạo nhiều bản sao, đặt khối vào trong **lặp lại** hoặc **liên tục**.
- Ô chọn **bản thân tôi** nghĩa là sao chính nhân vật đang viết code. Em cũng có thể chọn tên nhân vật khác.
### Khối 2: khi tôi bắt đầu là một bản sao
- Đây là khối **mũ** (khối đầu tiên của một đoạn code).
- Các lệnh gắn bên dưới **chỉ bản sao làm**, bản gốc không làm.
- Mỗi bản sao vừa được tạo ra sẽ tự chạy đoạn code này **riêng cho mình**.
### Khối 3: xóa bản sao này
- Làm bản sao đang chạy lệnh này biến mất.
- Thường dùng khi bản sao **xong việc**: rơi chạm đáy, bay ra khỏi màn hình, bị bắn trúng.
- Lệnh này **không có tác dụng với bản gốc**.
> **Ghi nhớ:** Bản gốc lo việc **tạo** bản sao. Bản sao lo việc **di chuyển** và **tự xóa** mình.
> **Lưu ý:** Scratch chỉ cho phép tối đa khoảng **300 bản sao** cùng lúc. Nếu không xóa, đến 300 thì Scratch sẽ không tạo thêm được nữa.
## 3. Ví dụ làm theo: Tuyết rơi
Kết quả: bông tuyết liên tục xuất hiện ở mép trên, rơi xuống và biến mất khi chạm đáy.
### Bước 1: Chuẩn bị
1. Mở Scratch, xóa nhân vật mèo.
2. Chọn phông nền tối, ví dụ **Winter** hoặc **Night City**, để tuyết trắng nổi bật.
3. Thêm nhân vật **Snowflake**. Nếu không tìm thấy, em tự vẽ một chấm tròn màu trắng.
4. Thu nhỏ bông tuyết: ở ô **Kích thước**, nhập **30**.
### Bước 2: Code cho bản gốc (người tạo bản sao)
Bản gốc ẩn mình đi, rồi cứ 0,2 giây lại tạo một bản sao.
```
khi bấm vào lá cờ xanh
ẩn
liên tục
tạo bản sao của [bản thân tôi]
đợi (0.2) giây
```
**Vì sao phải ẩn bản gốc?** Nếu không ẩn, sẽ có một bông tuyết đứng yên giữa màn hình, không bao giờ rơi.
### Bước 3: Code cho bản sao (bông tuyết rơi)
Mỗi bản sao tự chọn chỗ xuất hiện, rồi rơi xuống đến khi chạm đáy thì tự xóa.
```
khi tôi bắt đầu là một bản sao
đi tới x: (lấy ngẫu nhiên từ (-230) đến (230)) y: (180)
hiện
lặp lại cho đến khi < (tọa độ y) < (-170) >
thay đổi y một lượng (-3)
xóa bản sao này
```
Giải thích từng dòng:
- **đi tới x: ngẫu nhiên, y: 180**: bông tuyết xuất hiện ở mép trên, mỗi bông một vị trí khác nhau.
- **hiện**: bản sao giống bản gốc nên cũng đang bị ẩn. Phải cho hiện lên.
- **lặp lại cho đến khi tọa độ y < -170**: rơi dần cho tới khi gần chạm đáy.
- **thay đổi y một lượng -3**: mỗi lần lùi xuống 3 bước. Số càng lớn, tuyết rơi càng nhanh.
- **xóa bản sao này**: chạm đáy thì biến mất, không làm chật màn hình.
### Bước 4: Chạy thử
1. Bấm lá cờ xanh và quan sát.
2. Thử đổi **0.2** thành **0.05**: tuyết rơi dày hơn hay thưa hơn?
3. Thử đổi **-3** thành **-8**: tuyết rơi nhanh hơn hay chậm hơn?
4. Lưu bài với tên **Vidu_TuyetRoi.sb3**.
### Mở rộng (không bắt buộc)
Thêm khối **xoay (5) độ** vào trong vòng lặp của bản sao để bông tuyết vừa rơi vừa xoay.
## 4. Lỗi thường gặp
| Hiện tượng | Nguyên nhân | Cách sửa |
| --- | --- | --- |
| Có 1 bông tuyết đứng yên giữa màn hình | Quên **ẩn** bản gốc | Thêm khối **ẩn** dưới lá cờ xanh |
| Không thấy bông tuyết nào rơi | Quên khối **hiện** trong code bản sao | Thêm **hiện** dưới khối **khi tôi bắt đầu là một bản sao** |
| Chỉ có 1 bông tuyết rơi | Viết code rơi dưới **lá cờ xanh** thay vì dưới khối bản sao | Chuyển code rơi sang khối **khi tôi bắt đầu là một bản sao** |
| Tuyết rơi một lúc rồi không xuất hiện thêm | Quên **xóa bản sao này**, đã đủ 300 bản sao | Thêm **xóa bản sao này** ở cuối code bản sao |
| Bản sao sinh ra quá nhiều, máy bị chậm | Đặt khối **tạo bản sao** bên trong code của bản sao | Chỉ để bản gốc tạo bản sao |
| Tuyết dồn thành một đống ở cùng một chỗ | Quên khối **lấy ngẫu nhiên** cho tọa độ x | Dùng **lấy ngẫu nhiên từ -230 đến 230** |
## 5. Tự kiểm tra
Trả lời trước, rồi mới xem đáp án bên dưới.
1. Bản gốc và bản sao khác nhau như thế nào?
2. Muốn tạo 10 bản sao, em làm thế nào?
3. Đoạn code dưới khối **khi tôi bắt đầu là một bản sao** do ai thực hiện: bản gốc hay bản sao?
4. Vì sao phải dùng khối **xóa bản sao này**?
5. Trong ví dụ tuyết rơi, vì sao bản sao phải có khối **hiện**?
**Đáp án**
1. Bản gốc là nhân vật có sẵn, có tên trong danh sách nhân vật. Bản sao do bản gốc tạo ra, không có tên, mất đi khi dừng chương trình.
2. Đặt **tạo bản sao của bản thân tôi** vào trong **lặp lại (10)**.
3. Chỉ bản sao thực hiện.
4. Để bản sao xong việc thì biến mất, không vượt giới hạn 300 bản sao và không làm máy chậm.
5. Vì bản gốc đã bị ẩn, bản sao giống bản gốc nên cũng bị ẩn theo.
0 Nhận xét