lua:使用Lua處理游戲數據


在之前lua學習:lua作配置文件里,我們學會了用lua作配置文件。

其實lua在游戲開發中可以作為一個強大的保存、載入游戲數據的工具。

 

1.載入游戲數據

比如說,現在我有一份表單:

data.xls

用什么工具解析這個Excel文件並將數據載入游戲?

我們可以使用Lua來完成這個工作。不過要先將表單保存為csv文件(數值用逗號隔開的文件)。

從表單中,我們可以得知第一行是鍵名,剩下的行是數值。我們可以用下面的lua函數載入該csv文件並保存到表中。

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,並自動關閉文件。

然后,可以再創建一個函數解析每行的字符,並創建表格保存該行的所有數據。

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文件,不論簡單還是復雜的文件。

 

我們可以寫個函數測試一下:

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()載入數據了。
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()操作就可以恢復游戲的數據了。
 
 

4.用lua處理log,篩取信息

其實也就是一些io,string操作,沒什么新的東西
把舊的log中想的篩取信息,寫到新的文件中,具體可以參加以下代碼:
function find_player()
    local logfile = assert(io.open("房間201.log","r")) --打開舊文件
    local findfile = io.open("find_player.txt","w") --打開新文件

    local text = logfile:read("*all") --讀入所有內容

    for w in string.gmatch(text,".-,") do
        if string.find(w,"player userid = (%d+) level=(%d+) enter") ~= nil then --查找寫入相關內容到新文件
            findfile:write(w)
        end

        if string.find(w,"player userid = (%d+) leave") ~= nil then
            findfile:write(w)
        end
    end

    logfile:close() --關閉文件
    findfile:close()
end

find_player()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM