Lua脚本教程

article/2025/9/21 6:58:42

Lua脚本教程

  • 一、数据类型
    • 1、常量、变量
    • 2、变量名:字母、数字、下划线(不能以数字开头)
    • 3、几种数据类型
  • 二、运算符
  • 三、初识函数
  • 四、判断语句
  • 五、循环语句
  • 六、表
  • 七、高级函数与控制结构
  • 八、函数库
    • 1.基本库
    • 2.数学库,表库
    • 3.字符串库
    • 4.操作系统库
    • 5、流和文件库

一、数据类型

1、常量、变量

a=10

a=2.5

a=“abcd”

左边是变量、右边是常量

lua中注释符是 –

2、变量名:字母、数字、下划线(不能以数字开头)

内置关键字:

andbreakdoelseelseififor
endinfalseturefunctionnotlocal
whilerepeatnilthenreturnforuntil

3、几种数据类型

按类型分:

  • number:所有数字包括十六进制和科学计数法
  • boolean:true 或 false
  • string
  • function:可以在代码中实现某种功能的语句块
  • table:lua语言的核心之一,类似于哈希表
  • userdata(自定义类型):脚本用户只能使用,而不能对其进行定义
  • thread:线程可用于异步计算的协同程序
  • nil(空类型):空

按作用域分:

  • 全局变量:
  • 局部变量:local修饰
    举个栗子
    在这个函数num()中。i就是一个局部变量,他被关键字local定义,只在函数num()中有效。而变量没有用local定义,j就是一个全局变量,在整个程序中都有效。不论在什么地方,只要没有被local定义的变量就是全局变量。
function num()
local i = 1
j = 2
end

练习题:
来证明两个变量的作用域。写一个函数,要包含两个同名的变量,一个局部变量,一个全局变量。并输出在屏幕上,来证明两个变量的作用域。
答案:

function num()local i = 1j = 2print(i)print(j)
end
num()
print(i)
print(j)

输出结果:

1
2
nil
2

二、运算符

加法+
减法-
乘法*
除法/
^
取模%
取负-
等于==
小于<
大于>
小于等于<=
大于等于>=
不等于~=
and
or
not
链接··

三、初识函数

1、在lua中,函数都是function类型的对象,他可以被比较,可以赋值给一个变量,传递给函数,从函数中返回,或者作为table表中的键(表我们以后会讲到)。
2、定义一个函数它可以接收任意多个参数供其使用。另外,一个函数可以在它结束的时候返回任意多个值。return关键字的作用就是在函数中返回某些值。

ps:关于函数,在其他流行编程语言中,函数只是类的一部分,它不是对象。所以,你不能将一个函数赋值给一个变量或者进行相等不相等的比较,你更不可以在一个函数中去定义另一个函数。

定义方式:
第一种(重要):

function 函数名(参数)函数内容return 返回值    --可以没有end

第二种:

函数名 = function(参数)函数内容return 返回值     --可以没有end

举个栗子

function compute(a,b)local x = a+blocal y = a-breturn x,yend
i,j = compute(5,2)
print(i.." : "..j)

函数库:
math库、string库、io库、table库等。。

可变参数:

function  f(...)  --三个点表示函数的参数个数不确定
function  f(a,b,...) --函数有两个固定的参数,其他参数不确定
f(3)      --a=3,b=nil,arg={n=0}
f(3,4)    --a=3,b=4,arg={n=0}
f(3,4,5,8) --a=3,b=4,arg={5,8;n=2}

四、判断语句

格式:
第一种

if 表达式 then语句块
end

第二种

if 表达式 then语句块1else语句块2
end

第三种

if 表达式1 then语句块1elseif 表达式2 then语句块2else语句块3
end

举个栗子

function f(i)if i>90 and i<=100 thenprint("优秀")elseif i>70 and i<=90 thenprint("良好")elseif i>60 and i<=70 thenprint("及格")elseprint("不及格")end
end
f(65)

五、循环语句

格式:
第一种

while 循环条件 do循环体
end

第二种

repeat循环体
until 循环条件

第三种

