มารั่วกันเถอะ


ช่วงนี้กำลังเห่อเขียน Python อยู่ก็เลยว่าจะทำคู่มือการเขียนโปรแกรมภาษา Lua เบื้องต้นหน่อย (แบบว่า Python คนใช้กันเยอะแล้ว) พอดีผมเป็นคนเล่นเกมไม่เก่ง แต่ก่อนเล่นเกมคอมฯ ก็มักจะแก้เซฟไฟล์ โกงค่าสถานะตัวละครบ้าง เพิ่มเงิน และอื่นๆ สมัยนั้นอินเทอร์เน็ตยังไม่เจริญหาโปรแกรมโกงยากต้องพึ่ง Hex editor เอาบางเกมก็แก้ง่ายแปลงค่าตัวเลขฐานสิบกับฐานสิบหกแล้วสุ่มหาค่าเอาเทียบตำแหน่งกับชุดตัวเลขอื่นลองแก้ค่าดูแล้วทดลองโหลดเกมใหม่ บางเกมก็แก้ไม่ได้เพราะเข้ารหัสไว้ ส่วนมากเกมไหนไม่โกงมักเล่นไม่จบ นอกเรื่องมาซะยาวแล้วมันเกี่ยวกับที่อยากทำคู่มือ Lua ยังไง แล้วหัวเรื่องคืออะไร


อย่างแรกเลยหัวเรื่องเป็นการเล่นคำ Lua ตามต้นฉบับเขาให้ออกเสียงว่า “ลู-อา” ผมออกเสียงเร็วๆ ก็เป็น “ลัว” แล้วก็แปลงเป็น “รั่ว” หมายถึงหลุดออก ภาษาแสลงประมาณว่า บ้าๆบอๆ คือเราจะหัด Lua กันแบบไม่ต้องจริงจังมาก

อย่างที่สอง Lua เป็นภาษาสคริปต์ที่มีขนาดเล็กเร็วง่ายและยืดหยุ่น ได้รับความนิยมในเกมหลายตัว และมักถูกใช้เป็นภาษาที่ใช้อธิบายข้อมูล ดังนั้นบางเกมทำเซฟไฟล์ในแบบของภาษา Lua รวมถึงสคริปต์การทำงานบางอย่างด้วยทำให้การโกงเกมมีความสนุกสนานมากขึ้นและไม่ต้องปวดหัวกับไบนารี่ไฟล์อีกต่อไป


เริ่มต้นกับ Lua

