Professional Documents
Culture Documents
Thiet Ke Phan Mem Giao Duc
Thiet Ke Phan Mem Giao Duc
Hà Nội - 2017
Lời nói đầu
Các bạn đang có trên tay cuốn sách rất đặc biệt về lập trình Scratch. Cuốn sách có
tên THIẾT KẾ PHẦN MỀM VÀ TRÒ CHƠI GIÁO DỤC bằng ngôn ngữ lập
trình Scratch. Cuốn sách này là một phát triển cao hơn nữa của cuốn sách TỰ
HỌC LẬP TRÌNH SCRATCH đã phát hành trước đây.
Môn Tin học ở các nước trên thế giới cùng có 1 lộ trình tương tự. Có thể với tên
gọi khác nhau nhưng nội dung thì cũng gần tương tự của Việt Nam chúng ta.
Trong đó, chắc tất cả đều hiểu: phân môn Khoa học máy tính (CS) sẽ là quan
trọng nhất, đóng vai trò trung tâm, cốt lõi của môn Tin học.
Trong 3 hướng này, IT và DL là những nội dung mà giáo viên Tin học hiện nay
vẫn đang giảng dạy, do đó sẽ không có gì bỡ ngỡ. Riêng hướng CS là hoàn toàn
mới và hoàn toàn khác biệt so với hiện nay.
Có thể tóm tắt hướng đi, phát triển tương lai của 3 nhóm, phân môn của môn Tin
học trong bảng sau:
DL - Học vấn số hóa phổ IT - Ứng dụng CNTT và CS - Khoa học máy tính
thông truyền thông
Các kỹ năng cơ bản, tối Sử dụng công nghệ xử lý số, Lý thuyết và thực hành về xử
thiểu cần có trong thời đại phần mềm để ứng dụng và lý số, tư duy giải quyết vấn
số hóa, ví dụ: Kỹ năng sử tạo ra các sản phẩm số phục đề, thiết lập chương trình,
dụng chuột, gõ bàn phím; vụ yêu cầu. Ví dụ đồ họa, thuật toán, tư duy máy tính.
Soạn thảo văn bản, bảng phim, ảnh, ứng dụng trong
tính, trình chiếu; Khai thác các công việc đời sống.
Internet. Sử dụng thư điện
tử và mạng xã hội.
Đây là những kỹ năng, Mảng kiến thức này sẽ được Lõi của môn học này là khái
năng lực tối thiểu đơn giản phân thành 2 nhóm: niệm tư duy máy tính hay tư
nhất cần có của mọi công duy thuật toán. Đây là kiến
1. Nhóm ứng dụng CNTT,
dân trong thế giới số hiện phần mềm vào các chuyên thức cơ bản nằm bên dưới các
nay. Có thể ví như học khái niệm quen thuộc như
ngành, môn học khác với
đếm trong môn Toán và phần mềm, phần cứng máy
Tin học.
học đánh vần trong môn tính. Đi cùng mô hình tư duy
Tiếng Việt. 2. Nhóm các ứng dụng này là 1 tập hợp các kiến thức
CNTT, truyền thông bên lõi, cơ bản về lý thuyết cũng
trong ICT. như thực hành, kỹ năng, năng
DL - Học vấn số IT1- Ứng dụng trong CS - Khoa học máy tính.
hóa phổ thông. các lĩnh vực ngoài
Kiến thức lõi của Tin học:
ICT.
Tin học
Có thể so sánh 3 nhánh kiến thức của môn Tin học theo sơ đồ trên với các sơ dồ
sau của môn Toán và Ngữ văn - tiếng Việt.
Toán học
CS và IT là 2 mảng kiến thức bắt buộc cần dạy cho HS ngay từ cấp Tiểu học,
ngay từ lớp 1. Hai nhóm kiến thức này là độc lập với nhau, gần như bổ sung cho
nhau và có nhiều cách tiếp cận, định hướng khác nhau hoàn toàn. Giáo viên Tin
học cần hiểu rõ điều này khi giảng dạy. Các chuyên gia thiết kế chương trình môn
Tư duy máy tính: năng lực tư duy quan trọng nhất của
Khoa học máy tính.
Xuất xứ của khái niệm Tư duy máy tính (computational thinking).
Người đầu tiên nhắc đến cụm từ này là Seymour Papert (29/2/1928 – 31/7/2016),
giáo sư toán đại học MIT đồng thời là tác giả của phần mềm và ngôn ngữ lập trình
LOGO, trong khi muốn đưa việc giảng dạy thuật toán bằng phần mềm này cho
học sinh nhỏ tuổi.
“… the thought processes involved in formulating problems and their solutions
so that the solutions are represented in a form that can be effectively carried out
by an information-processing agent”.
tạm dịch:
"… là các quá trình tư duy bao gồm cả mô tả và lời giải bài toán sao cho lời
giải có thể được thực hiện một cách hiệu quả bởi các tác tử xử lý thông tin".
Tác giả GS Jeannette Wing (hiện là phó chủ tịch Microsoft) là người đầu tiên
đưa ra định nghĩa của khái niệm này (tư duy máy tính), như sau:
“The solution can be carried out by a human or machine, or more generally, by
combinations of humans and machines.”
tạm dịch:
"Lời giải phải (và có thể) được thực hiện bởi con người hoặc máy tính, hoặc
tổng quát hơn, bởi sự kết hợp (đồng thời) con người và máy tính".
Như vậy tư duy máy tính chính là kỹ năng rất cơ bản để chúng ta có thể hiểu,
biết một cách có lý, logic về thế giới xung quanh dựa trên sức mạnh của máy tính.
Phân môn "Khoa học máy tính" là môn học dạy các nguyên tắc lý thuyết và thực
hành cho mô hình tính toán máy tính và các ứng dụng của mô hình này. Lõi của
môn học này là khái niệm tư duy máy tính hay tư duy thuật toán. Đây là mô
hình tư duy lõi, cơ bản nằm bên dưới các khái niệm quen thuộc như phần mềm,
phần cứng máy tính. Mô hình tư duy này sẽ cung cấp các khung kiến thức để giải
quyết các bài toán, vấn đề nảy sinh. Đi cùng mô hình tư duy này là 1 tập hợp các
7|Thiết kế phần mềm
kiến thức lõi, cơ bản về lý thuyết cũng như thực hành, kỹ năng, năng lực phân
tích, mô phỏng và giải quyết vấn đề.
Khoa học máy tính đi sâu vào tìm hiểu cách làm việc và vận hành của máy tính và
các hệ thống máy tính, tìm hiểu các máy tính và chương trình được thiết kế và lập
trình như thế nào. Học sinh sẽ được tiếp cận với các hệ thống tính toán theo mọi
khía cạnh, có thể cần hoặc không cần có máy tính. "Tư duy máy tính" sẽ có ảnh
hưởng đến cả các lĩnh vực khoa học khác như sinh học, hóa học, ngôn ngữ, tâm lý
học, kinh tế và thống kê. Cũng chính tư duy đó sẽ giúp học sinh có thể giải các bài
toán, giải quyết vấn đề, thiết kế hệ thống, sản phẩm và hiểu được sức mạnh cũng
như giới hạn, hạn chế của con người và máy móc. Chính tư duy đó sẽ là yêu cầu
kỹ năng, năng lực mà mỗi học sinh cần hiểu và nắm bắt được dù chỉ một phần của
nó. Nếu có các kỹ năng, tư duy, suy luận như "máy tính" thì các học sinh này sẽ
hiểu tốt hơn và có nhiều cơ hội hơn trong việc tiếp thu các công nghệ "dựa trên
máy tính" (computer-based technology) và sẽ được chuẩn bị tốt hơn khi trở thành
công dân tương lai trong xã hội hiện đại.
Khoa học máy tính là môn học thực hành, trong đó rất khuyến khích sự dũng cảm
và sáng tạo. Học sinh được học các nguyên tắc, lý thuyết hàn lâm của môn học và
khuyến khích ứng dụng sáng tạo để hiểu và mô phỏng được thế giới thực xung
quanh các em. Sự kết hợp hài hòa giữa lý thuyết, thực hành và sáng tạo sẽ làm cho
môn học này trở nên vô cùng hấp dẫn, giúp các học sinh có thể tạo ra được các
sản phẩm vừa có ích ("Nó chạy rồi!") vừa trí tuệ ("Nó quá đẹp!").
Tư duy máy tính ở đây cần được hiểu là nói về khả năng con người có thể làm,
chứ không phải máy tính có thể làm. Ví dụ khi nhắc đến tư duy máy tính người ta
thường nhắc đến các khả năng suy nghĩ và làm việc logic, có tính (tối ưu) thuật
toán, có thể lặp lại và có thể trừu tượng hóa.
Trong mô hình phân môn Khoa học máy tính của Tin học, tư duy máy tính cần
được trang bị cho học sinh ngay từ cấp Tiểu học.
Các năng lực, kỹ năng cơ bản của tư duy máy tính bao gồm Trừu tượng hóa và
Lập trình.
Tin học và vai trò của các ngôn ngữ lập trinh trực quan
Chúng ta cùng xem lại các mốc sự kiện công nghệ quan trọng với môn Tin học và
ngành CNTT, ICT nói chung.
1945. Ra đời máy tính điện tử, ra đời ngành CNTT, khoa học máy tính.
1970x. Xuất hiện các máy tính mainframe, nhỏ hơn nhiều so với những chiếc máy
tính thế hệ đầu tiên. Ngành Khoa học máy tính, CNTT chính thức được hình
thành và giảng dạy trong các trường đại học.
1980. Máy tính cá nhân (PC) ra đời, đưa các ứng dụng của CNTT đến từng gia
đình. Lần đầu tiên môn Tin học (chỉ bao gồm học các ứng dụng) được đưa xuống
nhà trường cho học sinh các lớp cuối cấp.
1990-2000. Bùng nổ Internet các ứng dụng mạng trên qui mô toàn cầu. Môn Tin
học được đưa xuống cấp 1, nhưng chỉ dừng lại ở việc học các ứng dụng cụ thể, rời
rạc.
2005-7. Xuất hiện điện thoại thông minh, sau đó là các ứng ụng IoT, len lỏi vào
khắp các ngành công nghiệp và dịch vụ. Xuất hiện các khoa học mới như tự động
hóa, khoa học dữ liệu, trí tuệ nhân tạo có ứng dụng cụ thể hàng ngày. CMCN 4.0
xuất hiện.
Trên thực tế những phát minh công nghệ, khoa học, ứng dụng mới rất nhiều là
một tích hợp công nghệ từ những chuyên ngành trên. Do vậy các nhà khoa học
mới đưa ra 4 chữ cái trên, như một slogan để khuyến khích việc học tập, nghiên
cứu xung quanh các môn học này và các tích hợp giữa chúng.
Tuy nhiên có 1 chuyên ngành nữa mà ai cũng biết đóng vai trò then chốt nhất, tích
hợp giữa các hướng trên, đó chính là Tin học, hay nói chính xác hơn là khoa học
máy tính trong tin học.
Khoa học máy tính là môn học mang đặc tính STEM rõ nhất, môn học này có
nhiều điểm chung nhất với đồng thời các thành phần khác của STEM như Kỹ
nghệ (Engineering), Toán học (Mathematics), Khoa học (Science) và Công nghệ
(Technology). Sau đây là một vài lý giải cho mệnh đề trên.
- Hướng kiến thức này dựa trên một hệ thống cơ sở lý luận toán học chặt chẽ,
logic và khoa học.
- Trọng tâm của Khoa học máy tính là "tư duy máy tính", có cơ sở lý luận hàn
lâm nền tảng kết hợp thực nghiệm và đánh giá, đo đạc số liệu một cách khoa
học.
- Lõi của Khoa học máy tính là phần kiến thức lập trình, một kỹ năng đòi hỏi quá
trình thiết kế, xây dựng, kiểm thử và đánh giá dựa trên các tiêu chuẩn kỹ thuật.
- Khoa học máy tính yêu cầu và có liên quan rất nhiều đến sự hiểu biết, ứng dụng,
đánh giá các công nghệ của nhiều chuyên ngành khác nhau.
STEM bắt buộc phải gắn liền với Tin học, với Khoa học máy tính, chúng tuy 2
nhưng là 1 thực thể thống nhất, không thể tách rời. Khoa học máy tính là nền tảng
lý thuyết và công nghệ kết nối các chuyên ngành khác nhau trong mô hình STEM.
Scratch là môi trường lập trình hỗ trợ giáo dục STEM tốt
nhất.
Vì sao lại có thể khẳng định Scratch là môi trường lập trình hỗ trợ giáo dục STEM
tốt nhất?
Như chúng ta đã biết, điểm cốt lõi cơ bản nhất của giáo dục STEM là vừa học vừa
làm, thực hành làm ra các sản phẩm cụ thể, từ đó nâng cao sự đam mê, yêu thích
môn học của mình.
Với cách hiểu trên thì với môn Tin học, tinh thần giáo dục STEM chính là khuyến
khích làm ra các sản phẩm cụ thể từ chính các kiến thức môn học của mình.
Ngôn ngữ lập trình Scratch rất trực quan, dễ dàng tạo ra các sản phẩm, chương
trình, phần mềm hay đơn giản là một trò chơi. Đây chính là điểm mạnh nhất của
Scratch mà các ngôn ngữ lập trình bậc cao khác không thể làm được, vì qui trình
làm ra một sản phẩm hoàn chỉnh bằng các ngôn ngữ lập trình bậc cao khác là khá
phức tạp.
Cuốn sách này được viết nhằm mục đích chính tăng cường giáo dục STEM của
môn Tin học.
Giới thiệu nhanh các chủ đề cuốn sách
Sau đây là giới thiệu nhanh nội dung cuốn sách.
Sách sẽ có 8 chương. Mỗi chương là một chủ đề độc lập, định hướng vào công
nghệ, kỹ thuật làm phần mềm hoặc định hướng nội dung phần mềm. Các chủ đề
đều có thể đọc độc lập. 3 chủ đề đầu tiên là định hướng công cụ, 5 chủ đề sau là
định hướng nội dung thiết kế phần mềm.
Sau mỗi chủ đề là một số bài tập nhỏ. Chúng tôi sẽ liên tục bổ sung thêm các bài
tập, mở rộng này trong tương lai.
10 | T h i ế t k ế p h ầ n m ề m
Chủ đề 1. Một số nguyên tắc và qui trình thiết kế phần mềm
Mục tiêu:
- Giới thiệu một số nguyên tắc thiết kế phần mềm, trò chơi trên Scratch.
- Mô tả các bước thiết kế 1 chương trình phần mềm hoàn chỉnh.
Chủ đề 1 sẽ trình bày một số nguyên tắc, và đặc biệt trình bày, đưa ra 1 qui trình
thiết kế phần mềm bằng Scratch. Có 4 qui trình quan trọng nhất của việc thiết kế
phần mềm là:
- Viết kịch bản phần mềm.
- Thiết kế nhân vật.
- Thiết kế bộ dữ liệu hệ thống.
- Lập trình.
Để có thể lập trình dễ dàng, không mắc lỗi, cần xây dựng và vẽ được Sơ đồ thiết
kế - hoạt động của chương trình. Sơ đồ này càng được vẽ cẩn thận, chính xác bao
nhiêu thì việc cài đặt, lập trình sẽ càng dễ dàng bấy nhiêu.
Chủ đề 2. Clone và một số kỹ thuật xử lý Clone
Mục tiêu:
- Giới thiệu nhanh khái niệm và một số kỹ thuật lập trình với Clone trong Scratch.
- Ứng dụng kỹ thuật Clone trong việc thiết kế phần mềm, trò chơi giáo dục.
Chủ đề này nhắc lại các kiến thức, kỹ thuật chính liên quan đến Clone (phân
thân). Clone có lẽ đóng vai trò trung tâm nhất của toàn bộ quá trình thiết kế phần
mềm. Nội dung của chủ đề này được lấy chủ yếu từ cuốn sách TỰ HỌC LẬP
TRÌNH SCRATCH mà tôi đã viết trước đây.
Chủ đề 3. Các công cụ và kỹ thuật thiết kế phần mềm
Mục tiêu:
- Một số kỹ thuật chính khi thiết kế phần mềm thực sự so sánh với việc chỉ viết
chương trình theo yêu cầu của người khác.
- Một vài kỹ thuật và đặc thù chính của một phần mềm hay trò chơi.
Chủ đề này trình bày một số kỹ thuật và công cụ hay dùng trong khi viết các
chương trình phần mềm cụ thể. Các công cụ này rất cần thiết cho mọi người muốn
tự học thiết kế phần mềm. Ví dụ các công cụ đã trình bày trong chủ đề này:
- Kỹ thuật đếm điểm số, do thời gian.
- Kỹ thuật hiển thị số lần chơi.
- Kỹ thuật hiển thị số hoặc chữ lớn.
- Một số cách thiết kế và thuật toán sinh ngẫu nhiên.
Chủ đề 4. Thiết kế một số phần mềm quen thuộc
Mục tiêu:
- Thiết kế một số phần mềm giáo dục quen thuộc, từ dễ đến khó để rèn luyện các
kỹ năng cơ bản thiết kế phần mềm.
Chủ đề này sẽ bắt đầu thực sự thiết kế chi tiết một số phần mềm quen thuộc và
tiêu biểu. Hầu hết các phần mềm trong chủ đề này đều đã được giới thiệu trong
11 | T h i ế t k ế p h ầ n m ề m
cuốn sách trước của tôi, nhưng trong cuốn sách này, các phần mềm này sẽ được
mô tả hoàn toàn chi tiết đến mức lập trình.
Các phần mềm được mô tả trong chủ đề này là:
- Bút vẽ tự do và nâng cao.
- Flappy Bird.
- Kỹ thuật bắn súng.
- Tham quan bảo tàng.
- Trò chơi đoán từ Hangman.
- Trò chơi mưa từ.
- Trò chơi Luyện trí nhớ.
- Trò chơi Ô chữ.
Chủ đề 5. Phần mềm tập chuột, bàn phím
Mục tiêu:
- Các phương pháp điều khiển nhân vật bằng chuột và bàn phím.
- Một số kỹ thuật xử lý chuột.
- Phần mềm tập chuột, bàn phím cho học sinh.
Chủ đề này bắt đầu bằng việc mô tả các kỹ thuật điều khiển bàn phím, chuột và kỹ
năng nhận biết điều khiển chuột.
Các thao tác chuột sau được mô tả chi tiết trong chủ đề:
- Di chuyển chuột.
- Nháy chuột.
- Kéo thả chuột.
- Nháy đúp chuột.
Phần mềm Mouse Skills dùng để luyện các thao tác với chuột được thiết kế chi
tiết trong phần này.
Ngoài ra một phần mềm học gõ bàn phím bằng 10 ngón cũng được thiết kế, mô tả
trong chủ đề này.
Chủ đề 6. Phần mềm hỗ trợ học khoa học máy tính
Mục tiêu:
- Một số thuật toán chính biến đổi số trong các hệ đếm khác nhau.
- Thiết kế phần mềm, trò chơi liên quan đến biến đổi số trong các hệ đếm khác
nhau.
- Một số phần mềm khác hỗ trợ giảng dạy khoa học máy tính trong trường phổ
thông.
Chủ đề này tập trung mô tả một số chương trình ứng dụng có liên quan đến phân
môn khoa học máy tính của môn Tin học. Các chủ đề cụ thể bao gồm:
- Các thuật toán và bài toán mô tả việc chuyển đổi giữa các hệ đếm thập phân, nhị
phân và hexa.
- Các thuật toán sắp xếp và phần mềm mô phỏng sắp xếp.
12 | T h i ế t k ế p h ầ n m ề m
- Các trò chơi có liên quan đến sắp xếp số.
Chủ đề 7. Phần mềm hỗ trợ học toán
Mục tiêu:
- Thiết kế một số phần mềm hỗ trợ học và dạy môn Toán.
- Một số thuật toán sinh dãy số ngẫu nhiên, sinh các bài toán đầu vào cho các phần
mềm học Toán.
Chủ đề này tập trung mô tả các phần mềm ứng dụng học và giải toán. Các dạng
toán trắc nghiệm và điền số trực tiếp được mô tả trong chủ đề này.
Một lớp các bài toán điền số vào dãy được thiết kế dữ liệu cẩn thận và mô tả chi
tiết trong chủ đề này.
Chủ đề 8. Phần mềm hỗ trợ học khoa học
Mục tiêu:
- Thiết lập các dạng bài toán mô tả các hiện tượng thực tế, có tính chính xác và
khoa học.
- Thiết kế một số phần mềm đơn giản cho môn Khoa học tự nhiên.
Chủ đề này chỉ bao gồm những ví dụ nhỏ ban đầu của hướng phần mềm dành cho
nhóm các môn học khoa học. Đặc điểm của các ứng dụng này là tính chính xác
khoa học của các mô phỏng.
Chủ đề bao gồm 1 số chương trình, ứng dụng mô phỏng lịch tháng và đồng hồ số,
mô phỏng viên đạn bắn ra khỏi nòng súng, mô phỏng chuyển động của bánh xe,
chuyển động của quả bóng trong trò chơi bi-a.
Chủ đề này sẽ có có rất nhiều phát triển trong tương lai.
13 | T h i ế t k ế p h ầ n m ề m
14 | T h i ế t k ế p h ầ n m ề m
MỤC LỤC
Lời nói đầu ................................................................................................................... 2
Đối tượng, mục đích ................................................................................................ 2
Môn Tin học trong tương lai sẽ như thế nào? ................................................... 2
Tư duy máy tính: năng lực tư duy quan trọng nhất của Khoa học máy tính. .. 7
Tin học và vai trò của các ngôn ngữ lập trinh trực quan .................................. 8
Scratch và giáo dục STEM ..................................................................................... 9
Scratch là môi trường lập trình hỗ trợ giáo dục STEM tốt nhất..................... 10
Giới thiệu nhanh các chủ đề cuốn sách ................................................................ 10
Chủ đề 1. Một số nguyên tắc và qui trình thiết kế phần mềm ........................ 11
Chủ đề 2. Clone và một số kỹ thuật xử lý Clone ............................................ 11
Chủ đề 3. Các công cụ và kỹ thuật thiết kế phần mềm ................................... 11
Chủ đề 4. Thiết kế một số phần mềm quen thuộc ........................................... 11
Chủ đề 5. Phần mềm tập chuột, bàn phím ....................................................... 12
Chủ đề 6. Phần mềm hỗ trợ học khoa học máy tính ....................................... 12
Chủ đề 7. Phần mềm hỗ trợ học toán ............................................................... 13
Chủ đề 8. Phần mềm hỗ trợ học khoa học ....................................................... 13
Chủ đề 1. Một số nguyên tắc và qui trình thiết kế phần mềm ............................... 19
Nội dung chính ...................................................................................................... 19
1. Ai là người thiết kế phần mềm? ................................................................... 19
2. Các bước thiết kế phần mềm ........................................................................ 20
3. Sơ đồ thiết kế phần mềm .............................................................................. 21
4. Ví dụ 1: Tìm hiểu các con vật ...................................................................... 22
5. Ví dụ 2: Math Board ..................................................................................... 27
Câu hỏi - Bài tập - Mở rộng .................................................................................. 34
Chủ đề 2. Clone và một số kỹ thuật xử lý Clone .................................................... 36
Nội dung chính ...................................................................................................... 36
1. Khái niệm phân thân - clone trong Scratch ................................................. 36
2. Rừng hoa........................................................................................................ 39
3. Hai chú mèo sinh đôi .................................................................................... 40
4. Thuộc tính của nhân vật................................................................................ 41
5. Biến nhớ riêng là thuộc tính của nhân vật ................................................... 45
6. Clone kế thừa thuộc tính nhân vật ............................................................... 46
7. Giao tiếp người dùng - clone, clone - clone ................................................ 50
Câu hỏi - Bài tập - Mở rộng .................................................................................. 52
Chủ đề 3. Các công cụ, kỹ thuật thiết kế phần mềm .............................................. 54
Nội dung chính ...................................................................................................... 54
1. Một số đặc điểm của phần mềm trò chơi..................................................... 54
15 | T h i ế t k ế p h ầ n m ề m
2. Kỹ thuật đếm ngược...................................................................................... 56
3. Mô phỏng lượt chơi cho các nhân vật ......................................................... 57
4. Kỹ thuật tính điểm số cho người chơi ......................................................... 59
5. Thể hiện số và đếm số .................................................................................. 60
6. Thể hiện chữ, tên người, nhân vật................................................................ 65
7. Kỹ thuật sinh ngẫu nhiên trong các trò chơi và phần mềm ........................ 66
8. Thuật toán sinh ngẫu nhiên 1 bộ đáp án, trong đó có 1 đáp án đúng ........ 70
9. Ví dụ: trò chơi điều khiển bóng ................................................................... 72
Câu hỏi - Bài tập - Mở rộng .................................................................................. 77
Chủ đề 4. Thiết kế một số phần mềm quen thuộc .................................................. 79
Nội dung chính ...................................................................................................... 79
1. Chương trình Bút vẽ màu hoàn chỉnh .......................................................... 79
2. Trò chơi, phần mềm, kỹ thuật bắn súng ...................................................... 83
3. Flappy Bird .................................................................................................... 92
4. Trình diễn trong bảo tàng ........................................................................... 101
5. Bút vẽ nâng cao và bài toán vẽ hình mẫu .................................................. 109
6. Trò chơi hangman ....................................................................................... 116
7. Trò chơi mưa từ........................................................................................... 127
8. Trò chơi luyện trí nhớ ................................................................................. 133
9. Trò chơi Ô chữ ............................................................................................ 146
Câu hỏi - Bài tập - Mở rộng ................................................................................ 166
Chủ đề 5. Phần mềm tập chuột, bàn phím ............................................................ 168
Nội dung chính .................................................................................................... 168
1. Điều khiển nhân vật bằng bàn phím .......................................................... 168
2. Điều khiển nhân vật bằng chuột ................................................................. 168
3. Mô phỏng di chuyển chuột ......................................................................... 171
4. Mô phỏng tập nháy chuột ........................................................................... 173
5. Mô phỏng tập kéo thả chuột ....................................................................... 175
6. Mô phỏng tập nháy đúp chuột .................................................................... 178
7. Phần mềm tập gõ bàn phím ........................................................................ 181
8. Ví dụ: phần mềm Mouse Skills .................................................................. 189
Câu hỏi - Bài tập - Mở rộng ................................................................................ 196
Chủ đề 6. Phần mềm hỗ trợ học Khoa học máy tính............................................ 198
Nội dung chính .................................................................................................... 198
1. Thuật toán biến đổi số thập phân, nhị phân và hexa ................................. 198
2. Phần mềm hiển thị và biến đổi giữa số thập phân, nhị phân và hexa ...... 203
3. Mô phỏng sắp xếp (loại 1) .......................................................................... 204
4. Mô phỏng sắp xếp (loại 2) .......................................................................... 211
16 | T h i ế t k ế p h ầ n m ề m
5. Biểu diễn nhị phân ...................................................................................... 219
6. Mô phỏng sắp xếp (loại 3). Trò chơi xếp số trong hình vuông ................ 224
7. Mô phỏng sắp xếp (loại 4) .......................................................................... 233
Câu hỏi - Bài tập - Mở rộng ................................................................................ 238
Chủ đề 7. Phần mềm hỗ trợ học Toán ................................................................... 242
Nội dung chính .................................................................................................... 242
1. Trò chơi điền số vào dãy, vào bảng ........................................................... 242
2. Trò chơi tìm số ............................................................................................ 255
3. Trò chơi bắn súng giải toán ........................................................................ 269
Câu hỏi - Bài tập - Mở rộng ................................................................................ 278
Chủ đề 8. Phần mềm hỗ trợ học Khoa học ........................................................... 282
Nội dung chính .................................................................................................... 282
1. Mô phỏng đồng hồ và lịch .......................................................................... 282
2. Các bánh xe quay ........................................................................................ 292
3. Bánh xe lăn trên đường thẳng .................................................................... 294
4. Bánh xe quay trong vòng tròn .................................................................... 296
5. Bánh xe lăn trên đường cong bất kỳ .......................................................... 299
6. Mô phỏng bắn súng..................................................................................... 305
7. Mô phỏng Bi-a ............................................................................................ 312
Câu hỏi - Bài tập - Mở rộng ................................................................................ 320
PHỤ LỤC: CÁC TẬP LỆNH SCRATCH............................................................. 322
1. Nhóm câu lệnh Move ...................................................................................... 322
2. Nhóm câu lệnh Look ....................................................................................... 323
3. Nhóm câu lệnh Sound ..................................................................................... 325
4. Nhóm câu lệnh Pen ......................................................................................... 326
5. Nhóm câu lệnh Variable ................................................................................. 327
6. Nhóm câu lệnh Event ...................................................................................... 328
7. Nhóm câu lệnh Control ................................................................................... 330
8. Nhóm câu lệnh Sensing .................................................................................. 331
9. Nhóm câu lệnh Operators ............................................................................... 334
10. Nhóm lệnh More Blocks ............................................................................... 335
Tài liệu tham khảo ................................................................................................... 337
17 | T h i ế t k ế p h ầ n m ề m
18 | T h i ế t k ế p h ầ n m ề m
Chủ đề 1.
Một số nguyên tắc và qui trình thiết kế phần mềm
Mục tiêu:
- Giới thiệu một số nguyên tắc thiết kế phần mềm, trò chơi trên Scratch.
- Mô tả các bước thiết kế 1 chương trình phần mềm hoàn chỉnh.
Nội dung chính
Nhắc lại rằng những điều được viết ra trong bài học này, cũng như quyển sách
này, chỉ có ý nghĩa trong phạm vi môi trường lập trình kéo thả Scratch. Tuy nhiên
nó có ích cho tất cả những ai đã và đang làm trong ngành CNTT, đặc biệt là lập
trình và thiết kế phần mềm.
1. Ai là người thiết kế phần mềm?
Người thiết kế phần mềm bằng lập trình Scratch phải là người đóng các vai trò
sau (4 trong 1).
A. Người viết kịch bản và thiết kế nhân vật
Như chúng ta đều biết, cái đầu tiên cần có của mọi bộ phim, vở diễn hay bất cứ sụ
kiện trình diễn nào đó chính là kịch bản. Kịch bản ở đây được hiểu là cốt truyện,
nội dung chính của truyện, lời thoại, hoạt động của các nhân vật chính. Kịch bản
còn có thông tin như mục đích, yêu cầu, đối tượng muốn hướng đến của câu
chuyện.
Với phần mềm cũng vậy, cái cần đầu tiên và số 1 là kịch bản của phần mềm. Hay
cái mà chúng ta vẫn thường gọi là yêu cầu cụ thể của bài toán.
Điều này cũng đúng với Scratch.
Người viết kịch bản và thiết kế nhân vật của phần mềm Scratch chính là người
đầu tiên và quan trọng nhất phác thảo ra yêu cầu, nội dung, kịch bản và hoạt động
cụ thể của các nhân vật trong phần mềm.
Trên thực tế người viết kịch bản và thiết kế nhân vật cho 1 chương trình
Scratch thực hiện những công việc sau:
- Thiết kế yêu cầu cụ thể và chi tiết của phần mềm bao gồm các hoạt động chính,
các chức năng chính, nêu được mục đích và đối tượng sử dụng của chương trình.
- Thiết kế các nhân vật chính, các nút lệnh chính của chương trình.
- Mô tả các chức năng, hoạt động chi tiết của từng nhân vật, từng nút lệnh trong
chương trình.
B. Đạo diễn chính toàn bộ hoạt động của phần mềm
Đạo diễn là người tổng chỉ huy việc thiết kế toàn bộ chương trình từ khi có kịch
bản cho đến khi kết thúc, hoàn thiện chương trình.
Đối với chương trình, phần mềm Scratch, công việc của đạo diễn là:
- Xác định công nghệ chính sẽ được sử dụng trong chương trình. Chú ý rằng 1 bài
toán, 1 kịch bản có thể có nhiều cách làm khác nhau, dựa vào các công nghệ, kỹ
thuật khác nhau. Ví dụ trong kịch bản sẽ có 3 nhân vật A, B, C. Đạo diễn sẽ là
người quyết định thiết lập 3 nhân vật độc lập hay chỉ dùng 1 nhân vật với 3 clone
để thể hiện.
19 | T h i ế t k ế p h ầ n m ề m
- Thiết kế toàn bộ giao diện đồ họa của chương trình bao gồm nhân vật, nền sân
khấu và các nút lệnh.
- Tìm kiếm âm thanh sẽ được sử dụng trong chương trình.
- Quản trị toàn bộ chương trình, kiểm tra, kiểm thử, sửa lỗi trong suốt quá trình
thiết kế chi tiết và lập trình.
- Quyết định thời điểm chương trình hoàn thành và nghiệm thu.
C. Người thiết kế hệ thống thông tin: tổng quát và chi tiết
Sau khi đã có kịch bản và thiết kế nhân vật, xác định xong công nghệ lõi thực hiện
thì bước tiếp theo là thiết kế hệ thống thông tin tổng quát và chi tiết. Các công
việc chính của người thiết kế hệ thống thông tin bao gồm:
- Thiết kế các biến nhớ và dữ liệu tổng thể.
- Phân rã chương trình.
- Tổng quát hóa và trừu tượng hóa các mô hình: nhân vật, sự kiện, hành động.
- Thiết kế sơ đồ quan hệ giữa các nhân vật và nền sân khấu.
- Chuẩn bị các thuật toán cần thiết cho các bài toán con đã được phân rã.
D. Người lập trình (coding) cụ thể
Cuối cùng là người lập trình (coding) cụ thể. Người lập trình sẽ phải tuân thủ tất
cả các đề nghị, yêu cầu và kiểm soát bởi 3 người phía trên.
2. Các bước thiết kế phần mềm
Trong mục này sẽ mô tả chi tiết các bước cần thực hiện của công việc thiết kế
phần mềm. Các công việc này là nhiệm vụ của người đạo diễn (B) và người thiết
kế hệ thống (C) ở phần trên.
2.1. Chuẩn bị công nghệ xử lý và giải quyết bài toán
Đây là bước thiết kế đầu tiên sau khi đã có kịch bản, yêu cầu chi tiết của chương
trình. Chúng ta đều biết rằng một bài toán Tin học sẽ có cách giải, nhiều cách tiếp
cận với các công nghệ khác nhau. Người thiết kế phần mềm phải quyết định điều
này.
Thông thường ở bước này, cần đưa ra các quyết định sau cho 1 chương trình, phần
mềm trên Scratch.
- Với từng nhân vật, nhóm nhân vật, có dùng Clone hay không? Nếu dùng Clone
thì sẽ triển khai như thế nào?
- Thiết kế bộ dữ liệu chính của chương trình. Thường bước này là việc thiết kế các
mảng dữ liệu chính sẽ dùng trong chương trình.
- Chuẩn bị và thiết kế các thuật toán chính sẽ dùng trong phần mềm.
2.2. Thiết kế nhân vật, nền sân khấu
Đây là bước vẽ, thiết kế chi tiết hình ảnh nhân vật, trang phục nhân vật, vẽ các
hình sân khấu, vẽ các nút lệnh chính của chương trình.
2.3. Thiết lập các biến nhớ hệ thống và dữ liệu quan trọng
Đây là bước rất quan trọng: thiết kế các biến nhớ hệ thống và các bộ dữ liệu quan
trọng của chương trình. Tại bước này nếu thiết kế không tốt sẽ ảnh hưởng đến
toàn bộ quá trình viết chương trình về sau. Người thiết kế chương trình tốt là
20 | T h i ế t k ế p h ầ n m ề m
người cần có quan sát tổng thể, có tầm nhìn xa để nhìn thấy cần thiết kế các biến
dữ liệu một cách hợp lý nhất.
Nguyên tắc chung của việc thiết kế dữ liệu hệ thống là vừa đủ, tiết kiệm.
2.4. Sơ đồ thiết kế hệ thống
Sơ đồ thiết kế hệ thống là Sơ đồ mô tả quan hệ giữa các nhân vật chính và trình tự
các hoạt động chính của phần mềm.
Thiết kế Sơ đồ thiết kế hệ thống là một trong những bước quan trọng nhất của quá
trình thiết kế chương trình và phần mềm.
2.5. Coding - Lập trình chi tiết
Cuối cùng, tất nhiên, là công việc lập trình cụ thể. Trong quá trình lập trình có thể
quay lại bất cứ bước nào ở phía trên.
Một trong những công việc rất quan trọng trong quá trình lập trình là kiểm thử,
tìm lỗi và sửa lỗi.
3. Sơ đồ thiết kế phần mềm
Sơ đồ thiết kế phần mềm là một trong những tài liệu quan trọng nhất của quá trình
thiết kế phần mềm trong Scratch. Không có 1 định nghĩa chính xác của Sơ đồ thiết
kế này nhưng có thể xác định các yếu tố sau cần có trong Sơ đồ này.
- Trong Sơ đồ này phải hiển thị tất cả các nhân vật (và sân khấu nếu có tham gia
vào chương trình).
- Mô tả chi tiết quan hệ giữa các nhân vật và nền sân khấu thông qua thông điệp
và biến nhớ hệ thống.
- Mô tả các hoạt động chính của nhân vật, nền sân khấu liên quan đến các sự kiện
thông điệp.
- Các thông tin quan trọng khác nếu có.
Nhìn vào sơ đồ này, người lập trình sẽ hiểu rõ cần phải tiến hành các bước lập
trình cụ thể như thế nào.
Dưới đây là hình ảnh 2 Sơ đồ thiết kế tương ứng với 2 ví dụ thiết kế phần mềm
của bài học này.
21 | T h i ế t k ế p h ầ n m ề m
4. Ví dụ 1: Tìm hiểu các con vật
Chúng ta bắt đầu từ một bài toán, chương trình đơn giản: Tìm hiểu các con vật.
Kịch bản của chương trình bắt nguồn từ 1 bộ dữ liệu gốc trong bảng sau:
Hình ảnh Tên con vật Mô tả
mèo Loài vật nuôi trong nhà rất phổ biến trong mọi gia
đình.
khủng long Loài vật khổng lồ nhất trên trái đất, đã tuyệt chủng
từ cách đây hàng triệu năm.
chó Loài vật nuôi có tác dụng giữ nhà rất phổ biến.
voi Con vật 4 chân lớn nhất hiện nay. Voi sống nhiều
ở châu Phi và châu Á.
ngựa Loài vật thường dùng để kéo xe, chở đồ, rất phổ
biến.
khỉ Loài vật gần với người nhất về bề ngoài, hay leo
trèo trên cây.
cáo Loài vật giống chó nhưng sống trong rừng, chuyên
ăn thịt các động vật khác.
cánh cụt Loài chim sống phổ biến ở châu Nam Cực, có
cánh ngắn.
Ý tưởng chính của bài toán là cần sinh ngẫu nhiên các câu hỏi trắc nghiệm từ bộ
dữ liệu trên, đối tượng là các bạn học sinh nhỏ tuổi. Câu hỏi kiểm tra có thể là một
trong các dạng sau:
- Quan sát hình ảnh đoán tên con vật.
- Đọc mô tả đoán tên con vật.
- Ghép nối hình ảnh và tên con vật.
Kịch bản cụ thể của phần mềm được thiết kế trong ví dụ này được thiết kế theo
mô hình câu hỏi trắc nghiệm thứ nhất ở trên.
Mô tả kịch bản, yêu cầu chương trình.
- Cần 1 nhân vật đóng vai Giáo viên sẽ liên tục đưa ra các câu hỏi "Đây là con
gì?". Chính giữa màn hình sẽ xuất hiện hình ảnh con vật cần xác định tên.
- Bên dưới sẽ hiện 4 đáp án trong đó có 1 đáp án đúng.
22 | T h i ế t k ế p h ầ n m ề m
- Người dùng cần làm bài bằng cách nháy chuột lên một trong các nút có chữ A,
B, C, D ở phía dưới mỗi đáp án.
- Nếu làm đúng, Giáo viên sẽ thông báo "Đúng rồi" (có thể có âm thanh kèm theo)
và sau đó Giáo viên hiển thị thông tin mô tả con vật này để người chơi biết thêm
thông tin. Sau khi dừng 2 giây, Giáo viên sẽ hỏi câu tiếp theo.
- Nếu làm sai, Giáo viên thông báo "Sai rồi" (có thể có âm thanh kèm theo) và sau
2 giây sẽ tiếp tục hỏi câu hỏi mới.
Tất cả nội dung các câu hỏi đều phải là ngẫu nhiên để người chơi không thể học
thuộc lòng các đáp án.
Hình ảnh mô tả của phần mềm có thể hình dung như sau.
Hệ thống trang
phục của nhân
vật này tương
thích với 2 bảng
dữ liệu chính:
Animal và
Animal_list.
23 | T h i ế t k ế p h ầ n m ề m
(2) Thiết kế nhân vật, nền sân khấu
Danh sách nhân vật được thiết kế trong chương trình.
Nhân vật Ý nghĩa Ghi chú thêm
Nhân vật này là trung tâm và Chú ý tên của trang phục
tham gia như một nguồn dữ liệu (costume name) cần phải
hình ảnh chính. Mỗi hình ảnh trùng với tên con vật
con vật sẽ là 1 trang phục của trong dãy (list) Animals.
nhân vật này.
Nhân vật Giáo viên chính, đóng
vai trò MC của chương trình.
24 | T h i ế t k ế p h ầ n m ề m
(4) Sơ đồ thiết kế hệ thống
Sơ đồ thiết kế và hoạt động của chương trình thể hiện trong mô hình sau.
Có thể mô tả bằng lời Sơ đồ thiết kế hoạt động của chương trình như sau:
- Thông điệp Next có ý nghĩa bắt đầu 1 phiên làm việc mới của chương trình.
Công việc cụ thể sau lệnh Next là:
+ Sinh ngẫu nhiên bộ dữ liệu câu hỏi trắc nghiệm bao gồm các biễn nhớ
PA_list, PA_correct, Aname, Bname, Cname, Dname.
+ MC ra câu hỏi: đây là con gì.
+ Nhân vật Animal chuyển trang phục sang số thứ tự con vật tương ứng.
- Sau khi hiển thị bài toán, chương trình chờ người chơi nháy chọn đáp án bằng
cách nháy lên 1 trong các nút A, B, C, D. Khi người dùng nháy, hệ thống cập nhật
biến choice và ra thông điệp Done.
- Thông điệp Done có ý nghĩa đã chọn xong đáp án. Giáo viên nhận thông điệp
này sẽ xử lý đáp án, thông báo đúng, sau.
- Sau đó Giáo viên gửi thông điệp Next để bắt đầu lại câu hỏi mới.
(5) Coding chương trình
1. Việc lập trình bắt đầu từ sân khấu, thực hiện 1 lệnh duy nhất là gửi thông điệp
Next.
25 | T h i ế t k ế p h ầ n m ề m
2. Xứ lý thông điệp Next.
Các công việc quan trọng là thiết lập bộ dữ liệu đầu vào cho câu hỏi trắc nghiệm.
Cụ thể như sau.
- Thiết lập mảng 4 dữ liệu PA_list. Bảng này sẽ lấy ngẫu nhiên 4 giá trị từ dãy các
số tự nhiên 1, 2, 3, …. (độ dài = length(Animals). Thuật toán sử dụng là sinh ngẫu
nhiên 1 tập con của 1 dãy số cho trước. Trong chương trình sau, dãy Temp_list
được tạo ra để lưu trữ dãy các số 1, 2, 3, …. (độ dài = length(Animals), từ đó sẽ
lấy ra 4 phần tử ngẫu nhiên đưa vào PA_list.
Chương trình sinh bảng PA_list như sau.
- Thiết lập dữ liệu cho các biến PA_correct, Aname, Bname, Cname, Dname.
Chương trình sinh bộ đáp án bao gồm PA_correct, Aname, Bname, Cname,
Dname.
PA_correct lấy ngẫu nhiên
từ 1 đến 4.
Các biến Aname, Bname,
Cname, Dname lần lượt lấy
tên của các con vật có chỉ số
lấy từ PA_list.
- Sau khi sinh xong các bộ dữ liệu trên thì việc tiếp theo là hiển thị con vật giữa
màn hình cho đúng câu hỏi.
26 | T h i ế t k ế p h ầ n m ề m
4. Xử lý thông điệp Done.
Cuối cùng là xử lý thông điệp Done. Giáo viên là người xử lý thông điệp này.
- Nếu đúng, GV thông báo đúng rồi, sau đó hiển thị thông tin mô tả của con vật
tương ứng.
- Nếu sai, GV thông báo sai rồi.
Đợi 1 thời gian ngắn, GV sẽ gửi thông điệp Next để bắt đầu một câu hỏi mới.
5. Ví dụ 2: Math Board
Ý tưởng của chương trình này là xây dựng một mô hình mô phỏng các bài học
môn Toán đơn giản dành cho học sinh nhỏ tuổi. Trong ví dụ cụ thể, các bài toán
chỉ là phép tính cộng, trừ đơn giản trong phạm vi 3-4 chữ số.
Kịch bản tưởng tượng của chương trình như hình sau.
Chương trình
Math Board
Math Board.sb2
Yêu cầu các bước thực hiện của chương trình như sau:
Chương trình sẽ tự động sinh các phép toán cộng, trừ số đơn giản. Phép tính được
hiện trên màn hình với các số thể hiện bằng đồ họa.
27 | T h i ế t k ế p h ầ n m ề m
Người dùng nhập trực tiếp từ bàn phím đáp án. Khi người dùng nhập xong, đáp án
do người dùng nhập sẽ hiện trên phép tính ở màn hình. Khi nó nút Check xuất
hiện. Nháy nút này để kiểm tra đúng hay sai.
Nếu sai, chương trình sẽ hiện thông báo Sai rồi và hiện đáp án đúng bên dưới.
Đồng thời xuất hiện nút Next. Nháy lên nút này để bắt đầu 1 phép tính mới.
Nếu đúng, chương trình sẽ xuất hiện thông báo Đúng rồi. Đồng thời xuất hiện nút
Next. Nháy lên nút này để bắt đầu 1 phép tính mới.
(1) Chuẩn bị công nghệ xử lý bài toán
Đặc điểm công nghệ chính của chương trình này là yêu cầu hiển thị số, phép toán
bằng hình ảnh lớn để HS dễ quan sát. Phần mếm sẽ cần sử dụng hai nhân vật:
Number để hiển thị số và Operation để hiện thị phép toán.
(2) Thiết kế nhân vật, nền sân khấu
Bảng các nhân vật của chương trình như sau, chú ý 2 nhân vật đầu tiên.
Tên nhân Nhân vật Mô tả ý nghĩa
vật, nút
lệnh
Number Nhân vật này có nhiệm vụ hiển thị số trên màn hình
theo hình ảnh lớn để học sinh dễ quan sát. Đây là
công nghệ chính, quan trọng nhất của chương trình
này. Nhân vật sẽ có 10 trang phục, có tên lần lượt
là 0, 1, 2, …, 9. Để hiển thị hình ảnh trên màn hình
sẽ dùng lệnh Stamp.
Operation Nhân vật này sẽ có 3 trang phục tương ứng với dấu
cộng (+), dấu trừ (-) và dấu bằng (=).Để hiển thị
hình ảnh trên màn hình sẽ dùng lệnh Stamp.
Chú ý: hoàn toàn có thể mở rộng cho các phép tính
nhân, chia trong tương lai.
Check Nút dùng để thực hiện lệnh Check - kiểm tra đúng,
sai.
Next Nút thực hiện thông điệp Next, chuyển sang bài
toán tiếp theo.
Đúng - Nút thể hiện thông báo Đúng / Sai trên màn hình.
Sai
28 | T h i ế t k ế p h ầ n m ề m
Biến nhớ Ý nghĩa Ghi chú thêm
op Giá trị mô tả phép toán. Tham số này có thể mở
= 1, phép cộng. rộng lên cho cả các phép
tính nhân, chia.
= 2, phép trừ.
Solution Đáp số của phép tính gốc.
UserNumber Đáp số do người dùng nhập.
Checked Kết quả làm bài của học sinh. Giá trị này được tính tự
= 1, làm đúng. động như sau:
Ẩn nút
CheckDone
ShowCorrect
29 | T h i ế t k ế p h ầ n m ề m
Stt Sự kiện - Người thực Công việc cần thực hiện
Thông điệp hiện
1 Next Sân khấu, nút - Sinh ngẫu nhiên bộ dữ liệu phép toán gốc:
Next op, N1, N2.
- Gửi thông điệp Start.
2 Start Sân khấu - Hiện thị hình ảnh phép toán và dấu =.
- Hiển thị các số N1, N2 bằng chữ số lớn trên
màn hình.
- Bắt đầu cho người dùng nhập đáp số của
phép tính, lưu vào biến nhớ UserNumber.
- Khi người dùng nhập xong thì gửi thông
điệp InputDone.
3 InputDone Sân khấu - Hiển thị số người dùng đã nhập lên phép
tính trên màn hình.
- Gửi thông điệp WaitCheck.
4 WaitCheck Numbers - Xuất hiện nút Check.
- Khi người dùng nháy nút Check thì gửi
thông điệp CheckDone.
5 CheckDone Nút Check Kiểm tra kết quả đúng hay sai.
- Nếu Sai, hiển thị nút Sai và gửi thông điệp
ShowCorrect.
- Nếu Đúng, hiển thị nút Đúng.
- Hiển thị nút Next. Nếu nháy nút Next sẽ gửi
thông điệp Next.
6 ShowCorrect Nút Đúng-Sai Hiển thị đáp án đúng bên dưới số người dùng
đã nhập.
30 | T h i ế t k ế p h ầ n m ề m
2. Hoạt động của sân khấu khi bắt đầu khởi động chương trình: thiết lập thông
điệp Next.
Chú ý: Dữ liệu N1, N2 được sinh trong ví dụ trên là các bài tập tính +, - bất kỳ (có
nhớ) trong phạm vi 3 chữ số).
4. Xử lý thông điệp Start.
Sau khi bộ dữ liệu gốc ban đầu đã được thiết lập (các biến N1, N2, op, Solution),
thông điệp Start được gửi đi thông báo bắt đầu quá trình làm bài của người dùng.
Các xử lý tiếp theo sau thông điệp Start bao gồm:
- Các chữ số và phép tính được thể hiện trên màn hình.
31 | T h i ế t k ế p h ầ n m ề m
- Đồng thời, sân khấu gửi lời yêu cầu nhập đáp số phép tính. Dữ liệu người dùng
nhập sẽ được đưa vào biến nhớ UserNumber, sau đó gửi thông điệp InputDone.
32 | T h i ế t k ế p h ầ n m ề m
33 | T h i ế t k ế p h ầ n m ề m
Câu hỏi - Bài tập - Mở rộng
1. Hoàn thiện 2 chương trình Tìm hiểu con vật và Math Board đã thiết kế trong
bài học.
2. Mở rộng chương trình Tìm hiểu con vật theo hướng sau: bổ sung thêm 1 dạng
câu hỏi nữa.
Giáo viên khi hỏi sẽ đưa ra nội dung câu hỏi = mô tả con vật + "Đó là con gì?", ví
dụ 1 câu hỏi như sau:
Loài vật nuôi trong nhà rất phổ biến trong mọi
gia đình. Đó là con gì?
Người dùng vẫn trả lời bằng cách nháy lên một trong các nút A, B, C, D. Nếu
người dùng làm đúng, hình ảnh con vật sẽ hiện trên màn hình.
Phần mềm sẽ tự động sinh ngẫu nhiên một trong hai loại câu hỏi như trên.
3. Mở rộng phần mềm Math Board thành 4 phép toán +, -, x, : như sau:
- Phần mềm sẽ sinh bài toán ngẫu nhiên với các phép tính cộng, trừ, nhân, chia.
- Với các phép toán, bộ dữ liệu ban đầu được sinh ngẫu nhiên như sau:
+ Phép cộng: sinh 2 số ngẫu nhiên có 2 hoặc 3 chữ số, nhưng tổng số < 1000.
+ Phép trừ: trừ 2 số tự nhiên ngẫu nhiên có 2 hoặc 3 chữ số.
+ Phép nhân: nhân 1 số có 2, 3 chữ số với số có 1 chữ số, tích < 1000.
+ Phép chia: số bị chia (N1) có 2 hoặc 3 chữ số, số chia có 1 chữ số, phép chia
phải là chia hết.
4. Thiết kế phần mềm Con gì ăn gì? theo kịch bản sau.
Trên màn hình bên trái là các con Mèo, Khỉ, Ngựa. Bên phải là Táo, Chuối và
Cỏ. Mỗi con chỉ ăn 1 thứ mà thôi: Khỉ ăn Chuối, Mèo ăn Táo, Ngựa ăn Cỏ.
35 | T h i ế t k ế p h ầ n m ề m
Chủ đề 2.
Clone và một số kỹ thuật xử lý Clone
Mục tiêu:
- Giới thiệu nhanh khái niệm và một số kỹ thuật lập trình với Clone trong Scratch.
- Ứng dụng kỹ thuật Clone trong việc thiết kế phần mềm, trò chơi giáo dục.
Nội dung chính
Clone - phân thân là 1 công nghệ rất đặc biệt của Scratch và có rất nhiều ứng dụng
trong các bài toán thiết kế phần mềm, trò chơi trong Scratch.
1. Khái niệm phân thân - clone trong Scratch
Tất cả các nhân vật trong Scratch đều có thể "phân thân", tức là tạo ra các nhân
vật khác là song sinh với chính bản thân mình. Các nhân vật được phân thân đó
gọi là Clone.
Chúng ta cùng xem 1 chương trình ngắn để bước đầu làm quen và phân biệt được
2 khái niệm: nhân vật chính (gốc) và phân thân (clone) của nhân vật này.
Nhân vật chính, gốc
Khái niệm Clone
(phân thân). Nhân vật được phân thân, là song
sinh của nhân vật gốc. Nhân vật
này được gọi là clone của nhân
vật chính.
Chúng ta cùng xem đoạn chương trình của nhân vật chính con mèo.
Bảng sau mô tả nhanh sự giống nhau và khác nhau giữa nhân vật bình thường và
phân thân của nhân vật (clone).
Nhân vật bình thường Clone (phân thân)
Có là nhân vật Có Có
không?
Cửa sổ lệnh Có Không. Dùng chung cửa sổ lệnh
riêng? với nhân vật gốc.
Chịu sự điều Có Có
khiển của các
lệnh Scratch
36 | T h i ế t k ế p h ầ n m ề m
Nhân vật gốc và Clone
Bảng sau liệt kê các thông tin nhanh liên quan đến nhân vật gốc và clone.
Nhân vật gốc Clone
Mô tả Là nhân vật hoạt động chính Là nhân vật phân thân từ 1 nhân
nhanh trên sân khấu cho người sử vật gốc, được khởi tạo bởi lệnh
dụng khởi tạo, hoạt động create clone of. Clone sau khi
vĩnh viễn. được tạo ra sẽ có đầy đủ tính
chất như 1 nhân vật bình thường
và kế thừa mọi thuộc tính từ
nhân vật gốc của mình. Clone
không hoạt động vĩnh viễn.
Khởi tạo Nhân vật chính dùng lệnh
Clone
để
tạo Clone. Có thể tạo Clone
của mình hoặc của các nhân
vật khác.
Chú ý: Sân khấu cũng có
quyền tạo Clone cho mọi
nhân vật.
Điều khiển Clone sau khi được tạo ra sẽ
Clone chịu sự điều khiển của câu lệnh
sự kiện
. Cho phép nhiều chương trình
cùng điều khiển 1 Clone.
37 | T h i ế t k ế p h ầ n m ề m
Nhân vật gốc Clone
Xóa Clone Clone tự xóa bản thân mình
bằng lệnh .
Thời gian Vĩnh viễn Chỉ hoạt động trong thời gian
sống chạy chương trình.
Chúng ta cùng xét 1 ví dụ sau. Ví dụ này minh họa cho quan hệ giữa nhân vật
chính và các phân thân - clone của chính mình.
38 | T h i ế t k ế p h ầ n m ề m
Clone có ý nghĩa gì trong các ứng dụng thực tế của Scratch, chúng ta cùng tìm
hiểu các hoạt động tiếp theo.
2. Rừng hoa
Chương trình đơn giản sau cho em hiểu thêm hoạt động của clone.
Rung hoa.sb2 Chương trình đơn giản này chỉ có đúng 1
nhân vật là bông hoa, nhưng với nhiều
hình ảnh đẹp mắt khác nhau.
Mục đích của chương trình là tạo ra 1 rừng
hoa với nhiều màu sắc sặc sỡ.
Để làm như vậy, em cần sưu tầm nhiều
hình ảnh hoa với màu sắc đa dạng khác
nhau và đưa vào thành các trang phục của
nhân vật này.
Chương trình được xây dựng đơn giản như sau:
- Nhân vật chính bông hoa cần tạo ra nhiều hình ảnh khác nhau nhưng có kích
thước gần giống nhau làm trang phục. Ví dụ:
- Trong mạch chương trình chính, em cho bông hoa lần lượt tạo ra 50 clone của
chính mình.
- Mỗi phân thân, clone sẽ di chuyển nhanh tới 1 vị trí ngẫu nhiên trên màn hình
với thể hiện trang phục ngẫu nhiên.
39 | T h i ế t k ế p h ầ n m ề m
3. Hai chú mèo sinh đôi
Giả sử chúng ta có 1 chương trình mà Mèo mẹ sinh ra 1 cặp mèo sinh đôi. Hai chú
mèo này, một có tên "Mèo vàng", một có tên "Mèo đen". Chương trình sử dụng
công nghệ Clone để từ 1 nhân vật ban đầu tạo ra 2 Clone tương ứng với cặp mèo
sinh đôi như hình dưới đây.
Giả sử chúng ta cần thiết lập 2 clone của nhân vật Mèo mẹ này, nhân vật 1 (ID=1)
có tên là Mèo vàng, nhân vật 2 (ID=2) có tên là Mèo đen. Để thực hiện được
những việc trên chúng ta sẽ thiết lập 2 biến riêng (local) của nhân vật chính là ID
và Name. ID dùng để chỉ số thứ tự các clone, biến Name để lưu trữ tên của các
Clone được khởi tạo. Khi bắt đầu chương trình, các biến nhớ riêng được gán giá
trị ban đầu là ID = 0, Name = (empty). Đoạn chương trình sau sẽ tạo Clone đầu
tiên.
Chú ý khi Clone đầu tiên tạo ra sẽ kế thừa và có giá trị ID = 1 và Name = "Mèo
vàng".
Sau đây là các đoạn chương trình thiết lập ban đầu.
40 | T h i ế t k ế p h ầ n m ề m
Khởi tạo và thiết lập 2
clones. Đoạn chương trình
thiết lập trạng thái ban
đầu của 2 chú mèo
sinh đôi - 2 clones.
Mỗi clone sẽ đổi trang
phục của mình và
dịch chuyển đến 1 vị
trí của riêng mình.
Đoạn chương trình chính điều khiển clone nói tên của mình như sau:
Sự kiện thực hiện khi click chuột vẫn
là lệnh when this sprite clicked
nhưng bên trong mỗi clone sẽ được
điều khiển riêng bởi câu lệnh if <ID
= ..> then.
Đây là lệnh điều khiển cho clone đầu
tiên.
Các thuộc tính bao gồm: Tên nhân vât; tọa độ hiện thời (x, y); hướng; kiểu xoay
(rotation style); có thể dịch chuyển bằng chuột trong khi chạy chương trình;
hiện/ẩn trên màn hình.
Trong Scratch, các thuộc tính quan trọng nhất của nhân vật được lưu cùng nhân
vật thông qua các biến nhớ hệ thống và có thể truy cập bởi các nhân vật khác
(hoặc sân khấu) thông qua 1 hàm thuộc tính nằm trong nhóm Cảm biến.
Danh sách thuộc tính của nhân vật có thể truy cập từ hàm số trên như sau:
Stt Tên thuộc tính nhân vật Mô tả ý nghĩa
1 x position Tọa độ X hiện thời của nhân vật.
41 | T h i ế t k ế p h ầ n m ề m
Stt Tên thuộc tính nhân vật Mô tả ý nghĩa
2 y position Tọa độ Y hiện thời của nhân vật.
3 direction Hướng hiện thời của nhân vật.
4 costume # Số thứ tự trang phục của nhân vật (tính từ
1).
5 costume name Tên trang phục hiện thời của nhân vật.
6 size Tỉ lệ kích thước hiện thời của nhân vật (tính
theo %, 100% = kích thước thật).
7 volume Tỉ lệ âm lượng âm thanh hiện thời của nhân
vật (tính theo %, 100% = âm thanh thực).
Tương tự đối với sân khẩu, các thuộc tính của sân khấu cũng có thể lấy các thuộc
tính từ hàm số.
Danh sách thuộc tính của sân khấu được ghi trong bảng sau:
Stt Tên thuộc tính sân khấu Mô tả ý nghĩa
1 backrop # Số thứ tự nền sâu khấu hiện thời (tính từ 1
theo DS nền sân khấu đang có).
2 backdrop name Tên nền sân khấu hiện thời.
3 volume Tỉ lệ âm lượng âm thanh hiện thời của sân
khấu (tính theo %, 100% = âm thanh thực).
Các đoạn chương trình sau mô tả hoạt động đuối bắt của Mèo và chạy của Chuột.
Mèo và Chuột luôn phải xác định tọa độ và hướng đi của đối phương, do đó phải
sử dụng hàm lấy thuộc tính.
42 | T h i ế t k ế p h ầ n m ề m
Mèo Chuột
Ban may
bay.sb2 Chương trình mô phỏng bắn
máy bay, tuy nhiên yêu cầu của
chương trình là khi viên đạn
được bắn ra khỏi nòng sẽ tự tìm
hướng đến máy bay (viên đạn
thông minh).
Chúng ta sẽ cùng thiết kế trò chơi đơn giản này như sau:
Nhân vật của chương trình.
- Với nhân vật Đạn, chúng ta có 2 đoạn chương trình, một điều khiển việc tạo
clone để viên đạn hình thành và một điều khiển viên đạn bay hướng đến máy bay.
Đoạn chương trình điều khiển tạo clone cho viên đạn.
Đoạn chương trình điều khiển hướng bay của viên đạn.
44 | T h i ế t k ế p h ầ n m ề m
Thiết lập thông số ban đầu của
máy bay.
Xét 1 ví dụ mô phỏng bài toán điểm danh học sinh trong lớp.
Diem danh
lop.sb2 Thầy giáo lần lượt đọc tên từng bạn
trong lớp. Khi đọc đến tên ai thì học
sinh đó đáp "Có em", lần lượt cho
đến khi kết thúc. Yêu cầu của chương
trình là tên phải được khai báo là
thuộc tính riêng của từng học sinh.
Chúng ta sẽ thiết lập chương trình với 6 nhân vật là Giáo viên và 5 học sinh như
hình trên. 5 nhân vật học sinh có tên là HS1, HS2, HS3, HS4, HS5. Với mỗi nhân
45 | T h i ế t k ế p h ầ n m ề m
vật học sinh này, cần tạo 1 biến nhớ riêng với tên Name dùng để lưu Họ tên của
từng nhân vật này.
Giáo viên sẽ lần lượt thực hiện 5 nhóm lệnh sau, mỗi nhóm lệnh có tác dụng gọi
tên 1 học sinh và đợi HS này trả lời.
Còn đây là đoạn chương trình của một học sinh (ví dụ HS1), với các học sinh
khác lệnh hoàn toàn tương tự.
Chúng ta đã được làm quen với các bài toán sinh và xử lý hàng loạt các clone của
mình. Clone - phân thân của nhân vật có một đặc điểm là chỉ có 1 cửa sổ lệnh chia
sẻ chung với nhân vật gốc. Do đó bài toán xử lý và điều khiển riêng rẽ các clone
có lẽ là một bài toán khó. Các vấn đề cụ thể của bài toán này được ghi trong bảng
sau.
Stt Câu hỏi, vấn đề Các câu hỏi bổ sung
1 Làm cách nào để có thể thực hiện các lệnh
điều khiển riêng rẽ từng Clone sau khi
chúng được khởi tạo. Ví dụ sau khi tạo ra 2
clone của 1 con chim, làm thế nào để điều
46 | T h i ế t k ế p h ầ n m ề m
Stt Câu hỏi, vấn đề Các câu hỏi bổ sung
khiển chúng, 1 con bay lên, 1 con bay
xuống?
2 Các lệnh truyền thông điệp có cách nào có
thể truyền thông tin đến từng phân thân
riêng rẽ?
3 Muốn thực hiện hội thoại giữa người dùng
với một Clone cụ thể thì làm cách nào?
4 Muốn truyền thông tin từ các chức năng
cảm biến, ví dụ nhấn phím, cảm biến va
chạm, màu sắc, … đến với từng Clone thì
làm cách nào?
5 Có thể hay không thực hiện hội thoại giữa
các clone với nhau? Bằng cách nào?
Chúng ta cùng xét lại ví dụ chương trình điểm danh lớp học. Chúng ta sẽ thiết kế
lại chương trình này sử dụng clone để mô tả các học sinh của lớp học.
Yêu cầu của chương trình tương tự như ví dụ bài điểm danh lớp học ở trên, nhưng
điểm khác cơ bản là bài tập này sẽ yêu cầu chỉ sử dụng 1 nhân vật HS gốc, các
học sinh khác trong lớp phải được sinh ra bằng Clone.
Diem danh
lop 2.sb2 Giao diện chương trình hoàn
toàn tương tự: Giáo viên sẽ
lần lượt điểm danh từng học
sinh trong lớp. Khi thầy gọi
đến tên ai thì học sinh đó nói
"Có em". Cứ như vậy đến hết.
47 | T h i ế t k ế p h ầ n m ề m
Yêu cầu của chương trình: chỉ
có 2 nhân vật: giáo viên và
học sinh.
(2) Nhân vật HS sẽ có 2 biến nhớ riêng là ID (mã hóa Clone) và Name (tên của
từng Clone - HS trong lớp).
Đoạn chương trình thực hiện khởi tạo 5 Clone của HS tương ứng với các học sinh
trong lớp.
48 | T h i ế t k ế p h ầ n m ề m
Thiết lập các thông số ban đầu cho
nhân vật HS gốc.
Đây là đoạn chương trình GV lần lượt đọc tên HS và chờ để từng HS trả lời. Chú
ý đặc biệt đến lệnh truyền thông điệp của GV. Sau mỗi lần đọc tên HS, GV sẽ
thực hiện lệnh và đợi HS trả lời. Chú ý đến biến nhớ
Stt có thể đưa được vào lệnh này. Khi nhận thông điệp, Clone tương ứng sẽ nhận
và thực hiện bằng lệnh . Chú ý lệnh này không đưa biến Stt
vào được mà phải nhập trực tiếp tên của thông điệp.
Đoạn chương trình điều khiển HS trả lời. Chú ý các HS này là Clone của nhân vật
gốc HS. Đoạn chương trình này có 1 số đặc biệt sau:
- Sự kiện nhận thông điệp cần gõ trực tiếp số thứ tự thông điệp tại ô thông số của
lệnh.
- Sử dụng lệnh kiểm tra rẽ nhánh:
49 | T h i ế t k ế p h ầ n m ề m
để điều khiển cho Clone với giá trị riêng ID cụ thể sẽ thực hiện khi nhận thông
điệp này. Đoạn chương trình nhận thông điệp của Clone thứ nhất như sau:
4 Muốn truyền thông tin từ Tất cả các lệnh cảm biến đều có thể thực
các chức năng cảm biến, hiện đối với riêng rẽ các Clone độc lập bên
ví dụ nhấn phím, cảm trong lệnh If …. then …. như sau.
biến va chạm, màu sắc,
… đến với từng Clone thì
làm cách nào?
50 | T h i ế t k ế p h ầ n m ề m
Stt Câu hỏi, vấn đề Cách giải quyết
5 Có thể hay không thực Hoàn toàn có thể. Các Clone thực hiện lệnh
hiện hội thoại giữa các truyền thông điệp bằng cách sử dụng nhóm
clone với nhau? Bằng lệnh:
cách nào?
51 | T h i ế t k ế p h ầ n m ề m
Câu hỏi - Bài tập - Mở rộng
1. Một Clone có thể tạo cho mình các Clone nữa hay không? Em hãy thử và cho
nhận xét về câu hỏi này.
2. Giả sử nhân vật A gửi một thông điệp, ví dụ có tên "Start". Nhân vật B hiện
có rất nhiều clone đang hoạt động. Khi đó lệnh When I receive <Start> trong cửa
sổ lệnh của B sẽ được thực hiện bởi các loại nào của B?
A. Nhân vật B gốc.
B. Các clone của B.
C. Cả nhân vật gốc và clone cùng thực hiện các lệnh này.
3. Viết chương trình tổng quát chương trình Rừng hoa ở trên. Các bông hoa khi
xuất hiện sẽ rất nhỏ và sẽ lớn dần lên, đồng thời xoay tròn và thay đổi màu sắc
lộng lẫy.
52 | T h i ế t k ế p h ầ n m ề m
Nhân vật của chương trình:
Thầy Tùng và Hình tròn.
- Chương trình có 2 nhân vật chính là Thầy Tùng và Hình tròn. Nhân vật hình tròn
do em tự thiết kế và có tối thiểu 10 trang phục với màu sắc khác nhau, ví dụ các
màu có thể vẽ: đỏ, vàng, nâu, cam, xanh lá cây, xanh da trời, xanh thẫm, đen, tím,
hồng.
- Khi chơi, thầy Tùng sẽ đưa ra câu hỏi, ví dụ: Em hãy nháy lên hình tròn màu
xanh lá cây. Bên dưới sẽ hiển thị 3 hình tròn với các màu sắc khác nhau được sinh
ngẫu nhiên từ danh sách các màu của nhân vật Hình tròn. Câu hỏi được sinh với
đáp án ngẫu nhiên.
- Người chơi nháy chuột lên hình tròn có màu tương ứng. Thầy giáo sẽ lập tức
thông báo "Đúng rồi" nếu làm đúng hoặc "Sai rồi" nếu làm sai. Chương trình sẽ
nghỉ 2 giây là lại tiếp tục sinh câu hỏi mới.
53 | T h i ế t k ế p h ầ n m ề m
Chủ đề 3.
Các công cụ, kỹ thuật thiết kế phần mềm
Mục tiêu:
- Một số kỹ thuật chính khi thiết kế phần mềm thực sự so sánh với việc chỉ viết
chương trình theo yêu cầu của người khác.
- Một vài kỹ thuật và đặc thù chính của một phần mềm hay trò chơi.
Nội dung chính
1. Một số đặc điểm của phần mềm trò chơi
Sau đây là 1 số đặc điểm, hay thuộc tính thường có của các trò chơi hay phần
mềm.
(a) Có đồng hồ tính thời gian thực.
Đồng hồ tính thời gian thực thường dùng với các mục đích sau:
- Dùng để đếm ngược thời gian, ví dụ đếm từ 100 về 0 thì kết thúc trò chơi.
- Dùng đểm đếm xuôi thời gian, tính toán thời gian đã chơi của người chơi.
Có nhiều cách tạo các "đồng hồ" thời gian như vậy.
1. Ví dụ sử dụng 1 biến nhớ có tên TimeCounter dùng để đếm ngược thời gian.
Giả sử, giá trị của biến này được gán 60 ngay từ lúc bắt đầu chương trình và nó sẽ
được giảm đi sau mỗi giây, do vậy sau đúng 60 giây thì giá trị này sẽ bằng 0, hay
đồng hồ sẽ được đếm ngược về 0.
Đoạn chươnng trình ngắn với biến nhớ này có thể như sau:
54 | T h i ế t k ế p h ầ n m ề m
2. Tương tác bằng chuột.
Tương tác bằng chuột cũng đóng vai trò rất quan trọng trong mọi chương trình
phần mềm. Ví dụ đối với Scratch thì tương tác bằng chuột có thể như sau:
- Sự kiện khi người chơi nháy chuột lên 1 nhân vật.
- Sự kiện khi người chơi nháy chuột lên 1 vị trí bất kỳ của màn hình, sân khấu.
- Hàm cảm biến khi nhận ra người dùng nháy chuột, và có thể tính toán được vị trí
chính xác của con trỏ chuột tại thời điểm nháy chuột đó.
- Hàm tính toán khoảng cách từ nhân vật đến vị trí con trỏ chuột.
- Lệnh cho phép nhân vật luôn dính chặt với con trỏ chuột.
- Lệnh cho phép nhân vật luôn xoay về hướng con trỏ chuột.
4. Tương tác thông qua các thông tin cảm biến khác
(c) Tính điểm để đánh giá người chơi.
Dùng điểm số để kích thích người chơi, xếp hạng người chơi. Cũng có thể dùng
điểm để làm phần thưởng như tăng lượt chơi, tặng quà, …
Cách làm đơn giản nhất là dùng 1 biến nhớ để lưu trữ điểm số. Biến nhớ này sẽ
gia tăng hoặc giảm bớt giá trị tùy theo các điều kiện cụ thể của trò chơi.
Thông thường điểm số sẽ luôn được thể hiện trên màn hình để người chơi quan sát
được điểm của mình.
(d) Khái niệm lượt chơi thay thế cho thời gian đếm ngược.
Đây là một kỹ thuật rất hay được sử dụng trong các trò chơi, phần mềm, làm tăng
độ hấp dẫn khi chơi.
Ví dụ trò chơi thả bóng, có thể qui định người chơi được 6 lượt chơi, mỗi lần để
bóng rơi xuống phía dưới sẽ mất 1 lượt. Nếu mất hết toàn bộ 6 lượt thì thua.
55 | T h i ế t k ế p h ầ n m ề m
(e) Mức khó, dễ của cách chơi
Hầu hết các trò chơi đều có khái niệm mức độ khó dễ. Theo thời gian chơi, phần
mềm sẽ tự động tăng các mức khó, dễ này để người chơi sẽ cảm thấy khó chơi
hơn. Thông thường cần tạo 1 biến nhớ chung để lưu mức độ này, ví dụ gamelevel.
Tham số này sẽ bắt đầu từ 0 hoặc 1 và sẽ được tăng dần theo thời gian hoặc điểm
số, đánh giá người chơi.
(f) Tương tác đối kháng các người chơi.
Tương tác đối kháng là việc mô phỏng đối kháng trực tiếp giữa 2 nhân vật trong
trò chơi, ví dụ chơi cờ, đấu súng, … Có 2 loại đối kháng sau:
1) Đối kháng giữa 1 người chơi và 1 nhân vật do phần mềm tự mô phỏng. Tương
tác đối kháng này thực chất là người đấu với máy tính.
2) Tương tác giữa 2 người chơi. Kỹ thuật này xử lý khó hơn trường hợp trên.
2. Kỹ thuật đếm ngược
Chúng ta cùng thực hiện kỹ thuật này thông qua trò chơi Thả bóng.
Tha bong
Cách chơi vẫn không có gì thay
extended.sb2 đổi. Bổ sung 1 đồng hồ thời
gian để đếm ngược. Nếu sau 60
giây hoặc nếu người chơi để
bóng rơi xuống phía dưới thì
thua.
Khi thua, màn hình sẽ hiện
dòng chữ "Game Over". Để làm
việc này sẽ bổ sung thêm 1
nhân vật Game Over nữa như
hình bên.
56 | T h i ế t k ế p h ầ n m ề m
- Nhân vật Game Over sẽ xử lý việc này. Khi nhận được thông điệp End, nút
Game Over sẽ hiển thị (nút này được ẩn đi khi bắt đầu chương trình) và ra lệnh
dừng toàn bộ bằng lệnh Stop All.
- Chương trình của Bóng như sau, chú ý cách xử lý khi bóng rơi xuống phía dưới
thì cũng gửi đi thông điệp End.
57 | T h i ế t k ế p h ầ n m ề m
Chúng ta bắt đầu phân tích nhân vật ngôi sao của chương trình này. Việc thể hiện
các ngôi sao từ đầu chương trình sẽ dùng tính năng phân thân, Clone của Scratch.
Như vậy khi bắt đầu chương trình, nhân vật ngôi sao sẽ phải phân thân thành 5
ngôi sao khác, được đánh số từ 1 đến 5 tính từ phải sang trái như hình sau.
5 4 3 2 1
Để đánh số các clone, chúng ta dùng biến nhớ CloneID - là biến riêng của nhân
vật này.
Biến nhớ dùng chung StarNumber dùng để tính số ngôi sao còn lại trên màn hình,
đây chính là số lượt chơi còn lại của người chơi. Biến nhớ này sẽ được gán giá trị
ban đầu = 5.
Đoạn chương trình sau mô tả hoạt động của bản thân các clone của ngôi sao. Đây
là đoạn chương trình quan trọng nhất và là "key" của toàn bộ kỹ thuật dùng nhân
vật thể hiện lượt chơi trên màn hình.
Chương trình có dùng 1 biến nhớ chung là StarChange có ý nghĩa như sau: biến
nhớ này mô tả trạng thát chuyển số lượng của nhân vật ngôi sao. StarChange bình
thường có giá trị = 0, nhưng tại thời điểm có biến động, giá trị của nó được thiết
lập = 1 để thông báo đến thời điểm giá trị StarNumber sẽ giảm đi 1 đơn vị. Đoạn
chương trình điều khiển clone này như sau:
58 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình kiểm tra khi bóng rơi
xuống dưới. Nếu số lượt còn lại > 0 thì
chuyển StarChage = 1 để giảm số lượt,
ngược lại nếu đã hết lượt thì thông báo
End để kết thúc.
59 | T h i ế t k ế p h ầ n m ề m
Khi bóng chạm được thanh ngang thì Mỗi khi thời gian chơi của người chơi
bật lên và tăng điểm số thêm 5. vượt qua khoảng 15 giây thì điểm sẽ
được tăng lên 3.
Thưởng lượt chơi. Qui định như sau: mỗi khi điểm số của ngưởi chơi vượt quá
200, 400, … (bội của 200) thì được thưởng thêm 1 lượt chơi. Trên màn hình sẽ
xuất hiện thêm 1 ngôi sao.
Để thực hiện được yêu cầu trên chúng ta thiết lập thêm 1 biến nhớ để điều khiển
việc thưởng lượt chơi, biến có tên iBonus và được gán giá trị ban đầu = 0. Thuật
toán như sau:
Mỗi khi kiểm tra thấy Diem_so > 200*iBonus thì gửi thông điệp Bonus để tăng
lượt và tăng iBonus lên 1 đơn vị. Nhân vật Ngôi sao sẽ nhận thông điệp Bonus
và xử lý để bổ sung thêm lượt chơi.
Đoạn chương trình của sân khấu điều khiển điểm số như sau:
Việc xử lý thông điệp Bonus của nhân vật Ngôi sao sẽ phức tạp hơn vì hiện tại
trên màn hình có cả nhân vật Ngôi sao gốc và các Clone của mình. Các Clone
cũng nhận được thông điệp Bonus. Do vậy cần lập trình để phân biệt được nhân
vật gốc và các Clone. Chỉ có nhân vật gốc mới nhận Bonus và xử lý. Chúng ta
phải sử dụng lại biến riêng CloneID để phân biệt nhân vật gốc và Clone của ngôi
sao. Nhân vật gốc sẽ có CloneID = 0.
Đoạn chương trình xử lý thông điệp Bonus như sau:
60 | T h i ế t k ế p h ầ n m ề m
Ví dụ sử dụng biến nhớ Time, đặt chế độ hiển thị biến nhớ này trên màn hình.
Chúng ta có 2 cách sau để cho biến nhớ tự động đếm theo thời gian là giây.
Cách 1. Sử dụng hàm hệ thống Cách 2. Dùng vòng lặp vô hạn, sau
timer, luôn gán Time cho timer. mỗi 1 giây nghỉ bằng lệnh wait thì
tăng Time lên 1 đơn vị.
Biến nhớ hệ thống timer cũng có chế độ hiển thị online . Em hãy so
sánh cách hiển thị của biến nhớ này với hiển thị biến nhớ Time do người dùng tạo
ra.
Cách thể hiện trên có 1 nhược điểm là chữ số quá bé, không gây ấn tượng. Trong
các phần mềm hoặc trò chơi cần các kỹ thuật để thể hiện số to hơn, rõ ràng hơn,
chúng ta sẽ cùng nhau tìm hiểu các bài toán này.
Kỹ thuật thể Chúng ta sẽ cùng xây dựng chương trình và thuật toán thể hiện số bằng hình ảnh
hiện số bằng lớn trên sân khấu. Kỹ thuật này rất hay được sử dụng trong các trò chơi và phần
hình ảnh trên mềm.
màn hình.
Ý tưởng của kỹ thuật này là sử
dụng lệnh stamp của Scratch để
hiển thị chữ số lớn bằng hình ảnh.
Show
Numbers.sb2 Thiết lập 1 nhân vật có tên
Number bao gồm đúng 10 trang
phục được đánh số từ 1 đến 10,
trang phục 1 là số 0, trang phục 2
là số 1, …., trang phục 10 là số 9.
Thuật toán sẽ dựa trên các trang
phục này để hiển thị chữ số trên
màn hình.
Giá trị 2 biến mảng chính liên quan đến thuật toán này (Numbers và Width) như
sau:
61 | T h i ế t k ế p h ầ n m ề m
- Bảng Numbers chứa 10 phần tử là 0, 1, 2,
3, 4, 5, 6, 7, 8, 9. Như vậy phần tử thứ k
chính là chữ số k-1, tương ứng trang phục
thứ k của nhân vật.
- Bảng Width lưu độ rộng của các trang
phục tương ứng. Phần tử thứ k chính là độ
rộng của trang phục số k-1.
45930
từ vị trí index=1, lấy ra chữ số ch. Chuyển
trang phục cho nhân vật, thực hiện lệnh
stamp, sau đó chuyển sang phải theo độ dài
Vị trí bắt bằng độ rộng của số ch+1 lấy từ bảng
đầu của index = 3
Width.
nhân vật
Ví dụ đoạn chương trình hiển thị số trên màn hình đếm lùi từ 1000 như sau:
Em hãy hoàn thiện thủ tục Show Number thể hiện 1 số bắt đầu từ 1 vị trí cho
trước trên màn hình.
(b) Kỹ thuật thể hiện đếm số tự động bằng hình ảnh
Thuật toán sử dụng trong phần trên có 1 nhược điểm là mỗi lần thể hiện phải xóa
Kỹ thuật thể tất cả để vẽ lại từ chữ số của số cần thể hiện. Chúng ta sẽ làm tốt hơn kỹ thuật trên
hiện việc đếm đối với bài toán thể hiện đếm (tăng dần hoặc giảm dần) trên màn hình.
bằng hình ảnh
trên màn hình. Ý tưởng chính của thuật toán này là sau mỗi lần tăng hoặc giảm số, không cần vẽ
lại toàn bộ các chữ số, mà chỉ cần vẽ lại những chữ số cần vẽ lại.
Chúng ta cùng xét 1 ví dụ thể hiện phép đếm tăng số, bắt đầu từ 1 giá trị nào đó.
Quá trình này được xét kỹ hơn khi chuyển thể hiện số n sang n+1.
Ví dụ với số n = 3587 thì số tiếp theo chỉ cần thay 7 8.
62 | T h i ế t k ế p h ầ n m ề m
Ví dụ với số n = 456999 thì số cần thể hiện tiếp theo là 457000.
Rõ ràng cần tìm ra chữ số đầu tiên < 9 tính từ bên phải của số n.
n= 456999 456999
Lastch = 6
Thủ tục chính của thuật toán trên là Counting from <n> at <X> <Y> sẽ hiện
máy đếm số tăng liên tục bắt đầu từ n.
Trong thủ tục này có sử dụng 1 thủ tục khác là New Show Number <n>. Thủ tục
này có chức năng thể hiện 1 số <n> tính từ vị trí hiện thời của nhân vật, nhưng
không xóa màn hình trước khi thể hiện chữ. Thủ tục này dùng để thể hiện liên tục
số LastNumber trong thuật toán trên.
Chúng ta cùng phân tích thủ tục đếm số tăng này.
63 | T h i ế t k ế p h ầ n m ề m
Thể hiện số gốc n trên màn hình,
thiết lập CurrNumber = n.
Bây giờ chúng ta quay lại thủ tục New Show Number, chỉ ra 1 vị trí thay đổi duy
nhất nhưng quan trọng của thủ tục này so với Show Number. Bổ sung vào các
trang phục số 1 trang phục empty nữa để xóa 1 chữ số đã có trên màn hình.
Trên đây là bài toán thể hiện phép đếm số tăng dần. Thuật toán thể hiện phép đếm
giảm dần hoàn toàn tương tự.
Bài tập: thiết lập thuật toán tương tự để xử lý bài toán đếm số giảm dần. Thủ tục
tương ứng sẽ có tên Counting down <n> at <X>, <Y>.
64 | T h i ế t k ế p h ầ n m ề m
6. Thể hiện chữ, tên người, nhân vật
Kỹ thuật thể Bài toán thể hiện chữ trong các phần mềm, trò chơi cũng tương tự như việc thể
hiện chữ bằng hiện số. Chúng ta có thể dùng biến nhớ thể hiện ngay trên màn hình.
hình ảnh. Để thể hiện các chữ bằng hình ảnh trên màn hình, chúng ta sẽ thiết lập nhân vật
Char có các trang phục chính là dãy các chữ cái của bảng chữ cái ngôn ngữ đang
sử dụng. Về lý thuyết thủ tục thể hiện Show Word có thể làm tương tự như Show
Number trong ví dụ trên. Nhưng chúng ta sẽ đi theo cách khác trong hoạt động
này.
Minh họa kỹ thuật hiển thị từ, tên người, tên sự vật được thể hiện trong chương
trình sau:
- Nhân vật chính là bộ chữ cái đầy đủ, ví dụ bộ 26 chữ cái tiếng Anh. Nhân vật
trong chương trình của chúng ta tên là Char và có 26 bộ trang phục theo bảng chữ
cái.
- Bộ dữ liệu chính bao gồm 2 bảng Alphabet và AlphabetWide. Alphabet là dãy
26 chữ cái tương ứng đúng với dãy các trang phục của Char. AlphabetWide là
dãy các chiều rộng của các trang phục của Char trên sân khấu.
- Để thiết lập thuật toán theo yêu cầu chúng ta cần thêm 2 bảng nữa, WList và
Wkc để lưu kết quả của từ, chữ cần thể hiện trên màn hình.
Giả sử từ cần thể hiện bằng hình ảnh trên màn hình là Word, thuật toán chính
được mô tả như sau.
Bước 1 (Init). Phân tích và tách từng chữ cái của từ Word, đưa vào bảng WList,
chỉ lấy các chữ cái có trong bảng Alphabet tương ứng. Bảng Wkc lưu thông tin
tương ứng lấy từ bảng AlphabetWide.
65 | T h i ế t k ế p h ầ n m ề m
Bước 2 (Show Word). Lần lượt lấy các chữ cái từ bảng WList, chuyển trang phục
cho chữ cái này, dùng lệnh stamp để vẽ chữ cái trên màn hình, sau đó chuyển vị
trí nhân vật sang phải theo 1 khoảng cách bằng đúng độ rộng của chữ cái này. Quá
trình này lặp lại cho đến khi đi hết bảng WList.
Bước 1 được gọi là quá trình Init (chuẩn bị), bước 2 là quá trình thực sự thể hiện
từ trên màn hình.
Phần lõi của bước 1, Init, được thể hiện bằng lệnh Scratch như sau.
Em hãy hoàn thiện 2 thủ tục Init và Show Word cho thuật toán trên.
random 7. Kỹ thuật sinh ngẫu nhiên trong các trò chơi và phần
algorithms mềm
Kỹ thuật sinh ngẫu nhiên rất hay được sử dụng trong tất cả các phần mềm, trò
chơi, ví dụ cần sinh 1 bộ câu hỏi trắc nghiệm từ 1 ngân hàng câu hỏi cho trước.
Có rất nhiều bài toán cụ thể liên quan đến kỹ thuật này, chúng ta cùng tìm hiểu 1
số thuật toán như vậy.
(a) Thuật toán sinh ngẫu nhiên 4 số trong 1 dãy số dạng List.
66 | T h i ế t k ế p h ầ n m ề m
Xét bài toán sau: cho trước 1 dãy số NumList. Dãy này được minh họa bằng biểu
diễn: a1, a2, ….., aN.
Cần lấy ra ngẫu nhiên 4 phần tử khác nhau từ dãy này, kết quả được đưa vào 4
biến nhớ pA, pB, pC, pD và thể hiện trên màn hình. Chú ý dãy ban đầu NumList
cần được bảo toàn sau thuật toán.
Phân tích.
Ý tưởng thực hiện bài toán này rất đơn giản, chỉ cần lần lượt lấy ra 4 phần tử ngẫu
nhiên của dãy NumList, sau mỗi lần lấy ra thì xóa phần tử gốc khỏi dãy ban đầu.
Nhưng bài toán yêu cầu bảo toàn dãy gốc nên cần thực hiện trên 1 dãy tạm. Như
vậy cần thiết lập thêm 1 biến nhớ dạng list nữa là TempList, cần thực hiện việc
chuyển toàn bộ dữ liệu từ NumList sang TempList và tiến hành thuật toán sinh dữ
liệu từ TempList này.
Đây là đoạn chương trình tạo dữ liệu ban đầu cho TempList.
Đoạn chương trình sau thực hiện việc sinh ngẫu nhiên phần tử từ dãy TempList,
đưa vào pA và xóa phần tử này từ dãy TempList.
Tương tự thực hiện như vậy với 3 phương án còn lại pB, pC, pD.
Bài tập: em hãy viết hoàn chỉnh thủ tục mô tả thuật toán trên.
(b) Thuật toán sinh ngẫu nhiên 1 xâu con 4 ký tự của 1 xâu bất kỳ
Bài toán: cho trước 1 xâu ký tự bất kỳ Str. Cần lấy ra ngẫu nhiên 4 ký tự khác
nhau từ xâu này, kết quả được đưa vào 4 biến nhớ pA, pB, pC, pD và thể hiện trên
màn hình.
Phân tích.
Bài toán này gần tương tự hoàn toàn bài toán trên, điểm khác duy nhất là dữ liệu
gốc không là dãy, mà là 1 xâu ký tự. Có 2 cách thực hiện như sau:
Cách 1: tạo 1 biến xâu tạm thời TempStr, sao chép Str sang TempStr và thực hiện
thuật toán lấy 4 phần tử ngẫu nhiên từ TempStr, sau mỗi lần lấy ra thì xóa ký tự ở
xâu gốc.
Cách 2: tạo 1 dãy TempList, lấy từng ký tự từ xâu Str chuyển vào TempList, sau
đó lấy ra 4 phần tử ngẫu nhiên tương tự thuật toán (a) đã nêu ở trên.
Với cách 1 của thuật toán này, sau đây là đoạn chương trình sao chép Str sang
TempStr và lấy đi 1 phần tử ngẫu nhiên đầu tiên gán vào pA.
67 | T h i ế t k ế p h ầ n m ề m
Tiếp theo cần xóa đi ký tự với chỉ số index của xâu TempStr. Vì Scratch không có
lệnh xóa 1 ký tự trong xâu, nên chúng ta phải thực hiện "mẹo" bằng cách chuyển
toàn bộ TempStr sang 1 xâu trung gian nữa, Temp1, sau đó cần gán ngược lại vào
xâu gốc TempStr. Chú ý khi chuyển từ TempStr Temp1 thì bỏ qua ký tự với
chỉ số index. Đoạn chương trình trên như sau:
68 | T h i ế t k ế p h ầ n m ề m
Vòng lặp chính.
Sinh giá trị ngẫu nhiên index,
lấy ra phần tử ch và đưa vào
cuối của StrOut.
69 | T h i ế t k ế p h ầ n m ề m
8. Thuật toán sinh ngẫu nhiên 1 bộ đáp án, trong đó có 1
đáp án đúng
Trong hoạt động này chúng ta sẽ làm quen với 1 số các thuật toán hay dùng khi
sinh ngẫu nhiên các câu hỏi trắc nghiệm trong các phần mềm giáo dục. Chúng ta
nhớ lại rằng câu hỏi trắc nghiệm luôn bao gồm 4 đáp án (có thể nhiều hơn), trong
đó có 1 đáp án đúng. Trên thực tế có rất nhiều bài toán như vậy, chúng ta sẽ chỉ
tìm hiểu 1 vài trong chúng.
Để mô phỏng các bài toán sinh ngẫu nhiên câu hỏi trắc nghiệm chúng ta dùng các
bộ dữ liệu sau:
(a) Bộ các biến nhớ độc lập để lưu các phương án pA, pB, pC, pD và bộ 4 trạng
thái để mô tả phương án đúng sai: pAstatus, pBstatus, pCstatus, pDstatus. Các giá
trị status có ý nghĩa = 0 nếu phương án sai, = 1 nếu phương án đúng. Một phương
án khác là chỉ cần 1 biến nhớ pCorrect có ý nghĩa là chỉ số của phương án đúng
trong số các phương án A, B, C, D.
(b) 2 mảng dữ liệu có độ dài 4 phần tử: pList và statusList.
pList[k], k=1, 2, 3, 4 là các phương án A, B, C, D.
sList[k], k=1, 2, 3, 4 là các trạng thái = 0, nếu sai, = 1, nếu đúng.
Như vậy bộ dữ liệu sẽ cần được cập nhật đồng thời cho các mảng pList, sList và
các biến nhớ pA, pB, pC, pD, pAstatus, pBstatus, pCstatus, pDstatus.
Xét các bài toán cụ thể sau:
Giả sử cho trước 1 dãy số (hoặc xâu ký tự). Cần lấy ra ngẫu nhiên 4 giá trị của dãy
trên dùng làm 4 phương án, sau đó lại lựa chọn ngẫu nhiên 1 trong số các giá trị
này để làm phương án đúng.
Chúng ta sẽ cùng thực hiện bài toán trên thông qua 1 ví dụ cụ thể sau.
Giả sử có 2 mảng dữ liệu: dsQG và dsThudo như hình dưới đây.
Cần sinh ngẫu nhiên các câu hỏi trắc nghiệm như sau, ví dụ:
70 | T h i ế t k ế p h ầ n m ề m
Lần lượt sinh 4 giá trị ngẫu nhiên lấy từ bảng dsQG (đồng thời dsThudo) và đưa
vào các biến pA, pB, pC, pD, sau đó lựa chọn 1 giá trị ngẫu nhiên trong 4 số này
lấy làm phương án đúng để sinh câu hỏi dạng như trên.
Minh họa thuật toán trên bằng chương trình sau dùng để kiểm tra kiến thức môn
Địa lý cho học sinh phổ thông.
Random Chương trình sẽ sinh tự động các
multiple câu hỏi trắc nghiệm theo mẫu trên
choice.sb2 và thể hiện như hình bên.
Người dùng sẽ trả lời bằng cách
nhập đáp án bằng số như 1, 2, 3, 4.
Ngay sau khi nhập đáp án, chương
trình sẽ thông báo đúng, sai và
sinh tiếp câu hỏi.
Chương trình sẽ dừng khi người
chơi chỉ nhấn Enter mà không
nhập số.
Thủ tục Init có nhiệm vụ thiết lập bộ dữ liệu đệm của chương trình.
71 | T h i ế t k ế p h ầ n m ề m
Chương trình chính sẽ có dạng đơn giản như sau:
Có thể tóm tắt thuật toán sinh ngẫu nhiên câu hỏi trắc nghiệm như sau:
- Sinh ngẫu nhiên 4 giá trị chỉ số khác nhau từ 1 đến độ dài dsQG. Các giá trị này
sẽ lưu vào 4 phần tử của dãy pList.
- Sinh ngẫu nhiên giá trị pCorrect từ 1 đến 4 để lưu phương án đúng.
- Gán tên các quốc gia đã chọn vào các biến pA, pB, pC, pD để hiện trên màn
hình.
- Sinh câu hỏi trắc nghiệm, lấy tên thủ đô của đáp án đúng lồng ghép trong nội
dung câu hỏi.
- Lặp lại quá trình trên cho mỗi lần sinh câu hỏi.
Em hãy hoàn thiện chương trình trên.
9. Ví dụ: trò chơi điều khiển bóng
Chúng ta sẽ hoàn thiện phần mềm trò chơi thả bóng đã được nêu ra trong các hoạt
động của bài học này, bổ sung thêm các yêu cầu mới.
72 | T h i ế t k ế p h ầ n m ề m
Chương trình được thiết kế với các nhân vật và dữ liệu chính sau:
- Nhân vật chính: Bóng; Thanh ngang, Ngôi sao (Star), Chữ số (Number) và nút
Game Over.
- Các biến nhớ chính:
TimeCounter: Tổng thời gian chơi. Chơi càng lâu sẽ được thưởng điểm và
thưởng lượt chơi.
Diem_so: Điểm số của người chơi.
StarNumber: Số lượt chơi thể hiện bằng các ngôi sao trên màn hình.
Sơ đồ hoạt động của phần mềm được mô tả trong hình sau.
0 0 5
Thiết lập các giá trị Thiết lập StarNumber = 5,
ban đầu như điểm hiển thị 5 ngôi sao Clone
số, thời gian hệ
trên màn hình.
thống.
Bóng rơi tự do xuống Thiết lập tăng
Begin
phía dưới, gặp thanh StarNumber lên +1, và
ngang thì bật lên. bổ sung thêm 1 sao
Kiểm soát thời gian clone trên màn hình.
chơi TimeCounter.
Bóng gặp thanh ngang
Mỗi lần thời gian vượt tăng điểm số +5. Clone
qua bội của 15 thì tăng
điểm số + 3.
Bóng rơi xuống Giảm StarNumber -1 và
Mỗi lần điểm số vượt dưới, mất 1 lượt xóa 1 Clone bên trái trên
quá 200, 400, … thông chơi. màn hình.
báo tặng lượt chơi
bằng thông điệp Bóng rơi xuống dưới,
Bonus. nếu hết lượt thì thông Thể hiện giá trị
báo End kết thúc điểm số bằng chữ
Bonus cuộc chơi. tại góc trái màn
hình.
End
73 | T h i ế t k ế p h ầ n m ề m
Chương trình của sân
khấu.
74 | T h i ế t k ế p h ầ n m ề m
Chương trình gốc của Ngôi sao
(Star).
75 | T h i ế t k ế p h ầ n m ề m
Chương trình điều khiển Thanh Chương trình của nút Game Over.
ngang.
76 | T h i ế t k ế p h ầ n m ề m
Câu hỏi - Bài tập - Mở rộng
1. Giả sử có 2 biến nhớ Time và Timer cùng để đo thời gian theo giây. Hai biến
này cùng được thiết lập như sau.
Nhưng 2 biến nhớ này được đi bằng 2 cách khác nhau như 2 đoạn chương trình
sau.
Chương trình trên đúng hay sai, nếu sai thì sai ở đâu và cần sửa như thế nào?
3. Thiết kế dữ liệu và viết chương trình ngắn mô tả các thuật toán sinh dữ liệu
ngẫu nhiên sau:
a. Sinh 1 bộ k phần tử ngẫu nhiên lấy từ N số {1, 2, 3, …, N}.
b. Tương tự bài trên, sinh ngẫu nhiên bộ k phần tử (a1, a2, …, ak) từ N số {1, 2, 3,
…, N} sao cho thỏa mãn:
a1 < a2 < …. < ak.
c. Sinh k cặp số khác nhau từng đôi một:
(a1, b1 ), (a2 , b2), …, (ak , bk) từ bộ N số {1, 2, 3, …, N}. Điều kiện để thực hiện
thuật toán này là k < N/2.
d. Tương tự bài trên, sinh k cặp số khác nhau từng đôi một
(a1, b1 ), (a2 , b2), …, (ak , bk) từ bộ N số {1, 2, 3, …, N} với điều kiện:
a1 < b1 < a2 < b2 < … < ak < bk.
77 | T h i ế t k ế p h ầ n m ề m
4. Thiết kế dữ liệu và viết chương trình mô tả các thuật toán, bài toán sau.
a. Input: N; Output: thông báo N có phải là số nguyên tố hay không.
b. Input: N; Output: P, ở đây P là số nguyên tố nhỏ nhất > N.
c. Input: N; Output: Khai triển N thành tích các ước số nguyên tố,
Ví dụ N = 12, Output: 2.2.3.
d. Input: dãy n số a1, a2, …, a n. Gọi dãy này là dãy A.
Output: Giá trị số maximun của dãy A.
e. Input: dãy n số a1, a2 , …, a n. Gọi dãy này là dãy A.
Output: Dãy con liên tục đơn điệu tăng lớn nhất của A.
f. Input: dãy n số a1, a2, …, a n. Gọi dãy này là dãy A.
Output: Dãy con không cần liên tục đơn điệu tăng lớn nhất của A.
5. Viết 1 thủ tục với nhân vật Number (như trong phần 5 của chủ đề này):
Show Number <N> center at <X, Y>.
Thủ tục này sẽ hiển thị bằng hình ảnh số N tại vị trí (X, Y) nhưng lấy điểm này
làm tâm của số được thể hiện.
Ví dụ Show Number <12345> center at <0, 0> sẽ thể hiện số 12345 tại vị trí
(0,0) như sau:
12345
Tọa độ (0, 0) sẽ ở vị trí
tâm của số 12345.
78 | T h i ế t k ế p h ầ n m ề m
Chủ đề 4.
Thiết kế một số phần mềm quen thuộc
Mục tiêu:
- Thiết kế một số phần mềm giáo dục quen thuộc, từ dễ đến khó để rèn luyện các
kỹ năng cơ bản thiết kế phần mềm.
Nội dung chính
1. Chương trình Bút vẽ màu hoàn chỉnh
Thiết lập chương trình mô tả chức năng vẽ bằng bút vẽ tự do với bảng màu cho
trước. Chương trình này sẽ mở rộng và tổng quát hóa các ví dụ mô phỏng bút vẽ
mà chúng ta đã học.
Butvetudo.sb2
Chú ý:
79 | T h i ế t k ế p h ầ n m ề m
- Nhân vật Bút vẽ cần có tâm nằm tại vị trí đầu bút.
- Riêng nhân vật ColorButton sẽ có 8 trang phục tương ứng với 8 màu của các
nhân vật màu Color1, …, Color8.
Sơ đồ hoạt động.
Sơ đồ hoạt động của chương trình này khá đơn giản như sau:
- Nút ColorButton khi nhận các thông điệp này sẽ chuyển trang phục tương ứng.
- Khi nháy lên nút Clear, thông điệp Clear sẽ được gửi đi để bút vẽ xử lý làm
sạch màn hình.
81 | T h i ế t k ế p h ầ n m ề m
Kỹ thuật nhận
biết sự kéo thả
chuột trên màn
hình.
- Điều khiển bút vẽ luôn gắn với con trỏ chuột, di chuyển cùng chuột máy tính.
Kích thước bút vẽ sẽ luôn đồng bộ với biến nhớ Width.
- Xử lý các thông điệp khi nhận được, bao gồm các thông điệp thay đổi màu sắc
và thông điệp làm sạch màn hình.
82 | T h i ế t k ế p h ầ n m ề m
2. Trò chơi, phần mềm, kỹ thuật bắn súng
Phần mềm - trò chơi bắn súng đơn giản sau sẽ giúp em hình thành các tư duy ban
đầu của việc thiết kế các trò chơi loại này. Kỹ thuật trọng tâm của chương trình là
bắn súng.
Bansung.sb2
Giao diện tượng trưng
của chương trình. Nhân
vật chính là khẩu súng
và các con chim đen.
Nhiệm vụ của người
chơi là bắn đạn trúng
càng nhiều chim đen
càng tốt. Nếu súng bị va
vào chim đen thì thua.
Phần lõi chính của chương trình là qui trình "bắn súng". Mô tả như sau: khi bấm
phím Space, viên đạn sẽ bay ra từ nòng súng và đi thẳng. Người chơi cần điều
khiển súng sao cho hướng đến đúng các con chim đen xuất hiện trước mặt.
83 | T h i ế t k ế p h ầ n m ề m
Thiết kế nhân vật.
Sau đây là danh sách chi tiết các nhân vật của chương trình.
Hình ảnh Tên nhân vật Mô tả ý nghĩa Ghi chú
Đạn Đạn được bắn ra từ nòng súng khi Viên đạn
bấm phím Space. Sử dụng kỹ cần bắn ra
thuật clone để điều khiển việc bắn từ vị trí đầu
súng này. Mỗi lần bắn được nòng súng.
thưởng 1 điểm.
Súng Người chơi sẽ điều khiển súng Chú ý vị trí
lên, xuống, sang phải, trái trên tâm của
màn hình để tránh chim đen và để súng chính
bắn trúng chim đen càng nhiều là vị trí xuất
càng tốt. phát của
viên đạn.
Máy bay Máy bay sẽ bay từ trái sang phải
(ariplane) màn hình một cách ngẫu nhiên và
có tốc độ chậm hơn đạn.
Nếu đạn bắn trúng máy bay thì
máy bay sẽ đâm đầu rơi xuống đất
và bị trừ 20 điểm.
Chim đen Chim đen sẽ xuất hiện ngẫu nhiên Sử dụng kỹ
từ bên phải và bay sang bên trái. thuật clone
Nếu chim đen va chạm vào súng để xử lý
thì chương trình lập tức dừng lại chim đen.
và hiện nút Game Over.
Tòa nhà Các tòa nhà xuất hiện và đứng im Sử dụng
(building) trên màn hình. lệnh stamp
để vẽ các
tòa nhà này.
Mây (clouds) Các đám mây xuất hiện ngẫu Sử dụng kỹ
nhiên từ bên phải và bay sang bên thuật clone
trái màn hình. để xử lý
mây.
Nút Game Khi súng va vào chim đen thì nút Khi bắt đầu
Over. Game Over xuất hiện và chương chương
trình kết thúc. trình nút
này sẽ ẩn
đi.
84 | T h i ế t k ế p h ầ n m ề m
Sơ đồ hoạt động.
Sơ đồ thiết kế chương trình như sau:
Shot
Đạn bắn ra từ
đầu nòng Chim xuất hiện
Thiết lập thông Nếu bấm phím súng. liên tục và bay từ
số ban đầu Space, gửi thông phải sang trái.
scoring = 0 điệp Shot.
Over
Hiển thị nút
Game Over.
Khi đối tượng đạn chuẩn bị tạo clone, cần 2 lệnh sau để thiết lập đạn sẽ luôn bắn
ra từ đầu nòng súng.
85 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình điều khiển viên đạn khi có thông điệp Shot như sau:
- Điều khiển khi gặp chim đen thì gửi Game Over và nếu bấm Space thì gừi
thông điệp Shot.
86 | T h i ế t k ế p h ầ n m ề m
c) Điều khiển thể hiện các tòa nhà
Sau mỗi 4 giây, các đám mây Các đám mây clone này sẽ
sẽ được tạo clone tại 1 vị trí được gán vận tốc ngẫu nhiên
ngẫu nhiên bên phải màn và chuyển động sang trái. Nếu
hình. gặp cạnh trái thì tự xóa.
87 | T h i ế t k ế p h ầ n m ề m
- Nhận được thông điệp Shot, lập tức sinh clone tại vị trí đầu nòng súng. Chú ý chỉ
có nhân vật với ID = 0 mới có quyền sinh clone.
- Điều khiển viên đạn bắn ra khỏi nòng với vận tốc cố định về phía trước. Nếu gặp
cạnh thì tự xóa.
- Nếu gặp chim đen thì kêu "pop", chờ 0.3 giây sau mới tự xóa. Thời gian chờ đủ
để chim đen cũng cảm biến được va chạm với đạn để tự chết.
- Nếu gặp máy bay, lập tức gửi thông điệp Crash, giảm 20 điểm và tự xóa.
Chú ý: có thể lập trình theo hướng khác không cần thông điệp, cho máy bay cảm
biến va chạm với viên đạn.
Ở đây sử dụng cách dùng thông điệp Crash, kết quả sẽ có ngay tức thì.
88 | T h i ế t k ế p h ầ n m ề m
Nếu viên đạn gặp máy bay thì lập
tức gửi thông điệp Crash, giamr 20
điểm và tự xóa clone.
- Chim đen khi xuất hiện sẽ vỗ cánh và chuyển động chậm sang trái. Nếu gặp
cạnh trái thì tự xóa clone.
Trong khi bay chim đen sẽ liên tục vỗ cánh và tự chuyển màu.
- Xử lý chim đen khi va chạm với đạn. Nếu gặp đạn thì phát ra tiếng kêu, tăng
điểm số lên 10 và lập tức xóa clone.
89 | T h i ế t k ế p h ầ n m ề m
Việc tạm dừng 0.3 giây ở đây
cũng có ý nghĩa tương tự: chờ
cho viên đạn cũng cảm nhận
được sự va chạm với chim đen
để cả 2 đều tự xóa khi va chạm
nhau.
Chờ 5 giây.
90 | T h i ế t k ế p h ầ n m ề m
91 | T h i ế t k ế p h ầ n m ề m
3. Flappy Bird
Trò chơi Flappy Bird đã nổi tiếng toàn thế giới.
Trong hoạt động này, em sẽ cùng suy nghĩ để thiết kế 1 phương án đơn giản của
phần mềm này.
Flappy Bird.sb2
92 | T h i ế t k ế p h ầ n m ề m
Hình Start. Hình ảnh này xuất hiện ngay từ đầu. Sẽ ẩn đi khi bắt đầu chơi, khi
người dùng bấm phím Space.
Hình FappyBird. Hình ảnh này xuất hiện ngay từ đầu. Sẽ ẩn đi khi bắt đầu chơi,
khi người dùng bấm phím Space.
Chú ý:
Ống khói và Chim nên tìm và chọn nhân vật có nhiều trang phục khác nhau.
Với ống khói, mỗi trang phục là 1 hình ảnh ống khói dài từ dưới lên trên và chỉ hở
1 khoảng ngẫu nhiên ở giữa, ví dụ như hình sau. Khoảng trống ở giữa chính là vị
trí cần điều khiển chim bay qua.
Hình ảnh nhân vật Bird có nhiều trang phục hỗ trợ mô tả chim vỗ cánh.
93 | T h i ế t k ế p h ầ n m ề m
Sơ đồ thiết kế chương trình.
Sơ đồ thiết kế và hoạt động của phần mềm tương đối đơn giản như sau:
Điều khiển hoạt động của nhân vật chính (bird) thông qua tham số
Gravity
Chúng ta sẽ thiết lập 1 biến nhớ riêng của nhân vật bird với tên Gravity (dịch:
trọng lực). Tham số này điều khiển khả năng bay lên của chim khi chúng ta bấm
phím Space. Để tạo hiệu ứng mỗi khi em bấm Space, chim sẽ bay lên, sau đó sẽ
từ từ bị rơi xuống, thuật toán như sau:
- Mỗi lần nhấn Space sẽ thiết lập Gravity 1 giá trị cố định > 0 (ví dụ = 5).
- Chim sẽ liên tục thay đổi giá trị tọa độ Y theo Gravity. Như vậy nên Gravity > 0.
chim sẽ bay lên, Gravity < 0, chim sẽ rơi xuống.
- Theo thời gian giá trị của Gravity sẽ liên tục giảm, cho đến khi người chơi bấm
Space thì quá trình giảm kết thúc và Gravity được đặt lại > 0.
94 | T h i ế t k ế p h ầ n m ề m
Nếu người dùng nhấn Chỉ sau 0.2 giây ban Trong suốt thời gian
phím Space thì lập tức đầu, giá trị Gravity sẽ chơi, chim sẽ thay đổi
gán Gravity = 5. liên tục giảm. Điều này liên tục độ cao (tọa độ
sẽ yêu cầu người chơi Y) theo Gravity. Vậy
phải bấm Space liên tục nếu Gravity > 0 thì
nếu không chim sẽ rơi chim bay lên, nếu
xuống đất. Gravity < 0 thì chim rơi
xuống dưới.
Điều khiển nhân vật chim khi va chạm với ống khói
Nếu va chạm với ống khói, chim kêu "ối" và lập tức rơi thẳng xuống đất. Khi
chạm đất thì ra lệnh dừng toàn bộ chương trình bằng thông điệp Game Over.
95 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình này
mô tả dáng điệu của
chim trong khi bay. Tùy
thuộc vào Gravity mà
chim sẽ hướng lên trên,
hướng ngang hoặc hướng
xuống dưới trong khi
bay.
Để mô tả chuyển động các ống khói Nếu ống khói va chạm với chim thì
(clone), có nhiều cách. Ở đây chúng ta lập tức thiết lập lại trạng thái Death
dùng lệnh glide, chuyển động sẽ được = 1 và dừng toàn bộ các chương
mô tả mượt hơn. trình trong cửa sổ này.
96 | T h i ế t k ế p h ầ n m ề m
Thiết kế biến nhớ hệ thống của chương trình.
Tên biến nhớ Mô tả ý nghĩa Ghi chú
Death Biến nhớ này ghi lại trạng thái của Ban đầu gán Death
chim. Chim sẽ chết nếu Death = 1. = 0.
Ready Biến nhớ mô tả trạng thái của trò chơi. Ban đầu gán
Khi bắt đầu thì Ready = 0. Khi bắt đầu Ready = 0.
chơi (người dùng bấm Space) thì
Score Điểm số của người chơi. Điểm số này Ban đầu gán Score
được tính theo cách sau (phù hợp với = 0.
nguyên bản của trò chơi này).
- Mỗi lền chim bay lên (bấm Space)
được tặng 1 điểm.
- Mỗi khi đi qua được 1 ống khói, được
tặng 10 điểm. Người chơi giữ
được chim sống
- Mỗi lần sống qua được các mốc thời
sót, càng về sau
gian 30 giây thì được tăng số điểm là
càng được nhiều
10*he_so_K. điểm.
he_so_K Biến nhớ này ban đầu gán = 1. nhưng sẽ
tăng 1 đơn vị mỗi khi thời gian trôi đi
được 30 giây.
Gravity Biến nhớ rất quan trọng, mô tả gia tốc
lực hút của trái đất với nhân vật Chim.
timer Biến nhớ hệ thống lưu thời gian chạy Cần có lệnh Reset
của đồng hồ máy tính, tính theo đơn vị timer để tính lại
giây. biến nhớ này.
97 | T h i ế t k ế p h ầ n m ề m
b) Bắt đầu trò chơi, khi người chơi bấm Space.
Chương trình điều khiển như sau:
Trong suốt quá trình chơi, đoạn chương trình sau sẽ điều khiển biến nhớ timer và
kiểm tra nếu thời gian chơi là bội của 30 giây thì tăng điểm cho người chơi.
98 | T h i ế t k ế p h ầ n m ề m
Chim luôn vỗ cánh. Chim sẽ bay lên hay bị Giá trị Gravity luôn bị
rơi xuống phụ thuộc vào giảm liên tục, chim sẽ bị
giá trị Gravity. hút rơi xuống đất.
- Đoạn chương trình sau điều khiển hướng bay của chim tùy theo giá trị của
Gravity. Khi bay lên, đầu chim hướng lên trên, khi bay, rơi xuống đầu chim
hướng xuống dưới.
- Đoạn chương trình điều khiển khi chim va vào ống khói.
99 | T h i ế t k ế p h ầ n m ề m
d) Điều khiển ống khói
Có nhiều cách để thể hiện các ống khói chuyển động từ phải sang trái màn hình.
Trong chương trình này chúng ta sử dụng kỹ thuật clone để tạo ngẫu nhiên các
ống khói và cho chúng chạy sang cạnh trái bằng lệnh glide to.
- Ngay sau khi bắt đầu phần chính của chương trình (nhận được thông điệp Start),
chương trình sẽ tạo liên tục các clone của ống khói (sau 1 khoảng ngẫu nhiên thời
gian), cho đến khi giá trị Death = 1 thì dừng.
- Các chương trình sau điều khiển ống khói sau khi được tạo ra.
Ống khói sẽ được đặt ở vị trí bên phải, Nếu va chạm với chim thì lập tức gán
chuyển trang phục ngẫu nhiên và chạy Death = 1 và dừng chương trình
sang bên trái trong 5 giây bằng lệnh không sinh clone ống khói nữa.
glide to. Nếu đi được về bên trái, tức
là chim đã bay qua thì tăng 10 điểm.
100 | T h i ế t k ế p h ầ n m ề m
4. Trình diễn trong bảo tàng
Trong phần này này chúng ta sẽ cùng thiết kế một mô hình chương trình được sử
dụng rất nhiều trong giáo dục, văn hóa, đó là việc mô phỏng trình diễn, giới thiệu
theo trang trí của bảo tàng, triển lãm, nhà văn hóa, …. Một bảo tàng (hay di tích
văn hóa) có nhiều phòng, cảnh. Trong mỗi phòng lại có nhiều hiện vật. Cần có 1
chương trình giúp người dùng có thể tham quan tất cả các phòng, gian hàng và
hiện vật trong bảo tàng này.
Bao tang.sb2
Hình ảnh bản tàng cần
tham quan.
2 em bé là người dẫn
chương trình.
Nhân vật của chương trình là người dẫn chương trình và các hiện vật trong bảo
tàng đó.
Sân khấu chính là các gian phòng của bảo tàng, là nơi chúng ta cần giới thiệu cho
người tham quan.
101 | T h i ế t k ế p h ầ n m ề m
Ví dụ trong chương trình cụ thể này, các nền sân khấu đánh số từ 2 đến 8 chính là
các gian phòng chính của bảo tàng. Các hiện vật (nhân vật) được thể hiện bên
trong các phòng này.
Yêu cầu chương trình.
- Bắt đầu chương trình là lời thuyết minh welcome trước khi bắt đầu thời gian
tham quan triển lãm, bảo tàng.
- Trong suốt quá trình khi tham quan qua các phòng, người dùng có thể nháy
chuột lên các hiện vật hoặc vị trí hình ảnh trên màn hình để xem hoặc nghe giải
thích chi tiết.
- Muốn chuyển phòng cần nháy lên 2 em bé người dẫn chương trình để xem
hướng dẫn. Khi xuất hiện các nút Next, Previous thì nháy lên các nút này để
chuyển phòng. Chú ý khi chuyển sang 1 phòng mới thì các nút này không xuất
hiện.
- Qui định cụ thể mỗi hiện vật chỉ xuất hiện đúng tại 1 vị trí trong 1 gian phòng cụ
thể. Như vậy mỗi nhân vật đóng vai trò hiện vật chỉ được phép xuất hiện trên 1
nền sân khấu xác định.
Chú ý: Chương trình này chỉ có thời điểm bắt đầu và không có kết thúc. Người
tham quan có thể khám phá bảo tàng bao lâu tùy thích.
Sơ đồ thiết kế chương trình.
Sơ đồ thiết kế và hoạt động của chương trình như sau:
102 | T h i ế t k ế p h ầ n m ề m
Kịch bản cụ thể của chương trình.
Một số yêu cầu chung:
- Nhân vật 2 em bé sẽ hiển thị trên tất cả các cảnh nhưng mỗi cảnh sẽ xuất hiện ở
những vị trí khác nhau.
- Mỗi nhân vật (trừ ra 2 em bé) sẽ chỉ hiển thị trên 1 cảnh sân khấu duy nhất, được
mô tả trong bảng sau. Các nhân vật này đóng vai trò là những hiện vật trong bảo
tàng.
- Nháy lên các nhân vật sẽ hiển thị thông tin tương ứng về hiện vật đó.
- Ngoài ra trên mỗi cảnh sẽ có các vị trí mà nếu nháy lên sẽ hiển thị thông tin
tương ứng, ví dụ 1 bức tranh treo trên tường. Bảng sau sẽ mô tả chi tiết các vị trí
đó.
Nhân vật Nền sân khấu Kịch bản
Nhân vật này (Boy and Girl) sẽ phải xuất
hiện ở tất cả các cảnh sân khấu, mỗi cảnh tại
các vị trí cố định khác nhau. Khi nháy lên
nhân vật này thì nhận được thông báo:
Các bạn hãy nháy chuột lên các nút Next,
Previous để xem tiếp.
Cảnh 1 (Khi đó các nút Next, Previous sẽ xuất hiện).
Khi bắt đầu chương trình thì sẽ có âm thanh
giọng nói welcome thể hiện.
Trên cảnh này có 3 vị trí liên kết thông tin là
3 bức tranh.
Tranh bên trái: Đây là bức tranh nhỏ của họa
sĩ Markel từ giữa thế kỷ 16.
Tranh bên phải: Đây là bức tranh phong
cảnh nổi tiếng của họa sĩ Levitan, vẽ đầu thế
Cảnh 2 kỷ 19.
Tranh giữa: thông tin là âm thanh:
Tranh_1_P2.
Nháy lên nhân vật sẽ hiện thông tin: Xe ngựa
cổ các gia đình quí tộc thường dùng.
Trên cảnh này có 1 vị trí liên kết thông tin là
bức tranh lớn có thông tin như sau:
Đây là bức tranh của tác giả Leonardo da
Vinci, trường phái tân hiện thực thế kỷ 16.
Nháy lên nhân vật sẽ hiện thông tin: Tàu hỏa
chạy than.
Cảnh 3
103 | T h i ế t k ế p h ầ n m ề m
Nhân vật Nền sân khấu Kịch bản
Trên cảnh này có 1 vị trí liên kết thông tin là
cái thuyền trắng. Thông tin như sau:
Một mẫu thuyền cổ thế kỷ 15.
Nháy lên nhân vật sẽ hiện thông tin: Thuyền
cổ. Giai cấp quí tộc sử dụng thuyền buồm
này khám phá thế giới biển.
Cảnh 4
Trên cảnh này có 1 vị trí liên kết thông tin là
bức tranh lớn giữa phòng. Thông tin như sau:
Đây là bức tranh nổi tiếng của danh họa nổi
tiếng thế giới Edouard Manet.
Nháy lên nhân vật sẽ hiện thông tin: Mẫu tàu
hỏa đầu tiên trên thế giới.
Cảnh 5
Trên cảnh này có 1 vị trí liên kết thông tin là
bức tranh lớn giữa phòng. Thông tin như sau:
Một bức tranh nổi tiếng không rõ tác giả của
thể kỷ 15.
Nháy lên nhân vật sẽ hiện thông tin: Mẫu ô
tô đầu tiên.
Cảnh 6
Trên cảnh này có 1 vị trí liên kết thông tin là
2 người nông dân. Thông tin như sau:
Trang phục người nông dân của châu Âu thế
kỷ 17.
Nháy lên nhân vật sẽ hiện thông tin: Mẫu
trang phục của quí tộc Anh quốc thế kỷ 17.
Cảnh 7
Trên cảnh này có 1 vị trí liên kết thông tin là
bức tranh lớn giữa phòng. Thông tin như sau:
Đây là bức tranh rất quí của danh họa
Picasso.
Nháy lên nhân vật sẽ hiện thông tin: Ô tô cổ,
xuất hiện đầu thế kỷ.
Cảnh 8
Nút này sẽ hiển thị khi người dùng nháy
chuột lên nhân vật 2 em bé. Chỉ hiện ở các
cảnh từ 1 đến 7. (cảnh 8 không hiện).
Nút này sẽ hiển thị khi người dùng nháy
chuột lên nhân vật 2 em bé. Chỉ hiện ở các
cảnh từ 2 đến 8. (cảnh 1 không hiện).
104 | T h i ế t k ế p h ầ n m ề m
Lập trình chi tiết.
a) Thông điệp Next được gửi khi nào
Thông điệp Next được gửi mỗi khi người chơi nháy chuột lên MC của chương
trình là nhân vật 2 em bé. Thông điệp này có ý nghĩa người dùng muốn chuyển
xem phòng khác của bảo tàng. Có thể xem phòng tiếp theo hoặc quay về phòng
trước đó.
Đoạn lệnh điều khiển 2 em bé gửi thông điệp Next như sau.
Nút Previous
Tương tự với nút Previous.
105 | T h i ế t k ế p h ầ n m ề m
b) Điều khiển các nhân vật đóng vai trò hiện vật
Theo kịch bản trên, mỗi nhân vật (trừ ra 2 em bé) sẽ chỉ hiện ở 1 nền sân khấu.
Chương trình điều khiển các nhân vật này là tương tự nhau.
Sau đây là chương trình điều khiển nhân vật Xe ngựa, nhân vật này sẽ hiện ở
Cảnh 2.
Với các nhân vật khác lập trình hoàn toàn tương tự.
c) Điều khiển nhân vật 2 em bé (Boy and Girl)
Nhân vật 2 em bé này đóng vai trò MC của chương trình, sẽ hiển thị ở tất cả các
cảnh của bảo tàng.
- Khi bắt đầu chương trình là đoạn âm thanh giới thiệu chung về bảo tàng cần
tham quan, coi như lởi chào mừng (welcome) của chương trình.
- Tại mỗi cảnh (phòng) bảo tàng, nháy lên nhân vật này sẽ làm hiển thị 2 nút mũi
tên để người tham quan chuyển sang phòng khác. Việc này được thực hiện bởi
thông điệp Next. Xem thêm cách xử lý thông điệp Next của 2 nhân vật mũi tên
phía trên.
- Cuối cùng là đoạn chương trình chỉ ra vị trí cụ thể của nhân vật này trong tất cả
các cảnh, nền sân khấu của chương trình.
Sử dụng hàm cảm biến . Hàm này sẽ trả lại số thứ tự của
nền sân khấu (trong danh sách) đang thể hiện trên màn hình. Số thứ tự này được
đánh số từ 1.
106 | T h i ế t k ế p h ầ n m ề m
Ví dụ, nếu nền sân khấu
là Cảnh 1 thì vị trí của
nhân vật này sẽ phải là
(0, -100).
- Khi người dùng nháy lên một vùng của phòng triển lãm (nháy lên 1 vị trí màn
hình xác định trước), chương trình sẽ gửi 1 thông điệp tương ứng. Nhân vật MC
sẽ nhận thông điệp và thông báo.
- Xử lý các thông điệp Do Next (chuyển sang cảnh sau) và Do Previous (chuyển
về cảnh trước). Xử dụng các lệnh next backdrop và switch backdrop to <#
number> tương ứng.
Thực hiện hoàn toàn tương tự với các liên kết khác.
108 | T h i ế t k ế p h ầ n m ề m
5. Bút vẽ nâng cao và bài toán vẽ hình mẫu
Chúng ta quay trở lại chương trình Bút vẽ tự do ở trên. Trong chương trình của
bài học trước, chúng ta đã mô phỏng 1 bút vẽ tự do với màu sắc và độ rộng bút có
thể chọn ngay trên màn hình.
Bây giờ chúng ta sẽ mở rộng ra để bổ sung thêm 1 chức năng đặc biệt: vẽ theo các
hình mẫu có sẵn.
Như vậy chương trình sẽ có 2 chế độ làm việc độc lập. Biến nhớ Pain_Type dùng
để phân biệt 2 chế độ này.
- Với Paint_Type = 1, chế độ vẽ tự do như em đã biết trong bài học trước.
- Với Pain_Type = 2, sẽ chuyển sang chế độ vẽ theo hình mẫu. Trên màn hình,
khu vực công cụ, các màu vẽ sẽ được thay thế bằng các hình mẫu. Nháy chuột lên
1 hình mẫu, sau đó nháy lên màn hình để thực hiện vẽ theo hình mẫu đã chọn.
Ve nang cao.sb2
Các hình mẫu sẽ được bổ sung vào chương trình như các nhân vật. Chúng ta cần 1
nút lệnh (nhân vật) nữa để chuyển đổi giữa 2 chế độ vẽ (vẽ tự do và vẽ theo mẫu)
của chương trình.
109 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình sau mô tả đoạn chương trình của nhân vật Paint_Type dùng để
chuyển đổi giữa 2 chế độ vẽ. Nháy chuột lên nút này để thay đổi chế độ vẽ.
- Khi nháy chuột lên nhân vật, đoạn chương trình sau sẽ gán cho biến tổng thể
Object-Selected 1 giá trị duy nhất xác định đúng ID của nhân vật này.
Khi nháy chuột lần tiếp theo trên màn hình 2 đoạn chương trình sau sẽ thực hiện
việc vẽ đúng nhân vật này bằng lệnh stamp.
111 | T h i ế t k ế p h ầ n m ề m
Nhân vật PaintType. Nhân vật này có 2 trang
phục tương ứng với 2 chế độ vẽ. Nháy chuột lên
nhân vật sẽ chuyển đổi giữa 2 chế độ này.
Biến nhớ hệ thống.
Tên biến nhớ Mô tả ý nghĩa Ghi chú thêm
Paint_Type Biến nhớ lưu trạng thái của chương
trình.
= 1, trạng thái vẽ tự do.
= 2, trạng thái vẽ theo mẫu.
Width Biến nhớ lưu độ rộng của bút vẽ. Nhận giá trị từ 1
đến 50.
Size Biến nhớ lưu kích thước (%) dùng để vẽ Nhận giá trị từ 5
mẫu đang thực hiện. đến 100.
Object-selected Dùng trong chế độ vẽ mẫu. Chỉ ra số Mặc định gán = 0
thứ tự của mẫu hình đang vẽ. (chưa chọn).
CurrSize Dùng trong chế độ vẽ mẫu. Dùng làm
biến trung gian khi tiến hành vẽ 1 mẫu.
X, Y, X- Các biến nhớ trung gian sử dụng khi vẽ
current, Y- mẫu.
current
Sơ đồ thiết kế hệ thống.
PType1 PType2
Gửi thông điệp Click chuột. Click chuột. Gán đối tượng đã
ColorX, bút sẽ chọn cho biến
nhận và chọn màu. Object-Selected.
Click chuột.
Gửi thông điệp
PaintNOW. Nhân
Kéo thả chuột vật tương ứng sẽ vẽ
vẽ tự do với màu stamp tại vị trí đã
đã chọn và độ click chuột với kích
rộng bút lấy từ thước lấy từ biến
biến Width. Size.
Dùng phím phải, trái để thay
đổi giá trị các biến nhớ này.
112 | T h i ế t k ế p h ầ n m ề m
Lập trình chi tiết.
(a) Điều khiển nhân vật PaintType.
113 | T h i ế t k ế p h ầ n m ề m
- Điều khiển bút vẽ trong chế độ vẽ tự do.
Cảm biến với kéo thả chuột. Khi kéo thả chuột sẽ pen down để tiến hành vẽ.
- Điều khiển nhân vật hình mẫu. Tất cả các nhân vật hình mẫu đều có điều khiển
gần như giống nhau.
114 | T h i ế t k ế p h ầ n m ề m
Nếu nháy lên hình mẫu
này thì gán biến nhớ
Object-Selected.
115 | T h i ế t k ế p h ầ n m ề m
6. Trò chơi hangman
Chúng ta sẽ quay lại 1 trò chơi rất nổi tiếng mà em đã làm quen trong bài học 15
(xử lý xâu ký tự 2), đó là trò chơi Tìm từ Hangman.
Lần này chúng ta sẽ thiết kế trò chơi tổng quát hơn và cho phép người thiết kế có
thể mở rộng nhiều trong tương lai.
Giao diện chương trình mới Hangman lần này sẽ có dạng như hình sau:
116 | T h i ế t k ế p h ầ n m ề m
Danh sách nhân vật.
Hình ảnh Tên nhân vật Ý nghĩa Ghi chú
Square Hình vuông. Hình này có chức Mỗi hình
năng che phủ các chữ cái của từ có kích
cần đoán. Đoán chữ tới đâu, các thướv
hình này sẽ biến mất dần tới đó. 48x48.
Char Nhân vật này có 26 trang phục Có thể mở
tương ứng với 26 chữ cái dùng rộng ra
trong việc thể hiện từ đoán chữ. các chữ
cái và số
khác.
Giáo viên Giáo viên đóng vai trò MC, người
dẫn của chương trình.
Delete NOW
Dãy các hình vuông được tạo ra bằng công cụ clone của nhân vật Square. Dãy các
hình này sẽ được đánh số từ 1 tính từ bên trái.
Để đánh số các clone này chúng ta sẽ sử dụng biến nhớ riêng của Square với tên
biến là CloneID.
Đoạn chương trình mô tả vẽ lưới ô vuông tương ứng với từ khóa Word bằng việc
tạo clone cho nhân vật Square. Kỹ thuật dùng clone để vẽ lưới các hình vuông
lần đầu tiên được sử dụng trong chương trình này và còn được sử dụng trong
nhiều chương trình khác của Scratch.
Đoạn chương trình của nhân vật Char hiển thị dãy các chữ cái của từ Word theo
lưới (nằm dưới các ô vuông) như sau, sử dụng lệnh vẽ stamp.
119 | T h i ế t k ế p h ầ n m ề m
Thuật toán xử lý chính của trò chơi khi tương tác với người chơi.
Thuật toán này sẽ sẽ sử dụng bộ dữ liệu sau để thực hiện.
Stt Tên biến nhớ Ý nghĩa Chú ý
1 W-Array Mảng này sẽ lưu các chữ cái tương Dãy này sẽ có
ứng của từ Word chính. Bảng này nhiều dài đúng
được tự động tạo ra ngay sau khi bằng độ dài của
sinh từ khóa Word. từ Word.
2 Ch-Array Mảng này dùng để kiểm tra xem Dãy này cũng
các chữ cái tương ứng của Word đã sẽ có nhiều dài
tìm được chưa trong quá trình chơi. đúng bằng độ
Bảng này có số phần tử bằng W- dài của từ
Array và bằng độ dài từ Word. Word.
Mỗi phần từ của bảng này có ý
nghĩa sau:
= ? nếu ký tự tương ứng chưa được
tìm ra.
= 1 ký tự cụ thể (khác ?) nếu ký tự
tương ứng đã được tìm thấy.
Bảng này được tự động tạo ra ngay
sau khi sinh từ khóa Word. Ban
đầu bảng này bao gồm toàn các
phần tử = ?
3 D-Array Bảng này lưu các chỉ số của các ký (list)
tự khi người dùng đoán đúng 1 chữ
cái, các vị trí này sau đó sẽ được
mở ô hình vuông (thông qua thông
điệp DeleteNOW.
Ví dụ nếu người dùng nhập chữ cái
a, trong từ Word có 2 chữ a ở các vị
trí 2, 5 thì bảng D-Array sẽ có 2
phần tử {2, 5}.
Thuật toán sau mô tả các bước thực hiện khi người chơi nhập 1 chữ cái từ bàn
phím để đoán tiếp từ hiện thời. Giả sử ký tự người dùng nhập là Ch.
120 | T h i ế t k ế p h ầ n m ề m
- Kiểm tra Ch có trong bảng W-Array hay không? Nếu không có thì thông báo
"Chữ đã nhập không đúng",
- Nếu Ch có trong W-Array mà tại vị trí đó phần tử tương ứng của Ch-Array
không là "?" thì thông báo "Chữ này đã nhập rồi".
- Nếu Ch có trong W-Array mà tại vị trí đó phần tử tương ứng của Ch-Array bằng
? thì thực hiện tiếp như sau:
+ Kiểm tra, lăp theo bảng W-Array xem tại những vị trí nào có giá trị = Ch, tại
các vị trí đó sẽ bổ sung chỉ số tìm thấy vào bảng D-Array.
+ Thông báo, ví dụ "Đã tìm thấy <k> chữ a", với k là độ dài của mảng D-Array
(chính là giá trị biến nhớ num_char), sau đó gửi thông điệp DeleteNOW để nhân
vật hình vuông sẽ thực hiện việc xóa clone để mở ra các vị trí tương ứng với các
chỉ số có trong bảng D-Array.
Đoạn chương trình của nhân vật Square khi xử lý thông điệp DeleteNOW như
sau:
b) Giáo viên xử lý thông điệp Reset, thực hiện các công việc chuẩn bị dữ liệu gốc
Thủ tục Init.Hangman có chức năng chuẩn bị dữ liệu gốc như sau:
- Sinh ngẫu nhiên Word lấy từ mảng WList.
- Gán HWord cho thông tin trợ giúp tương ứng của từ Word.
- Thiết lập mảng W-Array chứa tất cả các chữ cái của từ Word. Mảng này có độ
dài bằng chính độ dài của từ Word.
- Thiết lập mảng Ch-Array có độ dài bằng độ dài Word và chứa mặc định ban
đầu toàn các dấu ?. Phần tử của mảng Ch-Array này chỉ ra chữ cái tương ứng của
Word đã được đoán chưa, nếu = ? có nghĩa là chưa được đoán ra.
Chương trình chi tiết của thủ tục này như sau:
121 | T h i ế t k ế p h ầ n m ề m
Sinh Word và
HWord. Word lấy
ngẫu nhiên từ mảng
WList.
Đoạn chương trình mô tả giáo viên nhận và xử lý thông điệp Reset như sau. Ngay
sau khi thực hiện thủ tục Init.Hangman thì gửi thông điệp Paint và thông báo
người dùng sẵn sàng cho việc đoán từ.
c) Nhận được thông điệp Paint, nhân vật Square sẽ tiến hành tạo các hình vuông
chuẩn bị cho chương trình đoán từ Hangman.
Vẽ xong hình sẽ gửi thông điệp Start.
Chúng ta sẽ dùng kỹ thuật Clone để tạo ra các hình vuông này. Các clone này
được đánh số từ 1 đến 10 tính từ bên trái. Biến nhớ riêng CloneID dùng để đánh
số thứ tự riêng này.
Nhân vật gốc sẽ có CloneID = 0.
Các hình vuông trên màn hình đều là Clone sẽ có CloneID đánh số từ 1, 2, 3, ….
Khi nhận được thông điệp Paint (khi đó trên màn hình đã hết sạch các Clone),
nhân vật Square gốc sẽ sinh ra các Clone và hiện trên màn hình tại dãy các vị trí
xác định bởi mảng XList.
Đoạn chương trình hiện các hình vuông như sau.
122 | T h i ế t k ế p h ầ n m ề m
Gán CloneID = 0 cho nhân
vật gốc.
d) Nhận được thông điệp Start, nhân vật Char sẽ vẽ các chữ cái của từ lên màn
hình, nằm bên dưới các hình vuông. Nhân vật này luôn ẩn trên màn hình.
e) Nhận được thông điệp Start, Giáo viên bắt đầu tiên hành tương tác cho cuộc
chơi đoán từ. Đây là phần lõi và phức tạp nhất của chương trình.
Sơ đồ thuật toán của phần tương tác này nhu sau:
Đặt num_char_solve = 0
Thuật toán
xử lý quá Lặp lại cho đến khi num_char_solve = độ dài Word.
trình tương Cho người dùng nhập 1 chữ cái. (Init.Hangman)
tác đoán từ Xử lý chữ cái đó. (Process.Hangman).
của trò
chơi Nếu đoán đúng thì xóa các ô vuông tương ứng (bằng
cách gửi thông điệp DeleteNOW.
Hangman.
Kết thúc lặp.
Thông báo đã đoán xong từ cần tìm. Gửi thông điệp Reset
để bắt đầu 1 bài mới.
123 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình xử lý chính như sau.
124 | T h i ế t k ế p h ầ n m ề m
Thủ tục Process.Hangman.
Thủ tục này xử lý trường hợp (3): (3) Chữ cái Ch có trong Word và chưa được lật.
Điều kiện (3) tương đương với: Ch có trong W-Array nhưng vị trí tương ứng
trong bảng Ch-Array là ?.
Cách xử lý như sau:
Liệt kê tất cả các vị trí trong W-Array mà xảy ra (3), với mỗi trường hợp như vậy
thì cập nhật giá trị tương ứng trong Ch-Array bằng Ch và cập nhật số thứ tự này
vào mảng D-Array.
Tính giá trị Num_Char = số các chữ cái đã tìm thấy cho trường hợp (3).
Thuật toán này có thể viết dưới dạng giả code đơn giản như sau:
Xóa làm sạch mảng D-Array.
Thuật toán xử
lý khi chữ cái Gán lại Num_char = 0.
người dùng Lặp theo chiều dài mảng W-Array, theo từng vị trí
nhập (Ch) thỏa index, tính từ 1.
mãn điều kiện
Nếu vị trí tương ứng chỉ số index trong W-Array là
(3).
Ch và Ch-Array là ? thì
Thay thế ký tự ? bằng Ch trong Ch-Array.
Tăng Num_Char lên 1.
Tăng Num_Char_Solve lên 1.
Bổ sung index vào bảng D-Array.
Kết thúc Nếu.
Kết thúc lặp.
125 | T h i ế t k ế p h ầ n m ề m
d) Square xử lý thông điệp DeleteNOW.
Khi nhận thông điệp DeleteNOW, nhân vật Square sẽ tiến hành xóa tất cả các
Clone có CloneID trùng với các chỉ số có trong mảng D-Array.
Chương trình đơn giản như sau.
126 | T h i ế t k ế p h ầ n m ề m
7. Trò chơi mưa từ
Trong hoạt động này chúng ta sẽ cùng thiết kế 1 trò chơi giáo dục đơn giản nhưng
có nhiều ý nghĩa dành cho các bé nhỏ tuổi, trò chơi Mưa từ (Word Rain).
Mua tu.sb2
Giao diện của chương trình
và danh sách các nhân vật
chính. Nhân vật chính là 1
hình vuông (tên Square) có
các trang phục nhiều màu
sắc khác nhau.
- Chương trình bắt đầu chạy khi người dùng bấm phím Space hoặc nháy chuột bất
kỳ trên màn hình.
- Từ phía trên của màn hình, các hình vuông với màu sắc khác nhau sẽ rơi xuống,
mỗi hình kèm theo 1 từ (vì vậy chúng ta gọi là mưa từ). Các từ này có thể giống
nhau và được lấy ngẫu nhiên từ 1 từ điển từ cho trước.
- Người chơi phải quan sát và ngăn không cho các hình này rơi xuống phía dưới.
Nếu bị xuống thì bị trừ đi 5 điểm.
- Người dùng có thể thực hiện 1 trong 2 cách sau:
(a) Nháy chuột nhanh lên các hình vuông để chúng biến mất. Cách này được 1
điểm.
(b) Gõ nhanh từ đang rơi trên màn hình. Nếu gõ đúng 1 từ, từ và hình tương ứng
sẽ biến mất, điểm số sẽ tăng cao hơn, 25 điểm.
127 | T h i ế t k ế p h ầ n m ề m
Để mô phỏng các từ được rơi xuống cùng hình ảnh nhân vật Square, chúng ta sử
dụng kỹ thuật clone. Để cho từ có thể gắn kết liền với hình, chúng ta tạo 1 biến
nhớ riêng của nhân vật này với tên Word để lưu trữ các từ này. Khi hình rơi
xuống cùng với từ, chúng ta sẽ có cảm giác mưa từ.
Các đoạn chương trình chính xử lý nhân vật Square khi tạo clone và rơi xuống
như sau.
Sau mỗi 3 giây 1 clone lại được khởi Trong suốt quá trình rơi xuống, lệnh
tạo. Clone này trước khi xuất hiện sẽ say <Word> luôn được thực hiện đảm
được chuyển màu sắc và gán từ Word bảo từ này luôn được gắn với hình
được sinh ngẫu nhiên từ từ điển trong suốt quá trình mưa từ.
WList.
128 | T h i ế t k ế p h ầ n m ề m
Sơ đồ thiết kế.
Sơ đồ hoạt động của chương trình như sau:
Hình vuông.
129 | T h i ế t k ế p h ầ n m ề m
Nút Title, banner chính.
Khi người dùng nháy chuột bất kỳ hoặc bấm Space thì bắt đầu chơi bằng cách gửi
thông điệp Start Game.
Chương trình sau điều khiển hoạt động bình thường của các hình vuông - clone
sau khi được sinh ra. Các hình vuông này sẽ rơi xuống phía dưới. Sau 1 giây sẽ
xuất hiện các từ kèm theo hình vuông.
130 | T h i ế t k ế p h ầ n m ề m
Khi người dùng nháy lên hình vuông thì hình sẽ biến mất và chỉ được thưởng 1
điểm.
c) Sân khấu nhận liên tục tương tác với người chơi cùng thông điệp QuickDone.
Đây là đoạn hay nhất của chương trình. Sân khấu sẽ liên tục yêu cầu người chơi
nhập 1 từ từ bàn phím. Khi nhập xong 1 từ (từ người dùng nhập lưu vào biến nhớ
CWord), lập tức gửi thông điệp QuickDone để Hình vuông kiểm tra xem từ này
có mặt trên màn hình hay không.
Hình vuông sẽ lâpk tức kiểm tra xem trên màn hình có hình vuông nào có từ
Word trùng với CWord hay không. Nếu trùng (người chơi gõ chính xác 1 từ), lập
tức tăng 25 điểm và xóa hình vuông này khỏi màn hình.
Thời gian bắt đầu chạy khi Sau 2 phút thì gửi thông
Start Game. điệp Game Over.
131 | T h i ế t k ế p h ầ n m ề m
Nút Game Over sẽ hiện và thực hiện lệnh stop all để dừng toàn bộ chương trình.
132 | T h i ế t k ế p h ầ n m ề m
8. Trò chơi luyện trí nhớ
Chúng ta sẽ cùng nhau phát triển và thiết kế 1 trò chơi giáo dục rất quen thuộc đối
với học sinh: trò chơi luyện trí nhớ.
Memory.sb2
- Giao diện của trò chơi bao gồm 12 mảnh ghép (mỗi mảnh là 1 hình vuông). Bên
dưới các mảnh ghép là 1 nội dung (chữ hoặc hình ảnh), có 6 cặp thông tin giống
nhau. Nhiệm vụ người chơi là lật được tất cả các mảnh ghép bằng cách nháy
chuột lên các mảnh ghép.
- Qui tắc lật như sau: người chơi sẽ lật được 2 mảnh ghép liên tục nếu 2 mảnh đó
chứa nội dung giống nhau.
- Ví dụ: lần đầu nháy và lật được 1 mảnh ghép, khi nháy lật lần thứ 2, nếu nội
dung mảnh sau trùng với mảnh trước thì 2 mảnh đó sẽ được mở vĩnh viễn, nếu nội
dung mảnh sau khác mảnh trước thì 2 mảnh đó sẽ đóng lại và người chơi phải
thực hiện lại từ đầu.
133 | T h i ế t k ế p h ầ n m ề m
- Qui tắc tính điểm như sau: mỗi khi lật được vĩnh viễn 2 mảnh có nội dung giống
nhau thì tăng 1 điểm, khi hoàn thành 1 lần chơi mở tất cả các mảnh ghép sẽ được
tăng 20 điểm.
Thiết kế nhân vật chính của chương trình.
Hình ảnh Tên nhân vật Mô tả nhân vật
Giáo viên Giáo viên đóng vai trò MC của chương trình.
Char Nhân vật bao gồm các chữ cái thường dùng để
cung cấp thông tin nội dung cho các mảnh
ghép.
Alphabet Nhân vật bao gồm các chữ cái hoa dùng để
cung cấp thông tin nội dung cho các mảnh
ghép.
Animal Nhân vật bao gồm các hình ảnh con thú vật
dùng để cung cấp thông tin nội dung cho các
mảnh ghép.
1 2 3 4
-120 -40 40 120
7 (2, 3)
1 60 1 2 3 4
-20 5 6 7 8 11 (3, 3)
2
-100 9 10 11 12
3
Mỗi mảnh ghép chính là 1 clone của nhân vật Square có giá trị CloneID được ghi
trong các ô của bảng trên, đánh số từ 1 đến 12. Thuật toán sau tính được chỉ số
theo hàng X-index và chỉ số theo cột Y-index theo giá trị n = số thứ tự mảnh
ghép.
134 | T h i ế t k ế p h ầ n m ề m
Gán X-index:= n mod 4;
Nếu X-index = 0 thì gán
X-index:=4;
Gán Y-index:= n div 4 + 1 (làm
tròn)
Nếu n mod 4 = 0 thì gán
Y-index := Y-index - 1;
2) Để mô tả nội dung hiện bên dưới các mảnh ghép, chúng ta dùng các nhân vật
sau: chữ cái thường, chữ cái in hoa và hình ảnh con vật.
Mỗi nhân vật có nhiều trang phục như mô tả trong hình sau:
Nội dung của mỗi mảnh ghép cũng được thể hiện là 1 số tự nhiên. Nội dung 12 ô
mảnh ghép được lưu trong mảng Memory.List. Chú ý mảng này sẽ lưu ngẫu
nhiên 6 cặp số tự nhiên, mỗi cặp là 2 số giống nhau.
3) Các mảnh ghép thể hiện trên màn hình chính là các phân thân, clone của nhân
vật Square.
Nhân vật này được thiết kế với biến nhớ riêng CloneID. Biến nhớ này sẽ lưu trữ
ID của mảnh ghép, chính là số thứ tự của mảnh ghép trong mô tả trên của trò chơi.
Như vậy khi người dùng nháy lên 1 mảnh ghép, giá trị CloneID sẽ được dùng để
chỉ số thứ tự của mảnh ghép, còn giá trị số tương ứng trong mảng Memory.List
sẽ được tính là nội dung bên dưới mảnh ghép đó.
135 | T h i ế t k ế p h ầ n m ề m
4) Phần trọng tâm, khó nhất của chương trình là mô tả quá trình tương tác để mở
được 1 cặp mảnh ghép giống nhau. Thuật toán này sẽ cần 2 biến nhớ quan trọng:
Last.Square và Last.Square.Content.Ý nghĩa các biến nhớ này như sau:
- Last.Square chỉ ra trước đó đã mở tạm thời 1 mảnh ghép hay chưa. Nếu chưa
thì Last.Square = 0, ngược lại Last.Square chính là số thứ tự của mảnh ghép đã
mở trước đó.
- Nếu Last.Square > 0 (tức là đã có 1 mảnh ghép đang mở) thì
Last.Square.Content sẽ chính là nội dung của mảnh ghép đang mở.
Phần tương tác chính để của trò chơi Luyện trí nhớ được mô tả như sau:
Khi nháy chuột lên 1 mảnh ghép để mở. Gọi mảnh ghép này
Thuật toán mô là hiện thời.
tả quá trình Nếu Last.Square = 0 thì mở mảnh ghép này, gán
tương tác mở Last.Square cho ID của mảnh ghép này và gán
mảnh ghép của Last.Square.Content cho nội dung bên dưới của mảnh ghép
trò chơi Luyện này.
trí nhớ.
Nếu Last.Square > 0 thì
So sánh nội dung của mảnh ghép hiện thời với
Last.Square.Content.
Nếu trùng nhau thì
Mở tiếp mảnh ghép hiện thời.
Gán lại: Last.Square = 0; Last.Square.Content
= 0.
Nếu không trùng nhau thì
Tại vị trí của Last.Square cho hiện lại mảnh
ghép (đã mở ra trước đó).
Gán lại: Last.Square = 0; Last.Square.Content
= 0.
Nếu còn mảnh ghép chưa mở thì làm tiếp. Ngược lại kết
thúc trò chơi.
137 | T h i ế t k ế p h ầ n m ề m
Stt Tên biến nhớ Ý nghĩa Chú ý
5 NumList Dãy số tự nhiên 1, 2, 3, … có độ (biến nhớ)
dài = số lượng trang phục của nhân
vật tương ứng với MType. Bộ dữ
liệu này dùng để sinh ngẫu nhiên
bộ dữ liệu chính thể hiện nội dung
trên lưới.
6 Memory.List Đây là bảng dữ liệu chính của (list)
chương trình, được sinh ra cho mỗi
lần chơi. Bảng này 12 số, bao gồm
6 cặp giống nhau, mỗi số sẽ tương
ứng với 1 giá trị của nội dung thể
hiện trên lưới. Các phần tử của
bảng này được lấy ngẫu nhiên từ
bảng NumList.
7 num_square_solve Biến nhớ được dùng trong quá (biến nhớ)
trình tương tác với người chơi, chỉ
ra hiện đã có bao nhiêu mảnh ghép
đã được lật. Nếu
num_square_solve = 12 thì việc
chơi kết thúc.
8 Last.Square Biến nhớ này dùng để chỉ trạng (biến nhớ)
thái người chơi nháy chuột lên 1
mảnh ghép.
= 0 nếu trước đó chưa có mảnh
ghép nào được lật.
= k > 0 nếu trước đó mảnh ghép
thứ k đã được lật.
9 Last.Square.Content Biến này có ý nghĩa khi (biến nhớ)
Last.Square > 0, chỉ ra nội dung
của ô mảnh ghép đã được lật trước
đó. Như vậy khi người chơi lật 1
mảnh ghép, nếu nội dung của ô bên
dưới = Last.Square.Content và
Last.Square > 0 thì chứng tỏ đã
nháy đúng 2 mảnh ghép giống
nhau.
10 CloneID Biến nhớ riêng của nhân vật biến nhớ
Square dùng để mô tả số thứ tự của riêng của
mảnh ghép được khởi tạo. Square.
138 | T h i ế t k ế p h ầ n m ề m
Sơ đồ hoạt động của chương trình.
Chương trình điều khiển Giáo viên đóng vai trò như 1 MC trước khi nhận thông
điệp Reset.
139 | T h i ế t k ế p h ầ n m ề m
b) Chương trình sau của Giáo viên khi nhận được thông điệp Reset mô tả tổng thể
toàn bộ các bước thực hiệ chương trình.
2. Chuẩn bị bộ dữ liệu
Number.List.
3. Chuẩn bị bộ dữ liệu
Memory.List.
Như vậy Number.List sẽ chứa dãy các số tự nhiên hoặc 26, 26 hoặc 32 tùy thuộc
vào 1 biến nhớ MType dùng để chọn nguồn ảnh. Cách làm này có thể tổng quát
mở rộng cho nhiều bộ dữ liệu khác nữa.
c) Chuẩn bị bộ dữ liệu Number.List.
140 | T h i ế t k ế p h ầ n m ề m
Chọn ngẫu nhiên 1 trong 3
bộ dữ liệu, tương ứng với 3
nhân vật dùng để sinh dữ liệu
cho các ô lưới bên dưới các
mảnh ghép.
Đưa 6 cặp
số trùng
nhau của
Number.List
vào mảng
tạm.
141 | T h i ế t k ế p h ầ n m ề m
e) Thiết lập các hình vuông (mảnh ghép) sau thông điệp Reset.
Chương trình sau của Square sẽ sinh 12 clone là 12 mảnh ghép và sẽ hiển thị tại
đúng vị trí của lưới 4 x 3 = 12 ô vuông của trò chơi.
Số thứ tự của các mảnh ghép chính là giá trị lưu trong biến nhớ CloneID.
f) Vẽ nội dung bên dưới các mảnh ghép sau thông điệp MakeContent.
Khi nhận thông điệp MakeContent, cả 3 nhân vật Char, Alphabet và Animal
đều thực hiện cùng 1 chương trình để thể hiện nội dung bên dưới các mảnh ghép.
142 | T h i ế t k ế p h ầ n m ề m
Kiểm tra điều
kiện thực hiện.
Tính tọa độ
cho mảnh ghép
có số thứ tự
index.
143 | T h i ế t k ế p h ầ n m ề m
Tương tác 2: mở mảnh ghép thứ 2.
Kết quả là hoặc thành công, hoặc thất bại thì phải trả lại mảnh ghép của tương tác
1 bằng cách gửi thông điệp RestoreLast.
Mở mảnh
ghép thứ 2.
Nếu đã mở
hết thì End
Game.
Thiết lập 1
clone mới với
CloneID =
Last.Square.
Trả lại
CloneID = 0
và đặt lại các
biến nhớ hệ
thống.
j) Giáo viên
và thông điệp End Game.
144 | T h i ế t k ế p h ầ n m ề m
Giáo viên sẽ thông báo hoàn thành trò chơi, tăng điểm số lên 20 điểm, đặt lại
gameType = 0 và chuẩn bị cho bài tiếp theo bằng thông điệp Reset.
145 | T h i ế t k ế p h ầ n m ề m
9. Trò chơi Ô chữ
Chúng ta sẽ cùng thiết kế trò chơi Ô chữ (Crosswords), một trò chơi rất quen
thuộc và nổi tiếng và là chương trình phức tạp nhất của chủ đề này. Trò chơi này
rất nổi tiếng và đã có rất nhiều phần mềm mô phỏng trò chơi này.
O chu.sb2
146 | T h i ế t k ế p h ầ n m ề m
- Yêu cầu của chương trình là các bộ dữ liệu ô chữ phải được sinh tự động, ngẫu
nhiên từ một CSDL được nạp sẵn trong chương trình.
(b) Một vài nhận xét sơ bộ về thiết kế chương trình.
1. Một trong những điểm khó thiết kế nhất của chương trình này chính là bộ dữ
liệu gốc dùng để mô tả chương trình.
Bảng sau mô tả bộ dữ liệu gốc được thiết kế của chương trình.
Tên biến nhớ Ý nghĩa
MKey (biến nhớ) Từ khóa chính của ô chữ hiện thời, theo chiều dọc
thẳng đứng.
Cách tính: lấy ngẫu nhiên 1 từ từ dãy MKeyList.
MKey.Description (biến Mô tả, gợi ý của từ khóa chính.
nhớ)
KeyWList (list) Các từ khóa theo chiều ngang của ô chữ hiện thời.
Cách tính: lấy từ dãy WList và thỏa mãn chứa các
chữ cái tương ứng của MKey.
KeyWList.Description Các mô tả của các từ khóa theo chiều ngang.
(list)
KeyWList.index (list) Dãy các chỉ số, vị trí của từ trong dãy KeyWList
chứa ký tự khóa.
Trên màn hình, các ô chứa ký tự khóa chính sẽ đổi
màu xanh.
WList (list) Bộ từ điển dữ liệu các từ có thể làm từ khóa theo
chiều ngang. Các từ này phải có độ dài <=11.
WList.Description (list) Bộ từ điển mô tả của các từ trong dãy WList.
MKeyList (list) Từ điển dữ liệu gốc các từ có thể làm khóa chính.
Các từ này phải có độ dài <=8.
MKeyList.Desctiption Mô tả của các từ trong dãy MKeyList.
(list)
KeyWList.solve (list) Dãy các số chỉ ra từ khóa hàng ngang nào đã được
dự đoán, từ nào chưa. Nếu từ đã đoán xong thì giá
trị số tương ứng = 1, ngược lại = 0.
2. Một trong những đặc điểm khó nữa của chương trình này là cách vẽ, thể hiện
lưới các ô vuông trên màn hình.
Chúng ta sẽ sử dụng 1 nhân vật có tên Square để thể hiện lưới này. Kỹ thuật
Clone sẽ được dùng để thể hiện các ô vuông này trên màn hình.
147 | T h i ế t k ế p h ầ n m ề m
(c) Thiết kế nhân vật
Nhân vật và vai trò trong chương trình.
Biểu tượng Tên nhân vật Vai trò trong thiết kế
Giáo viên Giáo viên sẽ đóng vai trò người hướng dẫn
chính của chương trình với người chơi. Đồng
thời tất cả các hoạt động chính, thuật toán, các
lệnh chính đều xuất phát từ nhân vật này.
Bảng chữ cái Nhân vật Char dùng để thể hiện các từ khóa
của ô chữ. Việc thể hiện sẽ sử dụng lệnh vẽ
stamp của nhân vật này. Nhân vật sẽ có 26
trang phục tương ứng với 26 chữ cái tiếng Anh.
Tên của trang phục trùng với tên chữ cái, ví dụ:
a, b, c, d, e, f, ….
Chú ý: chương trình chỉ dùng các hình ảnh chữ
cái tiêng Anh thường, không có chữ hoa, do đó
tất cả các các từ khóa của chương trình đều
phải viết bằng chữ thường.
Vòng tròn có Nhân vật này là hình tròn, có 8 trang phục
số tương ứng với các hình có số từ 1 đến 8. Nhiệm
vụ của nhân vật này là hiện thành các nút ở cột
bên trái dùng để cho người chơi đoán các từ
khóa hàng ngang.
Nút / tên của Nút này có 2 ý nghĩa:
chương trình. - Hiện phía trên của màn hình làm tiêu để cho
phần mềm.
- Dùng là nút lệnh cho người chơi đoán từ khóa
chính hàng học.
Nhãn, đoạn Hoạt động chính Vai trò và nhiệm vụ của Các chú ý
chương nhân vật khác
trình
Bắt đầu Bắt đầu chương trình. Các nhân vật sẽ thiết lập Nền sân khấu
trạng thái ban đầu của mỗi sẽ phát thông
nhân vật. điệp Reset.
Reset Bắt đầu quá trình chính của trò - Nhân vật GV sẽ thực hiện Khi GV thực
chơi. Tại bước này sẽ thực hiện tất cả các hoạt động của hiện xong tất
các nhiệm vụ sau: bước này. cả các công
việc sinh dữ
148 | T h i ế t k ế p h ầ n m ề m
Nhãn, đoạn Hoạt động chính Vai trò và nhiệm vụ của Các chú ý
chương nhân vật khác
trình
- Thiết lập các giá trị mặc định, liệu, sẽ phát
ban đầu cho chương trình. thông điệp
Paint để yêu
- Sinh ngẫu nhiên 1 bộ dữ liệu cho
trò chơi ô chữ, bao gồm: cầu vẽ giao
diện cho trò
+ 1 Từ khóa chính (theo hàng chơi.
dọc). MainKey.
+ Dãy các từ khóa theo hàng
ngang. KeyWord. Mỗi từ khóa
hàng ngang phải chứa ký tự tương
ứng theo thứ tự của từ khóa chính.
Ví dụ nếu Main Key =
"computer" thì từ khóa thứ nhất
phải có chữ c, từ thứ 2 phải chứa
chữ o, ….
Paint Thực hiện việc vẽ các giao diện - Nhân vật Char thực hiện Khi vẽ xong
của chương trình. vẽ giao diện các chữ cái thể thì phát thông
hiện các từ hàng ngang. điệp Start để
bắt đầu quá
- Nhân vật Square thực
hiện vẽ giao diện là các trình tương
tác của người
hình vuông đè lên các chữ
dùng với
cái để che khuất. Các hình
vuông tương ứng với từ phần mềm.
khóa chính sẽ có màu xanh.
- Nhân vật Circle sẽ vẽ
giao diện là dãy 8 hình tại
cột bên trái.
Start Bắt đầu chơi đoán ô chữ. Nhân vật GV sẽ thực hiện Đây là bước
các hoạt động chính của phức tạp nhất
- Muốn đoán 1 từ khóa hàng ngay,
bước này, các nhân vật của chương
nháy nút hình tròn tương ứng ở
đầu mỗi từ khóa. khác phối hợp thực hiện. trình.
- Muốn đoán ngay từ khóa chính - Khi người dùng nháy lên
nút hình tròn tương ứng với
nháy lên nút tên chương trình (có
từ chưa tìm ra, nhân vật
chữ Crosswords).
Circle sẽ gửi thông điệp
- Nếu đoán đúng 1 từ khóa hàng Tim_hang_ngang cho GV.
ngang thì các hình vuông che
- Khi ngưởi dùng nháy lên
khuất từ trên hàng ngay này sẽ
nút Crosswords, nhân vật
mất đi, để hiện ra từ khóa này.
này sẽ gửi thông điệp
- Trò chơi kết thúc khi người chơi Tim_hang_doc cho GV.
hoặc đã đoán đúng được toàn bộ
- Khi người dùng đoán
các từ hàng ngang hoặc đoán đúng
đúng 1 từ hàng ngang, GV
được từ hàng dọc.
sẽ gửi thông điệp
Khi kết thúc sẽ dừng chương trình OpenSquare cho nhân vật
hoặc quay lại bước Reset.
149 | T h i ế t k ế p h ầ n m ề m
Nhãn, đoạn Hoạt động chính Vai trò và nhiệm vụ của Các chú ý
chương nhân vật khác
trình
Square để mở hình cho từ
hàng ngang này.
150 | T h i ế t k ế p h ầ n m ề m
Stt Tên biến nhớ Ý nghĩa Chú ý
= 0, chưa tìm được.
= 1, đã tìm được.
13 num_key_solve Số lượng các từ khóa theo chiều (biến nhớ)
ngang đã được tìm thấy.
14 KeyWList.solve Dãy các số chỉ ra từ khóa hàng (list)
ngang nào đã được dự đoán, từ
nào chưa. Nếu từ đã đoán xong
thì giá trị số tương ứng = 1,
ngược lại = 0.
151 | T h i ế t k ế p h ầ n m ề m
(e) Sơ đồ hoạt động chi tiết
152 | T h i ế t k ế p h ầ n m ề m
(f) Thiết kế chi tiết
1) Sinh ngẫu nhiên bộ dữ liệu ô chữ
Khi nhận được thông điệp Reset, nhân vật GV sẽ thực hiện các lệnh sinh ngẫu
nhiên bộ dữ liệu ô chữ. Các lệnh này sẽ được chia thành 2 thủ tục: Init.MainKey
sinh từ khóa chính và Init.WordKeys sinh dãy các từ khóa hàng ngang.
Thủ tục Init.MainKey:
Thủ tục Init.WordKeys. Thủ tục này sẽ xuất phát từ từ khóa chính MKey đã có,
sẽ tìm lần lượt các từ khóa hàng ngang có chứa lần lượt các chữ cái trong MKey.
Trong thủ tục này sẽ gọi 1 thủ tục khác Find char <ch> in <Word>, kết quả là vị
trí của chữ cái <Ch> trong từ <Word>, giá trị này lưu trong biến nhớ tổng thể
found.index.
153 | T h i ế t k ế p h ầ n m ề m
Còn đây là thủ tục Find char <ch> in <Word>. Kết quả của thủ tục này sẽ lưu
trong biến nhớ tổng thể found.index.
(20, -40)
(-100, 0)
154 | T h i ế t k ế p h ầ n m ề m
Hình ảnh 2 mảng số XList và YList trong chương trình.
3) Thể hiện (paint) giao diện ô chữ: các hàng chữ hàng ngang
Nhân vật Char sẽ có nhiệm vụ thể hiện các từ hàng ngang của ô chữ.
Chúng ta sử dụng kỹ thuật thể hiện chữ đã được đưa trong bài học
21. Nhân vật Char sẽ có các trang phục trùng với bảng chữ cái của
ngôn ngữ hiện thời và có tên trang phục chính là chữ cái đó.
Trong chương trình này chúng ta sẽ thực hiện trên ngôn ngữ tiếng
Anh với 26 chữ cái viết thường.
Chú ý: muốn mở rộng ra chữ hoa hoặc bổ sung thêm các ký tự khác
hay ngôn ngữ khác thì chỉ cần mở rộng số lượng trang phục của nhân
vật. Thuật toán sẽ không thay đổi.
Chú ý: Cần xác định tâm của trang phục nằm ở chính giữa hình ảnh
chữ cái.
Đoạn chương trình thể hiện các từ hàng ngang trên lưới ô chữ của nhân vật Char
như sau:
155 | T h i ế t k ế p h ầ n m ề m
4) Thể hiện (paint) giao diện ô chữ: các hình vuông
Để thực hiện công việc này, chúng ta sẽ sử dụng kỹ thuật tạo clone quen thuộc của
Scratch cho nhân vật Square (hình vuông). Để lưu trữ và tìm kiếm nhanh được vị
trí của các hình vuông clone trên màn hình chúng ta bổ sung thêm 2 biến riêng
cho hình vuông là Row - tọa độ theo X và Column - tọa độ theo Y.
Đoạn chương trình sinh clone của nhân vật Square phủ lưới ô vuông ô chữ như
sau:
5) Thể hiện (paint) giao diện ô chữ: cột tròn bên trái đầu các hàng ngang
Thể hiện cột tròn bên trái các hàng ô chữ là nhân vật Circle. Cách thực hiện cũng
dùng kỹ thuật clone. Nhân vật này sẽ có 8 trang phục tương ứng với các hình tròn
có các chữ số từ 1 đến 8. Đoạn chương trình vẽ cột đầu tiên như sau.
156 | T h i ế t k ế p h ầ n m ề m
Sử dụng biến nhớ riêng CloneID để đánh
số các clone được khởi tạo.
Với mỗi clone với CloneID, lệnh:
GV sẽ thực hiện chương trình tạo tương tác để người chơi nhập từ hàng ngang
tương ứng. Nếu người chơi nhập đúng thì gửi thông điệp OpenSquare cho nhân
vật Square để làm ẩn (xóa) các clone có trên hàng tương ứng.
Đoạn chương trình xử lý của nhân vật hình vuông đơn giản, kiểm tra xem nếu giá
trị Column = Curr_index thì xóa clone tương ứng:
157 | T h i ế t k ế p h ầ n m ề m
Lập trình chi tiết.
a) Sân khấu là nơi phát thông điệp Reset đầu tiên.
b) Giáo viên nhận được Reset sẽ thực hiện công việc sinh bộ dữ liệu gốc cho ô
chữ.
158 | T h i ế t k ế p h ầ n m ề m
Thứ tự các chỉ số của ký tự khóa chính trong từ khóa hàng ngang được lưu trong
bảng KeyWList.index.
Các mô tả sẽ được đưa vào bảng KeyWList.Description tương ứng.
Tìm từ khóa
hàng ngang
Word (lấy từ
WList) có chứa
Ch tương ứng.
Chú ý: Trong chương trình trên có sử dụng thủ tục Find char <ch> in <Word>.
Thủ tục này được mô tả ngay dưới đây.
159 | T h i ế t k ế p h ầ n m ề m
b.4. Thủ tục Init.Solve.
Thủ tục này thiết lập các giá trị ban đầu cho 1 số biến nhớ hệ thống dùng cho việc
giải ô chữ ở bước sau.
160 | T h i ế t k ế p h ầ n m ề m
Chương trình sinh lưới ô vuông như sau:
Lặp theo
chiều ngang.
ô vuông ứng
với chữ cái của
từ khóa chính sẽ
là màu xanh.
c.2. Thiết lập dãy các vòng tròn đánh số bên trái các từ khóa.
Các vòng tròn đánh số bên trái các từ khóa được thiết lập từ nhân vật Circle bằng
kỹ thuật Clone. Có tất cả 8 clone này, đánh số từ 1 đến 8 bởi biến nhớ riêng
CloneID. Chương trình đơn giản sau tạo ra 8 hình tròn này.
161 | T h i ế t k ế p h ầ n m ề m
c.3. Thể hiện dãy các từ khóa bên dưới lưới ô vuông.
Dãy các từ khóa được thể hiện bằng lệnh stamp bên dưới lưới ô vuông. Cách thực
hiện gần tương tự như việc thiết kế lưới ô vuông.
162 | T h i ế t k ế p h ầ n m ề m
Màn hình thể hiện thông báo của Giáo viên như sau:
Khi nhận được thông điệp Tim_hang_ngang Giáo viên sẽ là người xử lý thông
điệp này. Qui trình thực hiện như sau:
- Yêu cầu người chơi nhập từ cần đoán từ bàn phím.
- Tiến hành kiểm tra xem từ đã nhập có đúng với từ hàng ngang cần đoán hay
không.
Nếu đúng thì:
Thông báo đã đoán đúng, cập nhật các thông tin cần thiết và xóa tất cả các mảnh
ghép của hàng ngang này.
Nếu sai thì:
Cập nhận thông tin và thông báo đã đoán sai.
163 | T h i ế t k ế p h ầ n m ề m
Chương trình cụ thể như sau.
Thông báo và
yêu cầu người
chơi nhập từ
hàng ngang cần
tìm.
Nếu từ này là
cuối cùng thì
thông báo chiến
thắng, gửi Reset.
Xử lý thông điệp OpenSquare, xóa tất cả các ô hàng ngang tại vị trí
Currr_index rất đơn giản bằng chương trình sau.
Chú ý: tất cả các Clone trên lưới đều nhận được và cùng thực hiện chương trình
này nhưng chỉ những Clone tương ứng với từ vừa tìm thấy mới bị xóa.
165 | T h i ế t k ế p h ầ n m ề m
Câu hỏi - Bài tập - Mở rộng
1. Viết chương trình mô tả chương trình, trò chơi Chim bay sau.
Trò chơi Chim bay có các màn hình ban đầu và trong thời gian chơi như 2 hình
sau:
Hình ảnh ban đầu của chương trình. Hình ảnh trong thời gian chơi.
- Chương trình có 3 nhân vật chính: chim, ngôi sao và ma trắng. Bấm 1 phím bất
kỳ để bắt đầu chơi. Ban đầu người chơi được ngay 10 điểm.
- Chim sẽ luôn vỗ cánh và bay. Em điều khiển chim bay bằng các phím lên, phải,
trái. Khi bấm phím phải, trái, chim sẽ quay về hướng phải, trái và bay 1 đoạn
ngắn. Khi bấm phím lên, chim sẽ cố gắng bay lên. Tuy nhiên do cánh chim quá
nặng nên chim sẽ luôn bị hút rơi xuống. Nếu rơi xuống mặt đất, điểm số sẽ luôn bị
trừ đi 1 điểm trong suốt thời gian ở mặt đất. Do vậy người chơi cần điều khiển
nhanh để chim bay lên.
- Trên màn hình sẽ xuất hiện ngẫu nhiên các ngôi sao và ma trắng, chuyển động từ
trái sang phải hoặc từ phải sang trái màn hình. Ngôi sao xuất hiện nhiều hơn và
chuyển động nhanh hơn, ma trắng xuất hiện ít hơn và chuyển động chậm hơn.
- Nếu gặp ngôi sao, người chơi được thưởng 50 điểm.
- Nếu gặp ma trắng, lập tức điểm số bị đặt bằng 0, chim rơi xuống đất và trò chơi
kết thúc.
- Có 1 biến nhớ thời gian luôn hiện trên màn hình và sẽ chạy khi bắt đầu chơi. Sau
đúng 1 phút (60 giây), trò chơi kết thúc.
Để chơi trò chơi này, người chơi cần khéo léo điều khiển con chim sao cho đạt
nhiều điểm nhất khi kết thúc chương trình, tránh va chạm với con ma trắng.
2. Mở rộng chương trình Bút vẽ nâng cao (mục 5) như sau:
Không cho phép vẽ, in hình vẽ vào khu vực phía dưới màn hình, khu vực có các
công cụ vẽ.
Chú ý chương trình trong mục 5 không thỏa mãn hoàn toàn yêu cầu này. Chương
trình chỉ cấm được bút vẽ từ bên trong khu vực "cấm" ra ngoài, chứ chưa ngăn
được việc đưa bút vẽ từ ngoài vào bên trong vùng "cấm".
166 | T h i ế t k ế p h ầ n m ề m
Không cho
phép vẽ hình
trong khu vực
này.
3. Mở rộng trò chơi Luyện trí nhớ cho các lưới ô vuông 4 x 4 và 4 x 5.
4. Mở rộng chương trình, trò chơi Ô chữ với các chức năng sau:
- Bấm các phím 1, 2, 3, …. sẽ cho phép nhập từ hàng ngang thư 1, 2, 3, ….
- Bấm phím Space sẽ cho phép nhập từ hàng dọc (từ khóa chính).
5. Hãy thiết kế bộ dữ liệu và thủ tục có chức năng thể hiện được các từ tiếng Việt
hoàn chỉnh trên màn hình.
Ví dụ thủ tục cần thiết kế có dạng: Show Word <W> at <X, Y>.
Ví dụ lệnh Show Word <việt nam> at <0,0> sẽ thể hiện từ "việt nam" trên màn
hình sân khấu.
167 | T h i ế t k ế p h ầ n m ề m
Chủ đề 5.
Phần mềm tập chuột, bàn phím
Mục tiêu:
- Các phương pháp điều khiển nhân vật bằng chuột và bàn phím.
- Một số kỹ thuật xử lý chuột.
- Phần mềm tập chuột, bàn phím cho học sinh.
Nội dung chính
1. Điều khiển nhân vật bằng bàn phím
Trong Scratch có 2 cách điều khiển nhân vật bằng bàn phím, 1 cách điều khiển
cứng và 1 cách điều khiển mềm bằng cảm ứng.
Điều khiển cứng Điều khiển mềm
168 | T h i ế t k ế p h ầ n m ề m
2.2. Điều khiển nhân vật bằng cách nháy chuột. Mức 1, đơn giản
Ở mức 1, việc điều khiển nhân vật sẽ được kích hoạt mỗi khi người dùng nháy
chuột. Khi không nháy chuột nữa thì việc điều khiển sẽ dừng lại. Các cách điều
khiển nãy cũng rất thuận tiện vì người điều khiển sẽ hoàn toàn chủ động khi dùng
chuột điều khiển nhân vật.
CM3 Mỗi khi người dùng nháy chuột, nhân
vật sẽ xoay về hướng con trỏ chuột và
dịch chuyển nhanh về hướng đó 1 số
bước nhất định.
2.3. Điều khiển nhân vật bằng cách nháy chuột. Mức 2, phức tạp hơn
Ở mức này cách điều khiển chuột sẽ phức tạp hơn 1 chút nhưng cũng rất hiệu quả
và tạo cảm giác rất chuyên nghiệp. Tính năng cơ bản nhất của cách điều khiển
bằng chuột này là thông qua 1 biến nhớ trạng thái (ví dụ biến FolowOn), ý nghĩa
của biến này như sau.
Khi FolowOn = 1 thì trạng thái điều khiển chuột được kích hoạt, khi đó chuột sẽ
bắt đầu điều khiển nhân vật.
Khi FolowOn = 0, trạng thái điều khiển nhân vật sẽ không có tác dụng nữa.
Người dùng sẽ nháy chuột để thay đổi trạng thái của biến nhớ FolowOn này.
Đoạn chương trình sau mô tả công nghệ mấu chốt của cách điều khiển chuột mức
2 này.
Khi người dùng nháy chuột, hàm (biến) cảm ứng được kích hoạt
và nhận giá trị True (hay 1). Nhưng người dùng khi nháy chuột sẽ có 1 thời gian
rất ngắn vẫn giữ tay trên chuột, do đó giá trị sẽ luôn giữ giá trị
True 1 thời gian ngắn. Do vậy muốn đảm báo tính chính xác của phương pháp
tính giá trị FolowOn này cần đưa vào 1 lệnh cho chương trình tạm nghỉ 1/10 giây,
169 | T h i ế t k ế p h ầ n m ề m
tức lệnh , nó sẽ đảm bảo cho người dùng cảm nhận chính xác sự
thay đổi của FolowOn sau mỗi lần nháy chuột. Đoạn chương trình điều khiển như
sau:
Xử lý biến hệ thống
FolowOn
Sau đây là các khả năng, cách thực hiện điều khiển nhân vật bằng chuột, mức 2.
CM6 Dùng nháy chuột để bật tắt chế độ
điều khiển bằng chuột.
Khi chế độ bật, phương pháp CM2
sẽ được kích hoạt: Nhân vật luôn
xoay về phía con trỏ chuột và
chuyển động chậm (hoặc nhanh) về
phía con trỏ chuột.
CM7 Dùng nháy chuột để bật tắt chế độ
điều khiển bằng chuột.
Khi chế độ bật, phương pháp CM1
sẽ được kích hoạt: Nhân vật luôn
dính chặt với con trỏ chuột.
170 | T h i ế t k ế p h ầ n m ề m
3. Mô phỏng di chuyển chuột
Phân biệt 2 trường hợp mô phỏng di chuyển chuột. Chương trình cần nhận biết
được thời điểm con trỏ chuột đi qua 1 nhân vật.
1) Chủ thế là nhân vật chính
Trường hợp lập trình điều khiển nhân vật chính, lập trình trên cửa sổ lệnh của
nhân vật. Khi đó biểu thức (hàm số) tính khoảng cách từ nhân vật đến vị trí con
trỏ chuột sẽ được sử dụng. Trong ví dụ sau mỗi khi di
chuyển chuột đi qua gần tâm của nhân vật (khoảng cách < 5) thì nhân vật sẽ
Mo phong Reset
tap di chuyen
chuot.sb2 Thực hiện liên tục 20 bài
Reset luyện kỹ năng di chuyển
chuột. Sau mỗi lần, quả
bóng bé đi và yêu cầu khó
Hiện khi nhận thông điệp Reset. hơn. Khi kết thúc gừi thông
Đợi người dùng nháy chuột thì điệp Reset.
ẩn đi và gửi thông điệp Start.
Start
Sơ đồ làm việc của chương trình khá đơn giản. Phần lõi của chương trình nằm ở
quả bóng khi tiếp nhận thông điệp Start. Thông điệp Reset chỉ có tác dụng hiển
thị bảng thông báo giữa 2 lần luyện tập.
Lập trình
Đây là đoạn chương trình điều khiển quả bóng xuất hiện 20 lần cho mỗi bài luyện
tập di chuyển chuột.
172 | T h i ế t k ế p h ầ n m ề m
Thiết lập các tham số ban đầu. Time
là tham số đếm lượt quả bóng còn lại
cần luyện tập.
Đoạn chương trình sau xử lý khi di chuyển chuột lên quả bóng.
173 | T h i ế t k ế p h ầ n m ề m
Các nhân vật chính:
Hình ảnh Tên nhân vật Ý nghĩa
Ball Nhân vật chính của chương trình dùng để
luyện kỹ năng nháy chuột.
Mo phong Next
tap nhay
chuot.sb2
Thực hiện sinh 20 clone của
Next quả bóngđể luyện kỹ năng
nháy chuột. Nháy lên quả
bóng sẽ làm bóng biến mất.
Hiện khi nhận thông điệp Next. Đợi Khi đã hết bóng gừi thông
người dùng nháy chuột thì ẩn đi, tăng điệp Next.
biến nhớ Level và gửi thông điệp Start.
Start
174 | T h i ế t k ế p h ầ n m ề m
Lập trình cho quả bóng:
Chương trình Chương trình cho mỗi quả Khi ngừoi dùng nháy
chính: sinh 20 bóng clone. lên 1 quả bóng.
quả bóng clone.
Sinh liên tục 20 Mỗi quả bóng clone sau khi sinh Khi nháy lên 1 quả
clone và sau đó ra sẽ chuyển hướng ngẫu nhiên bóng thì quả bóng này
chờ đến khi kết và chuyển động với vận tốc tỉ lệ bị xóa đi.
thúc sẽ gửi thông thuận với level (cụ thể = 2 x
điệp Next. level).
Mo phong Reset
tap keo tha
chuot.sb2
Thực hiện liên tục 20 bài
Reset luyện kỹ năng kéo thả. Sau
mỗi lần, vòng tròn đích bé
đi và yêu cầu khó hơn. Khi
Hiện khi nhận thông điệp Reset. Đợi kết thúc gừi thông điệp
người dùng kéo thả ra đến cạnh thì Reset.
ẩn đi và gửi thông điệp Start.
Start
Sơ đồ làm việc của chương trình khá đơn giản. Phần lõi của chương trình nằm ở
quả bóng và vòng tròn khi tiếp nhận thông điệp Start. Thông điệp Reset chỉ có
tác dụng hiển thị bảng thông báo giữa 2 lần luyện tập.
Đoạn chương trình lõi Thiết lập các thông số Đoạn chương trình hiển thị
thiết lập tham số drag. ban đầu và gửi thông thời gian trên màn hình khi
điệp Reset. bắt đầu luyện tập.
176 | T h i ế t k ế p h ầ n m ề m
Lập trình cho quả bóng.
Đoạn chương trình ban đầu, chờ cho quá trình luyện tập kết thúc và gửi thông
điệp Reset.
Sau đây là đoạn chương trình chính điều khiển quá trình kéo thả quả bóng đến
đích, chương trình này được kích hoạt khi người dùng bắt đầu nháy chuột để tiến
hành kéo thả quả bóng đến vòng tròn.
177 | T h i ế t k ế p h ầ n m ề m
Thiết lập 20 vòng lặp để xử
lý từng bài luyện kéo thả.
Hiển thị tại 1 vị trí ngẫu
nhiên bên trái màn hình.
178 | T h i ế t k ế p h ầ n m ề m
Sau đây mô tả thuật toán có thể thiết lập trạng thái nháy đúp chuột thông qua biến
DoudbleClick.
Thủ tục Init thiết lập trạng thái ban đầu. Chú ý rằng sau khi thiết lập được trạng
thái DoudbleClick = 1, cần có thời gian (khoảng 0.5 đến 1 giây) chờ trước khi
chạy lại Init.
Thủ tục
Init
Thủ tục Init
Thuật toán chính kiểm tra và nhận biết nháy đúp chuột như trong chương trình
sau:
Thuật toán
kiểm tra Lần bắt thứ nhất của nháy
nháy đúp chuột. Đặt đồng hồ cho t1
chuột. và đặt t2 = 0.
179 | T h i ế t k ế p h ầ n m ề m
Các nhân vật chính:
Hình ảnh Tên nhân vật Ý nghĩa
Ball Nhân vật chính của chương trình dùng để
luyện kỹ năng nháy đúp chuột. Người
dùng cần thực hiện thao tác nháy đúp
chuột lên quả bóng này.
Banner Biển hiệu thông báo giữa 2 lần luyện tập.
Start
Sơ đồ làm việc của chương trình khá đơn giản. Phần lõi của chương trình nằm ở
quả bóng khi tiếp nhận thông điệp Start. Thông điệp Reset chỉ có tác dụng hiển
thị bảng thông báo giữa 2 lần luyện tập.
Lập trình cho sân khấu.
Sân khấu là nơi thực hiện công việc chính: nhận biết trạng thái nháy đúp chuột
của người dùng tại bất cứ thời điểm nào. Sân khấu cũng là nơi gửi thông điệp
Reset đầu tiên.
Đoạn chương
trình này hiển thị
thời gian chạy
trong khi luyện
tập.
Đoạn chương
trình chính nhận
biết trạng thái
nháy đúp chuột
của người dùng.
180 | T h i ế t k ế p h ầ n m ề m
Lập trình cho Banner.
Banner có nhiệm vụ chính hiển thị giữa 2 bài luyện tập. Nháy đúp chuột lên biển
hiệu này để vào bài luyện tập chính.
181 | T h i ế t k ế p h ầ n m ề m
Chúng ta cùng phân tích và thiết kế chương trình này.
1) Mô tả kịch bản
Đầu vào của chương trình là 1 dãy các từ (xâu ký tự) cần cho HS luyện gõ bàn
phím. Để có thể hiện chính xác và to trên màn hình, sẽ yêu cầu hạn chế độ dài của
các từ này, ví dụ hạn chế độ dài mỗi xâu không quá 10 ký tự (kể cả dấu cách).
Phần mềm sẽ hiện lần lượt từng từ (xâu) trên màn hình và yêu cầu HS tập gõ.
Trong quá trình gõ bàn phím, gõ tới đâu sẽ có 1 thanh ngang nhỏ chỉ ra vị trí đang
gõ và phía dưới hiện bàn tay có ngón tay phụ trách phím cần gõ.
Mô hình mô phỏng như vậy sẽ hoàn toàn tương tự như phần lõi của các chương
trình luyện gõ bàn phím trên thế giới.
2) Phân tích thuật toán thể hiện xâu chữ trên màn hình
Trong thiết kế phần mềm này có lẽ khâu khó nhất là cách thể hiện một từ, xâu ký
tự lên màn hình bằng hình ảnh đồ họa (chứ không phải bằng biến nhớ hay lời hội
thoại nhân vật).
Như vậy cần thiết kế các nhân vật có hình ảnh là bộ chữ cái cần thể hiện.
abcd mn
Độ rộng của 1 Khoảng cách từ tâm chữ c đến tâm chữ d sẽ
chữ cái, ký tự = ((độ rộng c) + (độ rộng d))/2
Để hiện thị xâu ký tự trên màn hình bằng hình ảnh lớn chúng ta sử dụng lệnh vẽ
stamp với dãy các nhân vật ứng với từng chữ cái đó. Nhân vật Char sẽ đóng vai
trò trung tâm của phần mềm thể hiện dãy các ký tự cần luyện gõ bàn phím. Vì
Scratch không nhận biết được các ký tự đặc biệt (ví dụ . , : ; / ) nên bộ trang phục
của Char sẽ chỉ hạn chế trong bảng chữ cái tiếng Anh, các chữ số từ 0 đến 9 và
dấu cách (space). Bộ trang phục của Char như sau:
1 2 3 4 5 6 7 8 9 10
a b c d e f g h i j
11 12 13 14 15 16 17 18 19 20
k l m n o p q r s t
21 22 23 24 25 26 27 28 29 30
u v w x y z 0 1 2 3
31 32 33 34 35 36 37
4 5 6 7 8 9 space
182 | T h i ế t k ế p h ầ n m ề m
3) Mô tả nhân vật
Hình ảnh Tên nhân Ý nghĩa Ghi chú thêm
vật
Char Nhân vật chính của phần mềm Đi với nhân vật
có nhiệm vụ thể hiện các từ, dãy này sẽ có nhiều
ký tự bằng hình ảnh trên màn dãy dữ liệu quan
hình. Nhân vật này có 37 trang trọng.
phục. Chú ý tên của trang phục
trùng với tên chữ cái (trừ ra
trang phục số 37 có tên space).
Paddle Thanh ngang có nhiệm vụ hiện
tại vị trí bên dưới ký tự đang cần
gõ phím.
GV GV đóng vai trò MC của chương
trình, hướng dẫn HS thực hiện
bài luyện gõ bàn phím.
Trang phục của nhân vật Finger. Chú ý tên của trang phục bắt buộc trùng với số
thứ tự của bảng này.
1 2 3 4 5
6 7 8 9
183 | T h i ế t k ế p h ầ n m ề m
Biến nhớ hệ thống Mô tả ý nghĩa Ghi chú thêm
CharKc (list) Dãy các độ rộng tương ứng các chữ cái
trong Word.
CharFinger (list) Dãy các số tương ứng ngón tay phụ
trách tương ứng với các chữ cái của
Word.
Keyboard_Practice Biến nhớ hệ thống chỉ ra là đã thực
hiện xong phần luyện gõ của xâu ký tự
Word chưa.
Char Biến nhớ lưu các ký tự của Word.
keypressed Biến nhớ lưu giá trị phím đã gõ. Vậy
nếu Char = keypressed thì đã gõ đúng.
5) Biến nhớ riêng cho Char dùng để thể hiện xâu chữ trên màn hình
Các biến nhớ này là biến nhớ riêng của nhân vật Char, có nhiệm vụ hỗ trợ thể hiện
1 từ, xâu ký tự trên màn hình.
Biến nhớ hệ thống Mô tả ý nghĩa Ghi chú thêm
Bảng, dãy dữ liệu gốc, hệ thống.
Alphabet (list) Bảng, dãy các chữ cái tương ứng với
trang phục của Char. Bảng này có
37 phần tử.
AlphabetWide Độ rộng (tính bằng point) của các ký
(list) tự trang phục tương ứng của nhân vật
Char.
AlphabetFinger Bảng lưu giá trị tương ứng với trang Bảng này cũng có
(list) phục của nhân vật Finger chỉ ra ngón 37 giá trị.
tay phụ trách của ký tự hiện thời. Ví
dụ phần tử thứ 37 của bảng này có
giá trị 5.
Bảng, dãy dữ liệu dùng để lưu trữ thông tin tạm thời
trong quá trình thể hiện trên màn hình một từ, xâu ký
tự Word.
WList (list) Dãy các ký tự lấy ra từ Word. Bảng này lấy
thông tin từ
Alphabet
WKc (list) Dãy các độ rộng của các ký tự từ Bảng này lấy
Word. thông tin từ
AlphabetWide
WFList (list) Dãy các tham chiếu ngón tay phụ Bảng này lấy
trách của các ký tự lấy từ Word. thông tin từ
AlphabetFinger
184 | T h i ế t k ế p h ầ n m ề m
6) Sơ đồ thiết kế hệ thống
185 | T h i ế t k ế p h ầ n m ề m
7) Lập trình
7.1. Thủ tục hiển thị xâu ký tự bằng hình ảnh trên màn hình (nhân vật Char)
Thủ tục Init <Word>
Thủ tục này có chức năng thiết lập các bộ dữ liệu ban đầu như WList, WFList,
Wkc.
Lấy từ ký tự từ WList.
Chuyển sang
vị trí bên phải
của ký tự tiếp
theo.
186 | T h i ế t k ế p h ầ n m ề m
7.2. Lập trình cho sân khấu
Đoạn chương trình sau của sân khấu mô tả toàn bộ hoạt động chính của chương
trình.
187 | T h i ế t k ế p h ầ n m ề m
Giá trị ban đầu của
keypressed được gán là ?
Sau đây là đoạn chương trình của nhân vật Paddle khi nhận thông điệp Start.
Mục đích: dịch chuyển thanh ngang bên dưới các ký tự sẽ yêu cầu người dùng gõ
phím. Nếu gõ đúng chuyển sang ký tự bên phải, cứ như vậy cho đến cuối từ.
188 | T h i ế t k ế p h ầ n m ề m
8. Ví dụ: phần mềm Mouse Skills
Chúng ta sẽ thiết kế một phần mềm gộp tất cả các tính năng tập luyện chuột (đã
mô tả ở trên) vào trong một chương trình.
Mouse Skills.sb2
Ý tưởng kịch bản phần mềm được mô tả trong hình trên, cụ thể như sau:
- Phần mềm sẽ có 4 chế độ luyện tập: di chuyển chuột, nháy chuột, kéo thả chuột
và nháy đúp chuột. Nháy lên 1 nút lệnh sẽ vào chức năng tương ứng. Khi thực
hiện xong bài luyện, phần mềm lại quay trở lại trạng thái chờ có 4 nút lệnh như
hình trên.
- Chế độ di chuyển chuột (Move):
Trên màn hình xuất hiện quả bóng tại vị trí ngẫu nhiên. Người dùng cần di chuột
lên quả bóng này, quả bóng sẽ ẩn đi và xuất hiện tại 1 vị trí khác với kích thước
nhỏ đi. Quá trình cứ như vậy, sau 10 lần thì kết thúc.
- Chế độ nháy chuột (Click):
Trên màn hình xuất hiện đồng thời 10 quả bóng chuyển động ngẫu nhiên. Người
chơi cần náy chuột lên các quả bóng để làm chúng biến mất. Khi đã làm biến mất
tất cả 10 quả bóng thì bài luyện kết thúc.
- Chế độ kéo thả chuột (Drag):
Trên màn hình xuất hiện quả bóng tại vị trí ngẫu nhiên. Người dùng cần kéo thả
quả bóng này đến 1 vị trí cố định bên trái màn hình. Nếu kéo thả không chính xác
quả bóng sẽ quay về vị trí cũ yêu cầu làm lại từ đâu. Bài luyện kết thúc sau khi
thực hiện kéo thả thành công 10 lần.
- Chế độ nháy đúp chuột chuột (DoubleClick):
Trên màn hình xuất hiện quả bóng tại vị trí ngẫu nhiên. Người dùng cần nháy đúp
chuột lên quả bóng này, quả bóng sẽ ẩn đi và xuất hiện tại 1 vị trí khác. Cần thực
hiện đúng thao tác này 10 lần.
Danh sách nhân vật chính:
Hình ảnh Tên nhân vật Ý nghĩa
Ball Nhân vật chính của chương trình dùng để
luyện kỹ năng chuột. Tùy thuộc vào từng
chức năng, cách sử dụng và thao tác với
quả bóng sẽ khác nhau.
189 | T h i ế t k ế p h ầ n m ề m
Hình ảnh Tên nhân vật Ý nghĩa
Giáo viên. Đóng vai trò MC của chương trình.
190 | T h i ế t k ế p h ầ n m ề m
Biến nhớ hệ thống Mô tả ý nghĩa Ghi chú thêm
bài luyện với thời
gian ngắn nhất.
Ngoài ra còn 1 số biến nhớ hệ thống nhưng dùng riêng cho từng chế độ luyện tập
chuột không nêu ra ở đây.
Reset
Xử lý theo từng chức năng. Mỗi chức năng là 1 bài luyện tập chuột.
Thực hiện xong các bài luyện thì gửi thông điệp Finish.
Finish
2. Đoạn chương trình sau là chương trình chính mô tả chức năng luyện tập di
chuyển chuột của phần mềm.
192 | T h i ế t k ế p h ầ n m ề m
1. Đoạn chương trình chính: sinh Clone và đợi khi bài luyện tập kết thúc.
2. Đoạn chương trình ngắn điều khiển các quả bóng clone chuyển động ngẫu
nhiên trên màn hình.
3. Đoạn chương trình xử lý khi người dùng nháy chuột lên các quả bóng clone.
Chế độ kéo thả Chế độ luyện tập kéo thả chuột DragMode.
chuột. DragMode. Việc kiểm soát trạng thái kéo thả chuột được thực hiện thông qua biến nhớ drag.
Đoạn chương trình này được viết trong cửa sổ lệnh của sân khấu.
193 | T h i ế t k ế p h ầ n m ề m
1, Đoạn chương trình chính kiểm soát bài luyện kéo thả chuột như sau:
2. Đoạn chương trình xử lý chính khi người dùng bắt đầu quá trình kéo thả trên
quả bóng.
Phần lõi của việc xử lý là đoạn chương trình sau. Khi người dùng nháy chuột lên
quả bóng, nếu kiểm tra thấy drag = 1 (đồng thời drag_mode = 1) thì bắt luôn sự
kiện này, gắn nhân vật với con trỏ chuột trong suốt thời gian kéo thả (cho đến khi
drag = 0 thì dừng lại). Sau đó sẽ tiến hành các bước kiểm tra tiếp theo.
194 | T h i ế t k ế p h ầ n m ề m
Chế độ nháy đúp Chế độ luyện tập nháy đúp chuột DoubleClickMode.
chuột. Thao các nháy đúp chuột luôn được kiểm soát bởi sân khấu và thông qua biến hệ
DoubleClickMode. thống DoubleClick. Nếu DoubleClick = 1 tức là người dùng vừa nháy đúp chuột
thành công (không liên quan đến vị trí nháy đúp của chuột). Đoạn chương trình
kiểm soát chung nháy đúp chuột như sau (đã được giới thiệu trong mục 6 của
chương này.
195 | T h i ế t k ế p h ầ n m ề m
Câu hỏi - Bài tập - Mở rộng
1. Hãy hoàn thiện phần mềm Mouse Skills theo thiết kế đã mô tả.
2. Mở rộng phần mềm Tập gõ bàn phím thành 1 chương trình hoàn chỉnh có
những bài học như sau:
- Bài luyện gõ phím ở hàng phím cơ sở.
- Bài luyện gõ phím hàng phím trên.
- Bài luyện gõ phím hàng phím dưới.
- Luyện gõ phím hàng phím số.
3. Mở rộng, thiết kế phần mềm luyện tập nháy chuột (phần 4) theo hướng sau:
Phần mềm sẽ có nhiều mức (level), mức càng cao càng khó và điểm số sẽ cao
hơn. Các mức được thiết kế mở rộng như sau:
- Hạn chế thời gian chơi cho mỗi mức, càng lên cao thời gian chơi càng ít đi.
Người chơi phải hoàn thành nháy chuột xóa hết các quả bóng trước khi hết thời
gian, nếu quá thời gian thì bị thua.
- Tăng số lượng quả bóng sau mỗi mức.
4. Viết chương trình mô tả luyện kéo thả chuột như sau:
Trên màn hình sẽ xuất hiện 5 quả bóng và 5 hình tròn ngẫu nhiên như hình dưới
đây.
- Các hình tròn và quả bóng có màu sắc tương tự nhau: vàng, xanh da trời, xanh lá
cây, hồng, tím.
- Các hình tròn sẽ đứng yên, còn các quả bóng chuyển động tự do trên màn hình
(gặp cạnh thì bật lại).
Nhiệm vụ của người chơi là nháy nhanh lên 1 quả bóng và kéo thả quả bóng này
về vị trí hình tròn cùng màu. Phải nháy chính xác và chuyển kéo thả ngay thì quả
bóng mới dính vào con trỏ chuột để có thể kéo thả.
Nếu thực hiện xong cả 5 quả bóng thì chiến thẳng.
196 | T h i ế t k ế p h ầ n m ề m
5. Viết chương trình mô tả tương tự luyện tập nháy chuột nhưng dùng để kiểm tra
nháy đúp chuột. Nếu người chơi nháy đúp chuột đúng lên 1 quả bóng thì quả này
sẽ biến mất. Ban đầu các quả bóng này sẽ chuyển động ngẫu nhiên trên màn hình.
197 | T h i ế t k ế p h ầ n m ề m
Chủ đề 6.
Phần mềm hỗ trợ học Khoa học máy tính
Mục tiêu:
- Một số thuật toán chính biến đổi số trong các hệ đếm khác nhau.
- Thiết kế phần mềm, trò chơi liên quan đến biến đổi số trong các hệ đếm khác
nhau.
- Một số phần mềm khác hỗ trợ giảng dạy khoa học máy tính trong trường phổ
thông.
Nội dung chính
1. Thuật toán biến đổi số thập phân, nhị phân và hexa
Trong phần này chúng ta sẽ thiết kế một loạt các thuật toán biến đổi số thể hiện
trong các hệ đếm khác nhau như nhị phân (binary), thập phân (decimal) và hệ 16
(hexadecimal).
Hệ nhị phân sẽ chỉ sử dụng 2 số 0, 1.
Hệ thập phân sử dụng 10 chữ số thông thường 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Hệ hexa sử dụng 16 chữ số: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
1.1. Chuyển số nhị phân sang thập phân
Bài toán: cho 1 số nhị phân anan-1….a1 a0 (binary), cần chuyển đổi số này sang hệ
thập phân.
Chúng ta quan sát qui luật biểu diễn số dưới dạng nhị phân và tìm ra qui luật tổng
quát cho việc chuyển đổi số viết theo hệ nhị phân sang hệ thập phân.
100 100 = 1.22 + 0.2 + 0 = 4 (hệ thập phân)
111 111 = 1.22 + 1.2 + 1 = 7 (hệ thập phân)
Tổng quát chúng ta thấy:
anan-1….a1a0 (binary) = an.2n-1 + an-1.2n-2 + …. + a1.2 + a0 (decimal)
Nhìn vào công thức trên chúng ta chưa hình dung được thuật toán cần thực hiện
trên máy tính. Chúng ta sẽ viết lại quá trình tính toán theo từng bước nhỏ để tính
được số thập phân.
an
2.an + a n-1
2.( 2.an + a n-1) + a n-2
2.( 2.( 2.a n + a n-1) + a n-2) + an-3
……
2.(an.2n-3 + an-1.2n-4 + …. + a0) + a1
2.(an.2n-2 + an-1.2n-3 + …. + a1) + a0.
Như vậy sau đúng n+1 bước thì quá trình tính trên kết thúc và kết quả thu được số
thập phân cần tìm.
198 | T h i ế t k ế p h ầ n m ề m
Số nhị phân ban đầu được đưa vào biến nhớ Binary. Số thập phân là kết quả đuọc
lưu trong biến nhớ Decimal. Các biến nhớ trung gian bao gồm index, len và ch.
Gán ban đầu: Decimal = 0, index = 1
Thuật toán len = độ dài xâu Binary
biến đổi số
Thực hiện vòng lặp với độ dài len
nhị phân sang
thập phân. ch = chữ số tương ứng chỉ số index của Binary
Decimal = 2.Decimal + ch
Tăng index lên 1
Đoạn chương trình mô tả thuật toán biến đổi hệ nhị phân sang thập phân Binary
Decimal như sau.
199 | T h i ế t k ế p h ầ n m ề m
Thuật toán Gán Binary = rỗng
biến đổi số Thực hiện lặp cho đến khi Decimal = 0
thập phân Đặt ch = Decimal mod 2;
sang nhị phân.
Decimal = Decimal / 2 (làm tròn xuống)
Bổ sung ch vào bên trái của Binary
Đoạn chương trình mô tả thuật toán chuyển đổi số Nhị phân sang Thập phân trên
được viết trong Scratch như sau:
Tóm tắt ý tưởng thuật toán chuyển đổi số nhị phân sang hexa như sau:
Nhóm các nhóm 4 chữ số liền nhau của số nhị phân và chuyển đổi sang hexa
thông qua bảng biến đổi trên.
Sơ đồ thuật
toán biến đổi
001101101101
200 | T h i ế t k ế p h ầ n m ề m
số nhị phân
0011 0110 1101
3 6 D
Viết chi tiết hơn thuật toán này như sau:
Input: Binary; Output: Hexa.
Thuật toán Bổ sung vào phía trước của Binary các chữ số 0 sao cho
biến đổi nhị tổng chiều dài của Binary chia hết cho 4.
phân sang
hexa. Lặp cho đến khi hết độ dài Binary:
Lần lượt lấy các nhóm 4 chữ số của Binary, tính từ
trái sang phải.
Với mỗi nhóm gán gr = nhóm 4 ký tự này.
Kiểm tra với bảng Bin-Hex trên (cụ thể là tìm kiểm
trong 2 dãy HexaBinList và HexaList để gán ký tự
hexa tương ứng gr vào biến ch.
Bổ sung ch vào phía phải Hexa.
Thuật toán này được cài đặt trên Scratch như sau:
Chương Gán giá trị ban đầu hexa =
trình chi rỗng.
tiết biến đổi
Binary sang Bổ sung vào bên trái của
Hexa. Binary các chữ số 0 sao cho
chiều dài của Binary chia
hết cho 4.
201 | T h i ế t k ế p h ầ n m ề m
1.4. Chuyển đổi hexa sang nhị phân
Thuật toán biến đổi số từ hexa sang nhị phân hoàn toàn ngược lại so với thuật toán
trên.
Sơ đồ thuật
36D
toán biến đổi
số hexa sang
nhị phân. 0011 0110 1101
1101101101
Có thể viết lại chi tiết thuật toán trên như sau:
Input: Hexa; Output: Binary.
Thuật toán
biến đổi số Lặp theo chiều dài của xâu Hexa, chạy từ trái sang
hexa sang nhị phải:
phân. Gọi ch là ký tự tương ứng của Hexa.
Kiểm tra chỉ số của ch trong bảng HexaList.
Lấy giá trị xâu nhị phân tương ứng chỉ số trên
trong bảng HexaBinList, và đưa vào bên phải của
Binary.
Cài đặt của thuật toán trên trong Scratch như sau:
202 | T h i ế t k ế p h ầ n m ề m
Chú ý: Kết quả của thuật toán trên, xâu nhị phân Binary có thể có 1 số chữ số 0
thừa ở bên trái. Cần xóa các chữ số 0 này. Trong ví dụ được minh họa ở trên, 2
chữ số 0 ở đầu Binary đã được xóa.
Số nhị phân
Ví dụ muốn chuyển đổi 1 số thập phân Decimal sang số hexa, chúng ta thực hiện
qua 2 bước sau:
Decimal Binary Hexa.
Ngược lại muốn chuyển đổi 1 số hexa Hexa sang thập phân sẽ thực hiện như sau:
Hexa Binary Decimal.
2. Phần mềm hiển thị và biến đổi giữa số thập phân, nhị
phân và hexa
Chúng ta sẽ thiết kế 1 chương trình đơn giản có thể thực hiện tất cả các biến đổi
số giữa 3 hệ đếm: thập phân, nhị phân và hexa như đã trình bày ở phần trên.
Kịch bản của phần mềm có thể đơn giản như hình ảnh sau.
Chương trình sẽ có 6 nút lệnh tương ứng với 6 chức năng chuyển đổi số từ hệ đếm
này sang hệ đếm khác. Khi nháy lên 1 nút lệnh, MC là giáo viên sẽ yêu cầu nhập
từ bàn phím 1 số tương ứng, sau đó Giáo viên sẽ thông báo kết quả là số đã được
đổi hệ đếm. Phần mềm sẽ sử dụng 3 biến nhớ hệ thống là Decimal, Binary và
Hexa dùng để lưu các số cần chuyển đổi.
203 | T h i ế t k ế p h ầ n m ề m
Các thuật toán chuyển đổi đã được mô tả chi tiết trong phần trên, bạn đọc sẽ được
giao bài tập để hoàn thiện chương trình này.
13 10 7 2 20
Cần dịch chuyển các số ở hàng dưới lên hàng trên (các vị trí được đánh dấu đỏ)
sao cho dãy mới thu được sẽ được sắp xếp tăng dần (hoặc giảm dần).
Chúng ta sẽ thiết kế chương trình sắp xếp loại 1 theo kịch bản đơn giản sau:
Phần mềm sẽ liên tục đưa ra giao diện chơi trên hình trên. Nhiệm vụ người chơi là
kéo thả các hình xúc sắc lên hàng trên, nhưng phải sắp xếp theo thứ tự tăng dần.
Nếu kéo thả sai vị trí thì quân xúc sắc sẽ tự động quay trở lại vị trí ban đầu. Khi đã
kéo thả xong toàn bộ xúc sắc chương trình sẽ thông báo ngay là đúng hay sai.
Phân tích, nhận xét
Điểm công nghệ mấu chốt của bài toán này là chúng ta sẽ dùng clone để mô tả các
mặt hình xúc sắc. Như vậy chỉ cần 1 nhân vật xúc sắc và 1 nhân vật điểm màu đỏ
để thiết kế giao diện cho chương trình.
204 | T h i ế t k ế p h ầ n m ề m
Thiết kế nhân vật chính
Hình ảnh Tên nhân vật Mô tả ý nghĩa Ghi chú thêm
Dice (xúc sắc) Phần tử chính của chương Tên các trang
trình. Nhân vật này có 6 trang phục này chính
phục tương ứng với 6 mặt của là 1, 2, 3, 4, 5, 6.
xúc sắc.
Point Nhân vật dùng để hiện dãy Người dùng sẽ
điểm đỏ trên màn hình. kéo thả xúc sắc
lên các vị trí
điểm đỏ này.
GV Giáo viên, đóng vai trò MC
của chương trình.
205 | T h i ế t k ế p h ầ n m ề m
Biến nhớ Biến nhớ Ý nghĩa Ghi chú thêm
chung riêng
người dùng đã kéo thả clone xúc sắc đến thả xúc sắc
đó. còn rỗng hay
đã có 1 xúc sắc
khác rồi.
Check-Result Biến nhớ dùng để kiểm tra (sau khi đã
kéo thả xong) việc kéo thả đã chính xác
hay chưa.
Sơ đồ thiết kế
Lập trình
1) Thiết lập vị trí ban đầu cho dãy các xúc sắc.
Thủ tục Init thực hiện việc khởi tạo và gán giá trị ban đầu cho 2 bảng DiceList và
NewDice_Place. Bảng DiceList sẽ chứa 1 hoán vị ngẫu nhiên của dãy {1, 2, 3, 4,
5, 6}, còn bảng NewDice_Place sẽ chứa toàn số 0 (vì chưa có xúc sắc nào được
dịch chuyển). Thủ tục này chính là triển khai thuật toán sinh 1 hoán vị ngẫu nhiên
của 1 dãy số cho trước.
Đoạn chương trình sau sinh 6 clone của nhân vật xúc sắc và thể hiện chính xác
trên màn hình theo đúng thứ tự lấy từ bảng DiceList.
Chú ý 3 biến nhớ: ID, Value, Draged là các biến nhớ riêng của nhân vật xúc sắc
nên chúng sẽ được thừa kế xuống cho từng clone của mình. Ý nghĩa cúa các biến
này là: ID - chỉ số thứ tự của clone, Value - giá trị số trên mặt xúc sắc, Draged
chỉ ra clone này đã được dịch chuyển chưa.
207 | T h i ế t k ế p h ầ n m ề m
Thiết lập các giá trị ban
đầu.
2) Xử lý thao tác kéo thả chuột trên dãy các xúc sắc.
Đây là phần chương trình chính của phần mềm. Chú ý rằng biến nhớ hệ thống
Drag luôn hoạt động để bắt được sự kiện khi người dùng bắt đầu kéo thả chuột
trên màn hình. Về cách điều khiển biến nhớ Drag đã được mô tả trong chương về
điều khiển bàn phím và chuột.
208 | T h i ế t k ế p h ầ n m ề m
1
Thủ tục Check kiểm tra xem tất cả các xúc sắc ở hàng dưới đã được chuyển lên
hàng trên chưa, nếu chuyển xong rồi thì gửi thông điệp PlsCheck để Giáo viên
tiến hành kiểm tra kết quả sắp xếp.
209 | T h i ế t k ế p h ầ n m ề m
Từ thiết kế của chương trình trên, chúng ta sẽ cùng mở rộng và thiết kế 1 chương
trình sắp xếp khác tổng quát hơn cho các số bất kỳ (chứ không hạn chế chỉ là 6
mặt xúc sắc như bài trên).
Giao diện của chương trình mới sẽ tương tự như bài trên, nhưng thay bằng các
mặt xúc sắc là 1 dãy số bất kỳ.
Sap xep L1 -
number.sb2
Chương trình này hoàn toàn tương tự như chương trình trên ở phần thiết kế, các
biến nhớ hệ thống. Điểm khác biệt duy nhất là chúng ta sẽ sử dụng nhân vật
Number thay thế cho xúc sắc trong bài trên. Nhân vật Number sẽ được thiết kế
với số lượng các trang phục không hạn chế (như trong hình trên số trang phục là
30 tương ứng với dãy số cần lấy ra từ 1, 2, …., 30).
Toàn bộ thiết kế chương trình cho phần mềm ở mục trên có thể áp dụng cho
chương trình mới này, ngoại trừ thủ tục sinh bộ dữ liệu ban đầu cho bảng
DiceList. Thủ tục Init của chương trình này sẽ thay đổi như sau:
210 | T h i ế t k ế p h ầ n m ề m
Thiết lập các dãy số
rỗng ban đầu.
Kịch bản chương trình sắp xếp loại 2 được mô tả nhanh trong 2 hình dưới đây.
211 | T h i ế t k ế p h ầ n m ề m
Sap xep L2 -
number.sb2
H1. Trạng thái ban đầu. Phía dưới H2. Trạng thái khi sắp xếp xong,
dãy số cần sắp xếp là các chỉ số chương trình thông báo và hiện nút
thứ tự của dãy. Next (tiếp theo).
- Dãy số ban đầu được sắp xếp ngẫu nhiên và hiện trên màn hình (như Hình 1).
- Người dùng sẽ lần lượt thực hiện các phép biến đổi 2 số như sau: dùng chuột di
chuyển 1 số sang 1 vị trí khác, số đó sẽ được chuyển sang vị trí mới, số ở vị trí
đich sẽ tự động chuyển lại về vị trí gốc để hoàn thiện chuyển đổi.
- Khi người dùng thực hiện thao tác không chính xác thì số đó sẽ quay lại vị trí cũ.
- Khi dãy số đã được sắp xếp xong, giáo viên (đóng vai trò MC) sẽ thông báo dãy
các biến đổi đã thực hiện. Nháy vào nút Next để tự động chuyển sang bài tiếp
theo.
Thiết kế nhân vật chính
Hình ảnh Tên nhân vật Mô tả ý nghĩa Ghi chú thêm
Number Nhân vật chính của chương Tên các trang
trình. Nhân vật này có các phục này chính
trang phục là hình ảnh các chữ là 1, 2, 3, ….
số bắt đầu từ 1.
GV Giáo viên, đóng vai trò MC
của chương trình.
212 | T h i ế t k ế p h ầ n m ề m
Thiết kế bộ dữ liệu chính
Biến nhớ Biến nhớ Ý nghĩa Ghi chú thêm
chung riêng
XList (list) Dãy các tọa độ X để thể hiện các số cần Dãy này có 6
sắp xếp. Dãy này được xác định trước phần tử.
và luôn cố định, không thay đổi.
DiceList (list) Dãy các giá trị gốc của dãy số hiện trên Dựa vào dãy
màn hình. Dãy này được sinh ngẫu này, clone sẽ
nhiên của dãy số gốc tương ứng với số thể hiện hình
lượng trang phục của Number. Cụ thể ảnh trang phục
trong ví dụ là: 1, 2, …, 30. tương ứng.
Dice_Place Vị trí mới (hiện thời) của các chỉ số của Ban đầu dãy
(list) dãy số ban đầu. Sau mỗi lần dịch Dice_Place
chuyển vị trí 2 số, dãy này sẽ được cập đồng nhất với
nhật lại. dãy 1-2-3-4-5-
6.
HistoryChange Dãy này lưu lịch sử các lần chuyển đổi Ban đầu dãy
(list) do người dùng thực hiện. Ví dụ người này rỗng.
dùng chuyển đổi vị trí ai aj thì
thông tin i-j được bổ sung vào bảng này.
ID, Value Các tham số riêng của nhân vật
Number dùng để chỉ giá trị thể hiện số
(theo trang phục).
Drag Biến nhớ hệ thống chung chỉ ra trạng
thái kéo thả của chuột.
= 0, chưa ở trạng thái kéo thả.
= 1, đang ở trạng thái kéo thả.
Y-Point Tọa độ Y của dãy các hình ảnh dãy số Giá trị hiện
của Number. thời = -20.
Y-Index Tọa độ Y của dãy các số index bên dưới Giá trị hiện
dãy số. thời = -130.
index-in Vị trí, chỉ số của số gốc khi người dùng
bắt đầu thực hiện kéo thả.
index-out Vị trí, chỉ số đích mà người dùng đã kéo
thả đến.
Check-Result Biến nhớ dùng để kiểm tra (sau khi đã
kéo thả xong) dãy đã được sắp xếp đúng
theo thứ tự tăng dần chưa.
213 | T h i ế t k ế p h ầ n m ề m
Sơ đồ thiết kế
Người sử dụng kéo thả chuột 1 số trong dãy Thông báo dãy
đến vị trí mới để thay đổi vị trí 2 số, nếu các biến đổi đã
thành công, số ở đích sẽ quay về vị trí gốc. thực hiện. Sau
Cứ như vậy. Nếu sắp xếp xong thì gửi thông đó gửi thông
điệp Done. điệp Reset.
Done
214 | T h i ế t k ế p h ầ n m ề m
B. Lập trình cho Index..
Các chỉ số (index) được thiết lập đơn giản bằng lệnh vẽ stamp trên màn hình.
215 | T h i ế t k ế p h ầ n m ề m
Xóa, làm sạch dữ liệu
của các bảng chính.
Đoạn chương trình chính hiển thị dãy các số bằng cách sinh 6 clone của Number
như sau:
216 | T h i ế t k ế p h ầ n m ề m
2. Xử lý khi người dùng bắt đầu kéo thả một số trên dãy.
Đoạn chương trình sau bắt đầu xử lý khi người dùng nháy chuột lên một số trong
dãy.
1. Tính
toán
index-out
2. Nếu tìm
được đích
chính xác.
3. Nếu không
tìm được
đích.
1. Chuyển số này chính xác tới vị trí đích (có chỉ số index-out).
2. Gửi thông điệp GoBack để yêu cầu clone đang ở vị trí đich (index-out) chuyển
lại về vị trí gốc (index-in). Chú ý tại đây bắt buộc phải dùng thông điệp vì không
thể điều khiển trực tiếp clone khác khi đang nằm trong cửa sổ lệnh của nhân vật
hiện thời.
3. Thay đổi chỉ số đầu và đích của bảng Dice_Place thông qua thủ tục Change-
Value(in, out).
4. Bổ sung thông tin chuyển đổi vào bảng HistoryChange.
Thông điệp GoBack được thực hiện như sạu:
Thủ tục Check sẽ kiểm tra xem dãy số hiện thời đã được sắp xếp đúng chưa. Nếu
đúng thì gửi thông điệp Done. Kết quả lưu vào biến Check_Result. Dãy mới đã
được sắp xếp xong khi Check_Result =1.
218 | T h i ế t k ế p h ầ n m ề m
5. Biểu diễn nhị phân
Chúng ta sẽ cùng thiết kế một chương trình, phần mềm đơn giản mô phỏng việc
chuyển đổi số thập phân sang nhị phân, nhưng dưới dạng một trò chơi. Giao diện
dự kiến của chương trình sẽ như hình sau:
Dãy bit
219 | T h i ế t k ế p h ầ n m ề m
Hình ảnh Tên nhân Mô tả ý nghĩa Ghi chú thêm
vật
Check Nhân vật này sẽ có 3 trang phục Các trang phục
tương ứng với 3 trạng thái: khác của Check
là:
- Check: kiểm tra đúng / sai.
- True: hiển thị khi làm đúng.
- False: hiển thị khi làm sai.
220 | T h i ế t k ế p h ầ n m ề m
Sơ đồ thiết kế
Lập trình
1. Sân khấu
2. Lập trình cho Number, thể hiện số n bằng hình ảnh trên màn hình.
Thiết lập Size kích thước Khi nhận thông điệp Start, sinh ngẫu
thể hiện số so với hình ảnh nhiên giá trị n và thể hiện số thập phân n
gốc của nhân vật. thông qua thủ tục
Show Number <n> at (X, Y).
Thủ tục Show Number được xây dựng dựa trên lệnh stamp và thông tin độ rộng
của các số trong bảng Width. Cách tính khoảng cách từ 1 số này sang số tiếp the
như sau:
221 | T h i ế t k ế p h ầ n m ề m
Thủ tục Show Number như sau:
Trong đoạn chương trình trên chú ý đến lệnh chuyển tọa độ X để vẽ thẻ bit tiếp
theo. Giá trị chuyển là (độ rộng (ch) + độ rộng (ch-next))/2 được nhân với
Size/100 là hệ số thay đổi kích thước nhân vật trên màn hình.
3. Lập trình cho Switch, thể hiện dãy bits.
Đoạn chương trình sinh dãy Bitlist và sinh các clone của nhân vật Switch để hiện
8 thẻ bit trên màn hình.
4. Khi nháy chuột lên 1 thẻ bít, cần lập trình để xử lý sự kiện này.
Các công việc cần thực hiện khi người dùng nháy chuột lên 1 clone - thẻ bit.
- Chuyển đổi trang phục của thẻ bít này từ 0 sang 1 và ngược lại.
222 | T h i ế t k ế p h ầ n m ề m
- Cập nhật giá trị tương ứng vào bảng Bitlist.
- Tính toán và cập nhật CheckNumber.
Đoạn chương trình như sau:
Thủ tục Init có chức năng duy nhất là cập nhật tính toán CheckNumber từ bảng
Bitlist. CheckNumber chính là giá trị số thập phân được tính từ dãy bit nhị phân
của Bitlist.
223 | T h i ế t k ế p h ầ n m ề m
Nếu đúng, tăng điểm số lên 1,
chuyển trang phục về True,
đợi 5 giây và gửi thông điệp
Reset.
6. Mô phỏng sắp xếp (loại 3). Trò chơi xếp số trong hình
vuông
Chúng ta sẽ thiết kế 1 chương trình mô phỏng trò chơi xếp số trong hìhn vuông,
một dạng khác của bài toán sắp xếp dãy số. Cho một hình vuông N x N bao gồm
N2 ô vuông nhỏ, lưu các số từ 1 đến N2. Nhiệm vụ của chúng ta là sắp xếp các số
này theo thứ tự tăng dần. Công cụ để sắp xếp lại các số là 1 Khung (frame) vuông
chứa được 4 hình vuông. Chúng ta có thể dịch chuyển Khung này bên trong hình
vuông. Bên trong Khung có thể xoay các hình vuông theo chiều kim đồng hồ hoặc
ngược kim đồng hồ.
Đây là một trò chơi khá nổi tiếng với các mức khó dễ khác nhau phụ thuộc vào
kích thước hình vuông. Các mức từ dễ đến khó tương ứng với N = 3, 4, 5.
Phân tích kịch bản và chuẩn bị thiết kế chương trình
Trước khi thiết kế cụ thể cần định nghĩa một vài khái niệm và qui định cách đánh
chỉ số của các đối tượng trong chương trình. Chúng ta cùng quan sát hình sau:
- Dãy các ô vuông sẽ đánh dấu từ 1 đến 16 như trong hình sau (các số màu đen tại
tâm các hình vuông). Ban đầu dãy các hình vuông này được thiết lập với giá trị
ngẫu nhiên. Ví dụ trong hình trên, hình vuông số 4 có giá trị 8.
- Frame (Khung) là đối tượng rất quan trọng của chương trình. Mỗi Khung sẽ là 1
hình vuông lớn phủ lên đúng 4 hình vuông nhỏ. Vị trí của Frame cũng được đánh
224 | T h i ế t k ế p h ầ n m ề m
số từ 1 đến 9 (trong hình dưới các vị trí này là số có khung tròn, nằm tại tâm các
Frame. Số thứ tự của Frame được ký hiệu FrameID.
- Mỗi Frame có 4 hình vuông được đánh số 1, 2, 3, 4 theo chiều kim đồng hồ (các
chữ số màu đỏ trong hình dưới). Ví dụ trong hình dưới Frame có FrameID = 1 sẽ
có các hình vuông 1, 2, 3, 4 tương ứng với các ô vuông 1, 2, 6, 5.
- Ký hiệu XList, YList là dãy tọa độ X, Y của tâm các hình vuông chính.
- Ký hiệu Frame-XList, Frame-YList là dãy các tọa độ X, Y của tâm các Frame.
- CurrSqList là dãy các giá trị của các ô vuông hiện thời trên màn hình. Dãy nãy
luôn có 16 phần tử và được cập nhật thường xuyên trong quá trình tương tác với
người dùng.
- FrameChange là bảng 4 phần tử ghi lại số thứ tự của các hình vuông nhỏ tương
ứng với các vị trí 1, 2, 3, 4 của Frame hiện thời.
225 | T h i ế t k ế p h ầ n m ề m
Danh sách biến nhớ hệ thống
Biến nhớ Biến nhớ Mô tả ý nghĩa Ghi chú
chung riêng thêm
XList, YList 2 bảng lưu dãy các tọa độ X, Y 2 bảng này
(list) của các ô vuông trên màn hình. có chiều dài
= 4, độ dài
hình vuông.
CurrSqList Dãy các giá trị của các ô vuông
(list) hiện thời trên màn hình.
Nhân vật ID, Value Số thứ tự và giá trị gốc của các
Square ô vuông khi được sinh ra (như
1 clone). Các giá trị này cập
nhật 1 lần và bao giờ thay đổi.
CurrID Số thứ tự hiện thời của ô
vuông. Chú ý giá trị này sẽ
được cập nhật sau mỗi lần xoay
Frame.
Xpos, Ypos Tọa độ X, Y của 1 ô vuông
hiện thờ. Các tọa độ này
Frame-XList, Dãy các tọa độ (X, Y) của các 2 bảng này
Frame-YList Khung. có độ dài =
(list) 3.
FrameID Chỉ số của Khung (Frame) hiện
thời.
FrameChange Bảng này có 4 phần tử chỉ ra số
(list) thứ tự của các ô vuông hiện
nằm trong Khung (Frame) hiện
thời, xếp theo chiều kim đồng
hồ.
226 | T h i ế t k ế p h ầ n m ề m
Sơ đồ thiết kế
z x
Thiết lập dãy các hình
Reset vuông ban đầu bằng Khi người dùng bấm z, x
clone. tiến hành quay các hình
vuông theo hoặc ngược kim
đồng hồng. Gừi các thông
Cập nhật lại bảng dữ điệp Update 1-2 tương ứng
liệu CurrSqList, để cập nhật dữ liệu.
kiểm tra nếu đã sắp
xếp xong thì gửi Update 1, 2
thông điệp Finish.
227 | T h i ế t k ế p h ầ n m ề m
Lập trình
1. Thiết lập các hình vuông ban đầu và dữ liệu cho bảng CurrSqList
Thủ tục Init thiết lập bộ dữ liệu ban đầu cho CurrSqList là 1 hoán vị ngẫu nhiên
của dãy số {1, 2, …, 16}. Đây chính là trạng thái đầu tiên của các ô vuông. Chú ý:
khi các clone của nhân vật Square được tạo ra, số thứ tự và giá trị của dãy
CurrSqList sẽ được gán cho biến nhớ ID và Value. Biến nhớ CurrID ở trạng thái
đầu tiên đồng nhất với ID.
228 | T h i ế t k ế p h ầ n m ề m
2. Thiết lập dữ liệu ban đầu và thể hiện Khung (Frame)
Khung đầu tiên được thiết lập có ID = 5, tức là ở tâm của hình vuông.
Thủ tục cập nhật bảng FrameChange từ Thủ tục cập nhật ngay các biến
ID của Frame này. nhớ n1, n2, n3, n4, v1, v2, v3, v4
sẽ được dùng khi xoay các hình
vuông.
229 | T h i ế t k ế p h ầ n m ề m
Cả 4 đoạn mô tả chi tiết việc dịch chuyển này như sau. Chú ý là sau khi dịch
chuyển cần cập nhật ngay các thông số của bảng FrameChange và các thông số
khác bằng thủ tục CalculateFrChange(id).
Mô hình xoay các ô vuông trong Frame được mô tả trong các sơ đồ sau:
Xử lý xoay phải
V1 V2 V1 V2
và trái các ô
vuông trong
Khung là phức
tạp nhất. V4 V3 V4 V3
Cập nhật dữ liệu theo chiều Cập nhật dữ liệu theo chiều
mũi tên 1 2 3 4 1. mũi tên 1 4 3 2 1.
Các tham số cần thay đổi: Các tham số cần thay đổi:
CurrID, Value, Xpos, YPost CurrID, Value, Xpos, YPost
và clone cần dịch chuyển trên và clone cần dịch chuyển trên
màn hình theo các mũi tên. màn hình theo các mũi tên.
230 | T h i ế t k ế p h ầ n m ề m
Thủ tục Xoay phải được triển khai cụ thể như sau:
V1 V2
V4 V3
231 | T h i ế t k ế p h ầ n m ề m
Sau đây là thủ tục Update-1 dành cho việc cập nhật lại bảng CurrSqList sau khi
đã thực hiện việc xoay phải. Nhiệm vụ của thủ tục này là cập nhật các chỉ số n1,
n2, n3, n4 của CurrSqList theo chiều kim đồng hồ như sau:
Nội dung n1 Nội dung n2 Nội dung n3 Nội dung n4 Nội dung n1
Sau đó cập nhật lại các giá trị v1, v2, v3, v4.
232 | T h i ế t k ế p h ầ n m ề m
7. Mô phỏng sắp xếp (loại 4)
Trong phần này chúng ta cùng thiết kế một chương trình sắp xếp khác, loại 4, sắp
xếp dãy số trong hình vuông.
Bài toán này như sau: Dãy các hình vuông đánh số từ 1 đến 15 được xếp ngẫu
nhiên trong 1 hình vuông 4 x 4, trong đó có 1 ô trống (empty). Người dùng có thể
dịch chuyển các ô có số sang vị trí ô trống bằng cách nháy lên ô này. Bằng các
thao tác như vậy cần sắp xếp lại các số trong hình vuông theo thứ tự tăng dần.
Bài toán này đơn giản hơn bài toán trên (loại 3). Thiết kế nhanh như sau.
Danh sách nhân vật
Hình ảnh Tên nhân Mô tả ý nghĩa Ghi chú
vật thêm
Quare Nhân vật chính. Nhân vật này có 16
trang phục tương ứng với các hình
vuông với dãy số 1, 2, .., 16.
Banner Banner chỉ hiện khi sắp xếp xong
toàn bộ hình vuông.
Sơ đồ thiết kế
Finish
234 | T h i ế t k ế p h ầ n m ề m
Lập trình
1. Một số công cụ hỗ trợ tính toán ban đầu
Thủ tục Init có chức năng sinh tự động bảng CurrSqList. Dãy này sẽ phải là 1
hoán vị ngẫu nhiên của dãy {1, 2, …, 15} và phải chứa 1 phần tử rỗng, vị trí phần
tử rỗng cũng phải ngẫu nhiên.
Thủ tục Calculate XY(emptyID) sẽ tính các tọa độ X, Y của ô vuông rỗng trên
màn hình và cập nhật vào các biến nhớ hệ thống EmptyXpos, EmptyYpos,
Empty-Xindex, Empty-Yindex.
235 | T h i ế t k ế p h ầ n m ề m
2. Thể hiện ô vuông với ô trống ngẫu nhiên trên màn hình
Chương trình sinh các ô vuông trên màn hình bằng công nghệ Clone cũng tương
tự như các chương trình đã nêu trong các phần trước. Điểm khác biệt duy nhất ở
chỗ chú ý đến vị trí Empty (ô rỗng) thì bỏ qua không sinh Clone tại đó nữa.
Đoạn chương trình như sau:
236 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình sau xử lý khi người dùng nháy lên 1 ô số nằm cạnh bên trái
của ô rỗng.
237 | T h i ế t k ế p h ầ n m ề m
Câu hỏi - Bài tập - Mở rộng
1. Hoàn thiện chương trình biến đổi số giữa các hệ đếm đã nêu trong phần 2.
2. Thiết kế và viết chương trình sắp xếp loại 1 (chương trình 2) nhưng với hình
ảnh nhân vật có các kích thước khác nhau. Tiêu chuẩn sắp xếp theo theo thứ tự to
nhỏ của hình ảnh nhân vật.
Nhân vật trong chương trình có nhiều trang phục khác nhau tương ứng với các đồ
vật, con vật khác nhau.
Người chơi kéo thả các hình ảnh phía dưới lên các hình tròn đỏ phía trên.
3. Thiết kế và viết chương trình sắp xếp loại 2 (chương trình 3) nhưng với hình
ảnh nhân vật có các kích thước khác nhau. Tiêu chuẩn sắp xếp theo theo thứ tự to
nhỏ của hình ảnh nhân vật.
Nhân vật trong chương trình có nhiều trang phục khác nhau tương ứng với các đồ
vật, con vật khác nhau.
Người chơi kéo thả các hình ảnh phía dưới sang các vị trí của nhau để sắp xếp lại
các hình này theo thứ tự theo yêu cầu.
4. Viết các chương trình mô tả trò chơi sắp xếp theo loại 3 nhưng với số lượng
hình vuông khác nhau.
238 | T h i ế t k ế p h ầ n m ề m
Trường hợp n = 3 Trường hợp n = 5.
5. Viết các chương trình mô tả trò chơi sắp xếp theo loại 4 nhưng với số lượng
hình vuông khác nhau.
Trường hợp n = 3. Trường hợp n = 5.
6. Viết chương trình mô tả một cách sắp xếp khác, được mô tả trong hình sau.
Người chơi chỉ được quyền di chuyển 1 con số từ phía bên phải sang 1 vị trí bất
kỳ ở bên trái.
Trong ví dụ sau, giả sử chúng ta di chuyển số 5 sang vị trí số 1.
6 1 4 2 5 3
6 5 1 4 2 3
239 | T h i ế t k ế p h ầ n m ề m
Khi số 5 được chèn vào vị trí số 1, thì các mảnh ghép 1, 4, 2 nằ, giữa 2 vị trí 5 và
1 sẽ được dịch chuyển sang phải để chiếm vị trí của số 5 vừa được chuyển đi.
240 | T h i ế t k ế p h ầ n m ề m
241 | T h i ế t k ế p h ầ n m ề m
Chủ đề 7.
Phần mềm hỗ trợ học Toán
Mục tiêu:
- Thiết kế một số phần mềm hỗ trợ học và dạy môn Toán.
- Một số thuật toán sinh dãy số ngẫu nhiên, sinh các bài toán đầu vào cho các phần
mềm học Toán.
Nội dung chính
1. Trò chơi điền số vào dãy, vào bảng
Một trong các trò chơi, bài toán vui hay gặp nhất là bài toán tìm số trong dãy hoặc
bảng. Cho trước 1 dãy (hoặc bảng) số có qui luật, trong đó có 1 vị trí trống, cần
tìm số còn thiếu này. Cách làm là lựa chọn 1 trong số các đáp án có sẵn (trắc
nghiệm).
Dien so vao
day.sb2
Giao diện đơn giản của
chương trình.
Dãy số hiện ở giữa màn hình,
các đáp án trắc nghiệm phía
dưới. Người dùng cần nháy
lên 1 trong các nút A, B, C, D
để giải (chơi).
242 | T h i ế t k ế p h ầ n m ề m
Giáo viên là người ra các thông
báo hướng dẫn chính của chương
trình.
- Người chơi làm bài bằng cách nháy chuột lên 1 trong các nút A, B, C, D bên
dưới các đáp án có sẵn. Chương trình sẽ lập tức sẽ thông báo đúng / sai và số hạng
tiếp theo của dãy sẽ hiện ngay trên màn hình. Đồng thời xuất hiện nút Next (xem
hình dưới).
- Nháy lên nút Next để tự động chuyển sang bài toán tiếp theo. Trò chơi cứ như
vậy mãi mãi.
Phân tích yêu cầu của chương trình.
Bộ dữ liệu chính mô tả yêu cầu và hoạt động của chương trình.
Stt Tên biến nhớ Ý nghĩa Chú ý
1 N1, N2, N3, 5 biến nhớ tổng thể lưu 5 giá trị đầu tiên (biến nhớ)
N4, N5 của dãy. Bài toán chính là tìm phần tử
tiếp theo (một cách hợp lý) của dãy trên.
2 pA, pB, pC, 4 phương án của bài toán. Trong 4 (biến nhớ)
pD phương án này sẽ có 1 phương án đúng.
3 pCorrect Biến nhớ chỉ ra số thứ tự của phương án (biến nhớ)
đúng trong số 4 phương án trên. Biến nhớ
này không hiện trên màn hình.
4 Choice Biến nhớ ghi lại phương án lựa chọn của (biến nhớ)
người dùng. Như vậy nếu
Choice=pCorrect thì làm đúng, ngược lại
là sai.
243 | T h i ế t k ế p h ầ n m ề m
Stt Tên biến nhớ Ý nghĩa Chú ý
5 Score Điểm số của người chơi. Nếu giải đúng sẽ (biến nhớ)
được tặng 10 điểm, nếu làm sai sẽ bị trừ 1
điểm.
Vấn đề chính, bài toán chính của trò chơi này là tự động thiết lập các bài toán và
cập nhập vào bộ dữ liệu đã nêu trên.
Có rất nhiều thuật toán có thể viết để thiết lập các bài toán cụ thể cho chương
trình. Mỗi thuật toán chỉ ra cách thiết lập 1 dãy các số có quan hệ logic. Bảng sau
ghi lại 1 vài thiết kế như vậy (sẽ được viết trong chương trình).
Stt Mô tả qui luật dãy số Ví dụ
1 Dãy số chẵn liên tục 2 4 6 8 10 12 14 16
2 Dãy số lẻ liên tục 1 3 5 7 9 11 13 15 17 19
3 Dãy số nguyên tố liên tục 2 3 5 7 11 13 17 19 23
4 Dãy số Fibonaci 1 1 2 3 5 8 13 21
5 Dãy số chính phương 1 4 9 16 25 36
6 Dãy số lập phương 1 8 27 64 125
7 Dãy các số tạo thành 1 cấp số 1 4 7 10 13 16 19 22
cộng.
8 Dãy số tạo thành 1 cấp số nhân. 3 6 12 24 48
Bộ dữ liệu sau dùng để lưu trữ dữ liệu cho tất cả các thuật toán trên. Bộ dữ liệu
này được thiết kế trong đối tượng Math của chương trình.
244 | T h i ế t k ế p h ầ n m ề m
Sơ đồ thiết kế dữ liệu chính của chương trình.
Các nút A, B, C, Các nút dành cho người chơi Nháy lên nút này
D lựa chọn đáp án của trò chơi. sẽ sinh ra thông
Mỗi lần chỉ được nháy chuột 1 điệp Done.
lần lên 1 nút lệnh này.
245 | T h i ế t k ế p h ầ n m ề m
Sơ đồ hoạt động của chương trình.
Reset
Thực hiện việc sinh dữ
liệu bài toán chính của
Gửi thông
chương trình.
điệp Reset
Math.Done
Thông báo yêu cầu Kích hoạt các nút này
bài toán. làm việc.
Kiểm tra và thông
báo đúng / sai.
246 | T h i ế t k ế p h ầ n m ề m
Các thuật toán sinh dữ liệu chính.
Sau đây là mô tả chi tiết 8 thuật toán sinh ngẫu nhiên các bộ dữ liệu đầu vào của
bài toán. Tất cả các thuật toán này đều nạp dữ liệu vào các biến nhớ sau:
1. pNumber. Số lượng số của dãy số.
2. NumList. Dãy số chính.
3. pList. Dãy 4 phương án.
4. sList. Dãy mô tả phương án đúng.
247 | T h i ế t k ế p h ầ n m ề m
Tên Mô tả thuật toán Chương trình
Dãy số chính Đặt i = ngẫu nhiên từ 1 đến 5.
phương Lặp pNumber lần.
Đưa i*i vào mảng NumList.
i=i+1
Thiết lập 2 mảng 4 phần từ pList và
sList. pList bao gồm các số lấy ngẫu
nhiên từ 10 đến 1000 và không =
phần tử thứ pNumber của NumList.
sList bao gồm toàn số 0.
Đặt k = ngẫu nhiên từ 1 đến 4.
Thay thế phần tử thứ k trong pList
với phần tử cuối cùng của NumList.
Thay thế phần tử thứ k của sList
bằng 1.
Dãy số lập Đặt i = ngẫu nhiên từ 1 đến 5.
phương Lặp pNumber lần.
Đưa i*i*i vào mảng
NumList.
i=i+1
Thiết lập 2 mảng 4 phần từ pList và
sList. pList bao gồm các số lấy ngẫu
nhiên từ 20 đến 5000 và không =
phần tử thứ pNumber của NumList.
sList bao gồm toàn số 0.
Đặt k = ngẫu nhiên từ 1 đến 4.
Thay thế phần tử thứ k trong pList
với phần tử cuối cùng của NumList.
Thay thế phần tử thứ k của sList
bằng 1.
Dãy các số Đặt i = ngẫu nhiên từ 1 đến 5.
tạo thành 1
Đặt d = ngẫu nhiên từ 2 đến 10.
cấp số cộng.
Lặp pNumber lần.
Đưa i vào mảng NumList.
i=i+d
Thiết lập 2 mảng 4 phần từ pList và
sList. pList bao gồm các số lấy ngẫu
nhiên từ 10 đến 100 và không = phần
tử thứ pNumber của NumList. sList
bao gồm toàn số 0.
Đặt k = ngẫu nhiên từ 1 đến 4.
248 | T h i ế t k ế p h ầ n m ề m
Tên Mô tả thuật toán Chương trình
Thay thế phần tử thứ k trong pList
với phần tử cuối cùng của NumList.
Thay thế phần tử thứ k của sList
bằng 1.
Dãy số tạo Đặt i = ngẫu nhiên từ 2 đến 10.
thành 1 cấp
Đặt p = ngẫu nhiên từ 2 đến 5.
số nhân.
Lặp pNumber lần.
Đưa i vào mảng NumList.
i = i *p
Thiết lập 2 mảng 4 phần từ pList và
sList. pList bao gồm các số lấy ngẫu
nhiên từ 10 đến 100 và không = phần
tử thứ pNumber của NumList. sList
bao gồm toàn số 0.
Đặt k = ngẫu nhiên từ 1 đến 4.
Thay thế phần tử thứ k trong pList
với phần tử cuối cùng của NumList.
Thay thế phần tử thứ k của sList
bằng 1.
Dãy số Đặt p = ngẫu nhiên trong các số 2, 3, Chương trình này sử dụng thủ tục
nguyên tố 5, 7, 11 Next Primary (number) để tìm ra số
liên tục Lặp pNumber lần. nguyên tố đầu tiên > number. Kết quả lưu
vào biến nhớ Next.Primary.Math.
Đưa p vào mảng NumList.
Tính p = số nguyên tố đầu
tiên tiếp theo.
Thiết lập 2 mảng 4 phần từ pList và
sList. pList bao gồm các số lấy ngẫu
nhiên từ 10 đến 100 và không = phần
tử thứ pNumber của NumList. sList
bao gồm toàn số 0.
Đặt k = ngẫu nhiên từ 1 đến 4.
Thay thế phần tử thứ k trong pList
với phần tử cuối cùng của NumList.
Thay thế phần tử thứ k của sList
bằng 1.
249 | T h i ế t k ế p h ầ n m ề m
Tên Mô tả thuật toán Chương trình
Thuật toán kiểm tra 1 số p có là Thủ tục Is Primary <p>.
nguyên tố hay không. Kết quả lưu
vào biến kq. Số p là nguyên tố nếu
kq = 1.
Đặt kq = 0, k = 2.
Nếu p = 1 thì Exit.
Lặp liên tục cho đến khi p chia hết
cho k hoặc k > p-1.
k=k+1
kết thúc lặp.
Nếu k = p thì đặt kq = 1. Thủ tục Next Primary <n> sẽ tìm số
nguyên tố nhỏ nhất > n, kết quả đưa vào
biến nhớ Next.Primary.Math.
250 | T h i ế t k ế p h ầ n m ề m
Danh sách các biến nhớ hệ thống của chương trình.
251 | T h i ế t k ế p h ầ n m ề m
Lập trình chi tiết.
a) Sân khấu thiết lập các tham biến ban đầu và gửi thông điệp Reset.
b) Khi nhận thông điệp Reset, nhân vật Math sẽ sinh 1 bộ dữ liệu cho bài toán.
c) Nhận được thông điệp Math.Done, Giáo viên sẽ thông báo cho người chơi bắt
đầu được làm bài. Lúc này sẽ thiết lập Time_to_solve = 1 để người chơi có thể
thao tác nháy chuột lên các nút đáp án A, B, C, D.
d) Đồng thời, các nút A, B, C, D sẽ chờ người chơi làm bài bằng cách nháy chuột
lên các nút này.
Sau đây là chương trình điều khiển cho nút A, chương trình cho các nút khác hoàn
toàn tương tự.
Ngay sau khi nháy chuột làm bài, nút lệnh sẽ gán giá trị cho biến nhớ Choice và
gửi thông điệp Done thể thông báo đã làm bài.
252 | T h i ế t k ế p h ầ n m ề m
Chương trình cho nút A.
Chỉ xử lý khi
Time_to_solve = 1.
e) Giáo viên lại là nhân vật nhận thông điệp Done để xử lý tiếp.
- Đặt lại Time_to_solve = 0.
- Kiểm tra người dùng làm đúng hay sai. Nếu đúng tăng 20 điểm, nếu sai trừ 1
điểm.
- Thông báo đúng/ sai.
Xử lý nếu làm
đúng.
Xử lý nếu làm
sai.
f) Đồng thời khi nhận được thông điệp Done thì nhân vật Number sẽ hiện đáp án
đúng ngay bên cạnh dãy số chính. Giá trị của đáp án đúng được lưu trong biến
nhớ Number.Answer. Nhân vật Number sẽ dùng thủ tục Show Number <n> at
<X, Y> để hiện đáp số này bằng hình ảnh số.
253 | T h i ế t k ế p h ầ n m ề m
Thủ tục Show Number <n> at <X, Y> được mô tả như chương trình sau.
g) Nút Next sẽ chỉ xuất hiện khi người dùng nhập xong bài toán. Khi đó nháy lên
nút này sẽ khởi động thông điệp Reset để bắt đầu 1 bài toán mới.
Chương trình điều khiển nhân vật Next như sau:
h) Cuối cùng là nhân vật hình câu hỏi. Nhân vật này sẽ hiển thị sau thông điệp
Reset và ẩn đi sau thông điệp Done.
254 | T h i ế t k ế p h ầ n m ề m
2. Trò chơi tìm số
Trong mục này chúng ta cùng làm quen và thiết kế 1 chương trình, trò chơi khác
nhưng cũng dựa trên việc sinh tự động các bài toán. Điểm khác biệt quan trọng là
trong chương trình này, việc giải toán chỉ cần nhập 1 đáp án (là số) duy nhất.
Ý tưởng giao diện chương trình này nằm ở hình ảnh con RÙA. Gần đến ngày thi
cử, chúng ta vẫn thấy các thí sinh đến Văn Miếu Quốc Tử Giám để xoa đầu rùa
lấy may. Trong chương trình này, người dùng khi giải toán gặp khó khăn sẽ nháy
chuột lên con RÙA để xem thêm gợi ý, hướng dẫn.
Các dạng bài toán của chương trình này cũng là 1 tổng quát hơn ví dụ trong phân
trước của chủ đề. Dạng bài toán cần tìm đáp số chính xác là rất điển hình trong
ứng dụng toán học.
Tim so.sb2
Chương trình (thông
qua giáo viên) sẽ liên
tục đưa ra bài toán,
người chơi nhập đáp số
thông qua hộp hội thoại
nhập số. Con rùa xuất
hiện để hỗ trợ người
chơi.
255 | T h i ế t k ế p h ầ n m ề m
Khi làm bài, giáo viên sẽ
luôn đưa ra nội dung, yêu
cầu của bài toán. Sân khấu
thực hiện lệnh tương tác
yêu cầu nhập đáp số. Nháy
lên con rùa để xem hướng
dẫn, gợi ý. Quá trình này
dừng lại khi người chơi
nhập đáp án đúng.
256 | T h i ế t k ế p h ầ n m ề m
Stt Tên bài toán Diễn dải bài toán
5 Tính phần tử tiếp theo của 1 Tìm phần tử tiếp theo của dãy số sau:
dãy số có qui luật. <N1>, <N2>, <N3>, <N4>.
6 Chuyển đổi số thập phân Hãy chuyển đổi số thập phân sau <N>
sang nhị phân. sang số nhị phân.
7 Chuyển đổi số nhị phân sang Hãy chuyển đổi số nhị phân sau <N> sang
thập phân. số thập phân.
8 Tìm giá trị Max, Min của 1 Tìm giá trị lớn (nhỏ) nhất của dãy số sau:
dãy số cho trước. <N1> <N2> ….. <Nk>.
Bộ dữ liệu sau dùng để lưu trữ dữ liệu cho tất cả các thuật toán trên. Bộ dữ liệu
này được thiết kế trong đối tượng Math của chương trình.
Stt Tên biến nhớ Ý nghĩa Chú ý
1 Problem.Content Nội dung bài toán. (biến nhớ)
2 Problem.Hint Gợi ý của bài toán. (biến nhớ)
3 Problem.Answer Đáp số của bài toán. (biến nhớ)
Chú ý: Các bài toán sinh dãy số trong ví dụ ở phần trước hoàn toàn có thể được sử
dụng lại trong bài này. Đoạn chương trình sau mô tả cách chuyển đổi dữ liệu đã
sinh bài toán điền số vào dãy số dạng trắc nghiệm sang dạng bài toán có 1 đáp số
duy nhất.
Thiết kế theo Cách thiết kế nhân vật Math trong 2 ví dụ trên, trong nhân vật này chứa tất cả
module các thuật toán sinh dữ liệu của các bài toán chính, được gọi là thiết kế theo
module. Chúng ta có thể gọi là Math module.
257 | T h i ế t k ế p h ầ n m ề m
Danh sách các nhân vật chính.
Biểu tượng Tên nhân vật Chức năng và hoạt động Các chú ý khác
Đối tượng Đối tượng này được xây dựng Bộ dữ liệu chính
Math đặc biệt để lưu trữ tất cả các dữ lưu dữ liệu của
liệu và thuật toán sinh tự động các thuật toán sẽ
các bài toán và dữ liệu của là dữ liệu riêng
chương trình. (local) của đối
tượng này.
Giáo viên. Giáo viên đóng vai trò MC của
chương trình.
258 | T h i ế t k ế p h ầ n m ề m
Sơ đồ hoạt động.
Thiết lập bộ dữ
Reset liệu cho bài toán.
Hiển thị và nêu yêu
Start
Yêu cầu người cầu bài cần giải.
dùng nhập đáp án.
Nếu nhập sai, gửi
Thông báo SAI rồi và nêu
thông điệp Sai rồi.
yêu cầu bài cần giải.
Sai rồi
Thông báo ĐÚNG rồi và
nêu yêu cầu bài cần giải.
Nếu nhập đúng,
gửi thông điệp
Done. Cho phép thông
Done báo hướng dẫn nếu
nháy chuột lên.
Hiển thị.
Nháy chuột lên thì
ẩn đi và gửi thông
điệp Reset.
` Reset
259 | T h i ế t k ế p h ầ n m ề m
Stt Tên biến nhớ Ý nghĩa Chú ý
Các biến nhớ và mảng sau là biến riêng của nhân vật Math. Các
biến này được dùng để sinh các bài toán của chương trình.
1 Problem.Content Nội dung bài toán.
(biến nhớ)
2 Problem.Hint (biến Gợi ý của bài toán.
nhớ)
3 Problem.Answer Đáp số của bài toán.
(biến nhớ)
4 pNumber (biến nhớ) Số lượng phần tử của dãy sẽ được Gán mặc
sinh tự động. Giá trị có trong định = 6.
chương trình là pNumber = 6.
5 NumList (list) Dãy số chính (gốc) được sinh tự Dãy này có
động của thuật toán. pNumber
phần tử.
6 N1, N2, N3, N4, N5 5 biến nhớ tổng thể lưu 5 giá trị đầu
(biến nhớ) tiên của dãy. Bài toán chính là tìm
phần tử tiếp theo (một cách hợp lý)
của dãy trên.
260 | T h i ế t k ế p h ầ n m ề m
Một số thuật toán sinh dữ liệu.
261 | T h i ế t k ế p h ầ n m ề m
Tên bài Thuật toán thực hiện Chương trình mô tả
toán
Đếm số các Đặt k = ngẫu nhiên từ 10 đến 100.
ước số
Đặt count = 0, i = 1.
thực sự.
Thực hiện lặp k - 1 lần.
Nếu k mod i = 0 thì tăng count
lên 1.
Tăng i lên 1.
kết thúc lặp.
Problem.Answer =
Problem.Hint =
Problem.Content =
Chuyển Biến đổi số thập phân decimal sang nhị Vì các số decimal hoặc binary sẽ phải được sinh
đổi số thập phân binary. ngẫu nhiên, do đó thủ tục chính có thể trình bày
phân sang theo thuật toán biến đổi từ decimal binary
Gán binary = rỗng
nhị phân. hoặc ngược lại đều được.
Thực hiện lặp cho đến khi decimal = 0
Chương trình sau mô tả ch decimal sinh ngẫu
Đặt ch = Decimal mod 2; nhiên, tính binary sau.
decimal = decimal / 2 (làm tròn
xuống)
Bổ sung ch vào bên trái của
binary.
kết thúc lặp.
Problem.Answer = binary.
Problem.Hint = Hãy mở sách về thuật
toán biểu diễn nhị phân để xem lại.
Problem.Content = Biến đổi và tìm
dạng nhị phân của số sau <decimal>,
Chuyển Biến đổi số nhị phân binary sang thập Vì các số decimal hoặc binary sẽ phải được sinh
đổi số nhị phân decimal. ngẫu nhiên, do đó thủ tục chính có thể trình bày
phân sang theo thuật toán biến đổi từ decimal binary
Gán ban đầu: decimal = 0, index = 1
thập phân. hoặc ngược lại đều được.
len = độ dài xâu binary.
Chương trình sau mô tả ch decimal sinh ngẫu
Thực hiện vòng lặp với độ dài len nhiên, tính binary sau.
ch = chữ số tương ứng chỉ số
index của binary
decimal = 2*decimal + ch
Tăng index lên 1
kết thúc lặp.
Problem.Answer = decimal.
262 | T h i ế t k ế p h ầ n m ề m
Tên bài Thuật toán thực hiện Chương trình mô tả
toán
Problem.Hint = Hãy mở sách về thuật
toán biểu diễn nhị phân để xem lại.
Problem.Content = Hãy biến đổi sang
dạng thập phân của số nhị phân sau
<binary>.
263 | T h i ế t k ế p h ầ n m ề m
Tên bài Thuật toán thực hiện Chương trình mô tả
toán
Dãy số Đặt k = ngẫu nhiên từ 1 đến 10.
chẵn liên
Đặt i = 2*k.
tục. Tìm số
tiếp theo. Lặp lại pNumber lần.
Đưa i vào mảng NumList.
Tăng i lên 2.
kết thúc lặp.
Problem.Answer = Phần tử cuối cùng
của dãy NumList.
Problem.Hint = Các số trong dãy đều
là số chẵn.
Problem.Content = Tìm phần tử tiếp
theo của dãy số sau: <NumList>.
Dãy số lẻ. Đặt k = ngẫu nhiên từ 1 đến 10.
Tìm số tiếp
Đặt i = 2*k + 1.
theo.
Lặp lại pNumber lần.
Đưa i vào mảng NumList.
Tăng i lên 2.
kết thúc lặp.
Problem.Answer = Phần tử cuối cùng
của dãy NumList.
Problem.Hint = Các số trong dãy đều
là số lẻ.
Problem.Content = Tìm phần tử tiếp
theo của dãy số sau: <NumList>.
Dãy số Đặt p = ngẫu nhiên trong các số 2, 3, 5, Chương trình này sử dụng thủ tục
nguyên tố 7, 11 Next Primary (number) để tìm ra số nguyên tố
liên tục. đầu tiên > number. Kết quả lưu vào biến nhớ
Lặp pNumber lần.
Tìm số tiếp Next.Primary.Math.
theo. Đưa p vào mảng NumList.
Tính p = số nguyên tố đầu tiên
tiếp theo.
kết thúc lặp.
Problem.Answer = Phần tử cuối cùng
của dãy NumList.
Problem.Hint = Các số trong dãy đều
là số nguyên tố.
Problem.Content = Tìm phần tử tiếp
theo của dãy số sau: <NumList>.
264 | T h i ế t k ế p h ầ n m ề m
Tên bài Thuật toán thực hiện Chương trình mô tả
toán
Chú ý: trong thuật toán trên có sử dụng
2 thủ tục hay thuật toán con.
Thủ tục Is Primary <p> kiểm tra xem số p có
- Thủ tục kiểm tra 1 số có phải là phải là nguyên tố hay không. Kết quả trả về vào
nguyên tố hay không. biến nhớ kq.math.
- Thủ tục tính số nguyên tố tiếp theo
nhỏ nhất sau 1 số tự nhiên cho trước.
Is Primary <p>
1. Thủ tục kiểm tra 1 số có phải là
nguyên tố hay không.
Thuật toán kiểm tra 1 số p có là nguyên
tố hay không. Kết quả lưu vào biến kq.
Số p là nguyên tố nếu kq = 1.
Đặt kq = 0, k = 2.
Nếu p = 1 thì Exit.
Lặp liên tục cho đến khi p chia hết cho
k hoặc k > p-1.
k=k+1
kết thúc lặp.
Nếu k = p thì đặt kq = 1.
Thủ tục Next Primary <n> sẽ tìm số nguyên tố
nhỏ nhất > n và trả kết quả vào biến nhớ
2. Thủ tục tính số nguyên tố tiếp theo Next.Primary.Math.
sau số n.
(xem hình bên).
265 | T h i ế t k ế p h ầ n m ề m
Tên bài Thuật toán thực hiện Chương trình mô tả
toán
Problem.Hint = Các số trong dãy này
là các bình phương đúng liên tục.
Problem.Content = Tìm phần tử tiếp
theo của dãy số sau: <NumList>.
Giáo viên.
b) Nhân vật Math sẽ nhận thông điệp Reset, sinh 1 bộ dữ liệu của bài toán và gửi
thông điệp Start để bắt đầu một bài toán của chương trình.
266 | T h i ế t k ế p h ầ n m ề m
Nhận được thông điệp Start, hệ thống bắt đầu hoạt động hết công suất của
mình.
c) Giáo viên thông báo nội dung bài toán.
d) Sân khấu liên tục yêu cầu người chơi nhập đáp số của bài toán hiện thời.
e) Người chơi nháy lên con rùa để xem hướng dẫn, gợi ý.
267 | T h i ế t k ế p h ầ n m ề m
Giáo viên thông báo "Đúng
rồi", tăng 15 điểm cho người
làm bài và đặt lại TimeStart
= 1.
268 | T h i ế t k ế p h ầ n m ề m
3. Trò chơi bắn súng giải toán
Ý tưởng vừa Chúng ta sẽ cùng thiết kế thêm 1 trò chơi "giải toán" nữa nhưng theo một cách
chơi vừa học. khác, hấp dẫn hơn. Người chơi sẽ được "chơi" trước khi phải "giải toán". Ý tưởng
chung của tất cả các phần mềm kiểu này là "vừa chơi, vừa học", hay cụ thể hơn là:
trong khi chơi, để vượt qua các chướng ngại vật, người chơi bắt buộc phải giải
toán. Chúng ta sẽ hiện thực hóa ý tưởng phần chơi là "bắn súng", còn phần học là
"giải toán có đáp số" như trong ví dụ trên.
Mô hình các chương trình, phần mềm dạng "vừa chơi, vừa học" có dạng chung
như sau:
StartGame StartMath
StartMath = 0 StartMath = 1
Nguyên tắc hoạt động của các hệ thống chương trình dạng như thế này:
- Chương trình sẽ phân chia thành 2 giai đoạn, hay 2 trạng thái tách biệt hoàn
toàn: trạng thái "trò chơi" và trạng thái "học toán". Phân biệ giữa 2 trạng thái này
có thể là 1 biến nhớ hệ thống, ví dụ StartMath, hoặc là các sự kiện, ví dụ
StartGame đánh dấu bắt đầu "trò chơi", còn StartMath đánh dấu bắt đầu "học
toán".
- Giữa 2 module này có sự quan hệ với nhau. Ví dụ muốn đạt điểm của trò chơi
cần giải xong 1 bài toán. Muốn chơi thì phải giải toán thật nhanh.
269 | T h i ế t k ế p h ầ n m ề m
Giao diện của chương trình được chia làm 2 giai đoạn (2 pha): chơi và học.
Phần chơi của chương trình: cần bắn Phần giải toán của chương trình: cần
súng trúng vào các bao tải tiền. Bao nhập đáp số đúng cho bài toán mà GV
tải càng nhỏ, điểm số sẽ càng cao. đang yêu cầu làm trên màn hình.
270 | T h i ế t k ế p h ầ n m ề m
Thiết kế danh sách nhân vật.
Stt Biểu tượng Ý nghĩa, hoạt động của nhân vật
1 Súng thần công. Khi người dùng nhấn phím Space thì sẽ
phát thông điệp Shot.
2 Đạn. Khi nhận thông điệp Shot sẽ xuất hiện tại đầu nòng
súng như 1 clone và dịch chuyển theo hướng nòng súng
cho đến khi gặp cạnh màn hình hoặc nếu nhận thông
điệp StartMath thì tự xóa.
3 Bao tải tiền. Bao tải tiền xuất hiện như các clone với
kích thước = size là % so với gốc. Giá trị size sẽ lấy ngẫu
nhiên từ 10-50%. Nếu va chạm với đạn thì lập tức tính
toán CurrMathPoint, gửi thông điệp StartMath, thiết
lập biến nhớ StartMath = 0 và xóa tất cả các clone trên
màn hình.
4 Đối tượng này được xây dựng đặc biệt để lưu trữ tất cả
các dữ liệu và thuật toán sinh tự động các bài toán và dữ
liệu của chương trình. Bộ dữ liệu của module Math như
sau:
Problem.Hint: Gợi ý bằng lời cách giải bài toán.
Problem.Answer: Đáp số duy nhất của bài toán.
Problem.Content: Nội dung bằng lời của bài toán.
5 Giáo viên. Giáo viên xuất hiện khi nhận được thông điệp
StartMath, sau đó sẽ điều khiển tương tác với người
chơi để giải toán.
6 Nút lệnh Next. Nút này xuất hiện khi nhận thông điệp
Đúng rồi. Khi nháy lên nút này sẽ phát thông điệp
Reset.
7 Bảng làm toán. Bảng này xuất hiện khi nhận thông điệp
StartMath. Bảng sẽ ẩn đi nếu nhận thông điệp Reset.
271 | T h i ế t k ế p h ầ n m ề m
Tâm của súng tại vị trí
này.
272 | T h i ế t k ế p h ầ n m ề m
Stt Tên biến nhớ Ý nghĩa
1 CloneID ID của nhân vật. = 0 nếu là nhân vật gốc, > 0 nếu
là clone.
Biến nhớ riêng của nhân vật Bao tải.
1 CloneID ID của nhân vật. = 0 nếu là nhân vật gốc, > 0 nếu
là clone.
2 Size Kích thước (tính theo %) của nhân vật thể hiện.
StartGame
273 | T h i ế t k ế p h ầ n m ề m
Lập trình chi tiết.
Pha 1: Game.
a) Sân khấu là nơi gửi thông điệp StartGame đầu tiên.
Nhận được thông điệp StartGame, các nhân vật sẽ chuẩn bị cho Game bắn súng.
b) Chương trình điều khiển súng sẽ sẵn sàng cho việc bắn đạn. Súng lúc này mới
xuất hiện, còn trước đó thì ẩn đi.
c) Các bao tải sẽ rơi ngẫu nhiên từ phía trên với kích thước ngẫu nhiên.
Chương trình sinh clone của nhân vật Bao tải như sau. Chú ý nhân vật gốc phải có
CloneID = 0, các phân thân sẽ có CloneID > 0.
Khi nhận thông điệp StartGame, chương trình điều khiển Bao tải như sau.
Chú ý:
- Trong suốt quá trình tạo ra clone, nhân vật gốc của Bao tải vẫn ẩn, không hiện
trên màn hình.
- Các bao tải có kích thước khác nhau. Người chơi bắn trúng bao tải càng nhỏ
càng được điểm cao.
274 | T h i ế t k ế p h ầ n m ề m
Bao tải khi được tạo ra (bằng clone) sẽ rơi xuống đất với tốc độ khá nhanh và biến
mất khi rơi xuống đất.
Các chương trình sau điều khiển viên đạn sau khi ra khỏi nòng súng.
275 | T h i ế t k ế p h ầ n m ề m
- Luôn chuyển động với vận tốc cố định về 1 hướng.
- Nếu gặp cạnh thì tự xóa clone.
Chú ý: Không có và không cần chương trình điều khiển đạn khi gặp bao tải vì
điều này sẽ được lập trình bởi bao tải.
f) Khi viên đạn bắn trúng Bao tải, lập tức chuyển sang chế độ Học toán.
Đoạn chương trình điều khiển khi đạn bắn trúng Bao tải như sau:
Nếu va chạm
với Đạn
Điểm số tạm thời CurrMathPoint không được thưởng ngay mà đợi khi người
chơi làm xong 1 bài toán mới thực hiện. Điểm số này = 100 - Size, do đó điểm
càng cao nếu kích thước bao tải càng nhỏ.
b) Nhân vật Math nhận thông điệp StartMath sẽ tiến hành sinh ngẫu nhiên 1 bộ
dữ liệu
276 | T h i ế t k ế p h ầ n m ề m
c) Giáo viên khi nhận được thông điệp Start sẽ xuất hiện và thông báo nội dung
bài toán cần làm.
Đồng thời sân khấu sẽ liên tục sẽ yêu cầu người chơi nhập đáp số cho bài toán.
Nếu người dùng nhập sai thì gửi thông điệp Sai rồi và yêu cầu nhập tiếp, nếy
đúng rồi thì kết thúc và gửi thông điệp Đúng rồi.
d) Giáo viên xử lý 2 thông điệp Sai rồi và Đúng rồi như sau.
e) Khi người chơi làm đúng bài toán, nút Next xuất hiện để chuẩn bị cho công
việc tiếp theo.
Nháy lên nút này sẽ gửi thông điệp StartGame và quay trở lại trạng thái trò chơi.
Toàn bộ chương trình điều khiển nút Next như sau.
277 | T h i ế t k ế p h ầ n m ề m
Bắt đầu chương trình
thì ẩn.
f) Cuối cùng là nhân vật Bảng đen, chỉ xuất hiện khi làm toàn.
2. Mở rộng chương trình Điền số vào dãy, thể hiện các dãy số gốc và đáp án bằng
hình ảnh các số như trong hình sau:
278 | T h i ế t k ế p h ầ n m ề m
3. Mở rộng, thay đổi phần mềm Bắn súng giải toán theo yêu cầu sau:
Khi chơi, người chơi sẽ được chơi thoải mái cho đến khi nào bị một bao tải rơi
xuống đất thì phải chuyển sang làm toán. Làm đúng 1 bài toán sẽ được quay lại
chơi bắn súng. Điểm số luôn được cộng vào khi bắn trúng 1 bao tải.
4. Phân loại các dạng toán có thể số hóa.
Bảng sau phân loại các dạng toán điền số vào dãy có thể thực hiện. Hãy viết các
thuật toán và thủ tục cho các bài toán này để áp dụng vào các chương trình đã mô
tả trong chủ đề này.
Stt Name Công thức
Dãy số theo công thức
1. Dãy số chẵn liên tục 2*N
2. Dãy số lẻ liên tục 2*N-1
3. Dãy số chính phương liên tiếp N*N
4. Dãy số liên tục là bội của 3 3*N
5. Dãy số liên tục là bội của 5 5*N
6. Dãy số liên tục là chính phương cộng 1 N*N+1
7. Dãy số liên tục là chính phương trừ 1 N*N-1
8. Dãy số liên tục là lập phương đúng N*N*N
9. Dãy số liên tục là lập phương đúng cộng 1 N*N*N+1
10. Dãy số liên tục là lập phương đúng trừ 1 N*N*N-1
11. Dãy số liên tục theo qui luật có dạng tổng quát là Q*N+R
Q*N+R, với 0<R<Q<10 (Q, R được sinh ngẫu
nhiên)
Dãy số theo qui luật logic chặt (sử dụng hàm để tạo
dãy)
12. Dãy các số nguyên tố liên tục MakePrime(N)
13. Dãy các số hợp số liên tục MakeCom(N)
14. Dãy số Fibonaci (*) Fibonaci(N)
15. Dãy số liên tục chỉ có ước nguyên tố là 2 và 3 Make23(N)
279 | T h i ế t k ế p h ầ n m ề m
Stt Name Công thức
16. Dãy số liên tục chỉ có ước nguyên tố là 2, 3 và 5 Make235(N)
17. Dãy số có dạng n + F(n) - tổng của dãy số tự nhiên MakeGFi(N)
và dãy Fibonaci (*)
18. Dãy số sinh theo qui luật (+N,-M), số hạng đầu Make07(N)
tiên là bất kỳ, N, M là các số tự nhiên bất kỳ.
19. Dãy số sinh theo qui luật (+N1,+N2,-M1,-M2), số Make08(N)
hạng đầu tiên bất kỳ, N1, N2, M1, M2 là các số tự
nhiên.
Dãy số theo qui luật logic lỏng (sử dụng thủ tục sinh
phần tử tiếp theo)
20. Dãy đơn điệu tăng An < An+1
21. Dãy đơn điệu giảm An > An+1
22. Dãy chỉ bao gồm các số chẵn An mod 2 = 0
23. Dãy chỉ bao gồm các số lẻ An mod 2 = 1
24. Dãy là một cấp số cộng An+1=
2*An -An-1
25. Dãy là một cấp số nhân An+1=
An*An/An-1
26. Dãy bao gồm các số > 0 An > 0
27. Dãy bao gồm các số < 0 An < 0
28. Dãy chỉ bao gồm các số nguyên tố MakePNext()
29. Dãy chỉ bao gồm các số chính phương MakeSQ()
30. Dãy chỉ bao gồm các số là hợp số MakeC()
31. Dãy chỉ bao gồm các số chia hết cho 10 MakeTen()
32. Dãy chỉ bao gồm các số chia hết cho 4 MakeFour()
33. Dãy chỉ bao gồm các số chia hết cho 5 MakeFive()
34. Dãy số có tính chất hiệu hai số bất kỳ đều chia hết DiffDFive()
cho 5.
Dãy số đặc biệt (dùng thủ tục hoặc hàm số sinh dãy)
35. Dãy số thập phân của PI PISeq(N)
314159265358979323846264338
32795
36. Dãy số thập phân của căn 2 (*) SQRT2(N)
141421356237309504880168872
42097
37. Dãy chữ số của các số tự nhiên <100 viết liền NaturalSeq(N)
nhau
12345678910111213141516171819202122...
280 | T h i ế t k ế p h ầ n m ề m
Stt Name Công thức
38. Dãy chữ số của các số tự nhiên chẵn <100 viết EvenSeq(N)
liền nhau
246810121416182022242628303234363840..
39. Dãy chữ số của các số tự nhiên lẻ <100 viết liền OddSeq(N)
nhau
13579111315171921232527293133....
40. Dãy số sắp xếp theo thứ tự từ điển Việt Nam VNAlphabet(N)
3 4 7 9 2 0 1 10 5 6 8
5. Mở rộng chương trình điền số vào dãy bằng giao diện điền số vào 1 ô trống của
một ma trận, ví dụ, kích thước 3 x 3. Chương trình này thực chất là mở rộng của
bài toán trên với số lượng phần tử của dãy pNumber = 9.
281 | T h i ế t k ế p h ầ n m ề m
Chủ đề 8.
Phần mềm hỗ trợ học Khoa học
Mục tiêu:
- Thiết lập các dạng bài toán mô tả các hiện tượng thực tế, có tính chính xác và
khoa học.
- Thiết kế một số phần mềm đơn giản cho môn Khoa học tự nhiên.
Nội dung chính
1. Mô phỏng đồng hồ và lịch
Chúng ta cùng thiết kế bài toán mô phỏng lịch bàn, có dạng như hình sau.
282 | T h i ế t k ế p h ầ n m ề m
Hàm cảm biến thời gian của Scratch.
year: năm hiện thời, ví dụ: 2017.
month: tháng hiện thời, ví dụ: 8
date: ngày (trong tháng) hiện thời, ví dụ: 10
day of week: ngày trong tuần, tính bắt đầu từ CN.
CN: 1, thứ 2: 2, …., thứ 7: 7.
hour: giờ hiện thời, tính từ 0 đến 23.
minute: phút hiện thời, tính từ 0 đến 59.
second: giây hiện thời, tính từ 0 đến 59.
Dãy tọa độ của tâm các ô lưới của lịch được lưu trong 2 dãy số XList và YList
như sau:
XList -180 -120 -60 0 60 120 180
YList 80 40 0 -40 -80 -120 -160
Ví dụ tọa độ tâm của ô lưới đầu tiên (góc trái trên) là (-180, 80). Từ đó suy ra tọa
độ điểm góc trái trên của lưới vẽ lịch tháng có tọa độ là (-210, 100). Tọa độ này
được gán cho cặp biến nhớ XPos, YPos.
Để tổng quát, chúng ta sẽ viết chương trình vẽ lưới kích thước m x n với các biến
nhớ m và n được gán trước = 7.
283 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình gốc chuẩn bị cho vẽ lưới như sau, trong đó thủ tục vẽ lưới
chính là Draw-Latice.
284 | T h i ế t k ế p h ầ n m ề m
- Nhóm các dữ liệu hệ thống khác.
Tên biến nhớ Ý nghĩa Ghi chú
Year Biến nhớ ghi số năm của lịch. Mặc định là năm hiện
thời.
Month Biến nhớ ghi số tháng của lịch (từ Mặc định là tháng
1 đến 12). hiện thời.
Date Biến nhớ ghi ngày của tháng (từ 1 Mặc định là ngày
đến 31). hiện thời.
Hour Biến nhớ ghi giờ của ngày (từ 0 Mặc định là giờ hiện
đến 24). thời.
Minute Biến nhớ ghi phút của giờ (từ 0 Mặc định là phút
đến 59). hiện thời.
Second Biến nhớ ghi giây của phút (từ 0 Mặc định là giây hiện
đến 59). thời.
leap-year Tham số này dùng để kiểm tra Giá trị này cần được
xem năm với giá trị year có phải tính toán dựa trên
là nhuận hay không. year.
CurrDay Ngày trong tuần của Date hiện Giá trị này chính là
thời (từ 1 đến 7 tương ứng với CN hàm:
thứ 7).
FirstDay Ngày trong tuần của ngày mùng 1 Giá trị này cần tính
của tháng. toán.
DayOfMonth Mảng 12 số lưu lại số ngày của
(list) các tháng tương ứng của năm hiện
thởi. Ví dụ với năm nhuận, dãy
này có giá trị như sau:
31, 29, 31, 30, 31, 30, 31, 31, 30,
31, 30, 31.
DayList (list) Dãy tên tiếng Việt của các ngày
trong tuần, bắt đầu từ "Chủ nhật",
"Thứ 2", …., "Thứ 7".
MonthList Dãy tên tiếng Việt của các tháng
trong năm, bắt đầu từ "Tháng
Giêng", "Tháng 2", …. , "Tháng
Chạp".
XList, YList Dãy các tọa độ X, Y của tâm các ô
lưới của lịch tháng.
285 | T h i ế t k ế p h ầ n m ề m
e) Sơ đồ hoạt động hệ thống
Sơ đồ hoạt động của chương trình này rất đơn giản. Điều quan trọng nhất là tất cả
các thông số, biến nhớ hệ thống cần được kích hoạt, tính toán trước khi thực hiện
các công việc thể hiện lịch và đồng hồ hệ thống trên màn hình.
Đầu tiên là việc thiết lập các thông số hệ thống ban đầu, lấy từ các hàm cảm biến
của Scratch.
Tiếp theo là tính toán các thông số hệ thống dựa trên các giá trị đã được gán ở
bước trên.
- Tính toán năm nhuận.
286 | T h i ế t k ế p h ầ n m ề m
Định nghĩa Năm year là nhuận nếu:
năm nhuận. year chia hết cho 4 trừ ra trường hợp year chia hết cho 100 và
không chia hết cho 400.
Thủ tục sau nhận giá trị đầu vào là year, kiểm tra xem có phải là năm nhuận
không và gán kết quả cho biến leap-year.
- Bước tiếp theo cần tính ngày trong tuần chính xác của ngày mùng 1 của tháng
hiện thời.
Đầu vào: Date, CurrDay. Đầu ra cần tính: FirstDay.
Tính toán này quan trọng vì nó xác định vị trí đặt ngày mùng 1 của tháng trên ô
lưới.
Thủ tục sau sẽ tính toán giá gtrị FirstDay. Thuật toán này khá đơn giản có thể mô
tả như sau:
287 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình cụ thể như sau:
Đây là chương trình tính toán các thông số hệ thống sau khi nhận được thông điệp
Reset, trước khi gửi thông điệp Start.
Tính FirstDay.
288 | T h i ế t k ế p h ầ n m ề m
Cần thiết kế 2 nhân vật có tên, ví dụ, Ngày - Tuần và Ngày - Tháng để thực hiện
các công việc trên.
Đoạn chương trình sau sẽ thể hiện các ngày trong tuần tại dòng tiêu đề của lịch, sử
dụng lệnh stamp. Nhân vật Ngày - Tuần sẽ có đúng 7 trang phục, tương ứng với
hình ảnh của các chữ CN, Th 2, …., Th 7.
Nhân vật Ngày - Tháng có 31 trang phục tương ứng với các chữ số từ 1 đến 31
được tạo ra để thể hiện các số của lịch tháng. Có thể sử dụng lệnh stamp để vẽ
các số này trên lịch như trên.
Nhưng ở đây chúng ta sẽ dùng công nghệ Clone để thực hiện công việc này. Mỗi
giá trị số trên lịch tháng là một phân thân của nhân vật Ngày - Tháng. Cách làm
này về hiệu ứng thể hiện giống như trên nhưng có thể phát triển nhiều tính năng
mở rộng sau này, ví dụ khai thác thêm thông tin của từng ngày trong tháng.
Cần thiết lập các biến nhớ riêng của Ngày - Tháng như sau:
ID Biến nhớ này sẽ lưu trữ số thứ tự hay chính là ngày
(date) trong tháng (từ 1 đến 31).
DayID Biến nhớ này lưu trữ ngày trong tuần của date (ID)
hiện thời của nhân vật. Giá trị nhận từ 1 (CN) đến 7
(thứ 7).
Đoạn chương trình sau mô tả cách sinh các clone và phân bổ chúng trên lưới của
lịch tháng hiện thời.
289 | T h i ế t k ế p h ầ n m ề m
g) Lập trình hiện thông tin ngày, tháng, năm
Để thể hiện thông tin ngày, tháng, năm và thời gian chúng ta sẽ sử dụng nhân vật
Number bao gồm trang phục là các số từ 0 đến 9.
Cần thiết lập các chương trình thể hiện phần phía trên của lịch tháng như sau.
Cần thiết lập 1 thủ tục chung Show Number (n, X, Y) để thể hiện số n bắt đầu từ
vị trí tọa độ (X, Y) như sau.
Thủ tục này gần tương tự thủ tục hiện số bằng hình ảnh đã được trình bày trong
các chủ đề trước nhưng ở đây được thiết kế đơn giản hơn.
290 | T h i ế t k ế p h ầ n m ề m
Để đơn giản, trong thủ tục
này cố định độ rộng các chữ
số thể hiện.
Đây là đoạn chương trình hiển thị Ngày hiện thời và Tháng, Năm hiện thời trên
màn hình, phía trên lịch tháng.
291 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình sau sẽ thể hiện đồng hồ điện tử chạy online trên màn hình.
Tuy nhiên muốn mô phỏng các bánh xe này quay đúng như trên thực tế thì bài
toán trở nên khó hơn nhiều, yêu cầu các tính toán chính xác, khoa học.
Chúng ta cùng tìm hiểu các bài toán bánh xe quay trong phần này.
292 | T h i ế t k ế p h ầ n m ề m
Giả sử vòng tròn có bán kính R và được quay 1 góc bằng α, khi đó cung tròn
tương ứng sẽ có độ dài như công thức sau đây.
Nếu 2 vòng tròn có bán kính R1, R2 tiếp xúc với nhau như hình sau. Nếu vòng tròn
thứ nhất quay 1 góc α thì vòng tròn thứ 2 sẽ quay theo chiều ngược lại 1 góc β
thỏa mãn đẳng thức: R1.α = R2.β. Điều này suy từ công thức tính độ dài cung
tròn trong hình trên.
Bây giờ chúng ta thiết kế 1 chương trình đơn giản, mô phỏng 2 bánh xe quay
ngược chiều và tiếp xúc với nhau. Yêu cầu là phải mô phỏng chính xác, khoa học.
Banh xe 2.sb2
Trong chương trình này, 2 nhân vật bánh xe sẽ được đặt tên là R1, R2 với 2 bán
kính gốc = R1, R2. Hai vòng tròn sẽ quay ngược chiều nhau với các giá trị góc
tương ứng là alpha và beta.
293 | T h i ế t k ế p h ầ n m ề m
Cần thiết lập quan hệ giữa alpha và beta. Giá trị alpha sẽ được thiết lập ngẫu
nhiên, beta sẽ được tính phụ thuộc vào alpha.
Đoạn chương trình sau mô tả việc tính toán ban đầu. Chú ý rằng R1, R2 là độ dài
gốc bán kính của 2 nhân vật vòng tròn. Trên màn hình 2 vòng tròn này được thể
hiện có thể đã có thay đổi kích thước, do vậy cần đưa thêm vào 2 biến nhớ Size1
và Size2 để tính toán kích thước chính xác của 2 bánh xe này.
Đoạn chương trình như sau:
Chú ý: trong mô hình trên, bán kính thực sự của vòng tròn trên màn hình được
tính bằng công thức sau:
𝑆𝑖𝑧𝑒
𝐵𝑅 = 𝑅.
100
Ở đây:
R = bán kính vòng tròn của hình ảnh gốc nhân vật.
Size = tỉ lệ kích thước của nhân vật so với gốc (tính theo %).
BR = bán kính thực tế của vòng tròn trên màn hình.
3. Bánh xe lăn trên đường thẳng
Trong phần này chúng ta sẽ tiếp tục mô tả chuyển động của các bánh xe tròn,
nhưng không phải quay tròn tại 1 vị trí, mà quay (lăn) chuyển động trên một
đường thẳng. Có rất nhiều mô phỏng thực tế của mô hình này, ví dụ chuyển động
của các phương tiện giao thông trên đường phố.
294 | T h i ế t k ế p h ầ n m ề m
Bài toán được đặt ra trong hình sau:
Mô tả 3 cái bánh xe lăn với vận tốc quay ban đầu khác nhau (sinh ngẫu nhiên) trên
một đường thẳng từ trái sang phải.
Thông tin của 3 bánh xe này được ghi trong các biến nhớ sau:
R1, R2, R3 Bán kính gốc các bánh xe (kích thước gốc ban đầu)
Size1, Size2, Size3 Kích thước hiện thời của các nhân vật bánh xe.
BR1, BR2, BR3 Bán kính hiện thời của các bánh xe trên màn hình.
alpha, beta, gamma Các góc quay của bánh xe tương ứng.
Các thông số trên được tính toán trong chương trình như sau:
295 | T h i ế t k ế p h ầ n m ề m
Các chương trình điều khiển, ví dụ, bánh xe 1 sẽ như sau:
- Thiết lập vị trí ban đầu.
- Thiết lập vòng quay ngẫu nhiên. Khi bấm vào nút Start mới bắt đầu cho bánh xe
quay và chạy.
296 | T h i ế t k ế p h ầ n m ề m
Như vậy lời giải của bài toán trên như sau:
- Trong khi cho vòng tròn với bán kính R1 quay xung quanh mình 1 góc α (ngược
kim đồng hồ).
- Đồng thời bản thân nhân vật vòng tròn này sẽ quay xung quanh điểm O, theo quĩ
đạo tròn bán kính R - R1, với vận tốc quay tương ứng là β.
Chương trình cần thiết lập sẽ mô phỏng 3 bánh xe chuyển động và trượt bên trong
1 hình tròn lớn bán kính R. Các nhân vật bánh xe này có tốc độ quay ban đầu sinh
ngẫu nhiên.
3 banh xe đi
tron.sb2
297 | T h i ế t k ế p h ầ n m ề m
Đoạn chương trình thiết lập và tính toán các thông số hệ thống như sau:
Điều khiển các bánh xe này gần tương tự nhau. Sau đây là các chương trình điều
khiển Bánh xe 1.
298 | T h i ế t k ế p h ầ n m ề m
Còn đây là đoạn chương trình dùng để vẽ vòng tròn lớn bán kính R. Vòng tròn
này cần được vẽ trước khi thực hiện các công việc khác.
3 banh xe đi
cong.sb2
Hàm số y = f(x)
299 | T h i ế t k ế p h ầ n m ề m
Mô phỏng bài
toán bánh xe
chuyển động trên
1 đường cong bất
kỳ.
Giả sử tại thời điểm hiện thời, vị trí bánh xe tại điểm A (tâm tại O).
A = (X0, Y0), Y0 = f(X0).
Ở thời điểm tiếp theo, khi bánh xe quay 1 góc α, bánh xe đi đến điểm B (tâm đến
O1).
B = (X1, Y1), Y1 = f(X1).
Cần tính toán chính xác tọa độ điểm B và tâm O1 .
Khi góc quay α khá nhỏ, có thể coi đoạn AB chính là cung AB, do đó AB được
tính theo công thức mà chúng ta đã biết:
𝜋
𝑑 = 𝑅. 𝛼.
180
Đặt AC = dx, BC = dy.
Với α khá bé thì có thể tính xấp xỉ: dy = dx. f'(X0).
Do đó ta có đẳng thức:
300 | T h i ế t k ế p h ầ n m ề m
Bây giờ chúng ta sẽ tính tọa độ điểm O1 .
Vector tiếp tuyến với đồ thị hàm số y = f(x) tại điểm B có hướng là:
υ = (1, f'(X1))
do đó vector vuông góc với υ và hướng vào tâm sẽ có hướng:
η = (-f'(X1), 1)
Do đó vector BO1 sẽ được tính theo công thức:
1
(−𝑅. 𝑓 ′ (𝑋1 ), 𝑅)
√1 + 𝑓′(𝑋1 )2
Tọa độ của tâm O1 sẽ được tính như sau:
𝑅.𝑓′(𝑋1)
Xt = X1 -
Công thức tính √1+ 𝑓′(𝑋1 )2
tọa độ tâm O1. 𝑅
Yt = Y1 +
√1+ 𝑓′(𝑋1 )2
301 | T h i ế t k ế p h ầ n m ề m
Bây giờ chúng ta sẽ thiết kế chương trình cụ thể với 3 bánh xe chạy trên đồ thị
hàm số dạng ax2 + b.
Trong ví dụ cụ thể sau, a = 0.003, b = -150.
Thiết lập các biến nhớ hệ thống của chương trình.
a hằng số tham gia vào định nghĩa của hàm f(x)
R1, R2, R3 Bán kính gốc các bánh xe (kích thước gốc ban đầu)
Size1, Size2, Size3 Kích thước hiện thời của các nhân vật bánh xe.
BR1, BR2, BR3 Bán kính hiện thời của các bánh xe trên màn hình.
Các bán kính này được tính theo công thức:
BR1 = R1.Size1 / 100.
alpha, beta, gamma Các góc quay của bánh xe tương ứng.
X1, Y1, X2, Y2. X3, Y3 Tọa độ các điểm trên đồ thị là điểm tiếp xúc của
bánh xe tương ứng.
dx1, dx2, dx3 Các số gia tương ứng trên trục X của mỗi bước lặp.
n1, n2, n3 Các biến nhớ phụ lưu trữ giá trị tính toán trung
gian.
1
√1 + 𝑓′(𝑋)2
BX1, BY1, BX2, BY2, Tọa độ các tâm bánh xe tương ứng với các điểm
BX3, BY3 tiếp xúc X1, Y1, X2, Y2. X3, Y3.
Đoạn chương trình thiết lập các thông số ban đầu của chương trình.
302 | T h i ế t k ế p h ầ n m ề m
Sau đây là phần điều khiển bánh xe 1. Hoàn toàn tương tự cho các bánh xe còn
lại.
Thiết lập vị trí ban đầu của bánh xe. Có thể đặt ở bất kỳ vị trí nào trên đồ thị.
Tọa độ tâm
bánh xe.
Thiết lập vị trí
ban đầu.
Chương trình điều khiển bánh xe luôn quay với vận tốc quay alpha.
Đây là đoạn chương trình chính điều khiển bánh xe chuyển động trên đồ thị hàm
số y = f(x), từ trái sang phải, gặp cạnh phải sẽ xuất hiện lại bên cạnh trái.
303 | T h i ế t k ế p h ầ n m ề m
Đây là đoạn chương trình vẽ đồ thị hàm số y = f(x) trên mặt phẳng sân khấu.
304 | T h i ế t k ế p h ầ n m ề m
6. Mô phỏng bắn súng
Chúng ta sẽ thiết kế trò chơi mô tả bắn súng đại bác tiêu diệt mục tiêu cho trước.
Yêu cầu của chương trình là mô phỏng đường đi của viên đạn chính xác gần như
thực tế. Giao diện của trò chơi sẽ như hình sau.
305 | T h i ế t k ế p h ầ n m ề m
Mô tả hoạt động của chương trình.
- Chương trình sẽ tự động thiết lập màn hình nền và vị trí của mục tiêu trên màn
hình.
- Người dùng được điều chỉnh vận tốc đạn và góc quay của súng, có thể điều
chỉnh trực tiếp trên thanh trượt của biến nhớ hoặc nháy nút để nhập chính xác 1
số.
- Bấm phím Space để thực hiện lệnh bắn (Fire).
- Viên đạn sẽ bắn ra khỏi nòng súng và bay trên 1 quĩ đạo chính xác trên màn
hình.
- Nếu trúng mục tiêu sẽ nghe tiếng nổ và viên đạn bốc lửa như hình sau.
- Nếu bắn trượt bị trừ 7 điểm, nếu bắn trúng được thưởng 50 điểm.
Như vậy thuật toán quan trọng nhất của trò chơi này là thiết lập quĩ đạo chính xác
của viên đạn khi ra khỏi nòng súng.
Quĩ đạo viên đạn
Mô tả quĩ đạo chuyển động của viên đạn là phần khó nhất của chương trình này.
2 tham số quan trọng của chương trình: Góc hướng súng, Angle = α và Vận tốc
viên đạn, Speed = υ (m/s).
α
υx
Vận tốc ban đầu được phân bổ thành 2 thành phần υx và υy .
υx = υ.cos(α); υy = υ.sin(α)
quĩ đạo chuyển động của viên đạn tính theo thời gian t như sau:
𝒈.𝒕𝟐
x(t) = υx.t; y(t) = υy.t -
𝟐
Ở đây t tính bằng giây (s), g = 9.8 m/s2 ; vận tốc tính bằng m/s.
306 | T h i ế t k ế p h ầ n m ề m
Từ các công thức trên chúng ta sẽ tính được tọa độ và vẽ được đường đi của viên
đạn với vận tốc ban đầu = Speed (υ) và góc ban đầu = Angle (α).
Mô tả viên đạn bắn ra khỏi nòng sẽ dùng công nghệ lập trình Clone của Scratch.
Thiết kế biến nhớ hệ thống.
Biến nhớ chung, hệ thống.
Score Biến nhớ ghi điểm số của người chơi.
Speed Vận tốc bắn ra của súng (ký hiệu V).
Angle Góc của súng pháo binh (ký hiệu α).
Length Độ dài nòng súng đại bác.
Biến nhớ riêng cho nhân vật viên đạn. Viên đạn sẽ được sinh bởi công cụ
Clone, do vậy mỗi phân thân sẽ có 1 bộ thông số riêng như sau:
ID ID để phân biệt nhân vật gốc và clone. Viên đạn clone sẽ có ID
= 1, viên đạn gốc sẽ có ID = 0.
Vx, Vy Các thành phần vector vận tốc của viên đạn hiện thời.
dx, dy, xPos, Các biến nhớ riêng dùng để mô tả quĩ đạo chuyển động của
yPos, t viên đạn.
307 | T h i ế t k ế p h ầ n m ề m
Một số chú ý khi viết chương trình chi tiết.
(a) Chú ý giá trị góc Angle.
Trong Scratch qui định hướng thẳng đứng lên trên là góc 0 độ, nhưng góc Angle
của bài toán mô phỏng là góc so với trục ngang X, do vậy khi thực hiện các thao
tác với số đo góc này cần thực hiện như hình sau.
Góc của lệnh Point in Phím trái sẽ tăng Angle lên 1 độ,
direction phải là phím phải sẽ giảm Angle xuống 1
90-Angle. độ.
Theo phân tích trên thì vị trí viên đạn sẽ xuất phát từ điểm (-220, -156) tức là từ
gốc của nòng súng (tâm bánh xe). Chúng ta có thể mô phỏng viên đạn phóng ra từ
đầu nòng súng. Cách làm như sau:
Gọi độ dài nòng súng là Length, khi đó tọa độ điểm đầu của nòng súng sẽ được
mô tả như trong hình sau.
Khi đó các đoạn chương trình mô phỏng vị trí xuất phát của viên đạn sẽ được sửa
lại như sau:
308 | T h i ế t k ế p h ầ n m ề m
(c) Điều khiển quĩ đạo viên đạn
Viên đạn sẽ được lập trình chuyển động khi người dùng bấm phím Space, thông
điệp Fire được gửi từ nhân vật Canon.
Đoạn chương trình thiết lập các tham số ban đầu của viên đạn bao gồm các vận
tốc thành phần (υx, υy) và thời gian t = 0.
Quĩ đạo của viên đạn sẽ được mô tả theo thuật toán sau:
309 | T h i ế t k ế p h ầ n m ề m
Lập trình chi tiết
(a) Điều khiển súng đại bác
Toàn bộ các chương trình điều khiển súng như sau:
Lệnh trên
các nút
Sân khấu
thực hiện
(c) Sân khấu sẽ thiết lập trạng thái ban đầu và gửi thông điệp Reset để bắt đầu
cuộc chơi.
Nhận được Reset, sân khấu sẽ thay đổi nền và mục tiêu tác chiến sẽ hiển thị ngẫu
nhiên trên màn hình.
Mục tiêu tác chiến: Sân khấu:
310 | T h i ế t k ế p h ầ n m ề m
(d) Điều khiển đạn.
Đây là phần khó nhất của chương trình.
Viên đạn sẽ có 2 trạng thái thể hiện là (1) hình viên đạn, sẽ được thể hiện với 8%
kích thước gốc và (2) hình ngọn lửa khi rơi trúng đích sẽ được thể hiện với 33%
kích thước gốc. Cần tìm hoặc thu âm 2 âm thanh: Fire khi bắt đầu bắn đạn ra khỏi
nòng và BigFire khi bắn trúng đích.
Trang phục
Khi bắt đầu chương trình, thiết lập ID = 0 cho nhân vật gốc và ẩn không hiện trên
màn hình.
Khi nhận thông điệp Fire, sẽ tiến hành phân thân, tạo ra 1 viên đạn Clone tại đầu
nòng súng. Chương trình như sau:
Thiết lập ID = 1 để
gán cho các clone giá
trị này.
Tạo 1 clone.
311 | T h i ế t k ế p h ầ n m ề m
Chương trình điều khiển quĩ đạo viên đạn như sau:
7. Mô phỏng Bi-a
Chúng ta đều biết qui luật đánh bóng của trò chơi Bi-a. Trong Scratch cũng có 1
lệnh mô tả 1 nhân vật khi va chạm vào cạnh sân khấu thì sẽ bị bật lại như thế nào,
Bi-a.sb2
312 | T h i ế t k ế p h ầ n m ề m
Khi nháy chuột quả bóng bắt đầu chuyển động với vận tốc trung bình và hướng
đến vị trí đã nháy chuột. Khi gặp cạnh hình chữ nhật bóng sẽ bật lại theo đúng
nguyên tắc của trò chơi bi-a.
Bất cứ lúc nào em nháy chuột sẽ làm đổi hướng bóng: bóng sẽ chuyển động về
hướng con trỏ chuột. Khi gặp cạnh sẽ có 1 tiếng kêu nhỏ phát ra.
Chú ý: Khung hình chữ nhật đỏ có thể là hình ảnh nền sân khấu, có thể là 1 nhân
vật Scratch, có thể là hình vẽ do chính quả bóng vẽ ra khi chạy chương trình.
Giả sử khung đỏ chữ nhật có tọa độ các đỉnh trái dưới là (X1, Y1), đỉnh đối diện
phải trên là (X2, Y2), tọa độ tâm là (X0, Y0).
Khi đó cần lập trình nhận biết và xử lý 8 trường hợp bóng va vào cạnh khung chữ
nhật như hình dưới đây.
2
6 5
Tọa độ (X2, Y2)
8
7
4
Tọa độ (X1, Y1)
Trong đó:
- Các trường hợp 1, 2, 3, 4 là va vào các cạnh phải, trên, trái, dưới của khung.
- Các trường hợp 5, 6, 7, 8 là đi vào chính giữa các góc của chữ nhật.
Sử dụng cảm biến màu sắc để xử lý từng trường hợp trên.
Bảng sau mô tả chi tiết các trường hợp cần xử lý.
313 | T h i ế t k ế p h ầ n m ề m
Vị trí Hình ảnh mô tả Điều kiện và lệnh thực hiện
1 Va chạm cạnh phải của khung.
Điều kiện:
X > X0 và | X-X2| < |Y-Y1| và |
X-X2| < |Y-Y2|
Xử lý:
Quay trái 2α.
314 | T h i ế t k ế p h ầ n m ề m
Vị trí Hình ảnh mô tả Điều kiện và lệnh thực hiện
Quay phải |2α| - 180o
5 Hướng thẳng giữa vào góc phải
trên.
Điều kiện: |X-X2| = |Y-Y2|
Trường hợp này α = 45o
Xử lý: quay trái 180 độ.
6 Hướng thẳng giữa vào góc trái
trên.
Giả sử bóng xuất phát từ điểm A, va vào cạnh tại điểm B và bật lại tại điểm A'.
Gọi A'' là điểm đối xứng của A' qua cạnh.
1. Bóng gặp cạnh phải
Khi bóng va đập vào cạnh phải của hình chữ nhật đỏ, có 2 khả năng xảy ra:
- Bóng di chuyển hướng lên trên. Khi đó ta có 0 <= α <= 90o.
- Bóng di chuyển hướng xuống dưới, khi đó: Trường hợp 90o <= α <= 180o.
Chúng ta cùng quan sát và phân tích 2 trường hợp này.
315 | T h i ế t k ế p h ầ n m ề m
Trường hợp 0 <= α <= 90o Trường hợp 90o <= α <= 180o
B' B'
B'' B''
Hướng bóng (AA") sẽ quay trái 2 lần Hướng bóng AA'' sẽ quay phải 2 lần
góc A''BB' chính bằng α. Do vậy góc A''BB'' = 180 - α. Do đó kết quả là
trường hợp này kết quả là: quay phải 1 góc = 2(180 - α) = 360 -
Quay trái 1 góc 2α. 2α. Đây chính là quay trái 1 góc 2α.
Kết quả là:
Quay trái 1 góc 2α.
Hướng bóng AA'' sẽ quay phải 2 lần (chú ý: số đo góc α < 0). Hướng bóng
góc A''BB"" = 90 - α. Do đó kết quả AA'' sẽ quay trái 1 góc bằng 2 lần góc
là: A''BB' = 90 - |α|. Do đó kết quả là:
Quay phải 1 góc 180 - 2α. Quay trái 1 góc 180 - |2α|
316 | T h i ế t k ế p h ầ n m ề m
Trường hợp -90o <= α <= 0o Trường hợp -180o <= α <= -90o
B' B'
B'' B''
(chú ý: số đo góc α < 0). Hướng bóng (chú ý: số đo góc α < 0). Hướng AA''
AA'' sẽ quay phải 1 góc bằng 2 lần góc sẽ quay trái 1 góc bằng 2 lần góc
A''BB' = |α|. Vậy kết quả là: A''BB'' = 180 - |α|. Kết quả là quay trái
1 góc = 360 - |2α| hay chính là quay
Quay phải 1 góc |2α|. phải 1 góc |2α|.
Quay phải 1 góc |2α|.
317 | T h i ế t k ế p h ầ n m ề m
Lập trình chi tiết
a) Thiết lập trạng thái ban đầu của chương trình, vẽ khung chữ nhật đỏ, xác định
các đỉnh bằng cách gán giá trị cho các biến nhớ X1, Y1, X2, Y2.
Lần đầu tiên nháy chuột sẽ làm cho quả bóng chuyển động và chuyển động mãi
mãi.
318 | T h i ế t k ế p h ầ n m ề m
c) Điều khiển quả bóng bật lại khi gặp cạnh hình chữ nhật.
Dùng cảm biến màu sắc để điều khiển quá trình này của quả bóng.
Mỗi khi gặp cạnh hình chữ nhật đỏ, đoạn chương trình sau sẽ được chạy để thiết
lập chế độ chuẩn bị "bật lại".
Đây là nhóm các lệnh kiểm tra điều kiện quả bóng gặp cạnh, các trường hợp 1, 2,
3, 4 đã nêu trong các phần trên.
Đoạn chương trình xử lý các trường hợp 5, 6, 7, 8, đi thẳng vào các góc hình chữ
nhật. Tất cả đều được xử lý bằng 1 lệnh là quay trái 180 độ.
319 | T h i ế t k ế p h ầ n m ề m
Câu hỏi - Bài tập - Mở rộng
1. Mở rộng chương trình xem đồng hồ và lịch như sau:
Bổ sung 2 nút Next, Previous có tính năng sau: nháy lên các nút này sẽ chuyển
lịch sang tháng sau (nút Next) và tháng trước đó (nút Previous).
2. Trong chương trình lịch và đồng hồ, thay đồng hồ số bằng đồng hồ chạy kim.
3. Trong chương trình 3, nếu chúng ta thay, ví dụ với bánh xe 1, đoạn chương
trình sau:
320 | T h i ế t k ế p h ầ n m ề m
5. Mô tả 1 bánh xe chuyển động trong 1 hình chữ nhật như hình sau.
321 | T h i ế t k ế p h ầ n m ề m
PHỤ LỤC: CÁC TẬP LỆNH SCRATCH
1. Nhóm câu lệnh Move
Câu lệnh Ý nghĩa
Dịch chuyển nhân vật <10> bước theo
hướng hiện thời. Chú ý: mỗi bước = 1
pixel.
Xoay nhân vật <15> độ theo chiều kim
đồng hồ.
Xoay nhân vật <15> độ ngược chiều kim
đồng hồ.
Quay nhân vật theo hướng được xác định
(trong hình: 90 độ). Các hướng chính:
Up (trên): 0o
Right (phải): 90o
Left (trái): -90o
Down (xuống): 180o
Chú ý: lệnh này sẽ xoay nhân vật theo
tâm của mình. Mỗi nhân vật sẽ có 1 tâm
duy nhất. Có thể dùng chức năng tinh
chỉnh đồ họa đề thay đổi vị trí tâm của
nhân vật.
Xoay nhân vật theo hướng của 1 nhân vật
khác. hoặc vị trí con trỏ chuột.
322 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
gian có thể nhập là số thập phân, ví dụ
1.5 là 1 giây rưỡi.
Thay đổi tọa độ X của nhân vật theo giá
trị cho trong lệnh. Giá trị có thể là số
dương hoặc số âm. Nếu giá trị > 0 thì
nhân vật chuyển động sang phải, nếu giá
trị < 0 thì nhân vật chuyển động sang trái.
Thiết lập giá trị tọa độ X của nhân vật.
Giá trị tham số của lệnh trong khoảng -
240 đến 240.
Thay đổi tọa độ Y của nhân vật theo giá
trị cho trong lệnh. Giá trị có thể là số
dương hoặc số âm. Nếu giá trị > 0 thì
nhân vật chuyển động lên trên, nếu giá trị
< 0 thì nhân vật chuyển động xuống dưới.
Thiết lập giá trị tọa độ Y của nhân vật.
Giá trị tham số của lệnh trong khoảng -
180 đến 180.
Nếu gặp cạnh màn hình, quay lại.
Đây là lệnh rất quan trọng. Lệnh sẽ điều
khiển nhân vật khi di chuyển gặp cạnh
của màn hình thì nhân vật sẽ "bật" trở lại
theo nguyên tắc đối xứng gương.
Thiết lập kiểu quay của nhân vật (ví dụ
khi gặp cạnh màn hình). Có 3 kiểu quay:
trái - phải (right-left), không quay (do not
rotate), quay tròn (all around).
(hàm) trả lại giá trị tọa độ X của nhân vật.
323 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
Thể hiện dòng chữ suy nghĩ
"Hmm…" trong khi chương trình
vẫn chạy bình thường.
Hiện nhân vật trên màn hình.
324 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
Chuyển nhân vật lên lớp trên cùng.
Đặt màu sắc cho bút theo mẫu màu. Dùng chuột
nháy chọn vị trí để chọn màu.
Thay đổi màu của bút theo giá trị <10> được
nhập trực tiếp. Cho phép giá trị âm hoặc dương.
Giá trị màu được thiết lập theo hiệu ứng màu sắc
(color effect).
326 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
Thiết lập màu cho bút theo giá trị màu.
Màu sắc có giá trị từ 0 đến 200 phân bổ như sau:
Thay đổi kích thước của bút theo <1> pixel. Giá
trị thay đổi có thể dương hoặc âm.
Thiết lập kích thước bút theo giá trị <1> pixel.
327 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
328 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
Lệnh điều khiển bàn phím. Nhóm
lệnh sẽ chạy khi phím tương ứng
<Space> được bấm.
Lệnh điều khiển chuột. Nhóm
lệnh sẽ chạy khi nháy chuột lên
nhân vật.
Lệnh điều khiển theo sân khấu.
Nhóm lệnh sẽ chạy khi nền sân
khấu thay đổi sang <backdrop1>.
Lệnh điều khiển phụ thuộc vào
độ âm (loudness), thời gian
(timer) và tốc độ của chuyển
động (video motion). Khi các
điều kiện trên thỏa mãn thì nhóm
lệnh sẽ chạy.
Lệnh điều khiển thông điệp.
Nhóm lệnh sẽ được thực hiện khi
nhân vật nhận được thông điệp
<message1>.
Lệnh gửi thông điệp cụ thể
<message1>. Lệnh "when I
receive the message" có tác dụng
trả lời cho thông điệp này. Các
lệnh khác vẫn chạy bình thường.
Chú ý: trong lệnh này có chức
năng tạo 1 thông điệp mới.
Lệnh gửi thông điệp cụ thể
<message1>. Khi gửi thông điệp
chương trình sẽ tạm dừng và chờ
cho đến khi tất cả các nhân vật
khác thực hiện xong các lệnh khi
nhận thông điệp này. Sau đó
chương trình sẽ quay lại thực
hiện các lệnh tiếp theo.
Chú ý: trong lệnh này cũng có
chức năng tạo 1 thông điệp mới.
Ví dụ:
330 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
bản sao (phân thân) có thể chọn từ danh sách.
"itself" là tạo phân thân cho chính mình. Có
thể tạo phân thân cho nhân vật khác.
Lệnh xóa đi 1 bản sao (phân thân) hiện thời.
333 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
(hàm) trả lại tên tài khoản người dùng
trên trang scratch.mit.edu.
334 | T h i ế t k ế p h ầ n m ề m
Câu lệnh Ý nghĩa
floor: làm tròn xuống
celling: làm tròn lên
sqrt: căn bậc 2
sin: hàm lượng giác sin.
cos: hàm lượng giác cosin.
tan: hàm lượng giác tan.
asin: : hàm lượng giác arcsin.
acos: : hàm lượng giác arccos.
atan: : hàm lượng giác arctang.
ln: logarit cơ số e.
log: logarit cơ số 10.
e^: hàm mũ e.
10^: hàm mũ 10.
335 | T h i ế t k ế p h ầ n m ề m
336 | T h i ế t k ế p h ầ n m ề m
Tài liệu tham khảo
[1]. Computing in the national curriculum. A guide for primary teachers.
[2]. Computing in the national curriculum. A guide for secondary teachers.
[3]. Learn to Program with Scratch. Majed Marji.
[4]. Scratch 2.0 Game Development. Sergio van Pul, Jessica Chiang.
[5]. Computer Science Concepts in Scratch. Michal Armoni and Moti BenAri,
2013.
http://stwww.weizmann.ac.il/g-cs/scratch/scratch-14-textbook-1-0-one-side.pdf
[7]. CS unplugged. Giảng dạy khoa học máy tính không cần máy tính.
http://www.csunplugged.org
[8]. Chương trình, chuẩn kiến thức môn Tin học. NXBGD, Hà Nội, 2000.
[9]. Chương trình giáo dục phổ thông tổng thể trong chương trình giáo dục phổ
thông mới. Tài liệu chính thức Bộ Giáo dục và Đào tạo, 2015.
337 | T h i ế t k ế p h ầ n m ề m
https://k12cs.org/wp-content/uploads/2016/09/K%E2%80%9312-Computer-
Science-Framework.pdf.
[20]. Lịch sử phát triển môn Tin học ở Việt Nam. CS4S số 3 (2017).
[21]. Đề cương khung chương trình môn Tin học của Anh quốc (bản mới). CS4S
số 1 (2017).
[22]. Hiểu và đi trong cách mạng công nghiệp lần thứ tư. Hồ Tú Bảo. 2017.
[23]. Tự học lập trình Scratch. Bùi Việt Hà.
[24]. Scratch for beginners. Bùi Việt Hà.
[25]. 20 bài tập lập trình Scratch. Bùi Việt Hà.
[26]. Introduction to Algorithms. Thomas H. Cormen, Charles E. Leiserson,
Ronald L. Rivest, and Clifford Stein.
[27].
[28].
[29].
[30].
338 | T h i ế t k ế p h ầ n m ề m