分类 编程.Lua 中的文章

A*算法 | Lua版本

A*算法思路

寻路步骤

  1. 从起点A开始, 把它作为待处理的方格存入一个"开启列表", 开启列表就是一个等待检查方格的列表.
  2. 寻找起点A周围可以到达的方格, 将它们放入"开启列表", 并设置它们的"父方格"为A.
  3. 从"开启列表"中删除起点 A, 并将起点 A 加入"关闭列表", “关闭列表"中存放的都是不需要再次检查的方格
  4. 从 “开启列表” 中选择 F 值最低的方格 C (绿色起始方块 A 右边的方块), 把它从 “开启列表” 中删除, 并放到 “关闭列表” 中.
  5. 检查它所有相邻并且可以到达 (障碍物和 “关闭列表” 的方格都不考虑) 的方格. 如果这些方格还不在 “开启列表” 里的话, 将它们加入 “开启列表”, 计算这些方格的 G, H 和 F 值各是多少, 并设置它们的 “父方格” 为 C.
  6. 如果某个相邻方格 D 已经在 “开启列表” 里了, 检查如果用新的路径 (就是经过C 的路径) 到达它的话, G值是否会更低一些, 如果新的G值更低, 那就把它的 “父方格” 改为目前选中的方格 C, 然后重新计算它的 F 值和 G 值 (H 值不需要重新计算, 因为对于每个方块, H 值是不变的). 如果新的 G 值比较高, 就说明经过 C 再到达 D 不是一个明智的选择, 因为它需要更远的路, 这时我们什么也不做.
  7. 当我们发现 “开始列表” 里出现了目标终点方块的时候, 说明路径已经被找到.

对每个格子怎么走,往哪个方向走有一个很重要的函数-估价函数, 公式如下:

……

阅读全文

Lua | next的使用

lua_next

lua_next(L,index):先把 表(lua栈 index所指的表), 的当前索引弹出,再把table 当前索引的值弹出,也就是先弹出 table的索引,再弹出table索引的值 举例:

local t = {
    ["a"] = 1,
    ["b"] = 2,
    ["c"] = 3
}

使用lua_next遍历table t

……

阅读全文

Lua | API

lua_pop和lua_settop

lua_settop

我们直接来看lua_settop,文档解释

/*
设置栈的高度,如果之前的栈顶比新设置的更高,那么高出来的元素会被丢弃,反之压入nil来补足大小
假设栈里有2个元素。
如果index=0,那么移除栈上所有元素
如果index=1,移除栈顶一个元素
如果index=4,那么压入2个nil元素
*/
void lua_settop (lua_State *L, int index);

使用代码测试

int lua_test(lua_State *L)
{
    int pop_num = lua_tointeger(L,1);
    printf("pop_num= %d\n", pop_num);
    lua_settop(L,0);
    printf("1-top %d\r\n",lua_gettop(L));
    lua_pushinteger(L,31);
    lua_pushinteger(L,32);
    lua_pushinteger(L,33);
    lua_pushinteger(L,34);
    printf("2-top %d\r\n",lua_gettop(L));
 
    lua_pop(L,pop_num);
    lua_settop(L, -2); //清除一个栈顶
 
    printf("3-top %d\r\n",lua_gettop(L));
    printf("栈底 %d\r\n",lua_tointeger(L,1));
    printf("栈顶 %d\r\n",lua_tointeger(L,-1));
    return 0;
}

输出

pop_num= 0
1-top 0
2-top 4
3-top 3
栈底 31
栈顶 33

总结lua_settop(L, idx)函数

……

阅读全文

Lua | 解决百元买鸡的问题

问题

编写lua程序求解百鸡百钱问题。公鸡5元一只,母鸡3元一只,小鸡一元3只,问100元钱买100只鸡,可买公鸡、母鸡、小鸡各多少只?

代码

-----------------------------------------------------------------------------
--公鸡5元一只,母鸡3元一只,小鸡一元3只,问100元钱买100只鸡,可买公鸡、母鸡、小鸡各多少只?
-----------------------------------------------------------------------------

local maxprice  = 100   --总价
local maxnum = 100      --总数量

local malePrice = 5    --公鸡价格
local femalePrice = 3  --母鸡价格
local smallPrice = 1/3 --小鸡价格

for malenum = 0, 20 do --公鸡的最大数量=100/4
    for femalenum = 0, 34 do --母鸡的数量最大值=100/3
        for smallnum = 0, 300 do --小鸡的数量最大值=100*3
            local tolsum = malenum * malePrice + femalenum * femalePrice + smallnum * smallPrice
            local num = malenum + femalenum + smallnum
            if tolsum == 100 and num == 100 then
                print(string.format("小鸡:%d只,母鸡:%d只,公鸡:%d只\n",smallnum, femalenum, malenum))
            end
        end
    end
end

输出

……

阅读全文

Lua | 调用C/C++的动态库

概述

最近在学习 云风的skynet库,想自定义一个模块,目标是使用lua调用C/C++所编写的库。

当我们需要在Lua里面调用c/c++函数时,所有的函数都必须满足以下函数签名:

typedef int (*lua_CFunction) (lua_State *L);

换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值。因为这个函数使用Lua栈作为参数,所以它可以从栈里面读取任意数量和任意类型的参数。而这个函数的返回值则表示函数返回时有多少返回值被压入Lua栈。(因为Lua的函数是可以返回多个值的)。

……

阅读全文