for 变量=初始值,终止值,步长 do循环体 
end

ps: 初始值、终止值还有步长三个部分都只会被执行一次。所以,即使你使用变量或表达式代替终止值和步长,在循环体中又不小心改变了终止值和步长,循环也能正常结束。
循环体内可以被break或return打断

举个栗子
打印100以内7的倍数

function f()local i = 0while i<=100 doif i%7==0 thenprint(i)endi=i+1end
end
f()
function f()local i = 0repeatif i%7==0 thenprint(i)endi=i+1until i>100
end
f()
function f()for i=0,100,1 doif i%7==0 thenprint(i)endend
end
f()

打印前20个斐波那契数列
循环方法

function f()local a=1local b=1local t=0print(a)print(b)for i=0,17,1 dot=aa=a+bb=tprint(a)end
end
f()结果
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765

递归方法

function f(a)if a<=2 and a>0 thenreturn 1elsereturn f(a-1)+f(a-2)end
end
for i=20,1,-1 doprint(f(i))
end结果
6765
4181
2584
1597
987
610
377
233
144
89
55
34
21
13
8
5
3
2
1
1

六、表

类似于java里面的数组
举个栗子

array = {} --空表
array = {"a","b","c"} --默认key的表。array[1]索引到"a"。注意key是从1开始的
array = {"vv",name="bb","cc"} --自定义key的表。array["name"]索引到"bb",注意name要加引号。 没有自定义key的按默认的key增加,分配时跳过自定义key-----------------------分割线---------------------------
元素赋值
array = {}
array["name"] = "a"
array["phone"] = "123"
array.city = "beijing"
array.sex = "boy"
print(array["sex"])元素删除
array.sex = nil
array["name"] = nil

练习题
如何将函数作为表二点元素添加进去?

array = {}
array.func = function()print("这是一个函数")end
array.func()

定义一个空表,然后将函数直接传递给表中的array.func,调用的时候需要加括号,因为它是一个函数。

1、表作为数组的应用:表中元素为同一数据类型
使用#可以获取数组的长度。

