Chuyên mục
Python Blog Uncategorized

Dự án “Thử thách sắp xếp”

Các bạn học sinh có còn nhớ dự án ““Nhà thám hiểm và cánh cửa bí mật” hay không? Ở dự án đó, nhà thám hiểm đã phải trải qua hành trình thật khó khăn khi phải lựa chọn 4 căn phòng bí ẩn, thế nhưng bạn ấy đã thành công lấy được kho báu và rời khỏi lâu đài. Trở lại với tòa lâu đài cổ kính đầy rẫy nguy hiểm, các con quái vật sau khi để mất kho báu đã họp bàn với nhau để tìm cách bảo vệ tòa lâu đài tốt hơn. Vậy là, nhân sư đã nâng cấp trò chơi của mình, không còn chỉ là game đoán số thông thường, mà là một thử thách sắp xếp đòi hỏi khả năng tính toán chính xác. 

Lần này, nhà thám hiểm lại quyết định quay trở lại tòa lâu đài bí ẩn. Làm thế nào để các bạn học sinh có thể giúp cho nhà thám hiểm an toàn rời khỏi nơi nguy hiểm đó? Để vượt qua thử thách của nhân sư, nhiệm vụ của chúng ta là sắp xếp các dãy số lộn xộn theo thứ tự từ lớn đến bé hoặc từ bé đến lớn. Chúng ta sẽ được chọn mình sắp xếp bao nhiêu số. Đặc biệt, các số trong dãy số sẽ ở dưới dạng các biểu thức cộng trừ, đòi hỏi sự tính toán thật nhanh và chính xác. Hãy thử sức chơi game với nhân sư ngay nào:

https://s4v.trinket.io/sites/sorting

Kiến thức lập trình 

Một số kiến thức chúng ta đã được học ở  khoá CS 101 sẽ được áp dụng để hoàn thành game nhập vai đơn giản này:

  • Thư viện random để tạo số ngẫu nhiên.
  • Vòng lặp forwhile trong Python.
  • Hàm (function)  trong Python
  • Chuỗi ký tự gồm nhiều dòng (Multi-line String)
  • Mảng trong Python 

Bắt đầu code thôi nào !!!!!

  1. Luật chơi:

Trò chơi bắt đầu khi nhân sư tạo một dãy số ngẫu nhiên dưới dạng các biểu thức cộng, trừ. Nếu sắp xếp theo thứ tự từ bé đến lớn, nhân sư sẽ hỏi người chơi lần lượt từ số bé nhất, số bé thứ hai, số bé thứ ba,… đến số lớn nhất.

Ví dụ: Một dãy số gồm các biểu thức: 3+1, 3-2, 1+1, 2+3. Sau khi tính toán, dãy số đó sẽ là 4, 1, 2, 5. Nhân sư yêu cầu người chơi sắp xếp từ bé đến lớn. Nhân sư sẽ hỏi: Số thứ nhất là số nào? Câu trả lời đúng là số 1. Nếu người chơi trả lời sai, trò chơi sẽ kết thúc. Nếu người chơi trả lời đúng, nhân sư sẽ tiếp tục hỏi: Số thứ hai là số nào? Câu trả lời đúng là 2. Nếu người chơi trả lời sai, trò chơi sẽ kết thúc. Nếu người chơi trả lời đúng, nhân sư sẽ tiếp tục hỏi số thứ ba. Trò chơi tiếp tục như thế đến số cuối cùng. Nếu người chơi trả lời đúng hết thì người chơi sẽ chiến thắng. 

Luật chơi tương tự với trường hợp sắp xếp từ lớn đến bé.

  1. Thuật toán:

Chúng ta sẽ tạo một thuật toán đơn giản để có thể mô phỏng trò chơi này. Chúng ta sẽ sử dụng hai mảng. Một mảng  lưu các biểu thức dưới dạng chuỗi. Mảng còn lại lưu kết quả các biểu thức đó. Ví dụ:  Mảng  lưu dãy các biểu thức: [‘3+1’, ‘3-2’, ‘1+1’, ‘2+3’]. Sau khi tính toán, mảng còn lại sẽ lưu kết quả  dãy số đó sẽ là [4, 1, 2, 5]. Ở đây, mục đích của mảng gồm các chuỗi  là dùng để in ra màn hình cho người chơi. Mảng kết quả gồm các số sẽ dùng để sắp xếp.

Trong luật chơi, nhân sư sẽ hỏi lần lượt các số theo thứ tự từ bé đến lớn (hoặc từ lớn đến bé). Vì vậy, chúng ta có thể tìm số bé nhất (hoặc lớn nhất) trong mảng. Qua mỗi lần nhân sư hỏi, chúng ta sẽ bỏ số bé nhất (hoặc lớn nhất) ra khỏi mảng, và tiếp tục tìm số bé nhất (hoặc lớn nhất) của mảng mới đến khi mảng không còn phần tử nào. 

Ví dụ:  Dãy gồm các biểu thức: 3+1, 3-2, 1+1, 2+3. Sau khi tính toán, dãy kết quả sẽ là 4, 1, 2, 5. Nhân sư yêu cầu người chơi sắp xếp từ bé đến lớn. 

  • Ở lượt thứ nhất, số bé nhất là 1. Sau lượt thứ nhất, chúng ta sẽ bỏ số 1 ra khỏi mảng. Mảng mới sẽ gồm 3 số là 4, 2, 5.
  • Ở lượt thứ hai, số bé nhất là 2. Sau lượt thứ hai, chúng ta sẽ bỏ số 2 ra khỏi mảng. Mảng mới sẽ gồm 2 số là 4, 5.
  • Ở lượt thứ ba, số bé nhất là 4. Sau lượt thứ ba, chúng ta sẽ bỏ số 4 ra khỏi mảng.
  • Mảng mới sẽ còn lại số 5. Số 5 là số cuối cùng. Như vậy, chúng ta đã gián tiếp sắp xếp dãy số ban đầu từ bé đến lớn.

      3. Code:   

Bước 1: Viết hàm giới thiệu game

Trước tiên, chúng ta sẽ tạo một hàm sử dụng câu lệnh print() để in ra màn hình luật chơi cũng như giới thiệu về game:

def intro():
    print('''
    ---
    NUMBER SORTING ++
    ---
    RULE:       Nhiệm vụ của trò chơi là sắp xếp 1 dãy số lộn xộn theo thứ tự từ bé đến lớn hoặc từ lớn đến bé.
                Người chơi sẽ được chọn sắp xếp bao nhiêu số trong dãy số
                Đặc biệt: Các số trong dãy sẽ được cho dưới dạng các biểu thức cộng trừ, đòi hỏi chúng ta cần kĩ năng tính toán cực cao nữa đó!
    ''')

Ở bài số 2, chúng ta đã biết về kiểu dữ liệu chuỗi (string). Từ trước đến nay, ta đều nhận thấy dữ liệu string phải ở trong cùng 1 dòng bắt đầu và kết thúc với dấu “”. Tuy nhiên, nếu ta sử dụng ”’  ”’ (3 dấu ‘), dữ liệu chuỗi có thể gồm nhiều dòng khác nhau (multi-line string).

Bước 2: Viết câu lệnh tương tác với người dùng ở đầu game

Tương tự như dự án “Nhà thám hiểm và cánh cửa bí mật”, chúng ta sẽ tạo một vòng lặp while để hỏi người chơi muốn tiếp tục trò chơi hay dừng lại. Đồng thời chúng ta sẽ in ra luật chơi bằng cách gọi hàm intro đã viết ở bước 1. Chúng ta lưu ý để gọi hàm intro, chúng ta chỉ cần dùng intro() vì hàm không return gì cả. Chúng ta cũng sẽ tạo một biến để hỏi người chơi muốn sắp xếp bao nhiêu số bằng câu lệnh input.

condition = True
while condition == True:                               
  intro()                                             
  number_guest = int(input("Bạn muốn sắp xếp bao nhiêu số nhỉ? >> "))               
        
  again = input('Bạn muốn chơi tiếp không? [Y/N]')                                    
  if again == 'N':
     condition = False

Bước 3: Viết hàm tạo dãy số ngẫu nhiên

Trò chơi sẽ gồm bốn loại biểu thức: a+b, a-b, a+b-c, a-b+c. a, b, c là các số nguyên ngẫu nhiên từ 1 đến 60. Chúng ta sẽ sử dụng câu lệnh random.randint(1,60) tương tự như dự án “Nhà thám hiểm và cánh cửa bí mật”. Mỗi biểu thức trong dãy số sẽ được chọn ngẫu nhiên từ bốn loại biểu thức bằng câu lệnh random.choice tương tự như dự án “Câu chuyện ngẫu nhiên”

Chúng ta sẽ sử dụng hai mảng raw_list1 raw_list2. Mảng raw_list1 lưu biểu thức dưới dạng chuỗi và mảng raw_list2 lưu kết quả của biểu thức. Ở bài số 3, chúng ta đã biết câu lệnh append dùng để lưu dữ liệu vào mảng. Ngoài ra để đổi số thành chuỗi chúng ta sẽ sử dụng hàm str. Để kết nối hai chuỗi, chúng ta sẽ sử dụng phép toán +. Ngoài ra chúng ta cũng không muốn các số trong dãy số lặp lại nên sẽ dùng câu lệnh not in để kiểm tra. “Not in” có nghĩa là không ở trong cái gì đó.   

Chúng ta sẽ tạo hai mảng trống rawlist1 rawlist2. Để dãy số có đủ số mà người chơi muốn sắp xếp, chúng ta sẽ sử dụng vòng lặp while và biến đếm i. Chúng ta sẽ đặt tên cho hàm tạo dãy số ngẫu nhiên là prep. Hàm nhận vào số biểu thức người chơi muốn sắp xếp và trả về hai mảng:

def prep(number_sort):
    rawlist1 = []
    rawlist2 = []                         
    i = 0
    while i < number_sort:                          
        a = random.randint(1,60)                               
        b = random.randint(1,60)
        c = random.randint(1,60)
        options = ["a+b", "a-b", "a+b-c", "a-b+c"]             
        option = random.choice(options)

        if option == 'a+b' and a+b not in rawlist1:
            rawlist1.append(str(a)+ ' + '+ str(b))                         
            rawlist2.append(a+b)                              
        elif option == 'a-b' and a-b not in rawlist2:
            rawlist1.append(str(a)+ ' - '+ str(b))                        
            rawlist2.append(a-b)                               
        elif option == 'a+b-c' and a+b-c not in rawlist2:       
            rawlist1.append(str(a) + "+" + str(b) + "-" + str(c))
            rawlist2.append(a+b-c)
        elif option == 'a-b+c' and a-b+c not in rawlist2:
            rawlist1.append(str(a) + "-" + str(b) + "+" + str(c))
            rawlist2.append(a-b+c)
        i = i + 1
    return rawlist1, rawlist2

Bước 4: Viết hàm trả về số bé nhất (hoặc lớn nhất)

Chúng ta sẽ sử dụng hai hàm có sẵn ở trong Python. Hàm min dùng để tìm số bé nhất trong mảng và hàm max để tìm số lớn nhất trong mảng. Chúng ta sẽ đặt tên hàm cần viết là sorting. Hàm nhận vào mảng (dãy số) và kiểu sắp xếp. Kiểu sắp xếp nhận một trong hai giá trị: 0 (sắp xếp từ bé đến lớn) hoặc 1 (sắp xếp từ lớn đến bé). Hàm trả về số bé nhất (hoặc lớn nhất) tương ứng với cách sắp xếp.

