Bài giảng 0: Scratch

Chào mừng!

  • Lớp học này không chỉ đơn thuần là về lập trình máy tính! Những kỹ năng thực tế mà bạn sẽ học được trong lớp này có thể tác động đến cuộc sống và việc học tập của bạn vượt xa phạm vi khoa học máy tính.

  • Thực tế, lớp học này là về cách giải quyết vấn đề theo một phương thức vô cùng mạnh mẽ! Bạn có thể sẽ áp dụng khả năng giải quyết vấn đề học được ở đây vào công việc ngoài khóa học này và thậm chí là trong toàn bộ sự nghiệp của mình sau này!

  • Tuy nhiên, nó sẽ không hề dễ dàng! Bạn sẽ phải “tiếp nhận một lượng kiến thức khổng lồ trong thời gian ngắn” trong suốt khóa học này. Bạn sẽ ngạc nhiên về những gì mình có thể đạt được trong những tuần tới.

  • Khóa học này chú trọng vào việc bạn tự cải thiện bản thân từ “vị trí của bạn hôm nay” hơn là việc đạt được một tiêu chuẩn định sẵn nào đó.

  • Điều quan trọng nhất khi bắt đầu khóa học này là: Hãy dành thời gian cần thiết để học tập. Mỗi người có một cách học khác nhau. Nếu ban đầu mọi việc không suôn sẻ, hãy hiểu rằng theo thời gian, kỹ năng của bạn sẽ ngày càng phát triển.

  • Đừng lo sợ nếu đây là lớp học khoa học máy tính đầu tiên của bạn! Đối với hầu hết bạn bè cùng lớp, đây cũng là lần đầu tiên của họ! Hơn nữa, các trợ giảng, trợ lý khóa học và cộng đồng sinh viên luôn sẵn sàng giúp đỡ bạn!

Cộng đồng!

  • Bạn là một phần của cộng đồng những người đang theo học khóa học này tại Harvard College, Harvard Extension School và qua edX.org.

  • Chúng tôi hy vọng bạn sẽ tham gia cùng chúng tôi (trực tiếp hoặc trực tuyến) tại CS50 Puzzle DayCS50 Fair.

  • Bạn có thể tham dự các buổi ăn trưa CS50 Lunches và CS50 Hackathon, nếu bạn là sinh viên tại khuôn viên trường Harvard.

Khoa học Máy tính và Giải quyết Vấn đề

Về cơ bản, lập trình máy tính là việc nhận một đầu vào (input) nào đó và tạo ra một đầu ra (output) nhất định - từ đó giải quyết một vấn đề. Những gì xảy ra ở giữa đầu vào và đầu ra, cái mà chúng ta có thể gọi là một hộp đen (black box), chính là trọng tâm của khóa học này.

  • Ví dụ, chúng ta cần điểm danh cho một lớp học. Chúng ta có thể sử dụng hệ thống gọi là unary (còn gọi là hệ cơ số 1) để đếm từng ngón tay một.

  • Máy tính ngày nay đếm bằng một hệ thống gọi là binary (nhị phân). Chính từ thuật ngữ binary digit (chữ số nhị phân) mà chúng ta có thuật ngữ quen thuộc là bit. Một bit là số 0 hoặc số 1: tương ứng với trạng thái tắt hoặc bật.

  • Máy tính chỉ giao tiếp bằng các số 0 và 1. Số 0 đại diện cho trạng thái tắt. Số 1 đại diện cho trạng thái bật. Máy tính được cấu thành từ hàng triệu, thậm chí hàng tỷ bóng bán dẫn (transistors) đang được bật và tắt liên tục.

  • Nếu bạn hình dung việc sử dụng một bóng đèn, một bóng đèn đơn lẻ chỉ có thể đếm từ 0 đến 1.

  • Tuy nhiên, nếu bạn có ba bóng đèn, bạn sẽ có nhiều lựa chọn hơn!

  • Bên trong chiếc iPhone của bạn có hàng triệu bóng đèn nhỏ gọi là transistors, chúng thực hiện các hoạt động mà đôi khi chúng ta coi là điều hiển nhiên mỗi ngày.

Theo một phương pháp phỏng đoán, chúng ta có thể hình dung các giá trị sau đại diện cho từng vị trí trong binary digit của mình:

4 2 1

Sử dụng ba bóng đèn, trạng thái sau có thể đại diện cho số 0:

4 2 1
0 0 0

