Một viên ngọc, viên ngọc tuyệt đẹp!
Nhưng bạn biết đấy, thứ còn tuyệt vời hơn một viên ngọc là cả một hàng ngọc!
Và dĩ nhiên, ta đã biết rằng cách tạo hàng ngọc hiệu quả nhất là sử dụng vòng lặp.
Vậy ta cùng sử dụng một vòng lặp for để vẽ 12 viên ngọc.
Đi từ trái sang phải màn hình.
Như thế đó. Ta có
for (var i = 0; i < 12; i++)
Sau đó ta sẽ lấy dòng này và chuyển vào trong đây.
Như vậy ta đã có 12 viên ngọc nhưng chúng lại đang chồng chéo lên nhau.
Hãy nhớ rằng ta đang muốn chúng trải ngang màn hình.
Điều đó có nghĩa là ta cần phải thay đổi x.
Và, hiện tại X = 36, nhưng mỗi lần lặp ta lại cần một giá trị khác.
Vậy tức là biến sẽ phải phụ thuộc vào i.
Ta chỉ cần nói rằng; i*36.
Như vậy viên ngọc đầu tiên nằm tại điểm 0, tiếp theo là 36, rồi 72, và v.v.
Tuyệt vời! Vậy là ta đã có một hàng ngọc.
Tự nhiên làm tôi nhớ đến cảnh trong phim Indiana Jones với Aladdin.
Nam chính phát hiện ra một kho báu dưới lòng đất chứa đầy đá quý
nhưng thường họ tìm được gấp mấy lần chỗ ngọc này.
Không phải một hàng ngọc mà cả đống ngọc luôn!
Vậy làm cách nào để chỗ ngọc này
trải dọc theo màn hình nữa?
Ta có thể bắt đầu bằng cách lặp lại vòng lặp for này, sao chép dán lại
rồi thay đổi y cho mỗi lần lặp.
Như vậy ta sẽ tăng lên 60 và sau đó là 90.
Vậy là ta đã có 3 hàng ngọc rồi, tuyệt vời.
Umm... nhưng tôi bắt đầu thấy chán rồi vì tất cả những gì tôi làm
chỉ là sao chép và dán và thay đổi có xíu xíu.
Thông thường trước đây khi nhận thấy cần phải viết những đoạn mã lặp đi lặp lại
tôi sẽ kiểu: “À chắc mình nên dùng vòng lặp thì hơn.”
Nhưng chúng ta đã đang sử dụng vòng lặp rồi.
Vậy làm thế nào để tránh được sao chép đi dán lại như vậy?
Cái đó chúng tôi hay gọi là “vòng lặp for lồng” – vòng lặp trong vòng lặp.
Ta sẽ tạo một vòng lặp ngoài trước.
Và vòng lặp đó sẽ đảm nhiệm việc trải ngọc dọc theo màn hình,
sau đó vòng lặp trong sẽ tiếp tục mang trọng trách hiện tại,
đó là trải ngọc theo chiều ngang màn hình.
Để tôi cho các bạn xem nhé.
Ta nhập for – lần này ta sẽ sử dụng một biến khác, gọi là j, vì ta đã sử dụng i rồi.
Vậy là for (var j = 0; j < 13; j++)
Được rồi, đó sẽ là vòng lặp ngoài của chúng ta, chịu trách nhiệm trải ngọc dọc màn hình.
Sau đó ta sẽ lấy một trong những vòng lặp for đã tạo từ trước và đưa vào bên trong,
chỉnh sửa bản sao, và xóa những vòng lặp cũ. Được rồi.
Hiện tại ta đã có một đống ngọc chồng hết lên nhau trong cùng một hàng.
Vấn đề là ta cần phải thay đổi y phải không?
Đó là biến mà ta đã thay đổi khi sao chép và dán,
hiện tại Y cố định là 90.
Ta muốn thay đổi y cho từng hàng.
Giống như x phụ thuộc vào i, ta cho y phụ thuộc vào j.
Ta có thể thay đổi thành, ví dụ như, j*30.
Tada! Nhiều ngọc quá! Được rồi đó!
Ta cùng quan sát lại một lượt nhé.
Vòng lặp ngoài tạo biến j và gia tăng biến tới 13.
Và, trong mỗi lần chạy vòng lặp ngoài, vòng lặp trong cũng sẽ chạy.
Vòng lặp trong tạo biến i được gia tăng lên tới 12.
Với mỗi lần chạy vòng lặp trong, ta sẽ có một hình ảnh có tọa độ x và y dựa trên “i” và “j”.
Và vì thế “i” thay đổi thường xuyên hơn “j”.
Để hiểu kỹ lưỡng hơn nữa, ta cùng thử hình dung các giá trị của “i” và “j”.
Tôi sẽ chú thích vào ảnh này
rồi thiết lập tô màu,
tôi sẽ sử dụng lệnh văn bản để thể hiện giá trị của “j” – ta nhập text j
rồi đặt vào vị trí thích hợp tại đây. Được rồi.
Ta có thể thấy “j” tăng từ 0 đến 12.
Về cơ bản đây cũng chính là vị trí của hàng ngọc.
Bây giờ ta sẽ hình dung”i” và xem nó thay đổi như thế nào nhé.
Đối với “i”, ta sẽ tô một màu khác.
Rồi ta sẽ đặt “i” ở đâu đó.
Và ta sẽ thay đổi x để hiển thị ngang màn hình.
Ta cũng thực hiện tương tự đối với y.
Ta có thể thấy rằng “i” đang tăng từ 0 đến 11.
Và “i”, như tôi đã nói, thay đổi thường xuyên hơn rất nhiều.
Dòng mã này sẽ được chạy nhiều lần hơn so với dòng mã này.
Vì dòng mã này được thực hiện với mỗi lần chạy vòng lặp for trong.
Trong khi dòng mã này chỉ được thực hiện khi chạy vòng lặp ngoài.
Hy vọng việc hình dung giá trị “i” và “j” này
có thể giúp các bạn hiểu hơn về vòng lặp for lồng.
Giờ hãy quay lại với số ngọc của chúng ta, vì trông chúng đẹp hơn rất nhiều!
Như vậy ta có thể thực hiện rất nhiều thứ với vòng lặp for lồng
nếu ta coi mọi thứ trên thế giới này
giống như một mạng lưới 2 chiều, ví dụ bàn cờ vua, cái chăn,
những ngôi sao trên quốc kỳ Mỹ, những hình nền và hoa văn hay ho.
Muốn kích thích trí tưởng tượng, trước hết hãy cứ nghịch chỗ mã này đã,
thay đổi hình ảnh chẳng hạn.
Tôi sẽ đổi nó thành hình trái tim!
Để cho các bạn thấy tôi thích vòng lặp for lồng như thế nào! Aww!