arr={"1","2"}
print(#arr)
for i=1,#arr,1 doprint(arr[i])
end
结果:
2
1
2

向数组中添加元素。使用 table.insert(数组,键,值)
从数组中删除元素。使用 table.remove(数组,键)
举个例子

table.insert(arr,2,"aa")
向arr数组中添加了键位2的值"aa"。原来键为2的值依次向后重新排列。
如果省略键,只填入数组名和值,那么就会默认把新添加的值放在数组最后一位。

练习题
将数组中的元素按从大到小排序

--冒泡排序
arr = {3,5,1,7,10,2}
for j = 1,#arr-1,1 dofor i=2,#arr-j+1,1 doif arr[i]>arr[i-1] thenarr[i-1],arr[i] = arr[i],arr[i-1]endend
end
for i=1,#arr,1 doprint(arr[i])
end

2、库函数
table.sort(数组,排序规则)

七、高级函数与控制结构

String.sun(字符串,开始下标,终止下标)–截取字符串
String.tonumber(字符串,进制)–字符串转数字类型

返回值丢失
如果函数调用所得的多个返回值是另外一个函数的最后一个参数,或者是多指派表达式中的最后一个参数时,所有的返回值将被传入或使用,否则,只有第一个返回值被使用或指定。例如:
在这里插入图片描述
其中toRGB()有三个返回值

select()函数它的作用是允许你指定从第几个返回值开始取值。这个函数可以接受任意数目的参数,其中第一个参数用来决定函数的行为,当第一一个参 数为“#”时,select(简单返回其余参数的个数,当第一个 参数为一个数字时,select()返 回其余从这个位置开始直到最后一个的参数:
在这里插入图片描述
函数的尾调用(重点)
当函数的最后返回结果是调用一个函数,称之为尾调函数。Lua在调用尾调函数时,先弹出当前函数的栈,然后再调用尾调函数,从而降低了函数层层调动过程中的栈消耗,非常适用于函数递归调用。

迭代器(pairs(集合)函数)与泛型for

for 变量列表 in 迭代器 do语句块
end

举个栗子

tab = {"a","b","c"}
for i,j in pairs(tab) doprint(i..","..j)
end结果
1,a
2,b
3,c

八、函数库

1.基本库

print()打印
tostring(123)返回字符串“123”
tonumber(参数)将参数转化为数字
type()返回参数的类型名
rawset(表,键,值)更改表中指定键对应的值,返回表的指针
rawget(表,键)获取表中指定键对应的值,当键不存在时返回nil
rawequal(num1,num2)比较两个参数是否相等,返回boolean值(相等为true)
dofile(程序块)打开并执行一个lua程序块
next(表,键)允许程序遍历表中每个字段,返回下一个键和对应的值。此函数只能用于数字做键的表。
pairs和ipairs迭代器。pairs可以遍历表中所有的键,并且除了迭代器本身以及遍历表本身还可返回nil;但是ipairs则不能返回nil,只能返回0,如果遇到nil则退出。它只能遍历到表中出现的第一个不是整数的键。
require(文件名)搜索目录加载文件,并判断是否文件已经加载。使用本函数前一般需要用package.path(路径)来指定搜索路径。

2.数学库,表库

数学库
在这里插入图片描述
table.concat(表,分隔符,开始下标,结束下标)返回参数中表内从开始下标到结束下标中的所有数组部分,并用分隔符隔开。后三个参数为可选参数。
table.insert(表,键,值)在指定表中插入一个指定的键和值。参数键可以省略。省略插入的值将被放置于表的最后一位。
table.maxn(表)返回指定表中所有正数键值中最大的键。如果不存在键为正数的元素,则返回0.
table.remove(表,键)删除并返回表的数组部分指定键的元素。其后的元素会被前移。如果省略键参,则从最后一个元素删起。
table.sort(表,comp)对指定的表进行升序排序。comp可选参数,此参数是一个外部函数,可以自定义sort函数的排序标准,此函数应满足以下条件:接受两个参数a,b,并返回一个布尔型的值,当a应该排在b前面时,反悔true,否则返回false。
table.foreachi(表,function(i,v))会期望一个从1开始的连续整数范围,遍历表中的键和值逐对进行function(i,v)操作。
table.foreach(表,function(i,v))会对整个表进行遍历。
table.getn(表)返回表中元素的个数
table.setn(表,个数)设置表中元素的个数

3.字符串库

string.len(字符串)字符串的长度
string.rep(字符串,数值)返回字符串的n个拷贝
string.lower(字符串)字符转小写
string.lower(字符串)字符转小写
string.sub(字符串,参数,参数)截取部分字符串
string.byte(字符串,参数)返回字符串中参数所指向字符的ascii码
string.char(参数,参数,参数,...)将ascii码转化为对应的字符
string.gsub(字符串,被替换的字符串,替换的字符串,参数)替换字符串的一部分,参数为需要替换的个数
string.find(字符串,参数,开始位置)查找在字符串中的某一部分,返回索引。
string.format(格式化字符串,格式化参量)

4.操作系统库

os.clock()返回一个程序使用cpu时间的一个近似值
os.time(...)按参数的内容返回一个时间值(数字),若不带参数则返回当前时间。
os.tmpname()返回一个临时文件名
os.getenv(varname)返回当前进程的环境变量varname的值,若变量没有定义则返回nil
os.remove(filename)删除文件
os.rename(oldname,newname)更改文件或目录名
os.exit(code)相当于C的exit函数,终止主程序
os.difftime(t2,t1)返回t1到t2相差的秒数
os.date(format,time)返回一个格式化日期、时间的字符串或表

5、流和文件库

简单IO:所有操作都是在两个当前文件之上
完全IO:为了更好的控制输入输出流,而添加了对输入输出文件句柄操作的一种模式。
io.read(参数)
参数:
*all 读取整个文件
*line 读取下一行
*number 从串中转换出一个数值
num 读取num个字符串
io.write()
与print的用法类似。可以用format函数进行格式化输出

io.input("账号.txt")
io.read() --读取账号.txt的内容
io.output("登录.txt")
io.write() --输出读取的内容到登录.txt

io.flush()输出所有缓冲区的内容到输出文件
io.close()关闭打开的文件
io.open(filename,mode)按指定模式打开一个文件,成功则返回文件句柄,失败则返回nil+错误信息
mode:
r 读
w 写
a 添加
r+ 更新,之前数据被保存
w+ 更新,之前数据被删除
a+ 添加更新,之前数据被保存,只允许在文件尾进行添加


http://chatgpt.dhexx.cn/article/XTs27v91.shtml

相关文章

【按键精灵】一步两步脚本教程

使用版本&#xff1a;2014.06:19549 游戏地址&#xff1a;http://www.4399.com/flash/204661_2.htm 图1 4399一步两步 1 脚本前准备 一步两步在h5页面中的目标是通过点击1步/2步&#xff0c;避免掉下去的情况下得到高分&#xff0c;另外能吃到硬币有额外加分&#xff0c;那么…

梦幻西游打宝图脚本制作教程

第1节课-找游戏内存数据 第2节课-起号辅助开发实战 第3节课-辅助大体框架设计 第4节课-自动起号功能完善 第5节课-找各种功能的内存数据1 第6节课-点击小地图的算法分析 第7节课-点击小地图功能代码实现和完善 第8节课-背包物品遍历功能实现 第9节课-背包物品遍历功能完善 第10…

怎么制作游戏脚本_自动玩游戏,手游脚本究竟是怎么做的?

手游现在已经成为大家打发碎片化时间的一种很普遍的方式了,而有的人会由于种种愿意不能自己去玩,就希望有什么办法或者工具能帮助我们解决这个问题,不用人收着也能完成任务。 实现原理: 比如一个游戏的任务,你需要在不同的手机屏幕上进行一系列点击,滑动,甚至输入文本,…

软件开发过程与需求获取

为学堂在线清华大学《软件工程》部分视频笔记 8.1需求工程师 需求分析是软件工程中的重要步骤&#xff0c;是决定软件醒目成败的关键影响因素之一。因此&#xff0c;需求工程成为软件工程和系统工程重要的分支领域之一。在需求工程中&#xff0c;我们主要关注的事软件和系统需求…

软件需求分析-需求开发-需求分析与建模和需求描述

需求开发 C6需求分析与建模一、要点二、周期一&#xff1a;理清框架和脉络三、周期二&#xff1a;确定需求细节四、其他需求 C7需求描述需求描述的风格与格式 C8需求验证 C6需求分析与建模 一、要点 需求分析实际上是业务分析&#xff0c;也就是选择一种业务导向的线索将零散…

需求开发与需求管理

需求开发与需求管理概述 在我看来&#xff0c; 项目管理的日常活动包括了&#xff1a; 需求管理、故障管理、版本管理、任务管理。 需求管理贯穿了项目的大部分生命周期&#xff0c;故障管理则从第一个迭代版本出现直到产品维护阶段&#xff08;包括内部故障与外部故障&#xf…

软件开发与过程管理——需求获取

目录 一. 需求获取概述 1.1 为什么要进行需求分析 1.2 需求获取的非平凡性 1.3 需求获取的主要活动 二. 需求获取的策略 2.1 需求获取的主动性策略 2.2 需求协商 三. 需求获取的主要方法 3.1 用户调查 3.2 文档分析 3.3 原型法 3.4 模型驱动 四. 软件开发及过程…

浅谈软件项目需求分析

这里不是写标准化的理论知识&#xff0c;而是想写写对软件需求工作的感受。 理论上的需求管理是要解决系统需求做什么的问题&#xff0c;以此界定系统功能和非功能性的内容。需求指的是由项目接受的或项目产生的产品和产品构件需要&#xff0c;包括由组织征集的对项目的…

软件工程之需求分析

现在人们越来越认识到软件工程在软件开发中的重要作用。目前国内软件在开发中还没有对软件开发的过程进行明确规定,文档不完整,也不规范,软件项目的成功往往归功于软件开发组的一些杰出个人或小组的努力。这种依赖于个别人员上的成功并不能为全组织的软件生产率和质量的提高…

如何写一份好的软件开发的需求分析

什么是需求分析&#xff1f; 通俗的讲&#xff0c;对用户的意图不断揭示和验叛的过程&#xff0c;要对经过系统可行性分析所确定的系统目标做更为详细的描述。 假如你是个建筑工程师&#xff0c;有个客户找你建一个鸡窝&#xff0c;这个时候要需要与客户沟通&#xff0c;来确定…

软件需求的三个层次——业务需求、用户需求和功能需求的区别

我们的软件产品或者项目&#xff0c;其需求都有三个层次&#xff0c;业务需求、用户需求和功能需求&#xff0c;除此之外&#xff0c;每个系统还有各种非功能需求。不是很了解的朋友&#xff0c;今天就和我和我们一起来了解一下吧&#xff01;   下图是需求层次关系图&#…

运算符重载规则

1) 并不是所有的运算符都可以重载。能够重载的运算符包括&#xff1a; - * / % ^ & | ~ ! < > - * / % ^ & | << >> << >> ! < > && || -- , ->* -> () [] new new[] …

