1. 程式人生 > >遊戲策劃配表並自動更新到資料庫

遊戲策劃配表並自動更新到資料庫

  在遊戲開發中,數值是必不可少的,數值一般由策劃設計匯出,然後開發再將數值應用於遊戲程式碼中。但是策劃的需求是經常會變的,這就導致數值會頻道的修正,如果沒次都去更新程式碼來匯入這會給開發帶來很多不必要的麻煩,所以設計一套配表系統和自動讀取匯入的小工具就顯得很有必要。
  下面這套小工具是基於公司的一套lua手遊服務端開發的配表工具。配表採用csv檔案來實現,csv可以用excel開啟,方便策劃們直觀的配置遊戲資料。同時csv檔案是逗號分隔檔案,程式方面也很容易進行解析。先貼上一段lua解析csv檔案的程式碼(暫時沒有實現讀取子資料夾內檔案的功能,可以自行新增)

for file in
lfs.dir(csv_file_path) do if file ~= "." and file ~= ".." then local real_file = csv_file_path .."/".. file --獲取標題和內容 local parsed_csv_titles,parsed_csv_table = parse_csv:load_csv_file(real_file) end end
local M = {}
local log = require("log"):new("parse_csv")

function
split(str, reps)
local resultStrsList = {}; string.gsub(str, '[^' .. reps ..']+', function(w) table.insert(resultStrsList, w) end ); return resultStrsList; end --一行一行取用資料 local function get_row_content(file) local content; local check = false local count = 0
while true do local t = file:read() if not t then if count == 0 then check = true end break end if not content then content = t else content = content..t end local i = 1 while true do local index = string.find(t, "\"", i) if not index then break end i = index + 1 count = count + 1 end if count % 2 == 0 then check = true break end end if not check then assert(1~=1) end --返回去掉空格的一行資料,還有方法沒看明白,以後再修改 return content and (string.gsub(content, " ", "")) end function M:load_csv_file(filePath) -- 讀取檔案 local alls = {} local file = io.open(filePath, "r") while true do local line = get_row_content(file) if not line then break end table.insert(alls, line) end --[[ 從第3行開始儲存(第一行是中文註釋,第二行是標題,後面的行才是內容) 用二維陣列儲存:arr[ID][屬性標題字串] ]] local titles = split(alls[2], ",") local ID = 1 local arrs = {} for i = 3, #alls, 1 do -- 一行中,每一列的內容,第一位為ID local content = split(alls[i], ",") ID = tonumber(content[1]) --儲存ID,以便遍歷取用,原來遍歷可以使用in pairs來執行,所以這個不需要了 --table.insert(arrs, i-1, ID) arrs[ID] = {} -- 以標題作為索引,儲存每一列的內容,取值的時候這樣取:arrs[1].Title for j = 1, #titles, 1 do arrs[ID][titles[j]] = content[j] end end --[[ for l = 1, #titles, 1 do log:info("title = " ..titles[l]) end for k = 1, #arrs,1 do log:info("key = " ..arrs[k].card_id .. " value = " ..arrs[k].card_type) end --]] --返回標題和內容 return titles,arrs end return M

  
  對於解析出來的資料,我們還需要匯入到資料庫,這裡我採用的是mongodb資料庫,每次更新完配表,策劃只需要點選客戶端工具上面的“更新資料庫”按鈕即可完成服務端的自動更新。客戶端工具僅僅是傳送一個rpc請求給伺服器,讓伺服器完成配表的讀取與匯入,客戶端實現很簡單就不貼程式碼了。服務端更新資料庫程式碼如下:
  

for l = 1, #parsed_csv_titles, 1 do  
    log:info("title = " ..parsed_csv_titles[l])
end

for i = 1, #parsed_csv_table,1 do
    --迴圈構造出插入的子語句
    local state = {}
    for j = 1, #parsed_csv_titles, 1 do
        local key = parsed_csv_titles[j]
        local value = parsed_csv_table[i][key]
        state[key] = value
   --     log:info(parsed_csv_titles[j] .. "=" ..parsed_csv_table[i][parsed_csv_titles[j]] .. " ")
    end

    --先查詢該條目是否存在,如果存在則更新,否則插入
    card_index = parsed_csv_table[i].card_index
    mdb:update(db, collection, {card_index = card_index},state)
end 

實現效果:
這裡寫圖片描述

這裡寫圖片描述
這裡寫圖片描述