Game Bắn máy bay
Mục tiêu: Trò chơi bắn máy bay: tàu bắn đạn, máy bay rơi xuống; trúng thì được điểm, bị đâm thì mất mạng.
Em sẽ học gì
- Nội dung trong bài: dùng nhân bản để tạo ra rất nhiều viên đạn và máy bay từ một nhân vật.
- Mỗi bản sao sinh ra, chạy chương trình riêng, rồi tự xoá khi trúng đích hoặc ra khỏi sân khấu.
- Bắn trúng máy bay thì được điểm, để máy bay đâm vào tàu thì mất một mạng.

Bài làm như sau. Trước hết là phông nền bầu trời: chọn Sân khấu ở góc dưới bên phải, rê chuột vào nút Chọn một Phông nền, chọn Tải phông nền lên, chọn file BauTroi.svg: trời xanh có mây, dưới đáy có dải xanh đậm. Viết dòng hướng dẫn chơi lên dải xanh đậm ở đáy: chọn công cụ Văn bản, hình chữ T, chọn màu tô trắng: kéo Độ bão hoà về 0, Độ sáng lớn nhất, bấm gần mép dưới rồi gõ: Di chuột: tàu chạy ngang. Phím cách: bắn.

Quay về thẻ Code. Dòng chữ nằm trên phông nền, nên lúc chơi luôn hiện ở đáy sân khấu. Trò chơi này không cần mèo: bấm chuột phải vào mèo, chọn xoá.

Thêm tàu của người chơi: bấm nút Chọn một Nhân vật ở góc dưới bên phải, gõ Rocketship vào ô tìm kiếm, rồi chọn con tàu. Đặt tên là Tau, Sân khấu rộng từ âm 240 đến 240 theo chiều ngang x, và từ âm 180 đến 180 theo chiều dọc y. Mèo đứng chính giữa, tại điểm x bằng 0, y bằng 0. đặt ở giữa đáy sân khấu: x bằng 0, y bằng âm 100, kích thước 40 phần trăm cho tàu nhỏ lại. Thêm viên đạn: rê chuột vào nút Chọn một Nhân vật, chọn Tải Nhân vật lên, rồi chọn file Dan.svg. Nhân vật mới tên là Dan. Đặt đạn ngay trên tàu: x bằng 0, y bằng âm 80. Thêm máy bay địch: lại rê chuột vào nút Chọn một Nhân vật, chọn Tải Nhân vật lên, chọn file MayBay.svg. Nhân vật tên là MayBay. Đặt máy bay ở mép trên: x bằng 0, y bằng 150. Tạo biến: chọn nhóm Biến số, bấm Tạo một biến, đặt tên là diem: số máy bay đã bắn trúng. Tạo thêm biến mang: số mạng còn lại, lúc đầu là 3. Hai ô biến hiện ở góc sân khấu.

Bây giờ viết khối lệnh. Chọn nhân vật Tau.

Việc cần làm: diem = 0, mang = 3; về giữa đáy; lặp mãi: x của tàu = x của chuột.
Sơ đồ thuật toán của tàu: bấm cờ xanh: điểm về 0, mạng bằng 3, tàu về giữa đáy. Rồi lặp mãi: đặt x của tàu bằng toạ độ x của chuột, nên tàu luôn chạy theo chuột.

Chọn nhóm Sự kiện, kéo khối: Khi bấm vào cờ xanh,
Giải thích: Khối Khi bấm vào cờ xanh: bấm cờ xanh thì các khối gắn bên dưới bắt đầu chạy.

Chọn nhóm Biến số, gắn khối đặt biến thành, chọn diem, giữ số 0,

thêm một khối đặt biến thành nữa, chọn mang, gõ 3: lúc đầu có ba mạng.
Giải thích: Khối đặt biến thành gán giá trị cho biến: mỗi ván mới, điểm về 0 và có ba mạng.

Chọn nhóm Chuyển động, gắn khối đi tới điểm x y, x bằng 0, y bằng âm 100: tàu ở giữa đáy sân khấu.

Chọn nhóm Điều khiển, gắn khối liên tục,

bên trong, khối đặt x bằng, trong nhóm Chuyển động,

ô số thả khối toạ độ x con trỏ chuột, trong nhóm Cảm biến. Ta vừa làm: điểm về 0, mạng bằng 3, tàu về giữa đáy, rồi lặp mãi chạy theo chuột.
Giải thích: Khối liên tục lặp mãi: mỗi lần lặp, đặt x của tàu bằng toạ độ x của con trỏ chuột, nên tàu luôn chạy theo chuột.