C++ 重载运算符

一、运算符重载 运算符重载是一种形式的C多态。 在C中&#xff0c;编译器有能力把一个由数据、对象和操作符共同组成的表达式&#xff0c;解释为对一个全局或成员函数的调用。该全局或成员函数被称为操作符函数&#xff0c;通过重定义操作符函数&#xff0c;可以实现针对自定…

C++重载决议

目录 前言一些与overload易混淆的概念override运算符重载 为什么需要重载决议&#xff1f;声明函数重载 什么是重载决议&#xff1f;什么不是函数重载&#xff1f; 重载决议之过程函数重载 && 函数模板before 重载决议more detailstype conversion(类型转换)rank&#…

重载

实质&#xff1a;重载的实质就是写一个重载函数语法&#xff1a;函数类型 operator 运算符名称 {对运算符的重载处理}说明&#xff1a;如果要对加号进行重载&#xff0c;则 “operator ” 就是函数名。方法&#xff1a; &#xff08;1&#xff09;成员函数法 定义&#xff1a…

重载运算符

输入带有空格的字符串 cin.getline(a[i]) 运算符重载的语法 定义一个重载的运算符与定义一个函数类似&#xff0c;只是这个函数的名称必须以operator开头。 运算符重载函数的一般形式为&#xff1a;类型 类名::operator 重载的运算符(参数表) {函数体 }参数的个数由以下两个…