def sorting(arr, sort_type):                 
  
  if sort_type == 0:
     return min(arr)
  else: 
     return max(arr)

Bước 5: Hoàn thiện code

Sau khi hỏi người chơi muốn sắp xếp bao nhiêu số, chúng ta sẽ chọn ngẫu nhiên cách sắp xếp bằng sử dụng câu lệnh random.randint(0,1). Nếu kết quả là 0 thì sắp xếp từ bé đến lớn. Nếu kết quả là 1 thì sắp xếp từ lớn đến bé.

Chúng ta sẽ gọi hàm prep để tạo dãy số ngẫu nhiên đã viết ở bước 2. Chúng ta sẽ in ra màn hình mảng gồm các biểu thức cần sắp xếp và cách thức sắp xếp.  

import random
condition = True
while condition == True:
    intro()
    number_guest = int(input('Bạn muốn sắp xếp bao nhiêu số ? >>'))
    sort_type = random.randint(0,1)

    raw_list1, raw_list2 = prep(number_guest)
    if sort_type == 0:
        print('Sắp xếp dãy số theo thứ tự từ bé đến lớn: ' + str(raw_list1))
    else:
        print('Sắp xếp dãy số theo thứ tự từ lớn đến bé: ' + str(raw_list1))

 	again = input('Bạn có muốn chơi tiếp không? [Y/N]')
    	if again == 'N':
         condition = False

Chúng ta sẽ tạo một vòng lặp while với biến đếm counter để đi qua số lượt nhân sư sẽ hỏi người chơi (bằng với số phần tử của mảng). Với mỗi lượt hỏi, chúng ta sẽ thực hiện ba công việc: 

  • Tìm số bé nhất (hoặc lớn nhất) trong mảng.
  • Hỏi người chơi xem số tiếp theo trong dãy sau khi được sắp xếp là số nào. Kiểm tra đúng hay sai. Nếu đúng thực hiện bước tiếp theo. Nếu sai thoát khỏi vòng lặp.
  • Bỏ số tìm được ở công việc đầu tiên ra khỏi mảng. 

Để tìm số lớn nhất (bé nhất), chúng ta sử dụng hàm đã viết ở bước 3. Chúng ta sử dụng câu lệnh điều kiện giống như thuật toán Cánh cửa bí mật ở bài số 2 để kiểm tra người chơi có nhập đúng số không. Để bỏ một số ra khỏi mảng, chúng ta sẽ sử dụng hàm remove:

  turn = len(raw_list2)
  counter = 0
  while counter < turn:
number = sorting(raw_list2, sort_type)
guess = int(input('Sau khi sắp xếp, số ở vị trí số '+        str(counter + 1) + ' là: >>'))
        
if guess == int(number):
  if counter == turn - 1:
    print('Chúc mừng chiến thắng')
  else:
    print('Đúng rồi! Tiếp tục nào!')
else:
    print('Bạn đã thua, câu trả lời là ' + str(number))
    break
raw_list2.remove(number)
counter = counter + 1

4.  Tada!!! 

Như vậy chúng ta đã hoàn thành xong một game rất thú vị đúng không nào. Các bạn học sinh đã thành công áp dụng kiến thức về hàm đã học ở bài số 4 để viết một thuật toán sắp xếp một dãy số. Ngoài ra, chúng ta cũng biết thêm một số hàm mới có sẵn trong Python giúp chúng ta code thuận tiện hơn  

Chương trình Python hoàn chỉnh của game sẽ là:

# -*- coding: utf-8 -*-

import random

def intro():
  print('''
  ---
  NUMBER SORTING ++
  ---
  RULE:   Nhiệm vụ của trò chơi là sắp xếp 1 dãy số lộn xộn theo thứ tự từ bé đến lớn hoặc từ lớn đến bé.
          Người chơi sẽ được chọn sắp xếp bao nhiêu số trong dãy số
          Đặc biệt: Các số trong dãy sẽ được cho dưới dạng các biểu thức cộng trừ, đòi hỏi chúng ta cần kĩ năng tính toán cực cao nữa đó!
    ''')

def prep(number_sort):
  rawlist1 = []
  rawlist2 = []                         
  i = 0
  while i < number_sort:                          
    a = random.randint(1,60)                               
    b = random.randint(1,60)
    c = random.randint(1,60)
    options = ["a+b", "a-b", "a+b-c", "a-b+c"]             
    option = random.choice(options)

    if option == 'a+b' and a+b not in rawlist1:
       rawlist1.append(str(a)+ ' + '+ str(b))                         
       rawlist2.append(a+b)                              
    elif option == 'a-b' and a-b not in rawlist2:
       rawlist1.append(str(a)+ ' - '+ str(b))                        
       rawlist2.append(a-b)                               
    elif option == 'a+b-c' and a+b-c not in rawlist2:       
       rawlist1.append(str(a) + "+" + str(b) + "-" + str(c))
       rawlist2.append(a+b-c)
    elif option == 'a-b+c' and a-b+c not in rawlist2:
       rawlist1.append(str(a) + "-" + str(b) + "+" + str(c))
       rawlist2.append(a-b+c)
        i = i + 1
    return rawlist1, rawlist2

def sorting(arr, sort_type):                 
  
    if sort_type == 0:
       return min(arr)
    else: 
       return max(arr)	

condition = True
while condition == True:
  intro()
  number_guest = int(input('Bạn muốn sắp xếp bao nhiêu số ? >>'))
  sort_type = random.randint(0,1)

  raw_list1, raw_list2 = prep(number_guest)
  if sort_type == 0:
     print('Sắp xếp dãy số theo thứ tự từ bé đến lớn: ' + str(raw_list1))
  else:
     print('Sắp xếp dãy số theo thứ tự từ lớn đến bé: ' + str(raw_list1))
    
  turn = len(raw_list2)
  counter = 0
  while counter < turn:
    number = sorting(raw_list2, sort_type)
     guess = int(input('Sau khi sắp xếp, số ở vị trí số '+        str(counter + 1) + ' là: >>'))
        
    if guess == int(number):
     if counter == turn - 1:
        print('Chúc mừng chiến thắng')
     else:
        print('Đúng rồi! Tiếp tục nào!')
     else:
        print('Bạn đã thua, câu trả lời là ' + str(number))
        break
     raw_list2.remove(number)
     counter = counter + 1
   again = input('Bạn có muốn chơi tiếp không? [Y/N]')
   if again == 'N':
      condition = False

Các bạn học sinh hãy tự do sáng tạo theo những ý tưởng của riêng mình. Chúng ta có rất nhiều cách để cải tiến game khác lạ hơn. Thầy cô gợi ý các bạn có thể sắp xếp dãy số bằng hàm có sẵn trong Python là sorted. Sắp xếp dãy số trước khi hỏi người chơi sẽ giúp chương trình chúng ta chạy nhanh hơn. Ngoài ra, các bạn có thể thêm vào những loại biểu thức khác nhau, và thêm phép tính nhân, chia. Các bạn học sinh hãy thử tạo nên dự án của riêng mình và chia sẻ game của mình trên STEAMese Profile nhé!

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official       

Chuyên mục
Python Blog Uncategorized

Dự án “Mã hóa Caesar”

  1. Mã hóa Caesar là gì?

Mã hoá là phương pháp để biến thông tin (hình ảnh, văn bản) từ định dạng bình thường sang dạng thông tin mà chúng ta không thể hiểu được nếu không có phương tiện giải mã. Đồng thời, mã hoá có vai trò quan trọng trong giao dịch điện tử để đảm bảo độ bảo mật, toàn vẹn của thông tin khi truyền trên mạng. Thông thường, mã hóa được áp dụng nhiều trong các ví điện tử quen thuộc với chúng ta như Momo, Zalopay, Shopee Pay….Trái lại, giải mã là quá trình ngược của mã hoá, biến thông tin từ dạng được mã hoá về dạng thông tin ban đầu. 

Mật mã Caesar là một dạng mật mã thay thế, trong đó mỗi ký tự ở văn bản ban đầu sẽ được thay thế bằng một ký tự khác, có vị trí cách nó một khoảng xác định trong bảng chữ cái. Cũng giống như các loại mật mã thay thế khác, mật mã Caesar rất dễ bị phá giải. Tuy nhiên đây là một bài toán hay để chúng ta áp dụng kiến thức đã học về “vòng lặp” và “mảng” ở bài 3 của khoá CS 101. Hãy thử tưởng tượng các bạn muốn kể một câu chuyện bí mật cho người bạn thân của mình. Để bảo mật câu chuyện riêng tư không bị lộ ra ngoài, chúng ta cần mã hóa câu chuyện và gửi cho bạn mình kèm với phương pháp giải mã. Cách làm này hết sức thú vị phải không nào!

Người đã sáng chế ra cách mã hóa Caesar thú vị là vị hoàng đế Julius Caesar. Kỹ thuật này đã được phát triển vào khoảng năm 100 Trước Công nguyên. Hoàng đế Caesar đã dùng nó để gửi những mệnh lệnh quan trọng cho những tướng sĩ trên chiến trường. Do đó, nếu bọn giặc có bắt được người truyền tin thì cũng không thể đọc và hiểu được nội dung của bức thư mã hóa đó. Kiến thức này thật sự rất hữu ích và được áp dụng cho tới ngày hôm nay. 

  1. Kiến thức lập trình:

Một số kiến thức chúng ta đã được học ở bài 3 của khoá CS 101 sẽ được áp dụng để hoàn thành chương trình mã hoá này: 

  • Mảng và cách lấy phần tử của mảng trong Python.
  • Vòng lặp forwhile trong Python.
  • Câu lệnh input() để nhập dữ liệu trong Python.
  • Câu lệnh print() để in thông báo ra màn hình.
  • Kiểu dữ liệu boolean trong Python với so sánh ==.
  1. Bài toán:

Chúng ta sẽ sử dụng Thonny để xây dựng một chương trình vừa giúp mã hoá, vừa giúp giải mã Caesar. Chương trình sẽ cho người dùng nhập một câu muốn mã hoá và số ký tự muốn dịch chuyển trong bảng chữ cái (k). Số k dương sẽ dịch chuyển văn bản sang phải (theo thứ tự từ A sang Z). Số k âm sẽ dịch chuyển văn bản sang trái (theo thứ tự từ Z sang A). 

Ví dụ 1:

Văn bản gốc (Văn bản chưa mã hóa): ABCDEF

Văn bản mã hóa: CDEFGH

Trong ví dụ trên, các kí tự trong văn bản gốc được mã hóa bằng cách dịch sang phải 2 kí tự. k=2

GốcABCDEFXYZ
Mã hóaCDEFGHZAB

Vì được dịch sang phải 2 ký tự nên A được mã hóa thành C, B mã hóa thành D… Đặc biệt, Y được mã hóa thành A, Z được mã hóa thành B, quay lại các ký tự đầu tiên.

Ví dụ 2:

Văn bản gốc (Văn bản chưa mã hóa): ABCDEF

Văn bản mã hóa: YZABCD

Trong ví dụ trên, các kí tự trong văn bản gốc được mã hóa bằng cách dịch sang trái 2 kí tự. k=-2

GốcABCDEFXYZ
Mã hóaYZABCDUVX

Vì được dịch sang trái 2 ký tự nên C được mã hóa thành A, D mã hóa thành B… Đặc biệt, A được mã hóa thành Y, B được mã hóa thành Z, quay lại các ký tự cuối cùng.