Chạy thử: bấm cờ xanh, rồi di chuột sang trái, sang phải: tàu chạy theo chuột.

Đến viên đạn. Chọn nhân vật Dan. Thêm tiếng đạn bắn: mở thẻ Âm thanh, bấm nút Chọn một Âm thanh, tìm Pew: tiếng chiu.

Quay lại thẻ Code.

Việc cần làm: ẩn đạn gốc; lặp mãi: đợi bấm phím cách, tạo bản sao, đợi 0,5 giây.
Sơ đồ của đạn gốc. Bấm cờ xanh: đạn gốc ẩn đi, nó chỉ là khuôn để tạo ra các viên đạn. Rồi lặp mãi: đợi đến khi bấm phím cách, tạo một bản sao của đạn, đợi 0,5 giây, rồi lại đợi phím.

Kéo khối Khi bấm vào cờ xanh,

gắn khối ẩn, trong nhóm Hiển thị,
Giải thích: Đạn gốc ẩn đi: nó chỉ là cái khuôn, các viên đạn bay lên là bản sao của nó.

Thêm khối liên tục, trong nhóm Điều khiển,

bên trong, khối đợi đến khi,

điều kiện là khối phím được bấm, trong nhóm Cảm biến: giữ nguyên phím trắng, tức là phím cách,
Giải thích: Khối đợi đến khi dừng ở đây cho tới khi phím cách, Scratch gọi là phím trắng, được bấm.

rồi khối tạo bản sao của chính tôi, trong nhóm Điều khiển,
Giải thích: Khối tạo bản sao của chính tôi tạo ra một viên đạn mới, giống hệt đạn gốc.

và khối đợi, gõ 0,5 giây: giữ phím thì mỗi giây bắn hai viên. Ta vừa làm: đạn gốc ẩn đi, rồi lặp mãi: đợi phím cách, tạo bản sao, đợi 0,5 giây.

Việc cần làm của bản sao: đi tới tàu, hiện ra, bay lên tới mép trên rồi tự xoá.
Sơ đồ của bản sao đạn: đi tới tàu và hiện ra. Chưa tới mép trên thì y tăng 10, bay lên; tới mép trên rồi thì xoá bản sao này.

Kéo khối Khi tôi bắt đầu là một bản sao, trong nhóm Điều khiển,
Giải thích: Khối khi tôi bắt đầu là một bản sao chạy riêng cho mỗi bản sao vừa được tạo ra.

gắn khối đi tới, trong nhóm Chuyển động, chọn Tau: viên đạn xuất phát từ con tàu,

rồi khối hiện, trong nhóm Hiển thị,

Gắn khối đặt âm lượng thành, trong nhóm Âm thanh, gõ 10: tiếng đạn nhỏ lại, chỉ còn 10 phần trăm.

và khối bắt đầu âm thanh, chọn Pew: đạn bắn ra kêu chiu.
Giải thích: Bản sao đi tới con tàu rồi mới hiện ra, vì đạn gốc đang ẩn nên bản sao cũng ẩn theo.
Giải thích: Khối đặt âm lượng thành 10 phần trăm làm tiếng đạn nhỏ lại. Bản sao không giữ âm lượng của đạn gốc, nên ta đặt âm lượng ngay trong bản sao.

Thêm khối lặp lại cho đến khi, trong nhóm Điều khiển,

điều kiện là phép so sánh lớn hơn, bên phải gõ 170,

bên trái thả khối toạ độ y, trong nhóm Chuyển động: lặp cho tới khi đạn lên tới mép trên.

Bên trong, khối thay đổi y một lượng, gõ 10: đạn bay lên.
Giải thích: Vòng lặp có điều kiện: y tăng 10 mỗi lần, lặp cho tới khi toạ độ y lớn hơn 170, tức là đạn lên tới mép trên.

Cuối cùng khối xoá bản sao này, gắn dưới vòng lặp. Ta vừa làm: mỗi bản sao đạn đi tới tàu, hiện ra, kêu Pew nhỏ nhỏ, bay lên tới mép trên rồi tự xoá.
Giải thích: Khối xoá bản sao này để xoá viên đạn khi không cần nữa. Không xoá thì bản sao cứ tích lại, làm đầy bộ nhớ, làm nặng chương trình. Ta cần lưu ý việc xóa này.