Python——运算符重载

Python——运算符重载 1.加法运算符重载和减法运算符重载2.__str__()方法重载和__ge__()方法重载3.索引的切片重载 运算符重载指的是将运算符与类方法关联起来&#xff0c;每个运算符对应一个指定的内置方法。 Python通过重写一些内置方法&#xff0c;实现了运算符的重载功能。…

C++ 运算符重载

前言 本文引用于“C语言中文网”&#xff0c;我整理出来放在博客&#xff0c;方便大家共同学习。所有知识点和代码均已亲测可用&#xff0c;如有疑问&#xff0c;可提出&#xff0c;一起讨论学习。 本章内容&#xff1a; 1. C运算符重载的概念和原理 2. C重载&#xff08;C重…

配置使用Navicat或PLSQL可视化工具远程连接Oracle

写在前面 本文讲解的是在没有 Oracle 环境&#xff0c;如何使用可视化工具配置远程连接服务器 Oracle 数据库。 目录 写在前面一、概述二、下载 Oracle Instant Client三、配置环境变量四、配置监听五、可视化工具环境配置5.1、Navicat5.2、PLSQL 一、概述 很多时候&#xff0c…

Windows系统远程连接Linux系统操作

远程连接服务器管理时&#xff0c;系统不同可分为两种&#xff1a;一是Linux系统和Mac系统或者Linux系统之间连接&#xff1b;二是Windows系统连接到Linux系统 第一种情况下&#xff1a;在Linux系统和Mac系统下可以相互用命令"ssh [-p] 22 连接主机名主机IP地址"连…