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

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

时间:2024-03-19 16:33:58浏览次数:28  
标签:平方 遍历 数字 .. Lua5.4 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中设计和使用迭代器就像是编制一套精巧的战略,让程序能够高效地探索和处理数据集合,无论是在遍历种田游戏的各种游戏元素,还是处理其他复杂的数据结构时都显得游刃有余。

标签:平方,遍历,数字,..,Lua5.4,Lua,迭代
From: https://blog.csdn.net/funsion/article/details/136845049

相关文章

  • 如何系统的学习Python——迭代器和生成器
    在Python中,迭代器(Iterators)和生成器(Generators)是用于处理可迭代对象的重要工具。它们允许你按需产生值,而不是一次性生成所有值,从而在处理大量数据时更加高效。下面是关于迭代器和生成器的详细解释:迭代器(Iterators):可迭代对象:在Python中,可迭代对象是实现了__iter__()方......
  • 二叉树的迭代遍历
    二叉树前后序遍历(迭代)#include<bits/stdc++.h>usingnamespacestd;structNode{intdata;Node*left;Node*right;Node(intvalue=0):data(value),left(nullptr),right(nullptr){}};Node*insertEle();voidpreorder(Node*pNode);voidmid......
  • 21_迭代器模式
    迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不需要暴露集合对象的内部结构。迭代器模式将遍历操作封装在迭代器对象中,使得客户端可以通过迭代器对象依次访问集合中的元素。迭代器模式有三个主要角色:迭代器(Iterator):定义了访问和遍历集合对......
  • 04_C++字符串_迭代器使用
    概念:迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针。1.使用迭代器使用begin和end,begin成员负责返回第一个元素(或者第一个字符)的迭代器。end成员返回指向容器“尾元素的下一个位置......
  • Lua 如何在Lua中调用C/C++函数
    Lua调用C函数有两种方式程序主体在C中运行,C函数注册到Lua中。C调用Lua,Lua调用C注册的函数,C或者Lua得到函数的执行结果。程序主体在Lua中运行,C函数作为库函数供Lua使用。C++的代码如下如何在Lua脚本中调用这个C语言函数(add_function)?#include<QCoreApplication>#inclu......
  • Qt 如何搭建Lua的运行环境
    一、Lua简介Lua是一种强大的、高效的、轻量级的、可嵌入的脚本语言。它支持过程(procedural)编程、面向对象编程、函数式编程以及数据描述。Lua是动态类型的,运行速度快,支持自动内存管理,因此被广泛用于配置、脚本编写等场景。二、Lua的优势Lua脚本可以很容易的被C/C++代......
  • Java 包装类:原始数据类型与迭代器
    JavaIteratorIterator接口提供了一种迭代集合的方法,即顺序访问集合中的每个元素。它支持hasNext()和next()方法,用于检查是否存在下一个元素以及获取下一个元素。获取Iterator可以使用集合的iterator()方法获取Iterator实例://导入ArrayList类和Iterator类impo......
  • 从keys命令出发-浅谈redis的字典和字典迭代器
    1.keys命令keys命令相信大家应该都用过,该命令会遍历整个redis的字典空间,对要查找的key进行匹配并返回。就像官方文档所说:在生产环境使用该方法的过程中要非常小心,因为redis服务器在执行该命令的时候其他客户端读写命令都会被阻塞。使用方法:KEYSpattern示例:127.0.0.1:6379......
  • C++中不同容器下迭代器失效的情况
    C++中不同容器下迭代器失效的情况迭代器失效分三种情况考虑,也是分三种数据结构考虑,分别为数组型,链表型,树型数据结构。数组型数据结构:该数据结构的元素是分配在连续的内存中,insert和erase操作,都会使得删除点和插入点之后的元素挪位置,所以,插入点和删除掉之后的迭代器全部失效,也就......
  • python迭代器、生成器与可迭代对象
    迭代(Iteration)如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration),这些可以直接作用于for循环的对象统称为可迭代对象:Iterable方法是通过collections.abc模块的Iterable类型判断,一个对象是否为可迭代对象>>>fromcollections.......