Chạy thử: bấm cờ xanh, giữ phím cách và di chuột: đạn bay lên liên tục, mỗi viên là một bản sao.

Đến máy bay địch. Chọn nhân vật MayBay. Thêm tiếng trúng đạn: thẻ Âm thanh, Chọn một Âm thanh, tìm Zoop.

Quay lại thẻ Code.

Việc cần làm: ẩn máy bay gốc; lặp mãi: tạo bản sao, đợi 1 giây.
Sơ đồ của máy bay gốc: ẩn đi, rồi lặp mãi: tạo một bản sao, đợi một giây. Mỗi giây có thêm một máy bay.

Kéo khối Khi bấm vào cờ xanh,

gắn khối ẩn,

thêm khối liên tục,

bên trong, khối tạo bản sao của chính tôi,

và khối đợi 1 giây. Ta vừa làm: máy bay gốc ẩn đi, rồi cứ mỗi giây tạo thêm một bản sao.
Giải thích: Lặp mãi: cứ mỗi giây, máy bay gốc tạo thêm một bản sao, tức là một máy bay mới.

Việc cần làm của bản sao: xuất hiện ở mép trên, x ngẫu nhiên; rơi xuống; trúng đạn thì cộng điểm, chạm tàu thì trừ mạng; xuống tới đáy thì xoá.
Sơ đồ của bản sao máy bay: hiện ở mép trên, tại x ngẫu nhiên. Chưa xuống tới đáy thì y giảm 4, rơi xuống. Chạm đạn thì điểm tăng 1 và xoá bản sao. Chạm tàu thì mạng giảm 1 và xoá bản sao. Xuống tới đáy rồi cũng xoá bản sao.

Kéo khối Khi tôi bắt đầu là một bản sao,

gắn khối đi tới điểm x y, ô y gõ 170: máy bay xuất hiện ở mép trên,

ô x thả khối lấy ngẫu nhiên, trong nhóm Các phép toán, từ âm 200, đến 200: mỗi máy bay xuất hiện một chỗ.

Thêm khối hiện.
Giải thích: Mỗi bản sao xuất hiện ở mép trên, tại một toạ độ x lấy ngẫu nhiên từ âm 200 đến 200, nên mỗi máy bay rơi một chỗ.

Thêm khối lặp lại cho đến khi,

điều kiện là phép so sánh nhỏ hơn, bên phải gõ âm 170,

bên trái thả khối toạ độ y: lặp cho tới khi máy bay xuống tới đáy.

Bên trong, khối thay đổi y một lượng, gõ âm 4: máy bay rơi xuống.
Giải thích: Vòng lặp có điều kiện: y giảm 4 mỗi lần, máy bay rơi xuống cho tới khi toạ độ y nhỏ hơn âm 170.

Thêm khối nếu, gắn dưới khối thay đổi y,

điều kiện là khối đang chạm, trong nhóm Cảm biến, chọn Dan: máy bay trúng một viên đạn bất kỳ,

thì khối thay đổi biến một lượng, chọn diem, giữ số 1,

khối đặt âm lượng thành, nhóm Âm thanh, gõ 10: như tiếng đạn, bản sao phải tự đặt âm lượng,

khối bắt đầu âm thanh, chọn Zoop,

khối ẩn: máy bay biến mất,

khối đợi 1 giây,

rồi khối xoá bản sao này: máy bay bị bắn hạ.
Giải thích: Đang chạm Dan đúng với mọi bản sao đạn. Trúng đạn thì điểm tăng 1, kêu Zoop, rồi máy bay này bị xoá.
Giải thích: Xoá bản sao thì tiếng của nó cũng tắt theo. Nên máy bay ẩn đi, đợi 1 giây cho tiếng Zoop kêu xong, rồi mới xoá.

Thêm một khối nếu nữa,

điều kiện là khối đang chạm, chọn Tau: máy bay đâm vào tàu,

thì khối thay đổi biến một lượng, chọn mang, gõ âm 1: mất một mạng,

rồi xoá bản sao này.
Giải thích: Máy bay đâm vào tàu thì mạng giảm 1 và máy bay này bị xoá.

