PDA

View Full Version : [TLBB] Lua basic



Sói Đẹp Trai
15-12-14, 04:50 PM
LUA là ngôn ngữ lập trình mở, nó có đầy đủ các tính chất của một ngôn ngữ mở, các hàm trong nó có thể được build từ nhiều ngôn ngữ khác. Nói nôm na là như vậy. Đó là cái lý do giải thích cho mấy cái hàm riêng trong game TLBB.

Để làm được những script đơn giản trước tiên bạn phải biết lập trình, nếu ai biết rồi có thể tham khảo webside chuyên về Lua basic.


http://www.lua.org/pil/1.html


Về Lua basic thì không cần phải mất nhiều thời gian mà tóm lại chỉ cần hiểu những cái sơ đẳng trong các ngôn ngữ lập trình nào đó là hoàn toàn dễ dàng. Theo mình thì hiểu C và Pascal là quá đủ.

Các khái niệm như biến, kiểu, mảng, bản ghi hay chuỗi cần đọc kỹ hơn một chút. Đặc biệt trong lua mọi thứ đều được định nghĩa dạng con trỏ, ví dụ như muốn khai báo biến nó na ná Java và C, ta dùng cấu trúc.


local Tên_biến=Giá_Trị
<<Lưu ý là nếu không có phần Giá_Trị thì Tên_biến mặc định sẽ là kiểu con trỏ nil>>


Tương tự như vậy khai báo mảng ta khai báo giống bên C.


local Tên_mảng={}
<<Mảng này sẽ mặc định các phần tử của nó = nil và số phần tử ban đầu = 0>>
local Tên_mảng={1,2,"a","b"}
<<Mảng này gồm 4 phần tử khác nil và được định nghĩa sẵn đánh số từ 1 đến 4, Phần tử thứ 3 có giá trị "a">>


Để lấy phần tử của mảng khác nil, ta dùng lệnh.


getn(Tên_Mảng)


Tương tự bạn có thể định sẵn các phần tử của mảng ban đầu giống C và có cái thú vị mà mình đã ứng dụng thành công Lua basic trong nhiều bài toán đòi hỏi giải thuật trên chuỗi phức tạp mà bên C nó phải mất nhiều câu lệnh dài mới làm được.
Ví dụ cách định vị phần tử của mảng như sau.


local My_Array={}
My_Array["Soi"]="Soi"
My_Array[0]=0


Lệnh rẽ nhánh, vòng lặp và hàm con.


Lệnh rẽ nhánh
if BT_Logic_1 then TH_Lệnh_1
elseif BT_Logic_2 then TH_Lệnh_2
...
else TH_Lệnh_N
end
//Chú ý là elseif này viết liền vẫn đúng mà tách ra cũng không sai nhé.
Vòng lặp for
for i=x,y do
end
//Vòng lặp với i chạy từ x đến y, mỗi lần lặp i tăng 1 đơn vị, nếu y<x thì vòng lặp ko tồn tại. Nó giống vòng for bên Pascal.
Vòng lặp repeat until
repeat
until BT_Logic
//Vòng lặp này sẽ thực hiện lệnh trước khi kiểm tra điều kiện BT_Logic, cấu trúc này giống bên Pascal và bên C/Java là do..while
Vòng lặp while do
while BT_Logic do
end
//Vòng lặp này ngược với repeat until nghĩa là kiểm tra điều kiện trước khi thực hiện lệnh, giống bên Pascal
Lệnh thoát khỏi vòng lặp và tiếp tục vòng lặp
Để thoát khỏi vòng lặp ngay ta dùng lệnh break và để tiếp tục vòng lặp bỏ qua các lệnh bên dưới ta dùng lệnh continue.
Hàm con
function Tên_hàm(Tham_biến_1,Tham_biến_2,...,Tham_bi� ��n_N)
return Giá_trị_của_hàm
end
Khóa return có thể có hoặc không tùy mục đích, nhưng một khi đã return thì sẽ out ra khỏi hàm con ngay lập tức.
//Lưu ý các phương pháp đệ quy quay lui hoàn toàn vẫn áp dụng được, và hàm có thể không trả về kiểu gì giống procedure của Pascal và void của Java/C.


Một số hàm quan trọng mà ta cần biết của Lua basic.