Chúng ta có thể thấy rằng k âm là phương pháp giải mã cho mã hoá với k dương và ngược lại.

Trước khi bắt tay vào lập trình, chúng ta có thể thử chương trình để mã hoá và giải mã Caesar: https://s4v.trinket.io/sites/caesar    

  1. Bắt tay vào lập trình thôi nào!!!

a. Thuật toán

Trước khi bắt tay vào viết code, chúng ta sẽ cùng suy nghĩ một thuật toán để giải quyết bài toán này nhé. Chúng ta có thể biểu diễn tất cả các ký tự trong bảng chữ cái bằng một mảng trong Python.

arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']

Mảng arr 26 phần tử. Với một ký tự bất kỳ, chúng ta có thể tìm được vị trí (index) i của nó trong mảng. Do đó khi dịch chuyển ký tự đó sang phải k kí tự, vị trí mới sẽ là i + k. Nếu dịch chuyển ký tự đó sang trái k kí tự thì khi đó k < 0 nên vị trí mới vẫn sẽ là i + k.

Trong trường hợp chúng ta dịch chuyển qua hai đầu của bảng chữ cái thì sao nhỉ? Ví dụ: Ký tự ‘X’ ở vị trí 23 trong mảng. Khi dịch chuyển sang phải 3 ký tự, vị trí mới sẽ là 23 + 3 = 26. Tuy nhiên vị trí cuối cùng của mảng arr 25. Do đó, chúng ta phải quay lại vị trí đầu tiên (0) của ký tự ‘A’. Trong trường hợp này, khi dịch chuyển, chúng ta đã đi hết 1 lượt mảng arr. Chúng ta có thể thấy công thức tính vị trí sau khi dịch chuyển là 23 + 3 – 26 * 1 = 0

Lấy một ví dụ khác: Ký tự ‘X’ ở vị trí 23 trong mảng. Khi dịch chuyển sang trái 80 ký tự, vị trí mới sẽ là 23 – 80 = -57. Từ vị trí ký tự ‘X’,  nếu dịch sang trái 23 ký tự, chúng ta sẽ đến vị trí của ký tự ‘A’. Như vậy, chúng ta đã đi hết 1 lượt mảng arr. Từ vị trí ký tự ‘A’, dịch tiếp sang trái 26 ký tự, chúng ta sẽ đi hết một lượt nữa mảng arr và quay lại vị trí ký tự ‘A’. Tiếp tục dịch sang trái 26 ký tự, chúng ta sẽ tiếp tục đi hết một lượt nữa mảng arr và quay lại vị trí ký tự ‘A’. Chúng ta còn phải dịch sang trái 5 ký tự nữa. Như vậy chúng ta sẽ đến vị trí ký tự ‘V’. Tóm lại, chúng ta đã đi hết 3 lượt mảng arr. Chúng ta có thể thấy công thức tính vị trí sau khi dịch chuyển là 23 – 80 + 26 * 3 = 21

Để tính xem phải đi qua mảng arr bao nhiêu lần, chúng ta có thể sử dụng phép toán floor division trong Python. Floor division trong Python là //. Floor division sẽ trả về số nguyên lớn nhất bé hơn kết quả của phép chia thông thường. Ví dụ: Với phép chia thông thường, chúng ta có 3 / 2 = 1,5. Tuy nhiên với floor division, 3 // 2 = 1, bởi vì 1 là số nguyên lớn nhất bé hơn 1,5. Lấy một ví dụ khác: Với phép chia thông thường, -57 / 26 = -2,19. Tuy nhiên với floor division, -57 // 26 = -3, bởi vì -3 là số nguyên lớn nhất bé hơn -2,19.       

