Lua 问题:返回想要的数据

想求助一下这个问题:

function setupRound()
    local gameModes = {'模式 1','模式 2','模式 3'} -- 游戏模式
    local maps = {'地图 1','地图 2','地图 3'}
    --local newMap = maps[math.random(1,#maps)]
    local mapData = {maps[math.random(#maps)],gameModes[math.random(#gameModes)]}
    local mapData = mapData
    return mapData
end

a = setupRound()
print(a[1],a[2]) --Egor 给出的修复方法

问题是:`

在尝试从 setupRound() 中获取信息时,我得到了 table: 0x18b7b20

获取 mapData 的方法:

a = setupRound()
print(a)

编辑:

输出问题

使用当前脚本,我将永远得到以下输出:地图 3 模式 2。这是什么原因?

效率;这是最佳方法吗?

虽然这不是一个问题,但我想知道我正在使用的方法是否确实是这样做的最有效方法。

点赞
用户4984564
用户4984564

首先

这行没有什么用,可以删除(它确实有作用,只是不是你想要的作用)

local mapData = mapData

输出问题

问题出在 math.random 上。编写一个脚本,内容为 print(math.random(1,100)) 并运行它 100 次。它每次都会输出相同的数字。这是因为 Lua 在启动时默认不设置随机种子。最简单的方法是在程序开头调用 math.randomseed(os.time())

效率;这是最好的方法吗?

这取决于情况。对于你想要的目的来说,是的,它已经足够高效了。如果有什么要改进的地方,我会将其改为以下形式,以避免使用神奇数字,这将使未来更难理解代码。

--- 等等。
local mapData = {
   map = maps[math.random(#maps)],
   mode = gameModes[math.random(#gameModes)]
}
-- 等等。
print(a.map, a.mode)

还要记住:

过早优化是万恶之源。

——Donald Knuth

2019-12-03 07:36:02
用户4383587
用户4383587

你创建了一个单独的函数来生成你的游戏模式和地图,这非常好。这样分离代码,模块化,整洁。

现在,你的游戏模式在一个名为modes = {}的表中(基本上是一个字符串列表)。你的地图在另一个表maps = {}中。

每个表项都有一个key,当省略时,它变为向上计数的数字。在你的例子中,modes和maps中各有3个项目,因此键会是1、2、3。键用于在该表(=列表)中抓取特定项目。例如,maps[2]将抓取maps表中的第二个项目,其值为map 2。modes表也适用于此。因此你要问的输出就是这样。

要获得随机游戏模式,只需调用math.random(#mode)。math.random最多可以接受两个参数。通过这些,您可以定义要从中选择随机数的范围。您也可以传递单个参数,然后Lua假定您想从1开始。因此,math.random(3)实际上变成了math.random(1, 3)。在这种情况下,#mode表示“计算该表中的所有游戏模式并给我该计数”,即3。

要从该函数返回您选择的地图和游戏模式,我们可以使用另一个表,只是将两个值保持在其中。但是,这一次表将具有不同的键来访问其中的值;即“map”和“mode”。

完整的例子是:

local function setupRound()
    local modes = {"mode 1", "mode 2", "mode 3"} --不同的游戏模式
    local maps = {"map 1", "map 2", "map 3"} --不同的地图
    return {map = maps[math.random(#maps)], mode = modes[math.random(#modes)]}
end

for i = 1, 10 do
    local freshRound = setupRound()
    print(freshRound.map, freshRound.mode)
end
2019-12-03 13:45:05