--Các hàm tính toán trên số thực
math.mod(x,y) => Trả về giá trị phần dư của phép chia 2 số nguyên x cho y.
math.floor(x) => Trả về số nguyên gần nhất nhỏ hơn số thực x, giống hàm trunc(x) bên Pascal.
math.abs(x) => Trả về trị tuyệt đối của số thực x.
math.sqrt(x) => Trả về căn bậc 2 số học của số thực x.
--Các hàm trên chuỗi
string.len(s) => Trả về độ dài chuỗi s.
string.sub(s,x,y) => Trả về chuỗi con của s tính từ vị trí x đến y. Nếu y vượt quá độ dài chuỗi s thì mình chưa check cái này nhưng theo suy đoán nó sẽ trả ra giá trị nil, nếu không tìm thấy chuỗi x trong s thì hàm trả về giá trị nil.
string.gsub(s,x,y) => Trả về chuỗi s sau khi đã thay thế tất cả các chuỗi con x thành y.
string.find(s,x) => Tìm vị trí chuỗi con x trong s.

Lưu ý không có khái niệm chuỗi giống mảng char như các ngôn ngữ lập trình khác. Vì thế muốn lấy phần tử thứ i của chuỗi s ta phải dùng hàm string.sub(s,i,i)

tostring(x) => Chuyển số x thành chuỗi
tonumber(x) => Chuyển chuỗi x thành số. Trường hợp không chuyển được hàm trả về giá trị nil.
type(x) => Trả ra kiểu của giá trị x. Ví dụ type("a")=="string", type(1)=="number"

Lưu ý là không thể so sánh lớn nhỏ một kiểu xác định với con trỏ nil. Ví dụ 4>nil, s<nil. Nếu là 4~=nil và s~=nil thì ok.
Trong lua hoàn toàn thực hiện được phép cộng 2 số lớn mà bên ngôn ngữ khác trừ Java, Python ta phải xây dựng hàm riêng.


Ngoài ra còn vài hàm bên Lua basic nữa nhưng do ít dùng nên mình ko đề cập đến các bạn có thể tham khảo trang web trên.

Một ví dụ về code Lua Basic

Mình có đoạn code này chưa biên dịch thử. Dùng cho Lua bên Client. Tư tưởng:
Muốn chuyển số Hex X sang Dec ta chuyển X qua Bin rồi chuyển từ Bin qua Dec.



local Hex_Bin=
{
["0"]="0000",
["1"]="0001",
["2"]="0010",
["3"]="0011",
["4"]="0100",
["5"]="0101",
["6"]="0110",
["7"]="0111",
["8"]="1000",
["9"]="1001",
["A"]="1010",
["B"]="1011",
["C"]="1100",
["D"]="1101",
["E"]="1110",
["F"]="1111",
}

function Power2(x)
if x==1 then
return 2
end
local p=Power2(math.floor(x/2))
if math.mod(x,2)==0 then return p*p
else return p*p*2
end

function HexToBin(x)
for i=1,string.len(x) --Upcase all Hex part of Hex number x
if x[i]=="a" then
x[i]="A"
elseif x[i]=="b" then
x[i]="B"
elseif x[i]=="c" then
x[i]="C"
elseif x[i]=="d" then
x[i]="D"
elseif x[i]=="e" then
x[i]="E"
elseif x[i]=="f" then
x[i]="F"
end
end
local Bin=""
local i=1
while string.sub(x,i,i)=="0" do --Delete the "0" at start of Hex number x (such as 000FA0 => FA0)
i=i+1
end
x=string.sub(x,i,string.len(x))
for i=1,string.len(x) do
if Hex[x[i]]==nil then --x[i] is not a part of hex number
return "Unknow"
end
Bin=Bin..Hex[x[i]]
end
return Bin
end

function BinToDex(x)
local Sol=0
for i=1,string.len(x)-1 do
if string.sub(x,i,i)==1 then
Sol=Sol+Power2(string.len(x)-i)
end
end
return Sol
end

function HexToDec(x)
local S=HexToBin(x)
if S=="Unknow" then
return -1
end
return BinToDex(S)
end

--To call this Script, you must call by HexToDec(Number) in which Number is a Hex number you want to convert to Dec number
--If the result is -1, you pressed a wrong Hex number


Trong đó có vài cái hàm chỉ dùng đc bên Client mà ko dùng đc bên SV, nếu muốn chuyển qua sv thì bạn phải chuyển các thứ như sau:
string.sub => strsub
string.len => strlen
math.mod => mod
math.floor => floor

Ai còn ý kiến gì về Lua basic cứ post tại đây nếu biết mình sẽ giải đáp. Hẹn gặp lại vào topic Lua in game.

kv02301009
21-08-23, 11:05 PM
tonumber(x) => Chuyển chuỗi x thành số. Trường hợp không chuyển được hàm trả về giá trị nil.
cái này chuyển x thành số, nếu mk muốn chuyển x thành chuỗi ký tự dạng văn bản thì chuyển thành gì ạ em cảm ơn