Tổng kết lại, nếu chúng ta ở vị trí i trong mảng arr và chúng ta dịch k ký tự, công thức tính vị trí sau khi dịch chuyển là i + k – 26 * ((i + k) // 26).                       

b. Code:

Bước 1: Viết các câu lệnh khai báo cần thiết   

Chúng ta sử dụng câu lệnh input() để hỏi người dùng khi nào muốn dừng trò chơi và vòng lặp while để tiếp tục trò chơi tương tự như trò chơi Nhà thám hiểm và cánh cửa bí mật ở bài 2. Chúng ta cũng tạo mảng arr để lưu bảng chữ cái:

arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
tiep = 'y'
while tiep == 'y':
    tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')

Trong vòng lặp while, chúng ta sẽ sử dụng câu lệnh input()để yêu cầu người dùng nhập câu cần mã hóa và số ký tự muốn dịch chuyển. Chúng ta cần tạo biến để lưu chuỗi sau khi được mã hoá:

plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper()
jump = int(input("Bạn muốn dịch sang mấy ký tự? "))
t = '' 

Để đơn giản, chúng ta sẽ sử dụng câu lệnh .upper() để in hoa tất cả các ký tự trong câu người dùng nhập vào. Code hoàn chỉnh sẽ là:

arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
tiep = 'y'
while tiep == 'y':
    plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper()
    jump = int(input("Bạn muốn dịch sang mấy ký tự? "))
    t = ''
    tiep = input('Nhập y để tiếp tục hoặc n để thoát: ') 

 Bước 2: Xác định vị trí của ký tự trong mảng arr: 

Một câu được biểu diễn bằng kiểu dữ liệu chuỗi (string) trong Python. Chúng ta đã được học ở bài 3, một chuỗi là một mảng mà phần tử là các ký tự trong chuỗi. Ví dụ: chuỗi “STEAM” là một mảng gồm 5 phần tử  “S”, “T”, “E”, “A”, “M”. Như vậy để lấy các ký tự từ chuỗi, chúng ta có thể sử dụng vòng lặp for:

for character in plaintext:
    print(character)

Chúng ta có thể sử dụng câu lệnh print để debug. Trong vòng lặp for, để lấy ra vị trí của ký tự ở trong mảng arr, chúng ta sử dụng thêm vòng lặp while với biến i để lưu vị trí của ký tự trong mảng. Biến i bắt đầu từ 0 và sẽ được cập nhật trong vòng lặp để đi đến vị trí mới trong mảng arr. Chúng ta sử dụng câu lệnh if để kiểm tra xem phần tử ở vị trí i trong mảng arr có giống với ký tự trong chuỗi không. Nếu giống, chúng ta sẽ break. Chúng ta vẫn có thể sử dụng câu lệnh print để debug:

i = 0
while i < len(arr):
    if character == arr[i]:
        print('Giống')
        break          
    i = i + 1

Code hoàn chỉnh sẽ là:

arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
tiep = 'y'
while tiep == 'y':
    plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper()
    jump = int(input("Bạn muốn dịch sang mấy ký tự? "))
    t = ''

    for character in plaintext:
        i = 0
        while i < len(arr):
            if character == arr[i]:
                print('Giống')
                break          
            i = i + 1

    tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')

 Bước 3: Mã hoá ký tự:

Sau khi xác định được vị trí i của một ký tự trong chuỗi, chúng ta sẽ sử dụng công thức tìm vị trí mới ở trong phần thuật toán để xác định ký tự sau khi mã hoá:

character_code = arr[i + jump - len(arr) * ((i + jump) // len(arr))]

Ngoài ra, chúng ta sẽ thêm một trường hợp. Nếu ký tự là khoảng trắng thì ký tự sau khi mã hoá cũng sẽ là khoảng trắng:

 elif character == ' ':
    character_code = ' '

Code hoàn chỉnh sẽ là:

arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
tiep = 'y'
while tiep == 'y':
    plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper()
    jump = int(input("Bạn muốn dịch sang mấy ký tự? "))
    t = ''

    for character in plaintext:
        i = 0
        while i < len(arr):
            if character == arr[i]:
               character_code = arr[i + jump - len(arr) * ((i + jump) // len(arr))]
               break
            elif character == ' ':
               character_code = ' '          
            i = i + 1

    tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')

 Bước 4: Kết nối các ký tự sau khi mã hoá thành chuỗi:

Các ký tự trong chuỗi có thể được xem như một chuỗi con. Để kết nối hai chuỗi thành một chuỗi, chúng ta sử dụng +:

t = t + character_code

Ở bước 1, chúng ta đã sử dụng biến t để lưu câu sau khi được mã hoá. Cuối cùng, chúng ta sẽ in ra câu sau khi được mã hoá:

print('Câu sau khi được mã hoá là: %s' % t)

Chúng ta sử dụng %s để thêm vào một biến có kiểu dữ liệu chuỗi vào câu lệnh print. Ngoài ra chúng ta sẽ thêm %  cùng với tên biến.

5.  Tada!!! 

Như vậy, các bạn học sinh đã hoàn thành xong game giúp mã hoá và giải mã Caesar nhanh chóng rồi đấy. Tuy quá trình làm game không ít khó khăn nhưng chắc chắn thành quả của các bạn rất hữu ích để áp dụng ngay trong cuộc sống. Chúng ta hoàn toàn có thể sử dụng chương trình này để mã hoá ngay một câu đố và đem cho mọi người đau đầu giải mã.  

Chương trình Python hoàn chỉnh của game sẽ là:

# -*- coding: utf-8 -*-

arr = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
tiep = 'y'
while tiep == 'y':
    plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper()
    jump = int(input("Bạn muốn dịch sang mấy ký tự? "))
    t = ''

    for character in plaintext:
        i = 0
        while i < len(arr):
            if character == arr[i]:
               character_code = arr[i + jump - len(arr) * ((i + jump) // len(arr))]
               break
             elif character == ' ':
                character_code = ' '          
            i = i + 1

        t = t + character_code

    print('Câu sau khi được mã hoá là: %s' % t)

    tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')

Có rất nhiều cách chúng ta có thể cải tiến game này. Các bạn hãy nghĩ một cách nào đó chúng ta có thể loại bỏ vòng lặp while sử dụng để đi qua các phần tử trong mảng arr. Ngoài ra, các bạn có thể cải tiến game bằng cách mã hoá cả chữ hoa và chữ thường, chứ không cần phải chuyển hết sang chữ hoa. 

Không chỉ vậy, thầy Harry và thầy Đức có một gợi ý hữu ích cho các bạn học sinh. Nếu chúng ta còn nhớ trong bài Vui học cùng thầy cô 1, thầy Đức đã giới thiệu cho chúng ta bảng mã ASCII. Trong bảng mã ASCII cũng có hai bảng chữ cái in hoa và in thường đấy. Chúng ta có thể chuyển một ký tự sang mã ASCII bằng câu lệnh ord() và chuyển từ mã ASCII về lại ký tự bằng câu lệnh chr(). Sau đó, chúng ta có thể chuyển từ số trong bảng mã ASCII thành vị trí của một phần tử trong mảng arr. Các bạn hãy cùng thử nhé!

Một gợi ý nữa để cải tiến game đó là chúng ta có thể sử dụng phép toán % trong Python để tính số lần chúng ta đi hết mảng arr. Phép toán này giúp chúng ta tìm số dư trong một phép chia. Ví dụ: 3 % 2 = 1.

Nhờ áp dụng ngay kiến thức của bài 3 khoá CS 101, bạn Đức Hoàng đã tạo ra được game “Mã hóa Caesar” hết sức thú vị và thực tế. Các bạn học sinh cũng hãy thử bắt tay vào sáng tạo một game cho riêng mình nhé! Sau khi hoàn thành game, các bạn có thể chia sẻ game của mình trên STEAMese Profile. 

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official       

Chuyên mục
Học kỳ Mùa thu 2021 Khám phá Python Blog

Dự án “Câu chuyện ngẫu nhiên”

  1. Kiến thức lập trình

Một số kiến thức chúng ta đã được học ở bài 3 của khoá CS 101 sẽ được áp dụng để hoàn thành trò chơi này:

  • Mảng trong Python. 
  • Cách lấy phần tử ngẫu nhiên trong mảng bằng thư viện random.
  • Vòng lặp while trong Python.
  • Câu lệnh input() để nhập dữ liệu trong Python.
  • Câu lệnh print() để in thông báo ra màn hình.
  1. Câu chuyện về dự án

Các bạn học sinh hãy thử tưởng tượng mình hóa thân vào vai một vị đạo diễn tài năng đang làm phim. Trong phim có hai nhân vật chính: một nam, một nữ. Ý tưởng về lời thoại và trang phục phù hợp cho hai nhân vật đã có trong kịch bản trên tay đạo diễn. Thế nhưng, có quá nhiều kịch bản hay nên các bạn chưa biết phải lựa ra kịch bản nào làm một bộ phim hoàn chỉnh. Các bạn học sinh đã có những ý tưởng khắc phục vấn đề này hay chưa? STEAM for Vietnam gợi ý thư viện random trong Python có thể giúp chúng ta kết hợp các lời thoại, trang phục khác nhau để tạo nên những câu chuyện đa dạng đấy!

 Chúng ta có thể chơi thử trò chơi ở đây nhé: https://s4v.trinket.io/sites/random 

  1. Bắt tay vào lập trình thôi nào!

Thư viện random:

Trong Python, thư viện random để thực hiện ngẫu nhiên một việc gì đó. Ở trò chơi Nhà thám hiểm và cánh cửa bí mật, chúng ta đã sử dụng một câu lệnh trong thư viện này để tạo số ngẫu nhiên cho nhân sư: random.randint(1,10). 

Ngoài ra, thư viện random còn có một câu lệnh để lấy ngẫu nhiên một phần tử trong mảng: random.choice(). Chúng ta sẽ dùng câu lệnh này để tạo ra game. 

      Code:

a)   Bước 1: Tạo danh sách các nhân vật, lời thoại, trang phục, và diễn biến câu chuyện:

Chúng ta sử dụng mảng để lưu trữ danh sách các nhân vật, lời thoại, trang phục, và diễn biến câu chuyện. Mảng sẽ được khai báo bằng [], các phần tử trong mảng được ngăn cách với nhau bởi dấu phẩy:

women = ["Một nữ hoàng", "Một bà già", "Bà Granny", "Một con chim", "Một nhà quý tộc", "Một bác sĩ", "Một diễn viên", "Trẩu"]

men = ["một sĩ quan", "một bá tước", 'một vị vua', 'một rô bốt sát thủ', 'một nghệ sĩ', 'một ông già', 'một nhà hoá học', 'William']

place = ['dưới biển', 'trên sao Hoả', 'ở siêu thị', 'trong một toà lâu đài', 'trong nhà bạn', 'trên mái nhà', 'phòng thí nghiệm']

women_wear = ['một cái váy', 'một cái túi giấy', 'một bộ đồ lặn', 'một cánh tiên', 'một bao ni lông']
men_wear = ['một bộ vest tím', 'một bộ đồ hoá trang con gấu', "một cái áo sơ mi"]

happens = ['sập nhà', 'cãi lộn', 'đánh nhau', 'một bàn chân lớn nghiền nát họ','núi lửa phun trào', 'động đất', 'Trái đất nổ tung']

women_say = ['Ngươi là ai?', 'Xin chào', 'đưa tiền đây', 'hello']

men_say = ["Ai đó", 'bíp bíp', 'ngươi là đứa nào', 'giết người', 'hello', 'Chả hiểu nói gì']

b)   Bước 2: Tạo câu chuyện ngẫu nhiên:

Bộ phim của chúng ta sẽ bắt đầu khi nhân vật nam gặp nhân vật nữ tại một địa điểm nào đó. Hai người nói chuyện với nhau và sự việc tiếp theo xảy ra.

Tương tự như trò chơi “Nhà thám hiểm và cánh cửa bí mật”, chúng ta sử dụng câu lệnh input() để hỏi người dùng khi nào muốn dừng trò chơi và vòng lặp while để tiếp tục trò chơi. Chúng ta sử dụng câu lệnh print để in ra câu chuyện.

Để lấy ngẫu nhiên một phần tử trong mảng, chúng ta sử dụng câu lệnh: random.choice(). Trong dấu ngoặc sẽ là tên của mảng. Ví dụ, để lấy ngẫu nhiên một nhân vật nữ trong mảng women, chúng ta sử dụng câu lệnh: random.choice(women)

Code hoàn chỉnh sẽ là:

import random

tiep = "y"
while tiep == "y":
    print(random.choice(women),"gặp", random.choice(men),random.choice(place))
    print("Cô ấy mặc", random.choice(women_wear))
    print("Anh ấy mặc", random.choice(men_wear))
    print("Cô ấy nói", random.choice(women_say))
    print("Anh ấy nói", random.choice(men_say))
    print("Điều đó dẫn đến", random.choice(happens))
    print()
    tiep = input("Nhấn y để tiếp tục hoặc n để thoát: ")
    print()

4.  Tada!!!

Như vậy chúng ta đã hoàn thành trò chơi rồi đấy. Thật đơn giản đúng không nào. 

Code hoàn chỉnh sẽ là:

# -*- coding: utf-8 -*-

women = ["Một nữ hoàng", "Một bà già", "Bà Granny", "Một con chim", "Một nhà quý tộc", "Một bác sĩ", "Một diễn viên"]

men = ["một sĩ quan", "một bá tước", 'một vị vua', 'một rô bốt sát thủ', 'một nghệ sĩ', 'một ông già', 'một nhà hoá học']

place = ['dưới biển', 'trên sao Hoả', 'ở siêu thị', 'trong một toà lâu đài', 'trong nhà bạn', 'trên mái nhà']

women_wear = ['một cái váy', 'một cái túi giấy', 'một bộ đồ lặn', 'một cánh tiên', 'một bao ni lông']
men_wear = ['một bộ vest tím', 'một bộ đồ hoá trang con gấu', "một cái áo sơ mi"]

happens = ['sập nhà', 'cãi lộn', 'đánh nhau', 'một bàn chân lớn nghiền nát họ','núi lửa phun trào', 'động đất', 'Trái đất nổ tung']

women_say = ['Ngươi là ai?', 'Xin chào', 'đưa tiền đây', 'hello']

men_say = ["Ai đó", 'bíp bíp', 'ngươi là đứa nào', 'giết người', 'hello', 'Chả hiểu nói gì']

import random

tiep = "y"
while tiep == "y":
    print(random.choice(women),"gặp", random.choice(men),random.choice(place))
    print("Cô ấy mặc", random.choice(women_wear))
    print("Anh ấy mặc", random.choice(men_wear))
    print("Cô ấy nói", random.choice(women_say))
    print("Anh ấy nói", random.choice(men_say))
    print("Điều đó dẫn đến", random.choice(happens))
    print()
    tiep = input("Nhấn y để tiếp tục hoặc n để thoát: ")
    print()

Quá trình hoàn thành dự án “Câu chuyện ngẫu nhiên” thật thú vị đúng không? Các bạn học sinh hãy tự sáng tạo cho mình những cốt truyện phim khác nhau từ nhân vật, trang phục tới nơi chốn, sự việc để hoàn thành một bộ phim của riêng mình nhé! Sau khi hoàn thành game, các bạn có thể chia sẻ game của mình trên STEAMese Profile để khoe cùng mọi người.

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official

Chuyên mục
Nhật ký Lập trình Về Chúng tôi

“Hôm nay, bố mẹ cùng học với con nữa nhé!”

“Sáng thứ bảy nào, cả gia đình cũng có mặt đầy đủ và hào hứng nghe giảng các buổi học lập trình cùng thầy cô trong STEAM for Vietnam. Bởi vì cả bố và mẹ đều không biết nhiều về lập trình nên những buổi học lập trình của con cũng là những cơ hội để bố mẹ mở mang kiến thức ở mảng này. Khi đó, chị cảm thấy khoảng cách thế hệ dường như được rút ngắn lại, bố mẹ trở thành những người bạn thân thiết, đồng hành và phát triển cùng con. Cả gia đình chị còn dành thời gian cùng nhau ôn bài và làm game mới mỗi cuối tuần. Điều này vừa giúp con vững kiến thức hơn và vừa tạo cho con không gian để giải trí một cách bổ ích. Nói chung, nhờ STEAM for Vietnam mà nhà chị đã “sưu tầm” được rất nhiều kỷ niệm dễ thương, đồng thời có cơ hội gắn kết tình cảm giữa con với ba mẹ nhiều hơn nữa. 

bé Minh

Nhờ cách giảng bài rất cặn kẽ của các thầy cô trong STEAM for Vietnam, con chị đã có thể thực hành bài tập ngay sau buổi học. Ngoài ra, chị luôn mong muốn con có thể áp dụng những kiến thức đã được học vào đời sống một cách thật sáng tạo bằng khả năng suy luận và tư duy của mình Vì thế, chị đã luôn động viên và hỗ trợ con trong quá trình phát triển game dựa trên các ý tưởng lấy từ đời sống thường ngày. Đó chính là lý do mà game “Miu đi siêu thị” ra đời. Đây là chủ đề thú vị mà chị đã gợi ý cho con khi cả nhà cùng nhau đi mua sắm. Chị rất tự hào khi thấy con hăng say lên nội dung chi tiết cho game và cặm cụi quên giờ giấc để hoàn thành dự án đầy tâm huyết của mình. 

Chị cảm thấy khóa học lập trình này là một trải nghiệm hết sức thú vị của con và cả gia đình. Nhờ có các buổi học lập trình trực tiếp cùng STEAM for Vietnam mỗi thứ bảy mà cả gia đình có thêm một hoạt động sinh hoạt cùng nhau. Một điều chị muốn nhắn nhủ với các phụ huynh còn đang e ngại chưa dám cho con học lập trình đó là các con đang ở độ tuổi mà khả năng tư duy và tiếp thu rất nhạy bén, vì vậy bố mẹ hãy tự tin cho con được tiếp xúc với lập trình từ sớm nhé!

– Chia sẻ từ chị Dương Minh Phương – phụ huynh bé Minh Sơn (7 tuổi), đang theo học khóa CS 001 – Nhập môn Tư duy máy tính và Lập trình Scratch tại STEAM for Vietnam-

— — —

“Nhật ký Lập trình” là series thuật lại những câu chuyện mà phụ huynh, học sinh, và các thầy cô chia sẻ về chặng đường theo học các khoá lập trình cùng STEAM for Vietnam.

Đọc thêm về series Nhật ký Lập trình tại đây.

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official



Chuyên mục
Học kỳ Mùa thu 2021 Khám phá Khoá học Python Blog

Dự án: “Nhà thám hiểm và cánh cửa bí mật”

  1. Kiến thức lập trình 

Sau khi học về câu điều kiện và vòng lặp, chúng ta đã có thể tạo được một game nhập vai đơn giản giống như bạn Hoàng Long. Một số kiến thức cần thiết để áp dụng trong game mà các bạn học sinh cần nhớ: 

  • Sử dụng Thonny để tạo một game đơn giản bằng Python.
  • Câu lệnh input() để nhập dữ liệu trong Python.
  • Câu lệnh print() để in thông báo ra màn hình.
  • Câu điều kiện với if, elif, và else trong Python.
  • Kiểu dữ liệu boolean trong Python với so sánh ==.
  • Thư viện random để tạo số ngẫu nhiên.
  • Vòng lặp while trong Python.
  1. Hành trình đầy thử thách của nhân vật trong game

Cốt truyện game là hành trình hết sức khó khăn của một nhà thám hiểm vô tình đi lạc vào một tòa lâu đài cổ kính. Xung quanh là không gian tối tăm, tĩnh mịch không một tiếng động, bạn ấy vừa hoang mang, vừa lo sợ khi trên tay chỉ cầm một ngọn đuốc le lói ánh sáng. Liệu điều gì đang chờ nhà thám hiểm trong tòa lâu đài này đây? 

Bỗng nhiên, nhà thám hiểm tìm thấy 4 căn phòng bí ẩn. Mỗi căn phòng lại có một kết cục khác nhau cho số phận của nhà thám hiểm đó! Các bạn học sinh có thể trải nghiệm game bằng cách nhấn vào đường link sau trước khi bắt tay vào code nhé!: https://s4v.trinket.io/sites/adventure-game 

  1. Bắt tay viết code thôi nào!

Trước khi bắt đầu viết code, chúng ta sẽ xây dựng một sơ đồ để hình dung thuật toán của game. Điều này rất cần thiết để chúng ta có thể hình dung các bước giải quyết một bài toán và code dễ dàng hơn. 

Hãy bắt đầu với vị trí đầu tiên của nhà thám hiểm, đối diện với 4 cánh cửa trong tòa lâu đài tối tăm. 

Sơ đồ 1: Nhà thám hiểm chọn phòng

Căn phòng thứ nhất: nhà thám hiểm ngỡ ngàng trước vô số vàng bạc, kim cương lấp lánh. Nếu may mắn chọn đúng căn phòng này, nhà thám hiểm sẽ có thể thoát khỏi tòa lâu đài và trở nên giàu có với rương kho báu khổng lồ. 

Căn phòng thứ hai: một con yêu tinh xấu xí, đáng sợ đang ẩn náu trong căn phòng để chờ nhà thám hiểm đi đến. Nó xông ra với một cây chùy trên tay và khiến nhà thám hiểm phải bỏ mạng ngay tại căn phòng này.

Căn phòng thứ ba: một con rồng khổng lồ đang nằm ngủ ngay góc phòng. Nếu nhà thám hiểm hoảng hốt và hét lên, con rồng sẽ tỉnh giấc và phun lửa thiêu rụi nhà thám hiểm ngay lập tức. Còn khi nhà thám hiểm đứng im không nhúc nhích, con rồng vô tình thức dậy thì sẽ trông thấy và nuốt trọn nhà thám hiểm. Vậy phải làm thế nào đây? Cách an toàn nhất là nhẹ nhàng đi ra khỏi phòng. Thế nhưng không hiểu sao cánh cửa lại bị khóa. Khi đó, tay nắm cửa đột nhiên phát ra tiếng động, bẫy được kích hoạt và khiến cho nhà thám hiểm bị rơi ra khỏi tòa lâu đài. Nhà thám hiểm đã trở về thành phố mà không có kho báu. 

Sơ đồ 2: Các trường hợp trong căn phòng 3

Căn phòng thứ tư: Bước vào căn phòng cuối cùng, nhà thám hiểm sẽ gặp con nhân sư với một câu đố hóc búa. Nhân sư rất thông minh và nó bắt nhà thám hiểm đoán đúng con số nó đang nghĩ trong đầu. Con số từ 1 đến 10. Nếu đoán đúng, nhân sư sẽ cho nhà thám hiểm đi khỏi lâu đài. Nếu đoán sai, nhà thám hiểm sẽ phải ở lại làm nô lệ cho nhân sư.

Sơ đồ 3: Các trường hợp trong căn phòng 4

Để hoàn thiện trò chơi, các bạn học sinh cần hỏi thêm người chơi có muốn tiếp tục chơi hay dừng lại sau khi đã mở cửa 1 căn phòng không nhé!

  1. Tiến hành code

Bước 1: Viết giới thiệu game

Chúng ta sẽ sử dụng chương trình Thonny để thực hiện game này. Trước tiên, chúng ta cần sử dụng câu lệnh print() để in ra màn hình vị trí bắt đầu của nhà thám hiểm. Để cho game sinh động, chúng ta sẽ thêm hình vẽ lâu đài bằng các ký tự ASCII (Nguồn: https://www.asciiart.eu/buildings-and-places/castles).

LAUDAI = """
   |>>>                                                      |>>>
    |                     |>>>          |>>>                  |
    *                     |             |                     *
   / \                    *             *                    / \
  /___\                 _/ \           / \_                 /___\
  [   ]                |/   \_________/   \|                [   ]
  [ I ]                /     \       /     \                [ I ]
  [   ]_ _ _          /       \     /       \          _ _ _[   ]
  [   ] U U |        {#########}   {#########}        | U U [   ]
  [   ]====/          \=======/     \=======/          \====[   ]
  [   ]    |           |   I |_ _ _ _| I   |           |    [   ]
  [___]    |_ _ _ _ _ _|     | U U U |     |_ _ _ _ _ _|    [___]
  \===/  I | U U U U U |     |=======|     | U U U U U | I  \===/
   \=/     |===========| I   | + W + |   I |===========|     \=/
    |  I   |           |     |_______|     |           |   I  |
    |      |           |     |||||||||     |           |      |
    |      |           |   I ||vvvvv|| I   |           |      |
_-_-|______|-----------|_____||     ||_____|-----------|______|-_-_
   /________\         /______||     ||______\         /________\
  |__________|-------|________\_____/________|-------|__________|
"""
print("Bạn đang ở trong một căn phòng tối tăm nằm trong một lâu đài bí hiểm.")
print(LAUDAI)
print("Có 4 cánh cửa trước mặt bạn, bạn hãy chọn một cánh cửa để thám hiểm.")

Để yêu cầu người chơi chọn cửa để khám phá, chúng ta sẽ sử dụng câu lệnh input():

a = input("Bạn chọn cánh cửa sổ: ")

Bước 2: Viết phần lựa chọn phòng

Câu lệnh input() chuyển dữ liệu người dùng nhập thành chuỗi nên a sẽ có kiểu dữ liệu chuỗi (string). Các bạn sẽ kiểm tra giá trị người chơi nhập vào từ bàn phím để xem người chơi chọn cửa số mấy để thám hiểm. Vì a có kiểu dữ liệu chuỗi nên chúng ta sẽ kiểm tra với “1”, “2”, “3”, “4”. Chúng ta lưu ý phải có dấu "". Để kiểm tra xem hai chuỗi có giống nhau không chúng ta có thể sử dụng ==. Khi kiểm tra, kết quả trả về sẽ có kiểu dữ liệu boolean True hoặc False. Vì có bốn phòng nên chúng ta sẽ sử dụng câu lệnh điều kiện rẽ nhánh để kiểm tra xem người chơi chọn thám hiểm phòng nào:

if a == "1":
    print("Bạn đang ở phòng 1.")
elif a == "2":
    print("Bạn đang ở phòng 2.")
elif a == "3":
    print("Bạn đang ở phòng 3.")
elif a == "4":
    print("Bạn đang ở phòng 4.")
else:
    print("Xin lỗi, bạn chỉ có thể nhập 1,2,3 hoặc 4")

Câu lệnh điều kiện rẽ nhánh sẽ kiểm tra điều kiện ở câu lệnh if trước, sau đó sẽ đến điều kiện ở các câu lệnh elif. Nếu tất cả điều kiện đó đều không thoả mãn thì sẽ thực hiện dòng lệnh ở else. Dòng lệnh ở else giúp nhắc nhở người chơi phải nhập các số 1, 2, 3, hoặc 4. Chúng ta lưu ý đi sau if và  elif là điều kiện nhưng ở else thì không. Có một cách rất hay để chúng ta có thể kiểm tra code mình viết (debug) đó là sử dụng câu lệnh print(). Khi chạy code, chúng ta hãy nhập vào bất kì phòng nào và xem chương trình in ra màn hình đúng phòng không.

Sau khi kiểm tra phần chọn phòng, chúng ta sẽ thêm vào một câu lệnh để hỏi người chơi muốn chơi tiếp hay dừng lại:

exit_choice = input("Ấn Enter để chơi lại, hoặc gõ thoát để đóng trò chơi.")

Sau khi người dùng nhập câu trả lời, chúng ta phải kiểm tra và nếu người chơi muốn chơi tiếp, chúng ta sẽ thực hiện lại toàn bộ các câu lệnh ở trên. Các bạn hãy sử dụng kiến thức vòng lặp while. Trong khi biến exit_choice không phải là “thoát” thì chúng ta sẽ quay lại thực hiện toàn bộ các câu lệnh. Để kiểm tra điều kiện không phải, chúng ta sử dụng !=:

while exit_choice != "thoát":

Tuy nhiên, chương trình chúng ta vẫn còn một lỗi nho nhỏ đấy. Đó chính là khi lần đầu tiên chơi, biến exit_choice chưa được gán bất kỳ giá trị nào. Chúng ta có thể gán biến đó với bất kỳ giá trị nào, ngoại trừ “thoát” để có thể bắt đầu trò chơi:

exit_choice = "c"

Chương trình hoàn chỉnh sẽ là:

exit_choice = "c"
while exit_choice != "thoát":
    if a == "1":
        print("Bạn đang ở phòng 1.")
    elif a == "2":
        print("Bạn đang ở phòng 2.")
    elif a == "3":
        print("Bạn đang ở phòng 3.")
    elif a == "4":
        print("Bạn đang ở phòng 4.")
    else:
        print("Xin lỗi, bạn chỉ có thể nhập 1,2,3 hoặc 4")
    exit_choice = input("Ấn Enter để chơi lại, hoặc gõ thoát để đóng trò chơi.")

Bước 3: Viết phần lựa chọn từng phòng:

  • Phòng 1:

Sau khi đã chia thành từng trường hợp, chúng ta sẽ đi theo sơ đồ đã vẽ ở sơ đồ 1. Với phòng 1, chúng ta sẽ in ra màn hình chúc mừng người chơi đã chọn đúng phòng có kho báu và hỏi người chơi muốn chơi tiếp hay dừng lại:

if a == "1":
    print("Bạn đã tìm thấy một căn phòng chứa kho báu, phát tài rồi!")
    print("Bạn đã thắng cuộc, trò chơi kết thúc.")
    print("(Khởi động lại để tiếp tục khám phá.)")
  • Phòng 2:

Với phòng 2 có con yêu tinh, chúng ta sẽ in ra màn hình chia buồn với người chơi và hỏi người chơi muốn chơi tiếp hay dừng lại:

elif a == "2":
    print("Cửa bật mở, một con yêu tinh xông ra và phang chuỳ vào đầu bạn.")
    print("Bạn đã chết, trò chơi kết thúc.")
    print("(Khởi động lại để tiếp tục khám phá.)")
  • Phòng 3:

Với phòng 3 có con rồng, chúng ta sẽ yêu cầu người chơi chọn làm gì sau khi thấy con rồng. Có ba lựa chọn tương ứng với ba số 1, 2, 3:

elif a == "3":
    print("Bạn bước vào căn phòng và thấy một con rồng đang ngủ say, bạn sẽ: ")
    print("1: Hét to lên để hăm doạ con rồng.")
    print("2: Từ từ đi ra khỏi phòng.")
    print("3: Chả làm gì cả.")
    b = input("Nhập lựa chọn của bạn vào đây: ")

Chúng ta sử dụng biến mới b để lưu câu trả lời của người chơi, tương tự như khi chúng ta hỏi người chơi chọn phòng nào. Và chúng ta cũng sẽ sử dụng câu lệnh điều kiện rẽ nhánh để chia thành các trường hợp lựa chọn:

if b == "1":
    print("Con rồng giật mình và phun lửa vào bạn.")
    print("Bạn đã bị thiêu rụi, trò chơi kết thúc.")
elif b == "2":
    print("Bạn định ra khỏi phòng thì nhận ra cánh cửa đã khóa, bạn chạm vào tay nắm cửa cũ kỹ và nó phát ra tiếng động!")
    print("Bẫy được kích hoạt, bạn rơi ra khỏi lâu đài và bạn thấy thành phố trước mắt mình.")
    print("Bạn đã thoát, trò chơi kết thúc.")
    print("(Khởi động lại để tiếp tục khám phá.)")
elif b == "3":
    print("Bạn đứng đó hồi lâu và con rồng thức dậy, vừa nhìn thấy bạn, con rồng lập tức nuốt chửng bạn ngay!")
    print("Bạn đã trở thành bữa ăn ngon cho rồng, bạn đã chết, trò chơi kết thúc.")
    print("(Khởi động lại để tiếp tục khám phá.)")
else:
    print("Xin lỗi, bạn chỉ có thể nhập 1,2,3.")
  • Phòng 4:

Ở căn phòng cuối cùng có một con nhân sư yêu cầu nhà thám hiểm phải đoán được số nó đang nghĩ. Chúng ta cũng bắt đầu nhánh ở phòng 4 bằng việc hỏi người chơi đoán số nhân sư đang nghĩ:

elif a == "4":
    print("Căn phòng bạn bước vào có một con nhân sư.")
    print("Nhân sư bắt bạn phải đoán được số mà nó đang nghĩ đến trong các số nguyên từ 1 đến 10.")
    print("Nếu bạn đoán đúng, nhân sư sẽ cho bạn đi.")
    print("Ngược lại bạn phải làm nô lệ cho nó!")
    number = int(input("Bạn chọn số nào: ")) 

Chúng ta cùng tìm hiểu cách để nhân sư nghĩ ra một số ngẫu nhiên. Để có thể tạo một số nguyên ngẫu nhiên từ 1 đến 10, chúng ta sẽ sử dụng thư viện (library) random trong Python. Thư viện random sẽ gồm rất nhiều câu lệnh nhỏ với những chức năng khác nhau. Ở đây chúng ta sẽ sử dụng random.randint() với hai input là 1 và 10. Tuy nhiên trước hết, chúng ta phải gọi thư viện đó trong Python bằng câu lệnh import.

Chúng ta sử dụng câu lệnh int() để chuyển kiểu dữ liệu từ chuỗi (string) sang số nguyên (int). Mục đích để kiểm tra số người dùng nhập và số nguyên tạo ngẫu nhiên bằng random.randint():

import random
if number == random.randint(1,10):
    print("Nhân sư gầm lên thất vọng. Bạn đã đoán đúng.")
    print("Nhân sư phải thả bạn đi.")
    print("Bạn đã chiến thắng. Trò chơi kết thúc.")
    print("(Khởi động lại để tiếp tục khám phá.)")
else:
    print("Nhân sư cười khoái trá. Bạn đã đoán sai!")
    print("Bạn đã trở thành nô lệ của nhân sư!")
    print("Bạn đã thua, trò chơi kết thúc.")
    print("(Khởi động lại để tiếp tục khám phá.)")
  1. Chương trình hoàn chỉnh của game

Chúng ta sẽ thêm câu lệnh # -*- coding: utf-8 -*- để hiển thị tiếng Việt. Đồng thời, các bạn học sinh lưu ý chương trình hoàn chỉnh phải lùi lề. Chương trình Python hoàn chỉnh của game sẽ là:

# -*- coding: utf-8 -*-
  
import random

LAUDAI = """
   |>>>                                                      |>>>
    |                     |>>>          |>>>                  |
    *                     |             |                     *
   / \                    *             *                    / \
  /___\                 _/ \           / \_                 /___\
  [   ]                |/   \_________/   \|                [   ]
  [ I ]                /     \       /     \                [ I ]
  [   ]_ _ _          /       \     /       \          _ _ _[   ]
  [   ] U U |        {#########}   {#########}        | U U [   ]
  [   ]====/          \=======/     \=======/          \====[   ]
  [   ]    |           |   I |_ _ _ _| I   |           |    [   ]
  [___]    |_ _ _ _ _ _|     | U U U |     |_ _ _ _ _ _|    [___]
  \===/  I | U U U U U |     |=======|     | U U U U U | I  \===/
   \=/     |===========| I   | + W + |   I |===========|     \=/
    |  I   |           |     |_______|     |           |   I  |
    |      |           |     |||||||||     |           |      |
    |      |           |   I ||vvvvv|| I   |           |      |
_-_-|______|-----------|_____||     ||_____|-----------|______|-_-_
   /________\         /______||     ||______\         /________\
  |__________|-------|________\_____/________|-------|__________|
"""

exit_choice = "c"
while exit_choice != "thoát":
   print("Bạn đang ở trong một căn phòng tối tăm nằm trong một lâu đài bí hiểm.")
   print(LAUDAI)
   print("Có 4 cánh cửa trước mặt bạn, bạn hãy chọn một cánh cửa để thám hiểm.")
 
   a = input("Bạn chọn cánh cửa số: ")
   if a == "1":
        print("Bạn đã tìm thấy một căn phòng chứa kho báu, phát tài rồi!")
        print("Bạn đã thắng cuộc, trò chơi kết thúc.")
        print("(Khởi động lại để tiếp tục khám phá.)")
   elif a == "2": 
        print("Cửa bật mở, một con yêu tinh xông ra và phang chuỳ vào đầu bạn.")
        print("Bạn đã chết, trò chơi kết thúc.")
        print("(Khởi động lại để tiếp tục khám phá.)")
   elif a == "3":
       print("Bạn bước vào căn phòng và thấy một con rồng đang ngủ say, bạn sẽ: ")
        print("1 : Hét to lên để hăm doạ con rồng.")
        print("2 : Từ từ ra khỏi phòng.")
        print("3 : Chả làm gì cả.")
        b = input("Nhập lựa chọn của bạn vào đây: ")
        if b == "1":
            print("Con rồng giật mình và phun lửa vào bạn.")
            print("Bạn đã bị thiêu rụi, trò chơi kết thúc.")
        elif b == "2":
            print("Bạn định ra khỏi phòng thì nhận ra cánh cửa đã khóa, bạn chạm vào tay nắm cửa cũ kỹ và nó phát ra tiếng động!")
            print("Bẫy được kích hoạt, bạn rơi ra khỏi lâu đài và bạn thấy thành phố trước mắt mình.")
            print("Bạn đã thoát, trò chơi kết thúc.")
            print("(Khởi động lại để tiếp tục khám phá.)")
        elif b == "3":
           print("Bạn đứng đó hồi lâu và con rồng thức dậy, vừa nhìn thấy bạn, con rồng lập tức nuốt chửng bạn ngay!")
           print("Bạn đã trở thành bữa ăn ngon cho rồng, bạn đã chết, trò chơi kết thúc.")
           print("(Khởi động lại để tiếp tục khám phá.)")
        else:
           print("Xin lỗi, bạn chỉ có thể nhập 1,2,3.")
    elif a == "4":
        print("Căn phòng bạn bước vào có một con nhân sư.")
        print("Nhân sư bắt bạn phải đoán được số mà nó đang nghĩ đến trong các số nguyên từ 1 đến 10.")
        print("Nếu bạn đoán đúng, nhân sư sẽ cho bạn đi.")
        print("Ngược lại bạn phải làm nô lệ cho nó!")
        number = int(input("Bạn chọn số nào: "))

        if number == random.randint(1,10):
            print("Nhân sư gầm lên thất vọng. Bạn đã đoán đúng.")
            print("Nhân sư phải thả bạn đi.")
            print("Bạn đã chiến thắng. Trò chơi kết thúc.")
            print("(Khởi động lại để tiếp tục khám phá.)")
        else:
            print("Nhân sư cười khoái trá. Bạn đã đoán sai!")
            print("Bạn đã trở thành nô lệ của nhân sư!")
            print("Bạn đã thua, trò chơi kết thúc.")
            print("(Khởi động lại để tiếp tục khám phá.)") 
    else:
        print("Xin lỗi, bạn chỉ có thể nhập 1,2,3 hoặc 4")
    exit_choice = input("Ấn Enter để chơi lại, hoặc gõ thoát để đóng trò chơi.")

STEAM for Vietnam khuyến khích các bạn học sinh hãy thử sáng tạo cốt truyện, tạo nhiều phòng và thử thách cho nhà thám hiểm hơn. Bên cạnh đó, các bạn cũng có thể cải tiến thêm cho game như thế này: khi người chơi nhập sai yêu cầu (Ví dụ: không phải các số từ 1 đến 4 cho số phòng), chương trình sẽ cho người chơi nhập lại đến khi đúng.  

Chỉ với những kiến thức từ hai bài đầu tiên của khoá CS101, bạn Hoàng Long đã tạo ra được một game đơn giản nhưng cũng không kém phần thú vị và gay cấn. STEAM for Vietnam tin rằng bạn học sinh nào cũng có thể sáng tạo dự án cá nhân đầy ấn tượng như vậy. Các bạn hãy thử bắt tay vào thực hiện dự án nhé! Sau khi hoàn thành game, các bạn có thể chia sẻ game của mình trên STEAMese Profile để khoe cùng mọi người.

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official

Chuyên mục
Học kỳ Mùa thu 2021

3 lợi ích của khóa học lập trình cho trẻ em tại STEAM for Vietnam

  • “Bài giảng chất lượng, gần gũi với trẻ nhỏ” 

STEAM for Vietnam đã đem đến cho các bạn nhỏ một hành trình thú vị để nắm được các thao tác lập trình căn bản, cũng như nâng cao tư duy máy tính. Theo mình, khóa học CS101 được thiết kế với nội dung và tài liệu rất phù hợp với các em nhỏ. Đặc biệt, bé nhà mình rất thích phần làm đồ họa nhảy theo nhạc. Trong quá trình học, các thầy cô luôn tận tình hướng dẫn dễ hiểu cho các bé. Nhờ vậy mà học sinh không chỉ học được cách “dịch từ “ngôn ngữ người” sang “ngôn ngữ máy” mà còn học được cách tư duy và làm ra sản phẩm cụ thể. Dự án cuối khóa chắc hẳn là cột mốc đặc biệt đối với các em học sinh. Bé nhà mình cũng học hỏi được nhiều khi phải phải chuẩn bị video giới thiệu về dự án cuối khóa, từ nội dung đến cách nói, cách trình bày. Con đóng cửa phòng viết, sửa, tìm hiểu… rất hăng say. Con đã học được rất nhiều sau khi hoàn thành dự án, đồng thời tạo ra một sản phẩm cụ thể mà con chưa bao giờ có.

(Mẹ của bé Quỳnh Mai – lập trình viên nhí đạt giải Demo Day CS 001 đã chia sẻ cho STEAM for Vietnam về những cảm xúc khi cho con theo học CS 001 & CS 101) 

  • “Chị muốn con học tư duy trước khi học kiến thức” 

Lúc đầu thì mình cũng chỉ muốn cho cháu làm quen với lập trình thôi vì đây cũng là một kỹ năng quan trọng như ngoại ngữ vậy.  Chị cảm thấy cháu tự tin hơn hẳn vì lập trình là một kỹ năng khá mới mẻ với các bạn nhỏ. Các bé được học cách tư duy, làm việc khoa học qua hình thức sắp xếp đoạn code và “Tách-Tìm-Nhìn-Viết”. Đồng thời, chị thấy rằng việc học lập trình sẽ giúp cho con tăng khả năng sáng tạo và giải quyết vấn đề. Cho nên, chị khuyến khích ba mẹ hãy cho con cái học lập trình từ sớm. Không hẳn học lập trình sẽ thành lập trình viên, dù rằng gia đình mình cũng rất mong muốn điều đó. May mắn là hiện tại cháu cũng rất yêu thích lập trình và muốn theo đuổi ngành này trong tương lai. Thế nhưng, chị tin rằng việc học lập trình sẽ trao cho các bé nhiều giá trị hữu ích hơn thế!

(Chia sẻ của phụ huynh bé Minh Đức – đạt giải Demo Day CS 101 khóa Spring Coding Bootcamp 2021)

  • “Con chưa bao giờ quen được nhiều bạn mới đến vậy” 

Mỗi bài học của các con mình đều theo dõi, mình thấy rằng học với STEAM các bé còn học được nhiều điều ngoài kiến thức. Chẳng hạn các con hay chấm bài cho bạn, rất chăm chỉ và cẩn thận. Đồng thời khi viết code cũng gọn gàng, ngay ngắn hơn trước nhiều. Nhờ học STEAM for Vietnam mà các con có thêm nhiều bạn mới ở khắp nơi. Hai anh em thường xuyên trao đổi với nhau và với các bạn trên STEAMese Profile. Cứ làm xong bài tập về nhà là lại đăng lên cho các bạn xem liền, háo hức lắm. Bình thường mỗi buổi học các con đều vào ngay LMS sớm để chat với các bạn nữa! 

(Anh Tuấn – phụ huynh của Trung Hiếu – có hai con đều đạt giải Weekly Challenge vui vẻ chia sẻ cảm nhận về khóa học)

STEAM for Vietnam rất vui vì phụ huynh và các em nhỏ đã cùng đồng hành trên hành trình thực hiện sứ mệnh lan tỏa công nghệ đến với hơn 20 triệu trẻ em Việt Nam trong 5 năm tới.  Những phản hồi tích cực từ cha mẹ là động lực giúp cho STEAM for Vietnam tiếp tục thực hiện sứ mệnh ý nghĩa này. 

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official

Chuyên mục
Nhật ký Lập trình Về Chúng tôi

“Mỗi đứa trẻ sinh ra đã là một thiên tài, chỉ có bản thân bố mẹ là giới hạn con thôi”

Là một người theo chủ nghĩa giáo dục sớm, chị rất tâm đắc câu nói này: “Mỗi đứa trẻ sinh ra đã là một thiên tài, chỉ có bản thân bố mẹ là giới hạn con thôi”. Vì vậy, chị luôn cố gắng động viên để con có thể phát huy hết khả năng của bản thân từ sớm. Cũng đã có rất nhiều người hỏi chị rằng dạy con học lập trình từ sớm như vậy (bé có tự học từ khi lên 4) có khó không? Câu trả lời là có, nhưng nếu mình chịu khó tìm cách, thì việc gì cũng có thể làm được cả thôi! 

Với con trẻ, việc dành cho con những lời động viên cùng với sự đồng hành của bố mẹ là điều vô cùng quan trọng. Mình hay áp dụng những biện pháp như khen con, nhảy múa hay tập thể dục mỗi khi con đang học mà buồn ngủ để tinh thần con phấn chấn hơn. Ngoài ra, mình còn tập cho con tính kỷ luật bằng cách đặt ra mục tiêu mỗi ngày về phần việc mà con cần làm. Khi con hoàn thành chỉ tiêu thì sẽ được tích điểm vào quyển sổ sao để nhận được phần thưởng từ mẹ. Phần thưởng cũng không cần phải to tát gì với các bạn bé đâu, đơn giản là chiếc cặp tóc xinh xinh, hay chiếc bút chì mới là đủ tạo động lực cho các con rồi! 

Bố mẹ thường nghĩ lập trình là cái gì rất cao siêu nhưng thật ra thì không phải vậy, vì bây giờ đã có những ngôn ngữ lập trình thân thiện với trẻ em như Scratch với giao diện tươi mới nhiều sắc màu, giúp các con có thể rèn luyện tư duy logic và tư duy sắp đặt không chỉ trong học tập mà còn trong cuộc sống nữa. Bố mẹ nào còn đang lăn tăn thì hãy cho con học thử lập trình tại STEAM for Vietnam ngay hôm nay để thấy được những lợi ích mà lập trình có thể mang lại cho con nhé! 

– Chia sẻ từ chị Trịnh Thùy Linh – phụ huynh bé Mật Ong (4 tuổi), đang theo học khóa CS 001 – Nhập môn Tư duy máy tính và Lập trình Scratch tại STEAM for Vietnam-

— — —

“Nhật ký Lập trình” là series thuật lại những câu chuyện mà phụ huynh, học sinh, và các thầy cô chia sẻ về chặng đường theo học các khoá lập trình cùng STEAM for Vietnam.

Đọc thêm về series Nhật ký Lập trình tại đây.

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official



Chuyên mục
Nhật ký Lập trình Về Chúng tôi

Một mùa hè COVID khó quên

Thân chào các Thầy/Cô và đại gia đình STEAM for Vietnam,

Hè vừa qua là một mùa hè có lẽ thật khó quên với hai đứa trẻ nhà chúng mình. Một mùa hè Covid tưởng chừng sẽ buồn nhưng thật may, nhờ có khóa học lập trình CS 001 mà mùa hè đó lại là một mùa hè thật ý nghĩa, mang lại cho các con thêm trải nghiệm mới. Con Phạm Minh Khoa (10 tuổi) và bạn của con là Nguyễn Thị Thùy Dương (9 tuổi) của nhóm Star đã tham gia khóa CS 001, Trại hè lập trình 2021 và nhận được giải thưởng “Giải thiết kế độc đáo”.

Là người mẹ nhìn đứa con của mình khôn lớn và vui tươi mỗi ngày, mình thật lòng biết ơn STEAM for Vietnam rất nhiều. Các bạn, các Thầy/Cô là những người đã vẽ giấc mơ thật đẹp cho con mình, cũng như rất nhiều các bạn nhỏ khác ở Việt Nam. Cảm ơn STEAM for Vietnam vì đã lan tỏa tình yêu, niềm đam mê lập trình cho các bạn nhỏ Việt Nam.

Minh Khoa

P/s: Cô Quỳnh Anh* ơi, thật sự con mình hâm cô các thầy cô ở STEAM for Vietnam nhiều lắm. Con đã tự đặt tên tiếng anh cho mình là Justin vì hâm mộ thầy Justin Hoàng* (thầy vừa đẹp trai, vui tính và còn thiết kế giỏi). Con cũng vô cùng yêu quý các thầy cô đã dạy con suốt khóa học vừa qua như thầy Song Hà, cô Nga, cô Trang, thầy Dương và nhiều thầy cô nữa. Con cũng biết đến cả cô Joy Vũ, cô hoa hậu Phương Thủy, chị Nghi tài giỏi biết nhiều thứ tiếng nữa. 

Cảm xúc của con vỡ òa khi xem clip giới thiệu về các thầy cô, con thật sự hâm mộ và lòng đầy rạo rực khi được học lập trình từ  các thầy cô làm ở các công ty công nghệ hàng đầu thế giới. Và sự thật chứng minh con đã rất phấn khởi, tích cực trong suốt quá trình học bài. Con sẽ luôn dõi theo STEAM for Vietnam và các Thầy/Cô.

Chúc đội ngũ STEAM for Vietnam và các Thầy/Cô luôn mạnh khỏe, hạnh phúc và thành công trong công việc của mình. Yêu thương STEAM for Vietnam rất nhiều.

Trân trọng,

Đặng Thị Minh Huệ

*Cô Quỳnh Anh – Thành viên đội ngũ Vận hành tại STEAM for Vietnam

*Thầy Justin Hoàng – Design Lead (Trưởng đội ngũ Thiết kế) tại STEAM for Vietnam

Chia sẻ từ chị Đặng Thị Minh Huệ – phụ huynh bạn Phạm Minh Khoa (10 tuổi) – học sinh khóa CS001 Trại hè lập trình 2021-

— — —

“Nhật ký Lập trình” là series thuật lại những câu chuyện mà phụ huynh, học sinh, và các thầy cô chia sẻ về chặng đường theo học các khoá lập trình cùng STEAM for Vietnam.

Đọc thêm về series Nhật ký Lập trình tại đây.

Đăng ký tham gia các khoá học Học kỳ mùa Thu của STEAM for Vietnam: https://steamforvietnam.org/courses

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official



Chuyên mục
Khám phá Scratch Blog

[CS 001] Học phần Get Started Course – Hỏi & Đáp

1. Học phần Get Started Course là gì? Tại sao cần phải hoàn thành khoá này trước khi tham gia vào khoá học.

  • Get Started Course là học phần tìm hiểu về hệ sinh thái công nghệ của STEAM for Vietnam (bao gồm Learning Management System – LMS, Live Apps, STEAMese Profile), được dùng để hướng dẫn và mô phỏng những giao diện trên nền tảng trong khoá học chính thức. 
  • Get Started Course sẽ cung cấp những hướng dẫn cụ thể những thao tác mà học sinh cần biết để tham gia khoá học một cách hiệu quả: cách xem bài giảng trực tuyến, xem lại bài giảng, trả lời câu hỏi điểm danh, làm bài tập về nhà (bao gồm nộp bài tập và chấm điểm cho bạn). Điểm của học phần Get Started Course không nằm trong điểm của khoá học chính thức. 
  • Học sinh cần hoàn thành học phần Get Started Course trước 11:59 tối ngày 3/10/2021 để tiếp tục truy cập vào các bài học chính thức của khoá học. 

2. Có bắt buộc phải hoàn thành học phần Get Started Course không? Nếu không làm thì có được tham gia khoá học CS 001 không?

Các học sinh bắt buộc phải hoàn thành học phần Get Started Course thì mới có thể tiếp tục học các bài giảng tiếp theo trong khoá học. Với những học sinh chưa hoàn thành học phần Get Started Course đúng hạn, tuy rất tiếc nhưng học sinh không thể truy cập vào các bài học tiếp học của khoá học.

3. Làm thế nào để hoàn thành học phần Get Started Course? 

Để hoàn thành học phần Get Started Course, học sinh cần:

  1. Trả lời 10 câu hỏi trắc nghiệm trong phần Quiz + Project;
  2. Nộp đường link sau scratch.mit.edu/projects/568229548 vào phần Project Scratch (Lưu ý: Vì các con chưa được học lập trình Scratch, chưa được hướng dẫn tạo project nên chỉ cần copy và nộp đúng đường link trên để hoàn thành phần này); và
  3. Chấm bài 5 bạn khác: Các con chọn “Bài làm hợp lệ” nếu bài của bạn khác nộp đúng đường link trên. Ngược lại, học sinh chọn “Bài làm không hợp lệ” nếu bài của bạn khác nộp không đúng đường link yêu cầu. 

Lưu ý: Sau khi học sinh hoàn thành cả 3 bước trên, học sinh sẽ cần chờ một vài ngày để được hiển thị điểm và mở khoá bài học tiếp theo. Lý do cho việc cần chờ một vài ngày là vì bài của mỗi học sinh đều cần được các bạn khác chấm thì hệ thống mới có thể hiển thị được điểm cuối cùng.

4. Nộp gì cho phần “Project Scratch” trong Get Started Course? Thế nào là đường link hợp lệ?

Để mô phỏng lại cách thức nộp đường link dự án trong các bài học chính thức, phần câu hỏi trong học phần Get Started Course yêu cầu học sinh nộp đường link mẫu vào phần câu trả lời. Đường link để trả lời đã được cung cấp bởi BTC trong phần hướng dẫn: “https://scratch.mit.edu/projects/568229548”. Với câu hỏi này, học sinh chỉ cần sao chép và dán đường link này vào phần trả lời bên dưới. Bài làm có đường link hợp lệ là bài làm có đường link giống với đường link đã được BTC cung cấp như trên. 

5. Làm thế nào để Chấm điểm cho bạn – Peer Assessment là gì? 

Với những học sinh đã nộp đường link hợp lệ, hệ thống sẽ mở ra phần “Chấm điểm bài nộp của bạn” để học sinh có thể hoàn thành phần Chấm điểm cho bạn. 

Học sinh cần phải chấm đường link cho 5 bạn khác xem bài làm có hợp lệ hay không:

  • Bài làm hợp lệ là bài làm có đường link giống với đường link BTC đã cung cấp (https://scratch.mit.edu/projects/568229548). 
  • Bài làm KHÔNG hợp lệ là bài làm có đường link KHÁC với đường link BTC đã cung cấp. 

BTC khuyến khích các học sinh cần hoàn thành phần chấm điểm này càng sớm càng tốt, để không chỉ giúp bài của học sinh có điểm sớm (để có thể truy cập vào các nội dung tiếp học của khoá học) mà còn giúp các bạn cùng học được nhận đánh giá đầy đủ.

Đây là hình thức chấm điểm Peer Assessment, một trong những hình thức đánh giá kết quả học tập phù hợp đề cao hiệu quả trong môi trường số. Chi tiết về lý do chọn Peer Assessment cho khoá học CS001 đã được anh Hùng Trần – người sáng lập STEAM for Vietnam – chia sẻ trong bài viết sau đây

6. Tại sao học sinh đã hoàn thành phần nộp Project Scratch và Chấm điểm cho bạn mà vẫn chưa có điểm và chưa truy cập được các bài học tiếp theo?

Sau khi học sinh nộp bài, học sinh sẽ cần chờ một vài ngày để được hiển thị điểm và mở khoá bài học tiếp theo. Lý do của việc chờ này là vì ngay tại lúc nộp bài, bài của học sinh chưa được các bạn khác chấm. Học sinh cần chờ một vài ngày để các bạn khác chấm điểm cho mình thì hệ thống mới có thể hiển thị được điểm cuối cùng.

Mọi câu hỏi thắc mắc khác về học phần Get Started Course các phụ huynh học sinh và các con học sinh có thể gửi câu hỏi lên mục “Thảo luận” (Discussion) trên hệ thống LMS, hoặc thông qua email hello@steamforvietnam.org.

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official

Chuyên mục
Học viên Về Chúng tôi

Gặp gỡ top lập trình viên nhí xuất sắc từ khóa học CS 001

Hồ Nhật Quang (Hà Nội) – Giải Xuất sắc nhất

Trò chơi của bạn Hồ Nhật Quang (12 tuổi) vô cùng sáng tạo khi truyền tải thành công thông điệp 5K phòng chống COVID-19, mỗi màn chơi là một của bạn chính là sự tổng hợp của từng bài học trong khóa học CS 001 – đây chính là điều khiến Ban Giám khảo đánh giá rất cao khi Quang đã ghi nhớ tốt các kiến thức được thầy cô giảng dạy. Hãy cùng STEAM for Vietnam tìm hiểu câu chuyện thú vị của lập trình viên nhí đã đạt giải Xuất sắc nhất từ phụ huynh của bạn nhé!

“Nguồn cảm hứng từ người thân trong gia đình đã đưa con nhà mình đến với lập trình và STEAM for Vietnam. Con có lập một kênh Youtube để review game, vì vậy con cũng tò mò những tựa game mình thường chơi được làm ra như thế nào. 

Trong quá trình thực hiện dự án, Nhật Quang đã có ý tưởng tạo một trò chơi có thể tổng kết được toàn bộ khoá học. Vì vậy con đã liên kết nhiều bài học với nhau.

Sau quá trình học hỏi và làm dự án tại STEAM for Vietnam, Nhật Quang đã học được sự kiên nhẫn trong khi học tập và làm việc. Ngoài ra, con đã biết quản lý thời gian tốt hơn để hoàn thiện dự án trong thời gian ngắn. Trải nghiệm tự làm một dự án đã giúp con hiểu hơn về lập trình và có mục tiêu cho mình trong tương lai. ” 

Link dự án: https://www.youtube.com/watch?v=50wBWMId9iU 

Nhóm CODER (An Giang) – Giải Xuất sắc nhất + Giải được Yêu thích nhất

Nhóm CODER gồm bạn Trần Trung Hiếu (12 tuổi) và Trần Hoàng Long (9 tuổi) đã  giành cùng lúc 2 giải thưởng từ buổi Demo Day cuối khoá với Giải Trò chơi Xuất sắc nhất và Giải được Yêu thích nhất. Trò chơi của nhóm đã rất sáng tạo khi đưa mọi người đi khám phá các địa danh của tỉnh An Giang cùng hai quần đảo Hoàng Sa và Trường Sa. Hai bạn cũng có bài thuyết trình rất tự tin và chuyên nghiệp. Chính nỗ lực này đã giúp nhóm CODER xuất sắc giành 2 giải thưởng của lớp CS 001: giải Trò chơi Xuất sắc nhất do Ban Giám khảo bình chọn và giải Yêu thích nhất do các bạn nhỏ khác bình chọn trên hệ thống STEAMese Profile.

“Trong suốt quá trình thực hiện dự án, hai anh em cùng bàn nhau phân chia công việc. Hoàng Long nhỏ hơn nên làm phần tìm kiếm thông tin về các địa danh của An Giang cùng phần nhạc nền. Còn Trung Hiếu kĩ năng tốt hơn nên làm phần nâng cao, tìm kiếm thêm ý tưởng cho dự án (biển đảo, phòng chống COVID – 19) và xử lý các lỗi phát sinh. 

Sau khóa học, các con đã học thêm được rất nhiều kỹ năng hữu ích, bao gồm: Lập bản thảo và hoàn thiện ý tưởng, thuyết trình, làm việc nhóm, xử lý lỗi code.”

Link dự án: https://www.youtube.com/watch?v=l7hEESrS2Gs 

Nhóm Kuties Ponies (Hoa Kỳ) – Giải Trò chơi Sáng tạo 

Nhóm Kutie Ponies của Bùi Nguyễn Phúc Khánh (12 tuổi) và Bùi Nguyễn An Nhiên (7 tuổi) đã xuất sắc giành Giải Trò chơi Sáng tạo với sự khen ngợi của các thầy cô STEAM for Vietnam. Ý tưởng dự án của hai em rất thú vị khi nói về hành trình thu thập các vật phẩm như khẩu trang, nước rửa tay, vaccine và tránh COVID-19. Đặc biệt, hai bạn nhỏ cũng chính là hai chị em ruột, đã cùng đồng hành và hỗ trợ lẫn nhau trong dự án lập trình này. 

“Trong quá trình học tập, hai bé cũng gặp một số khó khăn. Những khái niệm về lập trình như biến, vòng lặp, tạo bản sao vẫn còn khó hiểu. Do đó, gia đình phải giải thích chi tiết, cặn kẽ cho các con và xem lại nhiều lần. Bởi vì hai bé có niềm đam mê với mỹ thuật và hoạt hình nên chị đã khuyến khích con làm game theo ý tưởng sáng tạo của riêng mình. 

Gia đình rất bất ngờ và tự hào khi hai con xuất sắc nhận Giải Trò chơi Sáng tạo. Đồng thời, chị mong rằng những thành công đầu tiên này sẽ khơi gợi niềm đam mê yêu thích lập trình của hai bé. Sau khi học ở STEAM for Vietnam, hai bé không chỉ học được những kiến thức lập trình bổ ích mà còn rèn giũa các kỹ năng mềm. Con chị đã hình thành khả năng tự học và làm việc nhóm thông qua những tranh luận giữa hai chị em khi làm dự án cuối khóa.”

Link dự án: https://www.youtube.com/watch?v=_o6w6GTq92c 

Nhóm Lập trình viên Việt Nam (Hà Nội, Đà Nẵng, Quảng Ngãi, Hồ Chí Minh) – Giải Nỗ lực 

Các học sinh Nguyễn Tấn Hy Hữu, Lê Xuân Ngọc Mai, Nguyễn Hàng Tâm Minh và Lê Đặng Huyền Trâm đã tạo ra nhóm Lập trình viên Việt Nam và xuất sắc giành Giải Nỗ lực của khóa CS 001 trong Trại hè Lập trình 2021. Dù các thành viên đều chỉ 10 tuổi, nhóm Lập trình viên Việt Nam được ban giám khảo đánh giá cao vì sự phối hợp ăn ý khi làm việc nhóm. Ý tưởng trò chơi là đưa chúng ta tham quan 5 thành phố cũng chính là quê hương của các thành viên trong nhóm. 

“Khi thực hiện dự án, bạn Trâm được phân công làm thư ký, chịu trách nhiệm chính trong việc liên lạc và tổng hợp đóng góp từ các bạn. Bạn Hữu thích lập trình nên con xung phong làm thêm các tính năng mới trong game. Còn 2 bạn Nga và Mai tìm hình backdrop cho game và test game.

 Ban đầu các con đều không rõ phải làm việc nhóm online như thế nào, nhưng sau buổi họp đầu tiên, các con đã có thể tự chủ động email/meeting làm online khá ăn ý. Các bố mẹ cũng bất ngờ khi con có thể tự chủ động sắp xếp hoàn thành công việc với nhau: Tự tạo link online để meeting qua Google Meet, Zoom; tự dùng email liên lạc sắp xếp thời gian làm online; remix nhiều project trên Scratch với nhau.”

Link dự án: https://www.youtube.com/watch?v=4zPa34hltdY 

Tạm kết

Dù các em học sinh của STEAM for Vietnam ở độ tuổi còn nhỏ thế nhưng đã rèn luyện được rất nhiều kỹ năng mềm khi hoàn thiện dự án cuối khóa.  Không chỉ vậy, các em còn đạt được những thành tích đáng nhớ, làm động lực để phát triển niềm đam mê lập trình tốt hơn trong tương lai. Phụ huynh quan tâm có thể đăng ký các khóa học sắp tới vào Học kỳ Mùa thu 2021 của STEAM for Vietnam. 

Học kỳ Mùa thu bắt đầu mở đơn đăng ký từ 01/09/2021 và dự kiến khai giảng vào cuối tháng 09 hoặc tháng 10/2021 (tuỳ khoá học). Hãy theo dõi fanpage của STEAM for Vietnam để cập nhập những thông tin mới nhất về khoá học nhé!

Đăng ký tham gia Học kỳ mùa Thu của STEAM for Vietnam: https://steamforvietnam.org/courses

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official