Tương tự, trạng thái sau sẽ đại diện cho số 1:

4 2 1
0 0 1

Theo logic này, chúng ta có thể đề xuất rằng trạng thái sau bằng số 2:

4 2 1
0 1 0

Mở rộng logic này hơn nữa, trạng thái sau đại diện cho số 3:

4 2 1
0 1 1

Số 4 sẽ xuất hiện dưới dạng:

4 2 1
1 0 0

Trên thực tế, chỉ với ba bóng đèn, chúng ta có thể đếm tới số 7!

4 2 1
1 1 1

Máy tính sử dụng hệ cơ số 2 để đếm. Điều này có thể được hình dung như sau:

2^2  2^1  2^0
4    2    1
  • Do đó, có thể nói rằng sẽ cần ba bit (hàng đơn vị của 4, hàng đơn vị của 2 và hàng đơn vị của 1) để biểu diễn một số lớn tới mức 7.

Tương tự, để đếm một số lớn tới mức 8, các giá trị sẽ được biểu diễn như sau:

8 4 2 1
1 0 0 0

Máy tính thường sử dụng tám bit (còn được gọi là một byte) để biểu diễn một con số. Ví dụ, 00000101 là số 5 trong hệ nhị phân. 11111111 đại diện cho số 255. Bạn có thể hình dung số 0 như sau:

      128
      64
      32
      16
      8
      4
      2
      1

      0
      0
      0
      0
      0
      0
      0
      0

ASCII

  • Giống như các con số là những mẫu nhị phân của số 1 và số 0, các chữ cái cũng được biểu diễn bằng các số 1 và số 0!

  • Vì có sự chồng chéo giữa các số 1 và 0 đại diện cho cả số và chữ cái, tiêu chuẩn ASCII đã được tạo ra để ánh xạ các chữ cái cụ thể sang các con số cụ thể.

Ví dụ, chữ cái A được quy định ánh xạ tới số 65. 01000001 đại diện cho số 65 trong hệ nhị phân. Bạn có thể hình dung điều này như sau:

      128
      64
      32
      16
      8
      4
      2
      1

      0
      1
      0
      0
      0
      0
      0
      1

Nếu bạn nhận được một tin nhắn văn bản, mã nhị phân bên dưới tin nhắn đó có thể đại diện cho các con số 72, 73 và 33. Ánh xạ chúng sang ASCII, tin nhắn của bạn sẽ trông như sau:

H   I   !
72  73  33
  • Thật may mắn khi có những tiêu chuẩn như ASCII cho phép chúng ta thống nhất về các giá trị này!

