[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:01.38,0:00:03.65,Default,,0000,0000,0000,, Giờ hãy nói về thứ mà ta đã dùng Dialogue: 0,0:00:03.65,0:00:05.68,Default,,0000,0000,0000,, trong toàn bộ thời gian này: Hàm. Dialogue: 0,0:00:05.68,0:00:09.14,Default,,0000,0000,0000,, Bất cứ khi nào bạn đã sử dụng các lệnh như rect() hoặc fill() hoặc text(), Dialogue: 0,0:00:09.14,0:00:12.38,Default,,0000,0000,0000,, ta đã gọi các hàm và hàm đó vẽ nên Dialogue: 0,0:00:12.38,0:00:15.13,Default,,0000,0000,0000,, những gì ta bảo chúng làm. Dialogue: 0,0:00:15.13,0:00:16.81,Default,,0000,0000,0000,, Một hàm thực sự là gì? Dialogue: 0,0:00:16.81,0:00:19.48,Default,,0000,0000,0000,, Đó là một bộ code mà ta nhóm lại với nhau Dialogue: 0,0:00:19.48,0:00:21.24,Default,,0000,0000,0000,, và được đặt tên bởi ta muốn Dialogue: 0,0:00:21.24,0:00:23.17,Default,,0000,0000,0000,, dùng hàm đó nhiều lần. Dialogue: 0,0:00:23.37,0:00:25.98,Default,,0000,0000,0000,, Hãy nghĩ về rect()? Hàm rect() làm gì? Dialogue: 0,0:00:25.98,0:00:28.55,Default,,0000,0000,0000,, Nó chỉ vẽ bốn dòng thôi, phải không? Dialogue: 0,0:00:28.55,0:00:31.14,Default,,0000,0000,0000,, Ta chỉ có thể làm điều đó bằng cách dùng hàm line(), phải không? Dialogue: 0,0:00:31.14,0:00:33.85,Default,,0000,0000,0000,, Và ở đây ta thứ trông giống hình chữ nhật. Dialogue: 0,0:00:33.85,0:00:36.75,Default,,0000,0000,0000,, Nhưng ta nhận ra rằng ta muốn Dialogue: 0,0:00:36.75,0:00:39.32,Default,,0000,0000,0000,, vẽ một hình chữ nhật rất nhiều lần, Dialogue: 0,0:00:39.32,0:00:40.77,Default,,0000,0000,0000,, và nó sẽ thực sự phiền toái Dialogue: 0,0:00:40.77,0:00:42.78,Default,,0000,0000,0000,, khi phải làm toán mỗi lần để thử và tìm ra Dialogue: 0,0:00:42.78,0:00:44.28,Default,,0000,0000,0000,, cách vẽ một đường từ góc này sang góc khác Dialogue: 0,0:00:44.28,0:00:45.82,Default,,0000,0000,0000,, và tiếp nữa, tiếp nữa. Dialogue: 0,0:00:45.82,0:00:48.54,Default,,0000,0000,0000,, Vì vậy, thay vào đó, ta chỉ cần hàm rect() thôi, Dialogue: 0,0:00:48.54,0:00:50.86,Default,,0000,0000,0000,, và hàm đó thực hiện chính xác điều tương tự như Dialogue: 0,0:00:50.86,0:00:55.15,Default,,0000,0000,0000,, 4 dòng code đó đã làm, nhưng code thì ít hơn nhiều. Dialogue: 0,0:00:55.15,0:00:58.40,Default,,0000,0000,0000,, Vì vậy, nó thật tuyệt, và rect() là một trong những hàm đó, Dialogue: 0,0:00:58.40,0:01:00.52,Default,,0000,0000,0000,, ta đã có sẵn cho TẤT CẢ các chương trình Dialogue: 0,0:01:00.52,0:01:02.73,Default,,0000,0000,0000,, để dùng ở đây, trên Khan Academy. Dialogue: 0,0:01:02.73,0:01:05.34,Default,,0000,0000,0000,, Nhưng bạn cũng có thể tạo nên các hàm của riêng mình Dialogue: 0,0:01:05.34,0:01:08.41,Default,,0000,0000,0000,, để dùng trong các chương trình của mình. Dialogue: 0,0:01:08.41,0:01:11.43,Default,,0000,0000,0000,, Giả sử ta đang viết một chương trình Dialogue: 0,0:01:11.43,0:01:14.43,Default,,0000,0000,0000,, và ta muốn vẽ Winston nhiều lần - Dialogue: 0,0:01:14.43,0:01:17.02,Default,,0000,0000,0000,, có lẽ bởi ta sẽ kể chuyện đời của Winston Dialogue: 0,0:01:17.02,0:01:20.19,Default,,0000,0000,0000,, và thể hiện anh ấy ở mọi lứa tuổi trong đời. Dialogue: 0,0:01:20.19,0:01:24.24,Default,,0000,0000,0000,, Vì vậy, đây là code vẽ Winston, ta có thể bắt đầu như sau: Dialogue: 0,0:01:24.24,0:01:27.11,Default,,0000,0000,0000,, Ta có các biến 'faceX' và 'faceY' Dialogue: 0,0:01:27.11,0:01:29.03,Default,,0000,0000,0000,, để lưu tâm điểm của khuôn mặt, Dialogue: 0,0:01:29.03,0:01:31.24,Default,,0000,0000,0000,, và rồi ta vẽ mắt và miệng Dialogue: 0,0:01:31.24,0:01:33.04,Default,,0000,0000,0000,, tương ứng với các biến đó. Dialogue: 0,0:01:33.04,0:01:34.73,Default,,0000,0000,0000,, Ngay bây giờ chương trình đã thấy code, Dialogue: 0,0:01:34.73,0:01:37.32,Default,,0000,0000,0000,, và nó không nằm trong bất kỳ hàm nào cả, vì vậy nó chỉ chạy bình thường, Dialogue: 0,0:01:37.32,0:01:39.74,Default,,0000,0000,0000,, và nó chỉ chạy một lần mà thôi. Dialogue: 0,0:01:39.74,0:01:43.72,Default,,0000,0000,0000,, OK, hãy biến nó thành một hàm. Dialogue: 0,0:01:43.72,0:01:46.44,Default,,0000,0000,0000,, Để làm được điều đó, ta làm nó như cách Dialogue: 0,0:01:46.44,0:01:48.49,Default,,0000,0000,0000,, khai báo một biến, vì đó thực sự là Dialogue: 0,0:01:48.49,0:01:50.24,Default,,0000,0000,0000,, những gì ta làm. Dialogue: 0,0:01:50.24,0:01:52.08,Default,,0000,0000,0000,, Vì vậy, ta gõ 'var drawWinston'. Dialogue: 0,0:01:52.08,0:01:54.55,Default,,0000,0000,0000,, Ta đặt cho nó một cái tên đẹp, rất gợi tả, Dialogue: 0,0:01:54.55,0:01:59.04,Default,,0000,0000,0000,, và sau đó là dấu '=', nhưng ở đây, thay vì viết một số hoặc một chuỗi, Dialogue: 0,0:01:59.04,0:02:02.72,Default,,0000,0000,0000,, ta sẽ viết 'hàm' (chắc chắn bạn đánh vần đúng nhé) Dialogue: 0,0:02:02.72,0:02:08.36,Default,,0000,0000,0000,, và sau đó là dấu ngoặc đơn rỗng '()' và sau đó là một dấu ngoặc nhọn '{' Dialogue: 0,0:02:08.36,0:02:11.56,Default,,0000,0000,0000,, và sau đó là dấu ngoặc nhọn nữa '}' và dấu chấm phẩy ';' Dialogue: 0,0:02:11.56,0:02:14.49,Default,,0000,0000,0000,, OK, những gì ta cần làm là đặt mọi thứ Dialogue: 0,0:02:14.49,0:02:19.45,Default,,0000,0000,0000,, ta muốn bên trong hàm ở giữa ngoặc nhọn bắt đầu '{' và kết thúc '}'. Dialogue: 0,0:02:19.45,0:02:22.13,Default,,0000,0000,0000,, Vì vậy, ta sẽ lấy tất cả code ở chỗ này, Dialogue: 0,0:02:22.13,0:02:26.82,Default,,0000,0000,0000,, đặt vào trong hàm (thụt lề cho đẹp) và Ta Da! Dialogue: 0,0:02:26.82,0:02:28.97,Default,,0000,0000,0000,, Như vậy, giờ ta có biến này Dialogue: 0,0:02:28.97,0:02:32.38,Default,,0000,0000,0000,, để lưu một hàm - vì vậy về cơ bản ta đã đưa ra Dialogue: 0,0:02:32.38,0:02:35.76,Default,,0000,0000,0000,, một nhãn cho khối code này, để ta có thể gọi Dialogue: 0,0:02:35.76,0:02:37.86,Default,,0000,0000,0000,, nó bất cứ lúc nào, Dialogue: 0,0:02:37.86,0:02:40.76,Default,,0000,0000,0000,, "Này, hãy tìm khối code có nhãn đó và chạy nó!" Dialogue: 0,0:02:40.76,0:02:43.55,Default,,0000,0000,0000,, Ta đã khiến cho đoạn code này có thể tái sử dụng. Dialogue: 0,0:02:43.55,0:02:46.54,Default,,0000,0000,0000,, Nhưng giờ đây để ý rằng ta không còn Winston nữa! Dialogue: 0,0:02:46.54,0:02:49.36,Default,,0000,0000,0000,, Ta đã mất Winston rồi! Anh ấy đã đi đâu nhỉ? Dialogue: 0,0:02:49.36,0:02:53.02,Default,,0000,0000,0000,, OK - Những gì xảy ra là khi ta đặt cái này vào trong một hàm, Dialogue: 0,0:02:53.02,0:02:55.91,Default,,0000,0000,0000,, ta nói với chương trình rằng "đây là một loạt các code Dialogue: 0,0:02:55.91,0:02:57.84,Default,,0000,0000,0000,, mà anh muốn chạy sau này, Dialogue: 0,0:02:57.84,0:03:00.81,Default,,0000,0000,0000,, nhưng chỉ khi anh bảo chú chạy thôi nhé" Dialogue: 0,0:03:00.81,0:03:04.29,Default,,0000,0000,0000,, Vì vậy, ta phải bảo nó chạy code, có nghĩa là ta cần Dialogue: 0,0:03:04.29,0:03:09.11,Default,,0000,0000,0000,, 'gọi' hàm - giống như ta làm với ellipse() và rect() và line(). Dialogue: 0,0:03:09.40,0:03:13.75,Default,,0000,0000,0000,, Vì vậy, ta chỉ cần viết tên hàm ('drawWinston') Dialogue: 0,0:03:13.75,0:03:16.38,Default,,0000,0000,0000,, theo sau là dấu ngoặc đơn bắt đầu và kết thúc '()' Dialogue: 0,0:03:16.38,0:03:18.96,Default,,0000,0000,0000,, và, tất nhiên, dấu chấm phẩy và Ta Đa - Dialogue: 0,0:03:18.96,0:03:20.94,Default,,0000,0000,0000,, Ta đã có lại Winston rồi! Dialogue: 0,0:03:20.94,0:03:24.24,Default,,0000,0000,0000,, OK! Như vậy, tôi nghĩ rằng nó ngon đấy, nhưng bạn có thể thấy nó chưa ổn Dialogue: 0,0:03:24.24,0:03:27.37,Default,,0000,0000,0000,, bởi tất cả những gì ta vừa làm là khiến máy tính thực hiện chính xác Dialogue: 0,0:03:27.37,0:03:30.24,Default,,0000,0000,0000,, những gì nó đã làm trước đó. Nghe có vẻ ngớ ngẩn nhỉ? Dialogue: 0,0:03:30.24,0:03:32.92,Default,,0000,0000,0000,, Toàn bộ ưu điểm của hàm là ta có thể tái sử dụng chúng. Dialogue: 0,0:03:32.92,0:03:34.96,Default,,0000,0000,0000,, Như vậy, hãy làm ngay bây giờ thôi. Dialogue: 0,0:03:34.96,0:03:41.16,Default,,0000,0000,0000,, Ta chỉ có thể copy và paste hàm tên là "ta da!" "ta da!" thêm lần nữa và thêm lần nữa Dialogue: 0,0:03:41.16,0:03:46.57,Default,,0000,0000,0000,, Hmmm, nhưng nó trông giống nhau - - ngon - nó đã hoạt động - Dialogue: 0,0:03:46.57,0:03:48.100,Default,,0000,0000,0000,, và đang vẽ nhiều Winstons, nhưng vấn đề là Dialogue: 0,0:03:48.100,0:03:51.47,Default,,0000,0000,0000,, tất cả đều ở cùng một chỗ Dialogue: 0,0:03:51.47,0:03:54.43,Default,,0000,0000,0000,, Nếu ta có tia X, ta có thể chụp X-quang Dialogue: 0,0:03:54.43,0:03:57.63,Default,,0000,0000,0000,, và thấy ba Winstons, nhưng tôi không có tia X. Dialogue: 0,0:03:57.63,0:04:00.33,Default,,0000,0000,0000,, (Tôi không biết bạn có không). Dialogue: 0,0:04:00.33,0:04:03.44,Default,,0000,0000,0000,, Nhưng, ta có thể thay đổi một chút trong hàm Dialogue: 0,0:04:03.44,0:04:05.49,Default,,0000,0000,0000,, Để khiến nó rõ ràng hơn. Dialogue: 0,0:04:05.49,0:04:08.82,Default,,0000,0000,0000,, Như vậy, bạn thấy faceX và faceY - luôn luôn là 202 và 208? Dialogue: 0,0:04:08.82,0:04:11.59,Default,,0000,0000,0000,, Ta có thể thay đổi nó bằng hàm random() - Dialogue: 0,0:04:11.59,0:04:14.85,Default,,0000,0000,0000,, - hãy gõ random() từ 50 đến 350 và nó sẽ tạo ra Dialogue: 0,0:04:14.85,0:04:19.18,Default,,0000,0000,0000,, một số ngẫu nhiên trong khoảng đó - và ta có thể làm điều tương tự ở đây - Dialogue: 0,0:04:19.18,0:04:23.02,Default,,0000,0000,0000,, và như vậy mỗi khi hàm này được gọi, nó sẽ tạo ra số ngẫu nhiên mới, Dialogue: 0,0:04:23.02,0:04:26.57,Default,,0000,0000,0000,, và nếu khởi động lại, ta có thể có được các Winstons xuất hiện ngẫu nhiên. Dialogue: 0,0:04:26.57,0:04:29.36,Default,,0000,0000,0000,, Thật tuyệt! Whoo!! Dialogue: 0,0:04:29.36,0:04:32.10,Default,,0000,0000,0000,, Được rồi - như vậy tôi nghĩ ngon rồi đáy vì nó sẽ Dialogue: 0,0:04:32.10,0:04:34.92,Default,,0000,0000,0000,, tốn khá nhiều code để viết cái này nếu ta không gói trong một hàm. Dialogue: 0,0:04:34.92,0:04:38.32,Default,,0000,0000,0000,, Nó sẽ phải code gấp 3 lần. Dialogue: 0,0:04:38.32,0:04:40.96,Default,,0000,0000,0000,, Nhưng nó vẫn không hữu dụng cho lắm, Dialogue: 0,0:04:40.96,0:04:43.80,Default,,0000,0000,0000,, bởi vì có lẽ ta không muốn Winstons xuất hiện ngẫu nhiên. Dialogue: 0,0:04:43.80,0:04:45.74,Default,,0000,0000,0000,, Ta muốn có thể xác định vị trí cho Winston Dialogue: 0,0:04:45.74,0:04:47.85,Default,,0000,0000,0000,, tại các điểm cụ thể trên màn hình. Dialogue: 0,0:04:47.85,0:04:49.94,Default,,0000,0000,0000,, Vì vậy, hãy theo dõi, vì ta sẽ nói về cách truyền các tham số Dialogue: 0,0:04:49.94,0:04:52.00,Default,,0000,0000,0000,, để các hàm sau đây có thể Dialogue: 0,0:04:52.00,0:00:00.00,Default,,0000,0000,0000,, để làm chính xác điều đó.