====== BÀI HỌC 1 - Làm quen với Lua: Viết và chạy chương trình đơn giản, hiểu biến và làm việc với kiểu dữ liệu cơ bản ======
===== 1. Viết chương trình Lua đầu tiên =====
Một cách tuyệt vời để bắt đầu học bất kỳ ngôn ngữ lập trình nào là viết một chương trình đơn giản in ra dòng chữ "Hello, World!". Chương trình cơ bản này sẽ giúp bạn làm quen với cú pháp của Lua và hàm **print**.\\
**Ví dụ mã:**\\
print("Hello, Mini World: CREATA!")
{{:script:feature:lesson_1.png?nolink&400|}}
==== Giải thích: ====
* **print:** Đây là một hàm có sẵn trong Lua, dùng để in văn bản ra màn hình. Hàm là thành phần quan trọng trong mọi ngôn ngữ lập trình, và **print** là một trong những hàm đơn giản nhất bạn có thể dùng.
* **"Hello, Mini World: CREATA!":** Đây là một chuỗi (string), tức là một dãy ký tự được đặt trong dấu ngoặc kép. Hàm **print** sẽ nhận chuỗi này làm đối số và hiển thị nó ra màn hình.
Khi bạn chạy chương trình này, bạn sẽ thấy dòng chữ **"Hello, Mini World: CREATA!"** hiển thị. Điều này cho thấy môi trường Lua đã được cài đặt đúng và bạn có thể chạy chương trình Lua thành công.\\
==== Bài tập: ====
* Viết chương trình in ra dòng chữ **"Hello, Mini World Developer!"** bằng Lua.
* Chạy chương trình để xem kết quả.
* Thử thay đổi nội dung chuỗi để in tên của bạn hoặc một thông điệp khác.
**Ví dụ mã bài tập:**\\
print("Hello, Mini World Developer!")
{{:script:feature:lesson_1_2.png?nolink&800|}}
----
===== 2. Biến trong Lua =====
Biến được dùng để lưu trữ dữ liệu và cho phép bạn sử dụng hoặc thay đổi dữ liệu đó trong suốt chương trình. Trong Lua, bạn có thể khai báo biến bằng từ khóa **local**. Phần này sẽ hướng dẫn cách khai báo, gán giá trị và sử dụng biến trong Lua.\\
**Ví dụ mã:**\\
local myDevLevel = 3
local myMiniWorldString = "Hello, Player!"
local myMiniWorldBoolean = true
print(myDevLevel)
print(myMiniWorldString)
print(myMiniWorldBoolean)
{{:script:feature:lesson_1_3.png?nolink&400|}}
==== Giải thích: ====
* **local:** Từ khóa dùng để khai báo một biến cục bộ, nghĩa là biến đó chỉ được sử dụng bên trong khối mã nơi nó được định nghĩa.
* **myDevLevel, myMiniWorldString, myMiniWorldBoolean:** Đây là các tên biến. Trong Lua, tên biến phân biệt chữ hoa và thường, và nên đặt tên có ý nghĩa để thể hiện rõ dữ liệu mà nó lưu.
* **3, "Hello, Player!", true:** Đây là các giá trị được gán cho biến. Lua hỗ trợ nhiều kiểu dữ liệu khác nhau như số (number), chuỗi (string), và giá trị logic (boolean).
====Thực hành:====
Khai báo một vài biến với các kiểu dữ liệu khác nhau và dùng hàm **print** để in giá trị của chúng ra màn hình:\\
local level = nil
local name = "Don"
local isDev = true
print(level)
print(name)
print(isDev)
----
=====3. Kiểu dữ liệu cơ bản=====
Hiểu rõ kiểu dữ liệu là một phần quan trọng trong lập trình, vì chúng xác định loại dữ liệu mà bạn có thể sử dụng và xử lý. Lua hỗ trợ một số kiểu dữ liệu cơ bản như sau:\\
==== Number (Số) ====
Trong Lua, kiểu số có thể là số nguyên hoặc số thực (thập phân). Chúng thường được dùng trong các phép tính toán học và xử lý số liệu.\\
**Ví dụ:**\\
local age = 30
local height = 1.75
print(age) -- in ra: 30
print(height) -- in ra: 1.75
----
==== String (Chuỗi) ====
Chuỗi là dãy ký tự dùng để biểu diễn văn bản. Trong Lua, chuỗi có thể được đặt trong dấu nháy kép **" "** hoặc nháy đơn **' '**.
**Ví dụ:**\\
local greeting = "Hello, World!"
local singleQuoteString = 'This is also a string'
print(greeting)
print(singleQuoteString)
----
==== Boolean (Giá trị đúng/sai) ====
Kiểu boolean biểu diễn giá trị đúng **(true)** hoặc sai **(false)**. Chúng thường được dùng trong các câu lệnh điều kiện để điều khiển luồng chương trình.\\
**Ví dụ:**\\
local isLuaFun = true
local isRaining = false
print(isLuaFun) -- in ra: true
print(isRaining) -- in ra: false
----
====Nil (Giá trị rỗng)====
**nil** đại diện cho một giá trị không tồn tại hoặc chưa được gán. Đây là cách Lua biểu thị “không có gì”.\\
**Ví dụ:**\\
local nothing = nil
print(nothing) -- in ra: nil
----
====Thực hành:====
* Tạo các biến với các kiểu dữ liệu khác nhau: số, chuỗi, boolean, nil.
* Dùng hàm **print** để in giá trị của các biến ra màn hình.
* Thay đổi giá trị của biến và in lại để quan sát sự thay đổi.
**Ví dụ:**\\
local temperature = 23.5
local weather = "Sunny"
local isSummer = true
local unknown = nil
print(temperature)
print(weather)
print(isSummer)
print(unknown)
-- Thay đổi giá trị
temperature = 30
weather = "Cloudy"
isSummer = false
print(temperature)
print(weather)
print(isSummer)
----
=====4. Tìm hiểu thêm về Chuỗi (Strings)=====
Chuỗi trong Lua rất linh hoạt và đi kèm nhiều hàm hữu ích để thao tác. Phần này sẽ giới thiệu về cách **nối chuỗi, đo độ dài chuỗi**, và một số **hàm xử lý chuỗi cơ bản**.
**🔹 Nối chuỗi**\\
Nối chuỗi là quá trình kết hợp hai chuỗi lại với nhau. Trong Lua, toán tử **..** được dùng để nối chuỗi.\\
**Ví dụ:**\\
local firstName = "Mini"
local lastName = "World"
local fullName = firstName .. " " .. lastName
print(fullName) -- in ra: Mini World
**🔹 Độ dài chuỗi**\\
Bạn có thể lấy độ dài của một chuỗi bằng toán tử #.\\
**Ví dụ:**\\
local myString = "Hello, Lua!"
local length = #myString
print(length) -- in ra: 11
**🔹 Các hàm chuỗi trong Lua**\\
Lua cung cấp nhiều hàm xử lý chuỗi có sẵn như **string.upper**, **string.lower**, và **string.sub**.\\
**Ví dụ:**\\
local myString = "Hello, All Developer"
-- Chuyển sang chữ in hoa
local upperString = string.upper(myString)
print(upperString) -- in ra: HELLO, ALL DEVELOPER
-- Chuyển sang chữ thường
local lowerString = string.lower(myString)
print(lowerString) -- in ra: hello, all developer
-- Cắt chuỗi con (substring)
local subString = string.sub(myString, 1, 5)
print(subString) -- in ra: Hello
{{:script:feature:lesson_1_4.png?nolink&600|}}
====Thực hành:====
* Tạo 2 biến kiểu chuỗi và nối chúng lại.
* Tính và in ra độ dài của một chuỗi.
* Dùng các hàm **string.upper**, **string.lower** và **string.sub** để xử lý chuỗi và in kết quả ra màn hình.
**Ví dụ:**\\
local greeting = "Good"
local timeOfDay = " Morning"
local fullGreeting = greeting .. timeOfDay
print(fullGreeting) -- in ra: Good Morning
local message = "Hello, World!"
local messageLength = #message
print(messageLength) -- in ra: 13
local upperMessage = string.upper(message)
local lowerMessage = string.lower(message)
local partialMessage = string.sub(message, 1, 5)
print(upperMessage) -- in ra: HELLO, WORLD!
print(lowerMessage) -- in ra: hello, world!
print(partialMessage) -- in ra: Hello
----
=====5. Tìm hiểu thêm về Số (Numbers)=====
Các con số trong Lua rất đơn giản, nhưng bạn có thể thực hiện nhiều thao tác và hàm khác nhau với chúng. Phần này sẽ trình bày về **các phép toán số học**, **các hàm toán học**, và **chuyển đổi kiểu dữ liệu**.\\
**🔹 Phép toán số học**\\
Lua hỗ trợ các phép toán cơ bản như cộng, trừ, nhân, chia và chia lấy dư.\\
**Ví dụ:**\\
local a = 10
local b = 5
local sum = a + b -- 15
local difference = a - b -- 5
local product = a * b -- 50
local quotient = a / b -- 2
local modulus = a % b -- 0
print(sum)
print(difference)
print(product)
print(quotient)
print(modulus)
**🔹 Các hàm toán học**\\
Thư viện **math** của Lua cung cấp nhiều hàm hữu ích để thực hiện các phép toán, ví dụ như: **math.sqrt**, **math.floor**, **math.ceil**, và **math.random**.
**Ví dụ:**\\
local number = 16
local squareRoot = math.sqrt(number) -- 4
local floorValue = math.floor(4.7) -- 4 (làm tròn xuống)
local ceilValue = math.ceil(4.2) -- 5 (làm tròn lên)
local randomValue = math.random(1, 10) -- Số ngẫu nhiên từ 1 đến 10
print(squareRoot)
print(floorValue)
print(ceilValue)
print(randomValue)
**🔹 Chuyển đổi kiểu dữ liệu**\\
Lua cho phép chuyển đổi giữa các kiểu dữ liệu, ví dụ như từ số sang chuỗi và ngược lại.\\
**Ví dụ:**\\
local num = 42
local str = tostring(num) -- Chuyển số thành chuỗi
print(str) -- in ra: "42"
print(type(str)) -- in ra: string
local numStr = "123"
local numValue = tonumber(numStr) -- Chuyển chuỗi thành số
print(numValue) -- in ra: 123
print(type(numValue)) -- in ra: number
====Thực hành:====
* Thực hiện các phép toán cơ bản trên 2 biến số.
* Sử dụng một số hàm trong thư viện **math** và in kết quả ra.
* Chuyển số thành chuỗi và ngược lại, sau đó in kết quả ra màn hình.
**Ví dụ:**\\
local x = 8
local y = 3
local addition = x + y
local subtraction = x - y
local multiplication = x * y
local division = x / y
local mod = x % y
print("Addition:", addition)
print("Subtraction:", subtraction)
print("Multiplication:", multiplication)
print("Division:", division)
print("Modulo:", mod)
-- Hàm toán học
local num = 25
local sqrtValue = math.sqrt(num)
local roundedDown = math.floor(7.8)
local roundedUp = math.ceil(7.2)
local randomValue = math.random(1, 100) -- Số ngẫu nhiên từ 1 đến 100
print("Căn bậc hai của", num, "là:", sqrtValue)
print("Làm tròn xuống 7.8:", roundedDown)
print("Làm tròn lên 7.2:", roundedUp)
print("Số ngẫu nhiên từ 1 đến 100:", randomValue)
====💡 Giải thích:====
**Phép toán số học:**\\
* **+, -, *, /, %:** thực hiện các phép toán cơ bản trên **x** và **y**.
**Hàm toán học:**\\
* **math.sqrt(num)**: tính căn bậc hai của **num**.
* **math.floor(7.8)**: làm tròn xuống.
* **math.ceil(7.2)**: làm tròn lên.
* **math.random(1, 100)**: tạo số nguyên ngẫu nhiên từ 1 đến 100.
====🎯 Thử thách nhỏ:====
* Thêm đoạn mã trên vào script Lua hiện tại của bạn.
* Chạy script để xem kết quả các phép toán và hàm.
* Thử thay đổi giá trị của **x**, **y** và **num** để xem kết quả thay đổi như thế nào nhé!
----