中文编程入门(Lua5.4.6中文版)第九章 Lua 迭代器 参考种田游戏

迭代器(iterator)在游戏开发中扮演着重要角色,尤其是在Lua语言中。它是一种特殊的数据结构,能够逐个访问集合中的元素,犹如一位探险家穿越种田游戏的领土,逐一揭示各个城市与资源。

在Lua中,迭代器以一种强大的机制实现,它可以跟踪并遍历表或其他集合类型的每一个项目。其中,泛型for循环是利用迭代器的一种便捷方式,它内部会保存一个迭代函数、状态常量和控制变量三部分信息。

以下是一个范例,展示了如何使用Lua内置的pairs函数作为迭代器来遍历一个表示种田游戏特色单位列表的表:

-- 使用匹配迭代器遍历表格

任务列表 = {"勇士", "弓箭手", "攻城车"}

因为 事项,任务 属于 匹配(任务列表) 做
    输出("训练"..事项..":"..任务)
结束

输出结果为:

训练1:勇士
训练2:弓箭手
训练3:攻城车

此外,Lua中的序配函数则特别适用于按索引顺序遍历数组式表,就像按照城市序列派遣单位一样:

-- 使用序配迭代器遍历数组式表

城市资源 = {"粮食", "矿石", "金币"}

因为 索引, 资源 属于 序配(城市资源) 做
    输出("采集第"..索引.."种资源:"..资源)
结束

输出结果为:

采集第1种资源:粮食
采集第2种资源:矿石
采集第3种资源:金币

对于自定义迭代器,Lua提供了无状态和多状态两种形式。无状态迭代器如序配ipairs,仅依赖于传入的参数就能计算出下一个元素,而不需要额外保留状态;多状态迭代器则可能需要存储多个状态值,通常通过闭包或表来实现。

例如,创建一个用于生成数字平方的无状态迭代器:

函数 平方计算(最大数字, 当前数字)
   如果 当前数字 < 最大数字 即
      当前数字 = 当前数字 + 1
      返回 当前数字, 当前数字 * 当前数字
   结束
结束

因为 i, 平方数 属于 平方计算, 3, 0 做
    输出("数字 "..i.." 的平方是:"..平方数)
结束

输出结果为:

1数字 1 的平方是:1
2数字 2 的平方是:4
3数字 3 的平方是:9

而对于多状态迭代器,可以封装一系列状态在一个闭包或表内,以实现更复杂的遍历逻辑,如下是一个遍历预设数组的多状态迭代器实例:

游戏单元 = {"矛兵", "战车", "僧侣"}

-- 创建一个多状态迭代器
函数 多状态迭代器(闭包)
   局部 索引 = 0
   局部 计数 = #闭包
   
   -- 返回一个闭包作为迭代函数
   返回 函数()
      索引 = 索引 + 1
      如果 索引 <= 计数 即
         返回 闭包[索引]
      结束
   结束
结束

-- 使用自定义迭代器遍历数组
因为 单元 属于 多状态迭代器(游戏单元) do
    输出("招募 "..单元)
结束

输出结果为:

招募 矛兵
招募 战车
招募 僧侣

总之,在Lua中设计和使用迭代器就像是编制一套精巧的战略,让程序能够高效地探索和处理数据集合,无论是在遍历种田游戏的各种游戏元素,还是处理其他复杂的数据结构时都显得游刃有余。

相关推荐
nbplus_0075 分钟前
golang go-bindata打包配置文件嵌入到二进制文件
开发语言·后端·golang·个人开发·go配置文件
顶顶年华正版软件官方17 分钟前
苹果电脑畅玩《魔兽世界巫妖王之怒》怀旧服国服 苹果电脑怎么玩魔兽世界手游?PD虚拟机能玩魔兽世界吗 Mac运行Windows游戏
游戏·苹果电脑·pd虚拟机·虚拟机和crossover·魔兽世界·parallels激活码
安冬的码畜日常22 分钟前
【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(三)
开发语言·前端·javascript·信息可视化·数据可视化
hycccccch1 小时前
Java&MySQL 学习(基础)
java·开发语言·笔记·学习·mysql
游戏智眼1 小时前
自从棋牌游戏有了AI助阵,赢“麻”了!看这篇就够了
大数据·人工智能·游戏·ai·游戏引擎·aigc·游戏策划
芋芋qwq1 小时前
Lua、AB包热更新总结
开发语言·lua
爱分享的码瑞哥1 小时前
Rust 基础教程
开发语言·后端·rust
那个那个鱼1 小时前
C#面:现有一个整数number,请写一个方法判断这个整数是否是2的N次方
开发语言·算法·c#·.net
盏茶作酒1 小时前
解决expand-change第一次展开无数据显示与实现
开发语言·前端·javascript
V言微语1 小时前
2.3 主程序和外部IO交互 (文件映射方式)----IO Server实现
开发语言