前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lua Lua Lua!!!

Lua Lua Lua!!!

作者头像
云深无际
发布2022-02-09 11:15:28
3.6K0
发布2022-02-09 11:15:28
举报
文章被收录于专栏:云深之无迹

Lua是啥?

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 特性:

  • 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
  • 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 其它特性:
    • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
    • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
    • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
    • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

Lua LOGO

没空编译买这里的

忘了说改名字

OK了,阿巴阿巴

安装一个IDE

代码语言:javascript
复制
require("wx")
require("turtle")
local com = require('common')

local nW, nH = 1000, 600

local tHan = {
  ID = {"A", "B", "C"},
  A = {},
  B = {},
  C = {},
  Set = {
    ["nDisk"] = 10, -- The amount of disks to get moved
    ["nWait"] = 0.01, -- The amout of time to wait before a move
    ["clBase"] = colr(139,069,019), -- Base pylon color
    ["clDisk"] = colr(000,255,000), -- Disks color
    ["dW"] = 10, -- The distance between all pylons and window edges X
    ["dH"] = 20, -- The distance between all pylons and window edges Y
    ["dP"] = 15, -- The width of one pylon stick or plate
    ["dL"] = 11, -- Text letter width
    ["dT"] = 19, -- Pylon name text offset delta
    ["wT"] = 70, -- Fixed width of the first, top, smallest disk
    ["wB"] = 0,  -- Fixed width of the last, bottom, largest disk
    ["dD"] = 0,  -- The disk size width delta until the bottom disk is reached
    ["bW"] = 0,  -- Pylon base support width
    ["bH"] = 0,  -- Pylon hight
    ["tS"] = os.clock() -- Start time of the process
  }
}

local function newPylon(iD, nW, nH)
  return {ID=iD,W=nW,H=nH,M=0,P=0}
end

local function drawState()
  local tSet = tHan.Set
  local dP = tSet["dP"]
  local clDisk = tSet["clDisk"]
  for iD = 1, #tHan.ID do
    local key = tHan.ID[iD]
    local val = tHan[key]
    for iK = 1, #val do local dsk = val[iK]
      local dX, dY = (val.C-dsk.W/2), (val.Y-iK*(dP+dsk.H))
      pncl(clDisk); rect(dX,dY,dsk.W,dsk.H)
      text(com.getRound(dsk.P,0.001).."%",0,dX+1,dY-1)
    end
  end
end

local function drawBase()
  local dW = tHan.Set["dW"]
  local dH = tHan.Set["dH"]
  local dP = tHan.Set["dP"]
  local dT = tHan.Set["dT"]
  local bW = tHan.Set["bW"]
  local bH = tHan.Set["bH"]
  local tS = tHan.Set["tS"]
  local dL = tHan.Set["dL"]
  local nM = tHan.Set["nMove"]
  local clBase = tHan.Set["clBase"]; wipe()
  for iD = 1, #tHan.ID do
    local key = tHan.ID[iD]
    local val = tHan[key]
    local xP = (val.X + (bW / 2)) - dP/2
    pncl(clBase); rect(xP,dH,dP,bH)
    text(tHan.ID[iD],0,xP+((dP-dL)/2),dH-dT)
    pncl(clBase); rect(val.X,val.Y,bW,dP)
    text("Time: "..tostring(os.clock()-tS).."\n".."Move: "..tostring(nM))
  end
end

local function doMove(ID, tS, tD)
  local nWait = tHan.Set["nWait"]
  local nMove = tHan.Set["nMove"] + 1
  local nD, nS = #tD, #tS
  if(nWait and nWait > 0) then wait(nWait) end
  tS[nS].M = tS[nS].M + 1
  tS[nS].P = ((tS[nS].M / nMove) * 100)
  tD[nD+1] = tS[nS]; tS[nS] = nil
  tHan.Set["nMove"] = nMove
  drawBase(); drawState(); updt()
end

local function doHanoj(ID, tS, tD, tT)
  if(ID == 1) then doMove(ID, tS, tD) else
    doHanoj(ID-1, tS, tT, tD)
    doMove(ID, tS, tD)
    doHanoj(ID-1, tT, tD, tS)
  end
end

local function goHanoj(tH)
  local tSet = tHan.Set; tHan.Set["nMove"] = 0
  local nD = tHan.Set["nDisk"]
  local A,B,C = tH[tH.ID[1]], tH[tH.ID[2]], tH[tH.ID[3]]
  tSet["bW"] = ((nW - 4*tSet["dW"]) / 3)
  tSet["bH"] = (nH - 2*tSet["dH"])
  tSet["wB"] = (tSet["bW"] - 2*tSet["dP"])
  tSet["dD"] = (tSet["wB"] - tSet["wT"])/(nD-1)
  A[1] = newPylon(1,tSet["wT"],tSet["dP"])
  for iD = 2, (nD-1) do
    A[iD] = newPylon(iD,(A[iD-1].W+tSet["dD"]),tSet["dP"])
  end
  A[nD] = newPylon(nD,tSet["wB"],tSet["dP"])
  com.tableArrReverse(A)
  local xB, yB = tSet["dW"], (nH - tSet["dH"] - tSet["dP"])
  for iD = 1, #tHan.ID do
    local key = tHan.ID[iD]
    local val = tHan[key]
    val.name, val.X, val.Y = key, xB, yB
    val.C = (xB + tSet["bW"]/2)
    xB = xB + tSet["dW"] + tSet["bW"]
  end  
  drawBase(); drawState();  
  doHanoj(nD, A, C, B)
  drawBase(); drawState();
end

open("The towers of Hanoj")
size(nW, nH); zero(0, 0)
updt(false) -- disable auto updates
goHanoj(tHan)
wait()

写个小程序:

一个小游戏

我觉得可以先看这个

Lua的几种数据类型

为什么我要突然折腾这个Lua,以前玩ESP8266用过几天这个Lua,昨天研究ML的固件,我发现扩展功能的实现就是Lua的实现。

ML的这个Lua的接口实现。

拥有的接口

api_test这个地方是你添加的新功能在这里测试

事件,这里是各种处理线程

显示的功能模块

关于镜头的功能

实时界面

里面运行的是这个Lua的文件系统

内置的一些语法糖可能不是多好,这个东西可以加强Lua的内置功能

好家伙,这个是尼康自己的OS

这个真好看网页设计的

代码语言:javascript
复制
https://builds.magiclantern.fm/experiments.html

Lua得脚本系统在这里下载到:

这里

打开就像这样

这个不知道是啥

代码语言:javascript
复制
https://www.lua.org/
代码语言:javascript
复制
https://github.com/rjpcomputing/luaforwindows
代码语言:javascript
复制
https://sourceforge.net/projects/luabinaries/
代码语言:javascript
复制
https://studio.zerobrane.com/download?not-this-time
代码语言:javascript
复制
http://www.lua.org/manual/5.4/

Lua实现的官方文档

代码语言:javascript
复制
https://builds.magiclantern.fm/lua_api/index.html

LUA API doc

代码语言:javascript
复制
https://keplerproject.github.io/luafilesystem/manual.html

Lua 文件系统

代码语言:javascript
复制
http://stevedonovan.github.io/Penlight/api/manual/01-introduction.md.html
代码语言:javascript
复制
https://web.archive.org/web/20080118123839/http://www.canon.com/technology/canon_tech/field.html
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Lua 特性:
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档