Dưới đây là bảng ánh xạ mở rộng của các giá trị ASCII:

      0
      NUL
      16
      DLE
      32
      SP
      48
      0
      64
      @
      80
      P
      96
      `
      112
      p

      1
      SOH
      17
      DC1
      33
      !
      49
      1
      65
      A
      81
      Q
      97
      a
      113
      q

      2
      STX
      18
      DC2
      34
      ”
      50
      2
      66
      B
      82
      R
      98
      b
      114
      r

      3
      ETX
      19
      DC3
      35
      #
      51
      3
      67
      C
      83
      S
      99
      c
      115
      s

      4
      EOT
      20
      DC4
      36
      $
      52
      4
      68
      D
      84
      T
      100
      d
      116
      t

      5
      ENQ
      21
      NAK
      37
      %
      53
      5
      69
      E
      85
      U
      101
      e
      117
      u

      6
      ACK
      22
      SYN
      38
      &
      54
      6
      70
      F
      86
      V
      102
      f
      118
      v

      7
      BEL
      23
      ETB
      39
      ’
      55
      7
      71
      G
      87
      W
      103
      g
      119
      w

      8
      BS
      24
      CAN
      40
      (
      56
      8
      72
      H
      88
      X
      104
      h
      120
      x

      9
      HT
      25
      EM
      41
      )
      57
      9
      73
      I
      89
      Y
      105
      i
      121
      y

      10
      LF
      26
      SUB
      42
      *
      58
      :
      74
      J
      90
      Z
      106
      j
      122
      z

      11
      VT
      27
      ESC
      43
      +
      59
      ;
      75
      K
      91
      [
      107
      k
      123
      {

      12
      FF
      28
      FS
      44
      ,
      60
      <
      76
      L
      92
      \
      108
      l
      124

      13
      CR
      29
      GS
      45
      -
      61
      =
      77
      M
      93
      ]
      109
      m
      125
      }

      14
      SO
      30
      RS
      46
      .
      62
      >
      78
      N
      94
      ^
      110
      n
      126
      ~

      15
      SI
      31
      US
      47
      /
      63
      ?
      79
      O
      95
      _
      111
      o
      127
      DEL
  • Nếu muốn, bạn có thể tìm hiểu thêm về ASCII.

  • Vì mã nhị phân chỉ có thể đếm tới 255, chúng ta bị giới hạn ở số lượng ký tự được ASCII đại diện.

Unicode

  • Theo thời gian, ngày càng có nhiều cách thức giao tiếp qua văn bản.

  • Do mã nhị phân không đủ chữ số để đại diện cho tất cả các ký tự đa dạng mà con người sử dụng, tiêu chuẩn Unicode đã mở rộng số lượng bit có thể được truyền tải và thấu hiểu bởi máy tính. Unicode không chỉ bao gồm các ký tự đặc biệt mà còn cả các biểu tượng cảm xúc (emoji).

Có những emoji mà có lẽ bạn vẫn sử dụng hàng ngày. Những hình ảnh sau đây chắc hẳn rất quen thuộc với bạn:

😀 😃 😄 😁 😆 😅 😂 🙂 🙃 😉 😊 😇 😍 😘 😗 😙 😚 😋 😛 😜 😝 🤑 🤓 😎 🤗 😏 😶 😐 😑 😒 🙄 😬 😕 ☹️ 😟 😮 😯 😲 😳 😦 😧 😨

  • Mặc dù mẫu số 0 và số 1 đã được tiêu chuẩn hóa trong Unicode, mỗi nhà sản xuất thiết bị có thể hiển thị mỗi emoji hơi khác một chút so với nhà sản xuất khác.

  • Ngày càng có nhiều tính năng được thêm vào tiêu chuẩn Unicode để đại diện cho nhiều ký tự và emoji hơn nữa.

  • Nếu muốn, bạn có thể tìm hiểu thêm về Unicode.

  • Nếu muốn, bạn có thể tìm hiểu thêm về emoji.

RGB

  • Số 0 và số 1 có thể được sử dụng để đại diện cho màu sắc.

Đỏ, xanh lá cây và xanh dương (gọi là RGB) là sự kết hợp của ba con số.

Lấy các số 72, 73 và 33 mà chúng ta đã sử dụng trước đó (vốn hiển thị chữ HI! qua văn bản), sẽ được các trình đọc hình ảnh diễn giải là một màu vàng nhạt. Giá trị đỏ là 72, giá trị xanh lá là 73 và giá trị xanh dương là 33.

  • Ba byte cần thiết để đại diện cho các sắc thái khác nhau của đỏ, xanh dương và xanh lá (hay RGB) tạo nên mỗi điểm ảnh (pixel) màu trong bất kỳ hình ảnh kỹ thuật số nào. Hình ảnh đơn giản là tập hợp các giá trị RGB.

  • Số 0 và số 1 có thể được sử dụng để đại diện cho hình ảnh, video và âm nhạc!

  • Video là chuỗi gồm nhiều hình ảnh được lưu trữ cùng nhau, giống như một cuốn sách lật (flipbook).

  • Âm nhạc cũng có thể được biểu diễn tương tự bằng các tổ hợp byte khác nhau.

Thuật toán

  • Giải quyết vấn đề là trọng tâm của khoa học máy tính và lập trình máy tính. Một thuật toán (algorithm) là một tập hợp các hướng dẫn từng bước để giải quyết một vấn đề.

  • Hãy tưởng tượng vấn đề cơ bản là tìm một cái tên cụ thể trong một cuốn danh bạ điện thoại.

  • Một người có thể thực hiện việc này như thế nào?

  • Một cách tiếp cận có thể là đọc từ trang đầu tiên sang trang tiếp theo, rồi trang tiếp theo nữa cho đến khi hết trang cuối cùng.

  • Một cách tiếp cận khác có thể là tìm kiếm hai trang cùng một lúc.

  • Một cách tiếp cận cuối cùng và có lẽ là tốt hơn, đó là lật đến giữa cuốn danh bạ và hỏi: “Cái tên mình đang tìm nằm ở bên trái hay bên phải?”. Sau đó lặp lại quy trình này, chia đôi vấn đề liên tục.

Mỗi cách tiếp cận này có thể được gọi là các thuật toán. Tốc độ của mỗi thuật toán này có thể được hình dung như sau trong cái gọi là ký hiệu O lớn (big-O notation):

Lưu ý rằng thuật toán đầu tiên, được tô màu đỏ, có big-O là n vì nếu có 100 cái tên trong danh bạ, có thể mất tới 100 lần thử để tìm thấy đúng tên. Thuật toán thứ hai, tìm kiếm hai trang một lúc, có big-O là n/2 vì chúng ta tìm kiếm nhanh gấp đôi qua các trang. Thuật toán cuối cùng có big-O là log2n, vì việc tăng gấp đôi quy mô vấn đề chỉ dẫn đến việc tốn thêm một bước để giải quyết.

  • Các lập trình viên chuyển đổi các hướng dẫn dựa trên văn bản, ngôn ngữ con người thành mã nguồn (code).

Mã giả (Pseudocode)

  • Quá trình chuyển đổi các hướng dẫn thành mã nguồn này được gọi là mã giả (pseudocode).

  • Khả năng viết mã giả là chìa khóa dẫn đến thành công của bạn trong cả lớp học này và trong lập trình máy tính nói chung.

Mã giả là một phiên bản dễ đọc đối với con người của mã nguồn của bạn. Ví dụ, xem xét thuật toán thứ ba ở trên, chúng ta có thể soạn mã giả như sau:

1  Cầm cuốn danh bạ lên
2  Mở đến trang giữa của cuốn danh bạ
3  Nhìn vào trang đó
4  Nếu người đó có trên trang
5      Gọi cho người đó
6  Nếu không, nếu người đó nằm ở phần trước của cuốn danh bạ
7      Mở đến trang giữa của nửa bên trái cuốn danh bạ
8      Quay lại dòng 3
9  Nếu không, nếu người đó nằm ở phần sau của cuốn danh bạ
10     Mở đến trang giữa của nửa bên phải cuốn danh bạ
11     Quay lại dòng 3
12 Nếu không
13     Thoát
  • Viết mã giả là một kỹ năng quan trọng vì ít nhất hai lý do. Thứ nhất, khi bạn viết mã giả trước khi viết mã chính thức, nó cho phép bạn suy nghĩ thấu đáo về logic của vấn đề trước. Thứ hai, khi bạn viết mã giả, sau này bạn có thể cung cấp thông tin này cho những người khác đang tìm hiểu về các quyết định lập trình của bạn và cách mã của bạn hoạt động.

  • Lưu ý rằng ngôn ngữ trong mã giả của chúng ta có một số đặc điểm độc đáo. Đầu tiên, một số dòng bắt đầu bằng các động từ như cầm lên, mở, nhìn vào. Sau này, chúng ta sẽ gọi đây là các hàm (functions).

  • Thứ hai, lưu ý rằng một số dòng bao gồm các câu lệnh như nếu (if) hoặc nếu không, nếu (else if). Đây được gọi là các câu lệnh điều kiện (conditionals).

  • Thứ ba, hãy chú ý có các biểu thức có thể được phát biểu là đúng (true) hoặc sai (false), chẳng hạn như “người đó nằm ở phần trước của cuốn danh bạ”. Chúng ta gọi đây là các biểu thức logic (boolean expressions).

  • Cuối cùng, hãy chú ý có những câu lệnh như “quay lại dòng 3”. Chúng ta gọi đây là các vòng lặp (loops).

  • Những khối xây dựng này là nền tảng của lập trình.

  • Trong bối cảnh của Scratch, được thảo luận dưới đây, chúng ta sẽ sử dụng từng khối xây dựng cơ bản của lập trình nói trên.

Trí tuệ nhân tạo

Hãy xem xét cách chúng ta có thể tận dụng các khối xây dựng ở trên để bắt đầu tạo ra trí tuệ nhân tạo của riêng mình. Hãy nhìn vào mã giả sau:

Nếu sinh viên nói xin chào
    Nói xin chào
Nếu không, nếu sinh viên nói tạm biệt
    Nói tạm biệt
Nếu không, nếu sinh viên hỏi bạn thế nào
    Nói tôi khỏe
Nếu không, nếu sinh viên hỏi tại sao 111 trong hệ nhị phân là 7 trong hệ thập phân
...

Hãy lưu ý rằng chỉ để lập trình một vài tương tác, chúng ta đã cần rất nhiều dòng mã. Sẽ cần bao nhiêu dòng mã cho hàng nghìn hoặc hàng chục nghìn tương tác có thể xảy ra?

  • Thay vì lập trình AI đàm thoại như trên, các lập trình viên AI huấn luyện các mô hình ngôn ngữ lớn (LLMs) trên các tập dữ liệu khổng lồ.

  • LLMs tìm kiếm các mẫu trong các khối ngôn ngữ lớn. Các mô hình ngôn ngữ như vậy cố gắng đưa ra dự đoán tốt nhất về việc những từ nào sẽ xuất hiện sau một từ khác hoặc xuất hiện cùng nhau.

  • Mặc dù phần mềm dựa trên AI rất hữu ích trong nhiều lĩnh vực của cuộc sống và công việc, chúng tôi quy định rằng việc sử dụng các phần mềm dựa trên AI khác ngoài phần mềm của riêng CS50 là không hợp lý.

  • Công cụ phần mềm dựa trên AI của riêng CS50 mang tên CS50.ai là một trợ lý AI mà bạn có thể sử dụng trong khóa học này. Nó sẽ giúp bạn, nhưng không cung cấp toàn bộ câu trả lời cho các bài tập của khóa học.

  • Bạn không được phép sử dụng bất kỳ AI nào trong khóa học này ngoại trừ CS50.ai.

Những gì phía trước

  • Tuần này bạn sẽ tìm hiểu về Scratch, một ngôn ngữ lập trình trực quan.

Sau đó, trong những tuần tới, bạn sẽ học về C. Nó sẽ trông giống như thế này:

#include

int main(void)
{
  printf("hello, world\n");
}
  • Bằng cách học C, bạn sẽ được chuẩn bị kỹ lưỡng hơn cho việc học các ngôn ngữ lập trình khác trong tương lai như Python.

  • Hơn nữa, khi các tuần trôi qua, bạn sẽ tìm hiểu về các thuật toán.

  • Điều làm cho C trở nên khó khăn là các dấu câu. Tạm gác các dấu câu và cú pháp đó sang một bên, hôm nay chúng ta sẽ làm việc hoàn toàn với các ý tưởng trong một ngôn ngữ lập trình mang tên Scratch.

Scratch

Scratch là một ngôn ngữ lập trình trực quan được phát triển bởi MIT.

  • Scratch sử dụng cùng các khối xây dựng mã hóa thiết yếu mà chúng ta đã đề cập trước đó trong bài giảng này.

  • Scratch là một cách tuyệt vời để bắt đầu tiếp cận lập trình máy tính vì nó cho phép bạn làm việc với các khối xây dựng này một cách trực quan, không phải lo lắng về cú pháp của các dấu ngoặc nhọn, dấu chấm phẩy, dấu ngoặc đơn và những thứ tương tự.

IDE (môi trường phát triển tích hợp) của Scratch trông như sau:

Lưu ý rằng ở bên trái, có một danh sách các khối xây dựng mà bạn có thể sử dụng trong lập trình của mình. Ngay bên phải các khối xây dựng là khu vực mà bạn có thể kéo các khối vào để xây dựng chương trình. Ở bên phải khu vực đó, bạn thấy sân khấu nơi một chú mèo đang đứng. Sân khấu là nơi chương trình của bạn trở nên sống động.

Scratch hoạt động trên một hệ tọa độ như sau:

Lưu ý rằng tâm của sân khấu nằm ở tọa độ (0,0). Hiện tại, vị trí của chú mèo cũng đang ở chính vị trí đó.

Hello World

Để bắt đầu, hãy kéo khối lệnh “khi bấm vào cờ xanh” vào khu vực lập trình. Sau đó, kéo khối lệnh nói vào khu vực lập trình và gắn nó vào khối trước đó.

khi bấm vào cờ xanh
nói [hello, world]

Lưu ý rằng khi bạn nhấp vào lá cờ xanh trên sân khấu bây giờ, chú mèo sẽ nói “hello, world”.

Điều này minh họa rất rõ những gì chúng ta đã thảo luận trước đó về lập trình:

Lưu ý rằng đầu vào hello, world được truyền vào hàm nói, và tác dụng phụ của việc chạy hàm đó là chú mèo nói hello, world.

Hello, You

Chúng ta có thể làm cho chương trình của bạn tương tác hơn bằng cách để chú mèo nói hello với một người cụ thể. Hãy sửa đổi chương trình của bạn như sau:

khi bấm vào cờ xanh
hỏi [Tên bạn  ?]  đợi
nói (kết hợp [xin chào,] (trả lời))

Lưu ý rằng khi nhấp vào lá cờ xanh, hàm hỏi sẽ được thực hiện. Chương trình sẽ nhắc bạn, người dùng, Tên bạn là gì? Sau đó, nó lưu trữ tên đó vào biến mang tên trả lời. Chương trình sau đó truyền biến trả lời vào một hàm đặc biệt gọi là kết hợp, hàm này kết hợp hai chuỗi văn bản xin chào, và bất kỳ tên nào đã được cung cấp. Theo đúng nghĩa đen, trả lời trả về một giá trị cho hàm kết hợp. Tất cả chúng được truyền vào hàm nói. Chú mèo sẽ nói, Xin chào, kèm theo một cái tên. Chương trình của bạn hiện đã có tính tương tác.

Trong suốt khóa học này, bạn sẽ cung cấp các đầu vào vào một thuật toán và nhận được các đầu ra (hoặc tác dụng phụ). Điều này có thể được hình dung qua chương trình trên như sau:

Lưu ý rằng các đầu vào xin chào,trả lời được cung cấp cho hàm kết hợp, dẫn đến tác dụng phụ là xin chào, David.

Hoàn toàn tương tự, chúng ta có thể sửa đổi chương trình của mình như sau:

khi bấm vào cờ xanh
hỏi [Tên bạn  ?]  đợi
nói (kết hợp [xin chào,] (trả lời))

Lưu ý rằng chương trình này, khi nhấp vào lá cờ xanh, sẽ truyền cùng một biến đó, được kết hợp với xin chào, vào một hàm có tên là nói.

Tiếng Meo và Tính trừu tượng (Abstraction)

  • Cùng với việc viết mã giả, tính trừu tượng (abstraction) là một kỹ năng và khái niệm thiết yếu trong lập trình máy tính.

  • Tính trừu tượng là hành động đơn giản hóa một vấn đề thành những vấn đề nhỏ hơn và nhỏ hơn nữa.

  • Ví dụ, nếu bạn đang chuẩn bị một bữa tối thịnh soạn cho bạn bè, vấn đề phải nấu toàn bộ bữa ăn có thể khá choáng ngợp! Tuy nhiên, nếu bạn chia nhỏ nhiệm vụ nấu bữa ăn thành những nhiệm vụ (hoặc vấn đề) nhỏ hơn, nhiệm vụ lớn lao là tạo ra bữa ăn ngon lành này có thể cảm thấy bớt khó khăn hơn.

Trong lập trình, và ngay cả trong Scratch, chúng ta có thể thấy tính trừu tượng đang hoạt động. Trong khu vực lập trình của bạn, hãy lập trình như sau:

khi bấm vào cờ xanh
phát âm thanh (Meow v) cho đến hết
đợi (1) giây
phát âm thanh (Meow v) cho đến hết
đợi (1) giây
phát âm thanh (Meow v) cho đến hết

Lưu ý rằng bạn đang thực hiện cùng một việc lặp đi lặp lại. Thật vậy, nếu bạn thấy mình liên tục viết các câu lệnh giống nhau, rất có thể bạn có thể lập trình một cách nghệ thuật hơn – bằng cách trừu tượng hóa mã lặp lại này.

Bạn có thể sửa đổi mã của mình như sau:

khi bấm vào cờ xanh
lặp lại (3)
phát âm thanh (Meow v) cho đến hết
đợi (1) giây

Lưu ý rằng vòng lặp thực hiện chính xác những gì chương trình trước đó đã làm. Tuy nhiên, vấn đề được đơn giản hóa bằng cách trừu tượng hóa sự lặp lại vào một khối lệnh giúp lặp lại mã cho chúng ta.

Chúng ta thậm chí có thể tiến xa hơn bằng cách sử dụng khối định nghĩa, nơi bạn có thể tạo khối lệnh của riêng mình (hàm của riêng bạn)! Hãy viết mã như sau:

định nghĩa meow
phát âm thanh (Meow v) cho đến hết
đợi (1) giây

khi bấm vào cờ xanh
lặp lại (3)
meow

Lưu ý rằng chúng ta đang định nghĩa khối lệnh của riêng mình mang tên meow. Hàm này phát âm thanh meow, sau đó đợi một giây. Phía dưới đó, bạn có thể thấy rằng khi nhấp vào lá cờ xanh, hàm meow của chúng ta sẽ được lặp lại ba lần.

Chúng ta thậm chí có thể cung cấp một cách để hàm có thể nhận đầu vào n và lặp lại một số lần nhất định:

định nghĩa meow n lần
lặp lại (n)
 phát âm thanh [meow v] cho đến hết
 đợi (1) giây

Lưu ý cách n được lấy từ “meow n lần”. n được truyền vào hàm meow thông qua khối định nghĩa.

  • Nhìn chung, hãy lưu ý quá trình tinh chế này đã dẫn đến mã nguồn được thiết kế ngày càng tốt hơn như thế nào. Hơn nữa, hãy chú ý cách chúng ta tạo ra thuật toán của riêng mình để giải quyết một vấn đề. Bạn sẽ thực hành cả hai kỹ năng này trong suốt khóa học.

Câu lệnh điều kiện

Câu lệnh điều kiện là một khối xây dựng thiết yếu của lập trình, nơi chương trình kiểm tra xem một điều kiện cụ thể có được đáp ứng hay không. Nếu điều kiện được đáp ứng, chương trình sẽ thực hiện một việc gì đó.

Để minh họa một câu lệnh điều kiện, hãy viết mã như sau:

khi bấm vào cờ xanh
liên tục
nếu  thì
phát âm thanh (Meow v) cho đến hết

Lưu ý rằng khối liên tục được sử dụng để khối nếu được kích hoạt lặp đi lặp lại, nhờ đó nó có thể kiểm tra liên tục xem chú mèo có đang chạm vào con trỏ chuột hay không.

Chúng ta có thể sửa đổi chương trình của mình như sau để tích hợp cảm biến video:

khi chuyển động video > (10)
phát âm thanh (Meow v) cho đến hết
  • Hãy nhớ rằng, lập trình thường là một quá trình thử sai. Nếu bạn cảm thấy nản lòng, hãy dành thời gian để tự mình phân tích vấn đề đang gặp phải. Vấn đề cụ thể mà bạn đang giải quyết ngay bây giờ là gì? Cái gì đang hoạt động? Cái gì không hoạt động?

Oscartime

Oscartime là một trong những chương trình Scratch của riêng David – mặc dù phần âm nhạc có thể ám ảnh anh ấy vì số giờ anh ấy đã nghe nó trong khi tạo ra chương trình này. Hãy dành vài phút để tự mình chơi thử trò chơi.

Tự mình xây dựng Oscartime, trước tiên chúng ta thêm cột đèn.

Sau đó, viết mã như sau:

khi bấm vào cờ xanh
chuyển trang phục thành (oscar1 v)
liên tục
nếu  thì
chuyển trang phục thành (oscar2 v)
nếu không
chuyển trang phục thành (oscar1 v)

Lưu ý rằng việc di chuyển chuột qua Oscar sẽ thay đổi trang phục của nhân vật. Bạn có thể tìm hiểu thêm bằng cách khám phá các khối lệnh này.

Sau đó, hãy sửa đổi mã của bạn như sau để tạo ra một mẩu rác đang rơi:

khi bấm vào cờ xanh
đi tới điểm x: (chọn ngẫu nhiên (-240) đến (240)) y: (180)
liên tục
nếu  (0)> thì
thay đổi y một lượng (-3)

Lưu ý rằng vị trí của rác trên trục y luôn bắt đầu ở 180. Vị trí x được chọn ngẫu nhiên. Trong khi rác vẫn ở trên sàn, nó sẽ đi xuống mỗi lần 3 pixel. Bạn có thể tìm hiểu thêm bằng cách khám phá các khối lệnh này.

Tiếp theo, hãy sửa đổi mã của bạn như sau để cho phép khả năng kéo rác.

khi bấm vào cờ xanh
liên tục
nếu  và > thì
đi tới (con trỏ chuột v)

Bạn có thể tìm hiểu thêm bằng cách khám phá các khối lệnh này.

Tiếp theo, chúng ta có thể triển khai các biến tính điểm như sau:

khi bấm vào cờ xanh
liên tục
nếu  thì
thay đổi (điểm) một lượng (1)
đi tới điểm x: (chọn ngẫu nhiên (-240) đến (240)) y: (180)

Bạn có thể tìm hiểu thêm bằng cách khám phá các khối lệnh này.

  • Hãy thử chơi trò chơi đầy đủ Oscartime.

Trò chơi khó nhất của Ivy (Ivy’s Hardest Game)

  • Chuyển từ Oscartime sang Ivy’s Hardest Game, bây giờ chúng ta có thể hình dung cách triển khai chuyển động trong chương trình của mình.

  • Chương trình của chúng ta có ba thành phần chính.

Đầu tiên, hãy viết mã như sau:

khi bấm vào cờ xanh
đi tới điểm x: (0) y: (0)
liên tục
nghe bàn phím
cảm nhận tường

Lưu ý rằng khi nhấp vào lá cờ xanh, nhân vật của chúng ta sẽ di chuyển đến tâm của sân khấu tại tọa độ (0,0) và sau đó liên tục nghe tín hiệu bàn phím và kiểm tra các bức tường.

Thứ hai, thêm nhóm khối lệnh thứ hai này:

định nghĩa nghe bàn phím
nếu  thì
thay đổi y một lượng (1)
hết
nếu  thì
thay đổi y một lượng (-1)
hết
nếu  thì
thay đổi x một lượng (1)
hết
nếu  thì
thay đổi x một lượng (-1)
hết

Lưu ý cách chúng ta đã tạo một kịch bản tùy chỉnh nghe bàn phím. Đối với mỗi phím mũi tên trên bàn phím, nó sẽ di chuyển nhân vật quanh màn hình.

Cuối cùng, thêm nhóm khối lệnh này:

định nghĩa cảm nhận tường
nếu  thì
thay đổi x một lượng (1)
hết
nếu  thì
thay đổi x một lượng (-1)
hết

Lưu ý cách chúng ta cũng có một kịch bản tùy chỉnh cảm nhận tường. Khi một nhân vật chạm vào tường, nó sẽ di chuyển nhân vật đó trở lại vị trí an toàn – ngăn nhân vật đó đi ra khỏi màn hình.

  • Bạn có thể tìm hiểu thêm bằng cách khám phá các khối lệnh này.

  • Scratch cho phép nhiều nhân vật (sprites) xuất hiện trên màn hình cùng một lúc.

Thêm một nhân vật khác, hãy thêm các khối lệnh sau vào chương trình của bạn:

khi bấm vào cờ xanh
đi tới điểm x: (0) y: (0)
hướng về phía (90)
liên tục
nếu  hoặc > thì
quay phải (180) độ
hết
di chuyển (1) bước
hết

Lưu ý cách nhân vật Yale có vẻ cản đường nhân vật Harvard bằng cách di chuyển qua lại. Khi nó đâm vào tường, nó quay đầu lại cho đến khi lại đâm vào bức tường khác. Bạn có thể tìm hiểu thêm bằng cách khám phá các khối lệnh này.

Bạn thậm chí có thể làm cho một nhân vật đi theo một nhân vật khác. Thêm một nhân vật nữa, hãy thêm các khối lệnh sau vào chương trình của bạn:

khi bấm vào cờ xanh
đi tới (vị trí ngẫu nhiên v)
liên tục
hướng về phía (Harvard v)
di chuyển (1) bước

Lưu ý cách logo MIT bây giờ dường như đi theo logo Harvard. Bạn có thể tìm hiểu thêm bằng cách khám phá các khối lệnh này.

Tổng kết

Trong bài học này, bạn đã tìm hiểu về vị trí của khóa học này trong thế giới rộng lớn của khoa học máy tính và lập trình. Bạn đã học được rằng…

  • Rất ít sinh viên đến với lớp học này khi đã có kinh nghiệm lập trình trước đó!

  • Bạn không hề đơn độc! Bạn là một phần của một cộng đồng.

  • Giải quyết vấn đề là bản chất công việc của các nhà khoa học máy tính.

  • Khóa học này không chỉ đơn thuần là về lập trình – khóa học này sẽ giới thiệu cho bạn một cách học mới mà bạn có thể áp dụng vào hầu hết mọi lĩnh vực trong cuộc sống.

  • Cách các con số, văn bản, hình ảnh, âm nhạc và video được máy tính thấu hiểu và đại diện.

  • Kỹ năng lập trình cơ bản là viết mã giả.

  • Những cách hợp lý và không hợp lý để sử dụng AI trong khóa học này.

  • Tính trừu tượng sẽ đóng vai trò như thế nào trong các bài tập tương lai của bạn trong khóa học này.

  • Các khối xây dựng cơ bản của lập trình bao gồm hàm, câu lệnh điều kiện, vòng lặp và biến.

  • Cách xây dựng một dự án trong Scratch.

Đây là CS50! Chào mừng bạn tham gia! Hẹn gặp lại vào lần sau!