lua学习:使用Lua处理游戏数据

本文介绍如何使用 Lua 编程语言实现游戏数据的导入、导出及存储过程,涉及从 Excel 文件读取数据、CSV 文件解析、游戏数据保存与加载等内容,详细展示了 Lua 在游戏开发中数据管理的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1.载入游戏数据

比如说,现在我有一份表单:

data.xls


用什么工具解析这个Excel文件并将数据载入游戏?

我们可以使用Lua来完成这个工作。不过要先将表单保存为csv文件(数值用逗号隔开的文件)。

从表单中,我们可以得知第一行是键名,剩下的行是数值。我们可以用下面的lua函数载入该csv文件并保存到表中。

  1. function GetLines(fileName)  
  2.     index = 0  
  3.     myLines = {}  
  4.     for line in io.lines(string.format("%s%s", "./", fileName)) do  
  5.         index = index + 1  
  6.         myLines[index] = line  
  7.     end  
  8.     return index, myLines --返回文件的行数和一个包括所有行的表  
  9. end  
function GetLines(fileName)
    index = 0
    myLines = {}
    for line in io.lines(string.format("%s%s", "./", fileName)) do
        index = index + 1
        myLines[index] = line
    end
    return index, myLines --返回文件的行数和一个包括所有行的表
end
io.lines ([filename]):打开指定的文件filename为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回nil,并自动关闭文件。

然后,可以再创建一个函数解析每行的字符,并创建表格保存该行的所有数据。

  1. function GetValues(myString)  
  2.     num = 0  
  3.     values = {}  
  4.     if myString ~= nil then  
  5.         while string.find(myString,",") ~= nil do  
  6.             i,j = string.find(myString,",")  
  7.             num = num + 1  
  8.             values[num] = string.sub(myString,1, j-1)  
  9.             myString = string.sub(myString, j+1, string.len(myString))  
  10.         end  
  11.         num = num + 1 --接着对第二行数据  
  12.         values[num] = myString  
  13.     end  
  14.     return num, values  
  15. end  
function GetValues(myString)
    num = 0
    values = {}
    if myString ~= nil then
        while string.find(myString,",") ~= nil do
            i,j = string.find(myString,",")
            num = num + 1
            values[num] = string.sub(myString,1, j-1)
            myString = string.sub(myString, j+1, string.len(myString))
        end
        num = num + 1 --接着对第二行数据
        values[num] = myString
    end
    return num, values
end
string.find(s, pattern, pos):从源字符串s找到匹配pattern返回,pos参数可选, 表示起始位置,如果匹配不成功,返回nil。

string.sub():函数截取字符串s的从第i个字符到第j个字符之间的串。

在这个函数中,我们传入字符。通过调用string.find()和string.sub,返回数值的个数和包含了所有数值的表。通过这两个简单的处理步骤可以让用户解析几乎所有的csv文件,不论简单还是复杂的文件。


我们可以写个函数测试一下:

  1. function LoadDatas()  
  2.     myCharacters = {}  
  3.     numLines, allLines = GetLines("data.csv")  
  4.     --读第一行的键值  
  5.     count, myLabels = GetValues(allLines[1])  
  6.     --忽略第一行  
  7.     for index = 2, numLines do  
  8.         count, charHold = GetValues(allLines[index])  
  9.         myCharacters[index-1] = {}  
  10.         for index2 = 1, count do  
  11.             myCharacters[index-1][index2] = charHold[index2]  
  12.         end  
  13.     end  
  14.     --now print them  
  15.     for index = 1, 3 do  
  16.         for index2 = 1, table.getn(myLabels) do  
  17.             print(myLabels[index2], myCharacters[index][index2])  
  18.         end  
  19.     end  
  20. end  
function LoadDatas()
    myCharacters = {}
    numLines, allLines = GetLines("data.csv")
    --读第一行的键值
    count, myLabels = GetValues(allLines[1])
    --忽略第一行
    for index = 2, numLines do
        count, charHold = GetValues(allLines[index])
        myCharacters[index-1] = {}
        for index2 = 1, count do
            myCharacters[index-1][index2] = charHold[index2]
        end
    end
    --now print them
    for index = 1, 3 do
        for index2 = 1, table.getn(myLabels) do
            print(myLabels[index2], myCharacters[index][index2])
        end
    end
end

得到一个二维表:


2.保存游戏数据

我们可以利用lua内建的I/O功能来处理数据输出。只要确保输出的数据是采用合适的语法,就可以使用dofile()载入数据了。
  1. function save()  
  2.     myFile = io.open("save_data.lua", "w")  
  3.     if myFile ~= nil then  
  4.         myFile:write("-- 游戏数据保存文件")  
  5.         myFile:write(string.char (10))  
  6.         myFile:write(string.char (10))  
  7.         myFile:write(string.format("%s%s", "-- 文件创建于: ", os.date()))  
  8.         myFile:write(string.char (10))  
  9.         myFile:write(string.char (10))  
  10.         myFile:write("myValue = 5")  
  11.         io.close(myFile)  
  12.     end  
  13. end  
function save()
	myFile = io.open("save_data.lua", "w")
	if myFile ~= nil then
		myFile:write("-- 游戏数据保存文件")
		myFile:write(string.char (10))
		myFile:write(string.char (10))
		myFile:write(string.format("%s%s", "-- 文件创建于: ", os.date()))
		myFile:write(string.char (10))
		myFile:write(string.char (10))
		myFile:write("myValue = 5")
		io.close(myFile)
	end
end



3.载入保存的数据

利用dofile()操作就可以恢复游戏的数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值