Cuối cùng, gắn khối xoá bản sao này dưới vòng lặp: máy bay xuống tới đáy thì xoá. Ta vừa làm: mỗi bản sao máy bay hiện ở mép trên, rơi xuống; trúng đạn thì cộng điểm, đâm vào tàu thì trừ mạng, xuống tới đáy thì xoá.
Giải thích: Máy bay xuống tới đáy mà không trúng gì cũng phải xoá, để không còn bản sao thừa.

Chạy thử: bấm cờ xanh, giữ phím cách và di chuột theo máy bay: bắn trúng thì ô diem tăng, máy bay biến mất.

Còn phần thua cuộc. Chọn lại nhân vật Tàu. Thêm nhạc thua: thẻ Âm thanh, Chọn một Âm thanh, tìm Lose: đoạn nhạc game over.

Quay lại thẻ Code.

Việc cần làm: đợi đến khi mang < 1 thì nhạc thua, nói Hết mạng!, dừng tất cả.
Sơ đồ phần hết mạng: đợi đến khi mạng nhỏ hơn 1, đặt âm lượng 10 phần trăm, phát nhạc thua, nói Hết mạng! trong 4 giây, rồi dừng tất cả.

Kéo thêm một khối Khi bấm vào cờ xanh,
Giải thích: Tàu có thêm script thứ hai, cũng bắt đầu khi bấm cờ xanh, chạy song song với script thứ nhất.

gắn khối đợi đến khi, trong nhóm Điều khiển,

điều kiện là phép so sánh nhỏ hơn, bên phải gõ 1,

bên trái thả biến mang.
Giải thích: Khối đợi đến khi dừng ở đây cho tới khi mạng nhỏ hơn 1, tức là hết mạng.

Rồi khối phát thông báo, nhóm Sự kiện, Thông báo mới tên hetmang: báo cho máy bay thôi bay,

khối đặt âm lượng thành, nhóm Âm thanh, gõ 10: nhạc thua cũng nhỏ vừa phải,

khối bắt đầu âm thanh, chọn Lose: nhạc thua vang lên,

khối nói trong 2 giây, trong nhóm Hiển thị, gõ: Hết mạng! đổi thành 4 giây: đợi nhạc thua vang hết.

Cuối cùng khối dừng tất cả: hết ván, mọi bản sao cũng bị xoá. Ta vừa làm: đợi đến khi hết mạng thì phát nhạc thua, nói Hết mạng! trong 4 giây rồi dừng tất cả.
Giải thích: Khối dừng tất cả dừng mọi script, và Scratch xoá luôn mọi bản sao còn lại.

Máy bay phải dừng lại khi hết mạng, nếu không chúng vẫn đâm vào tàu, mạng xuống số âm. Chọn nhân vật MayBay.

Kéo khối Khi nhận thông báo, chọn hetmang, chọn hetmang,

gắn khối dừng lại, chọn other scripts in sprite: dừng các script khác, máy bay gốc thôi tạo máy bay mới,

rồi khối xoá bản sao này: các máy bay đang bay biến mất.
Giải thích: Thông báo đến cả máy bay gốc lẫn mọi bản sao: máy bay gốc thôi tạo máy bay mới, các bản sao tự xoá, nên mạng không xuống số âm.

Xong rồi! Chơi thử một ván: bắn hạ máy bay để ghi điểm. Để máy bay đâm vào tàu ba lần thì hết mạng, trò chơi dừng lại.

Các khối mới trong bài
- Khối tạo bản sao của chính tôi: tạo thêm một nhân vật giống hệt, chạy cùng các chương trình.
- Khối khi tôi bắt đầu là một bản sao: chạy riêng cho mỗi bản sao vừa được tạo ra.
- Khối xoá bản sao này: xoá bản sao khi không cần nữa, tránh tích lại.
Kỹ thuật lập trình đã học
- Về kỹ thuật lập trình, bài này ta học: nhân bản: một nhân vật gốc, thường ẩn đi, tạo ra rất nhiều bản sao giống nhau.
- Vòng đời của bản sao: sinh ra, chạy chương trình riêng, rồi tự xoá khi trúng đích hoặc ra khỏi sân khấu.
- Biến dùng chung: mọi bản sao máy bay cùng cộng điểm và trừ mạng.
- Và kiểm thử: bắn liên tiếp, nhiều máy bay cùng lúc, không còn bản sao thừa sau khi ra khỏi sân khấu.
Bài tập
Bài tập mở rộng: thêm máy bay mạnh, cần bắn ba phát mới rơi. Mỗi bản sao cần một biến riêng: khi tạo biến, chọn Chỉ nhân vật này.