เนื่องจาก Lua เป็นภาษาสคริปต์ดังนั้นจึงสามารถเรียกให้ทำงานได้ทันทีทั้งจากพิมพ์คำสั่งตรงๆ หรือเรียกไฟล์ชุดคำสั่งภาษา Lua ได้เลยโดยไม่ต้องแปลงเป็นไบนารี่ไฟล์ก่อนโดยเรียกใช้ผ่านคำสั่ง lua มีรูปแบบดังนี้

  1. ใช้เป็น Lua interpreter โดยเรียก lua เฉยๆ โดยไม่มีอากิวเมนต์ตามจะขึ้นพรอมต์ “>” รอรับจากนั้นก็พิมพ์คำสั่งไปได้เลยเช่น

        print(“Hello world”)                             

    ประโยคยอดฮิตเมื่อกด enter คำสั่งจะประมวลผลทันที ถ้าคำสั่งยังไม่สามารถประมวลผลได้เช่นยังไม่จบคำสั่ง หรือพิมพ์เป็นบล๊อกคำสั่งเช่น function, loop, condition ดังตัวอย่าง

        print(“Hello                                          

    เมื่อกด enter จะขึ้นพรอมต์ “>>” ไปในแต่ละบรรทัดจนกว่าคำสั่งจะสมบูรณ์จึงจะประมวลผลแล้วกลับเป็น “>” อีกครั้ง

    สามารถเรียกใช้ไลบรารีจากไฟล์ที่มีอยู่ได้โดยใช้คำสั่ง dofile(“ชื่อไฟล์”) ก็จะสามารถเรียกใช้ฟังก์ชันที่อยู่ในไฟล์นั้นได้

    เมื่อต้องการออกจาก Lua interpreter ให้พิมพ์คำสั่ง os.exit() ก็จะกลับสู่พรอมต์ปกติของคอนโซลหรือเทอร์มินอลนั้นๆ

  2. สั่งให้ไฟล์ภาษา Lua ทำงาน โดยเรียก

        lua [ออฟชั่น] [ไฟล์ Lua]                       

    เช่น

        lua hello.lua                                         

    หรือ

        lua -i hello.lua                                    

    ในกรณีที่ต้องการเรียก Lua interpreter ต่อหลังจากให้ไฟล์ hello.lua ทำงานแล้วเป็นต้น

Lua ภาษาแสนง่าย

ไม่ค่อยมีกฎเกณฑ์มากนักจะเขียนเป็นบล๊อกหรือเป็นบรรทัดเดียวกันก็ได้เช่น

    for i = 1,10 do         
        x = 2                  
        y = x * i              
        print(i,y)              
    end

หรือ

    for i=1,10 do x =2 y= x * i print(i, y) end

และยังเขียนคำสั่งติดๆ กันไปก็ได้เช่น

    a = 1 b = a * 2 

แต่จะทำให้อ่านยากสามารถใส่ ";" เพื่อช่วยให้อ่านได้ง่ายขึ้นดังนี้

    for i=1,10 do x=2; y= x * i; print(i, y) end  
    a = 1; b = a * 2


ตัวแปรใน Lua เป็น Dynamic type ไม่จำเป็นต้องกำหนดประเภทของตัวแปรหรือประกาศตัวแปรก่อนเรียกใช้เช่น

    a=10
    print(type(a),a)   --------->    number     10
    a="asdf"
    print(type(a),a)   --------->    string     asdf
    print(z)           --------->    nil
    b=print
    b(type(b),"Hello") --------->    function   Hello

จากตัวอย่างประเภทของตัวแปร a จะเปลี่ยนตามค่าที่ใส่ ส่วนตัวแปร z ยังไม่เคยประกาศหรือกำหนดค่ามาก่อนจึงมีค่าเป็น nil หรือก็คือไม่มีค่าไม่มีตัวแปรนี้มาก่อนนั่นเอง (ฟังก์ชัน type() จะคืนค่าประเภทของตัวแปรนั้น)
ส่วนบรรทัดล่างสุดเป็นการให้ตัวแปร b อ้างอิงไปยังฟังก์ชัน print() ดังนั้น b("สวัสดี") ได้ผลเท่ากับ print("สวัสดี")

การกำหนดค่าตัวแปรสามารถกำหนดค่าทีละตัวเช่น

    a=10
    b="asdf"
    c={'abc',"แมว",12.5,true}

หรือจะกำหนดค่าพร้อมกันก็ได้เช่น

    a,c,b = 10,{'abc',"แมว",12.5,true},'asdf'

หรือ

    a,c,b = 10,{'abc',"แมว",12.5,true},'asdf','addaadsdsd',2000,false,{1,4,3},"qqq"

ก็ได้ผลเหมือนกันระบบจะกำหนดค่าเท่ากับจำนวนตัวแปรเท่านั้นส่วนที่เกินมาจะไม่สนใจ ถ้าจำนวนค่าที่กำหนดน้อยกว่าจำนวนตัวแปรก็เช่นกันระบบจะไม่สนใจตัวแปรที่เกินมาเช่น

    a,b,c,d =2,0.345,"ok"
    print(a,b,c,d)     --------->    2     0.345     ok     nil

สามารถสลับค่าตัวแปรก็ได้

    a,b = 5,10
    print(a,b)         --------->    5     10
    a,b = b,a
    print(a,b)         --------->    10     5

ฟังก์ชันสามารถคืนค่าได้มากกว่า 1

    function fn(n)
        return n+1, n-1
    end

    a,b = fn(10)
    print(a,b)         --------->    11     9

แต่ถ้ากำหนดค่าตัวแปรเป็นชื่อฟังก์ชันจะเป็นการอ้างอิงไปยังฟังก์ชันนั้น

    c = fn
    d,e = c(5)
    print(d,e)         --------->    6      4

    x = print
    x(a,b,d,e)         --------->    11    9    6    4

 ประเภทตัวแปร

มีแค่ 8 ประเภทได้แก่ {nil, boolean, number, string, table, function, userdata, thread} โดยเบื้องต้นเราจะสนใจประเภทหลักๆ 5 ประเภทแรกดังนี้
  1. nil คือไม่มีค่าตัวแปรใดๆ ที่ไม่ได้กำหนดค่าหรือไม่มีตัวแปรนั้นอยู่ก็คือ nil การกำหนดให้ตัวแปรใดๆ มีค่าเท่ากับ nil จะเป็นการลบตัวแปรนั้นไป
  2. boolean มีอยู่สองค่าคือ true กับ false ตัวแปรประเภทอื่นๆ ที่ไม่ได้มีค่าเป็น nil จะเทียบเท่ากับ true
  3. number ต่างกับภาษาอื่นที่มีแบ่งย่อยเป็นจำนวนเต็ม จำนวนจริง ฯลฯ แต่ Lua จะมีแต่จำนวนจริง (double-precision floating-point) เท่านั้น
  4. string คือข้อความโดยจะอยู่ในเครื่องหมาย " หรือเครื่องหมาย ' หรือกรณีที่มีข้อความยาวหลายบรรทัดให้ใช้ [[ กับ ]] ปิดหัวท้ายข้อความ
  5. table คล้ายกับ array ในภาษาอื่นแต่เป็น array ที่สามารถกำหนด index หรือ key ด้วยค่าอื่นๆ ที่นอกจากลำดับเลขได้และมีขนาดไม่ตายตัวสามมารถเพิ่มขนาดได้มีลักษณะคล้ายกับ array ใน PHP หรือ dictionary ใน Python
สำหรับตอนนี้ก็แค่นี้ก่อนพอทำความรู้จักกับพื้นฐานไว้คราวหน้าค่อยมาต่อในส่วนอื่นๆ ครับ

ตอนที่ 2 มารั่วกันต่อ#2
ตอนที่ 3 มารั่วกันต่อ#3
ตอนที่ 4 มารั่วกันต่อ#4 

หัดเขียนโปรแกรมแบบบ้านๆ ตอนที่ 3 พื้นฐานภาษา Lua

ความคิดเห็น