comandos lua. Quiero saberlo todo. Idioma lua. Tipos de datos Lua

Recientemente, un amigo mío cercano fue entrevistado para un trabajo en una empresa local de desarrollo de juegos. No voy a dar nombres aquí, salvo decir que era una especie de gran boutique de desarrollo de juegos en Vancouver. No consiguió el trabajo, pero hoy no se trata de él. Personalmente creo que una de las razones fue por no ser lo suficientemente amigable con el lenguaje de scripting que utilizan.

Introducción

Estoy involucrado en esta área porque enseño programación de juegos a estudiantes, pero es un tema al que no he prestado suficiente atención en el pasado. Cubrimos Unreal Script como parte del curso Uso de scripts existentes. Pero en realidad no consideramos el motor de secuencias de comandos como parte de las utilidades o parte del motor. Entonces, armado con un sitio web, decidí romper esa pequeña barrera. El resultado se describe en este documento.

Lo único es que no estoy seguro del tamaño que tendrá este documento. Puedo dividirlo en varias partes más pequeñas o publicarlo todo como una larga perorata de principio a fin. De todos modos, lo resolveré un poco más tarde, una vez que haya puesto mis notas en un formato más significativo y consistente.

¿Por qué y por qué no?

En primer lugar, ¿por qué utilizar un lenguaje de programación? Gran parte de la lógica del juego se puede escribir en un lenguaje de programación para diversos fines, en lugar de tener que programarse como parte del motor del juego. Por ejemplo, cargar o inicializar un nivel. Después de cargar un nivel, es posible que desees hacer la transición de la escena al plan de juego o tal vez quieras mostrar algún texto de vista previa. Usando un sistema de secuencias de comandos, puedes hacer que ciertos objetos del juego realicen ciertas tareas. Además, considere implementar inteligencia artificial. Los personajes no jugadores necesitan saber qué hacer. Programar cada NPC "manualmente" dentro del cuerpo del motor del juego complicará innecesariamente la tarea. Cuando quieras cambiar el comportamiento de los NPC, tendrás que volver a compilar tu proyecto. Con un sistema de secuencias de comandos, puede hacer esto de forma interactiva, cambiando el comportamiento y guardando la configuración.

Toqué un poco este tema en el último párrafo, hablaremos más sobre ello un poco más adelante. La pregunta es, ¿por qué no escribir lógica exclusivamente en C/C++? En pocas palabras, la perspectiva del programador es que todo recae directamente sobre él y comenzará en consecuencia con el código del juego, al mismo tiempo tendrá que escribir el motor y las utilidades, etc. Pero ahora podemos, con un lenguaje de programación simple, delegar algunas de las tareas de funcionalidad a los diseñadores de niveles. Pueden empezar a modificar el nivel y optimizar la jugabilidad. He aquí un ejemplo:

Imaginemos que Joe, nuestro pobre programador, escribe él mismo todo el motor del juego, las herramientas y la lógica del juego. Sí, Joe lo pasará mal, pero supongamos que no le importa. También tenemos a Brandon, un diseñador de juegos. Brandon es un tipo bastante inteligente con grandes ideas sobre el juego. Entonces nuestro codificador Joe se aleja e implementa toda la lógica del juego usando las herramientas que desarrolló basándose en el diseño inicial de Brandon. Todo va bien en la oficina. La primera etapa se completa y Joe y Brandon se sientan en la sala de reuniones y comprueban su considerable trabajo. Brandon nota varios problemas con el juego que no se comporta como se esperaba. Entonces Joe vuelve al código y realiza los cambios necesarios. Este proceso puede tardar un día, al menos si no se trata de un cambio trivial. Luego otro día para recompilar el proyecto. Para no perder más días, la mayoría de las oficinas dejan el proceso de montaje de la noche a la mañana. Entonces, como vemos, pasan 24 horas antes de que Brandon vea el cambio que exigió.

Ahora, imaginemos que nuestro personaje principal, Joe, decide que la implementación de la lógica del juego utiliza el motor de script a su favor. Al principio le llevará algún tiempo, pero cree que será beneficioso a largo plazo. Y así, transfiere algunas funciones del motor del juego al sistema de script del juego. También escribe toda la lógica del juego en el sistema de secuencias de comandos mencionado anteriormente. Entonces, cuando se reúne con Brandon y el diseñador nota algo que no coincide con su idea, Joe rápidamente abre la consola, hace algunos cambios en el guión, reinicia el juego y ya ve el nuevo comportamiento. Los cambios se pueden realizar y mostrar inmediatamente, en lugar de tener que esperar a que se recopile. Y si Joe fuera particularmente expresivo, el sistema de secuencias de comandos podría usarse para servicios públicos y estar disponible para los diseñadores de niveles al construir niveles. Si avanzamos por este camino, entonces, con un poco de entrenamiento, los diseñadores de niveles podrían configurar ellos mismos los eventos del juego, como disparadores, puertas y otros eventos del juego, y disfrutar de la vida sin molestar al programador.

Este es un ejemplo bastante artificial y puede que sea un poco exagerado, pero espero que muestre la diferencia entre los enfoques. Entonces, lo que intentaremos hacer con este modelo es avanzar hacia datos más automatizados. Básicamente, hacia dónde nos dirigimos:

  1. El codificador está interesado en escribir el código del motor/herramientas, no la lógica del juego.
  2. Se dedicó tiempo a escribir el motor y las herramientas del juego.
  3. A los diseñadores les gusta jugar con las cosas. Las secuencias de comandos les dan libertad para diseñar niveles y funcionalidades. También les da más flexibilidad para experimentar con cosas que normalmente haría un programador.
  4. No debes volver a compilar si quieres cambiar la funcionalidad del juego. Simplemente cambia el guión.
  5. Quiere romper la conexión entre el código de máquina y el código de juego. Deben ser dos partes separadas. De esta forma será conveniente utilizar el motor para secuelas posteriores (espero).

Aquí haré algunas predicciones. Dentro de cinco años, los diseñadores de niveles tendrán que hacer algo más que construir niveles. Deben poder utilizar guiones para escenas de juegos. Varias empresas con visión de futuro ya han adoptado este enfoque. Además, puede ver este método de integración en editores como UnrealEd y Aurora toolset Bioware.

Aclaración y diatriba

Espero que a estas alturas ya hayas creído mis palabras y quieras incluir un componente de script en tu juego. Entonces, la siguiente pregunta es: ¿cómo diablos lo haces?

Lo que voy a usar para mi componente de script es un motor de script inyectable. lua. Permítanme comenzar diciendo que no soy un experto en Lua, pero es un lenguaje relativamente simple y no requiere un aprendizaje tedioso para dominarlo. Algunos de los ejemplos siguientes que analizaré son bastante simples. Al final de este documento, voy a incluir material de referencia adicional. Para ser justos, existen otros lenguajes de programación, como Small, Simkin, Python, Perl. Sin embargo, Lua es un lenguaje agradable y limpio. Esta es una muy buena ventaja.

Lua es de código abierto. Esto es bueno porque: (a) obtienes el código fuente del lenguaje y puedes buscar en él todo lo que quieras, (b) es gratis. Puedes usarlo en aplicaciones comerciales sin desperdiciar tu dinero. Bueno, para proyectos no comerciales ya sabes, gratis == bueno.

Entonces, ¿quién usa Lua actualmente? ¿Lua fue escrita por una oficina sharashka y solo la usan los pobres? Mmmm... en realidad no. Lua no apareció ayer y fue utilizada por personalidades bastante famosas:

  • lucasarts
    • Fandango sombrío
    • Escapar de la isla de los monos
  • bioware
    • Noches de nunca invierno

Ok, basta de quién es quién de los desarrolladores de lua. Puedes comprobarlo tú mismo en el sitio web de lua.

Comencemos con algo realmente simple. Lo primero que necesitamos construir nos mostrará cómo se usa el intérprete lua. Lo que necesitarás para esto:

  1. Obteniendo el código del intérprete de Lua.
  2. Configurar su entorno de desarrollo.
  3. Construyendo un intérprete desde cero.

Oye, ¿pensé que ya habías dicho suficiente despotricar?

Bueno, ¿es eso suficiente? Entonces, pongámonos manos a la obra. Puede obtener todo el código fuente de Lua en el sitio oficial. También me gustaría tomarme un segundo y señalar que hay una nueva versión de lua 5.0 en el horizonte. No voy a discutir esta versión en este artículo. Me ocuparé de ello más adelante, pero por ahora usaremos 4.0.1.

Lo primero que haremos será construir la biblioteca lua. De esta manera, no necesitaremos incluir las fuentes cada vez que construyamos el proyecto. Esto no es difícil y este no es el objetivo de nuestras lecciones. Es por eso que he incluido la biblioteca al principio como parte de este artículo. Utilicé una biblioteca estática para este ejemplo. Sí, tal vez lo compilaría como una DLL, pero para un sistema de secuencias de comandos una biblioteca estática funciona un poco más rápido. Tenga en cuenta que no mucho, pero más rápido.

Guiones en lenguaje Lua

Un script escrito en Lua no tiene ninguna función especial desde la que iniciar su ejecución. Se puede considerar un script simplemente como un conjunto de comandos (instrucciones) que se ejecutan comenzando con la primera instrucción.

Un script puede ser muy simple, que consta de un solo comando, o muy complejo, que contiene decenas, cientos e incluso miles de instrucciones. Las declaraciones consecutivas pueden estar separadas por un punto y coma (;). Sin embargo, este requisito no es obligatorio, por lo que todo el código siguiente es sintácticamente correcto:

Trabajar con variables en Lua

Las variables se utilizan para almacenar valores durante la ejecución del script.

Nombres de variables en Lua

Los nombres de variables (identificadores) en Lua pueden ser cualquier secuencia de letras, números y un guión bajo que no comience con un número.

tenga en cuenta

El lenguaje Lua distingue entre mayúsculas y minúsculas, por lo que abc, Abc, ABC son nombres diferentes.

La siguiente tabla muestra palabras reservadas por el lenguaje Lua y no se pueden usar en nombres de variables:

y romper hacer otra cosa si no

fin falso para la función si

en local nulo no o

repetir retorno luego verdadero hasta

Además, todos los nombres que comienzan con un guión bajo seguido de letras mayúsculas (por ejemplo, _VERSIÓN) también están reservados.

¿Qué variables hay en Lua?

Las variables en Lua pueden ser globales o locales. Si una variable no se declara explícitamente como local, se considera global.

Variables globales de Lua

Una variable global aparece cuando se le asigna el primer valor. Antes de asignar el primer valor, acceder a la variable global da como resultado cero.

MsgBox(tostring (g)) --> nulo

MsgBox(tostring (g)) --> 1

Una variable global existe siempre que exista el entorno de ejecución del script y esté disponible para cualquier código Lua que se ejecute en ese entorno.

Si es necesario, puede eliminar explícitamente una variable global simplemente asignándole el valor nulo.

g = 1 - crea una variable global g con el valor 1

g = nil - elimina la variable global g

MsgBox(tostring (g)) --> nulo

Todas las variables globales son campos de una tabla normal llamada entorno global. Esta tabla es accesible a través de la variable global _G. Dado que los campos del entorno global son todas variables globales (incluido el propio _G), entonces _G._G == _G.

Variables locales de Lua

Cualquier variable local debe declararse explícitamente utilizando la palabra clave local. Puede declarar una variable local en cualquier parte del script. La declaración puede incluir la asignación de un valor inicial a la variable. Si no se asigna ningún valor, la variable contiene cero.

local a - declara una variable local a

local b = 1 - declara una variable local b, asígnale el valor 1

local c, d = 2, 3 - declara las variables locales cyd, asígnales los valores 2 y 3

El alcance de una variable local comienza después de la declaración y continúa hasta el final del bloque.

Nota

El alcance de una variable es el área del código del programa dentro de la cual puede acceder al valor almacenado en esta variable.

Un bloque significa:

cuerpo de la estructura de control (si-entonces, si no, durante, mientras, repetir);

cuerpo funcional;

un fragmento de código encerrado en las palabras clave do...end.

Si una variable local se define fuera de un bloque, su alcance se extiende hasta el final del script.

local i = 1 - la variable i es local dentro del script

mientras yo<= a do - цикл от 1 до 5

local a = i^2 - la variable a es local dentro del bucle while

CuadroMensaje(a) --> 1, 4, 9, 16, 25

CuadroMensaje(a) -->

si i > 5 entonces

local a - la variable a es local dentro entonces

CuadroMensaje(a) --> 10

MsgBox(a) --> 5 (aquí acceso a global a)

local a = 20 - la variable a es local dentro del extremo final

CuadroMensaje(a) --> 20

MsgBox(a) --> 5 (aquí acceso a global a)

tenga en cuenta

Siempre que sea posible, se recomienda utilizar variables locales en lugar de globales. Esto evitará contaminar el espacio de nombres global y proporcionará un mejor rendimiento (ya que acceder a las variables locales en Lua es un poco más rápido que acceder a las globales).

Tipos de datos Lua

¿Qué tipos de datos admite Lua?

Lua admite los siguientes tipos de datos:

1. Nulo (nada). Corresponde a la ausencia de un valor para una variable. Este tipo está representado por un único valor: nulo.

2. Booleano (lógico). Este tipo incluye los valores falso y verdadero.

Al realizar operaciones lógicas, el valor nulo se trata como falso. Todos los demás valores, incluido el número 0 y la cadena vacía, se tratan como verdaderos.

3. Número (numérico). Se utiliza para representar valores numéricos.

Las constantes numéricas pueden especificar una parte fraccionaria opcional y un exponente decimal opcional, especificado por los caracteres "e" o "E". Las constantes numéricas enteras se pueden especificar en hexadecimal utilizando el prefijo 0x.

Ejemplos de constantes numéricas válidas: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. Cuerda. Se utiliza para representar cadenas.

Los valores de cadena se especifican como una secuencia de caracteres entre comillas simples o dobles:

a = "esto es una cadena"

b = "esta es la segunda línea"

Las cadenas entre comillas dobles se pueden interpretar mediante secuencias de escape tipo C que comienzan con el carácter "\" (barra invertida):

\b (espacio),

\n (avance de línea),

\r (retorno de carro);

\t (pestaña horizontal),

\\ (barra invertida);

\"" (comillas dobles);

\" (comilla simple).

tenga en cuenta

Un carácter en una cadena también se puede representar mediante su propio código usando una secuencia de escape:

donde ddd es una secuencia de no más de tres dígitos.

Además de las comillas, también se pueden utilizar corchetes dobles para definir una cadena:

Definir una cadena usando corchetes dobles le permite ignorar todas las secuencias de escape, es decir, la cadena se crea completamente como se describe:

local a = [] en Lua]=]

Habrá un término: "definición de cadena [] en Lua"

5. Función. Las funciones en Lua se pueden escribir en variables, pasar como parámetros a otras funciones y devolverse como resultado de la ejecución de funciones.

6. Mesa (mesa). Una tabla es una colección de pares clave-valor llamados campos o elementos de tabla. Tanto las claves como los valores de los campos de la tabla pueden ser de cualquier tipo excepto nulo. Las tablas no tienen un tamaño fijo: se les puede agregar una cantidad arbitraria de elementos en cualquier momento.

Lea más en el artículo “Crear tablas en Lua”

7. Datos de usuario (datos de usuario). Es un tipo de datos especial. Los valores de este tipo no se pueden crear ni modificar directamente en un script Lua.

Los datos de usuario se utilizan para representar nuevos tipos creados en el programa de llamada de script o en bibliotecas escritas en C. Por ejemplo, las bibliotecas de extensión Lua para CronosPRO usan este tipo para representar objetos como:

bancos de datos (clase Bank);

bases de datos (clase Base);

registros (clase de registro), etc.

8. Hilo (flujo). Corresponde al hilo de ejecución. Estos hilos no están asociados de ninguna manera con el sistema operativo y son compatibles únicamente con el propio Lua.

¿Cómo configurar el tipo de variable en Lua?

Lua no establece explícitamente el tipo de variable. El tipo de una variable se establece cuando se asigna un valor a la variable. A cualquier variable se le puede asignar un valor de cualquier tipo (independientemente del valor del tipo que contenía anteriormente).

a = 123 - la variable a es de tipo número

a = "123" - ahora la variable a es de tipo cadena

a = verdadero - ahora la variable a es de tipo booleano

a = () - ahora la variable a es de tipo tabla

tenga en cuenta

Las variables como tabla, función, hilo y datos de usuario no contienen los datos en sí, sino que almacenan referencias a los objetos correspondientes. Al asignar, pasar a una función como argumento y regresar de la función como resultado, los objetos no se copian, solo se copian las referencias a ellos.

a = () - crea una tabla. La variable a contiene un enlace a la tabla.

b = a - la variable b se refiere a la misma tabla que a

a = 10 - al elemento de la tabla con índice 1 se le asigna el valor 10

CuadroMensaje(b) --> "10"

MsgBox(a) --> "20"

Los datos restantes son valores inmediatos.

MsgBox(a) --> "20"

CuadroMensaje(b) --> "10"

¿Cómo obtener el tipo de variable en Lua?

El tipo de valor almacenado en una variable se puede determinar utilizando la función de tipo estándar. Esta función devuelve una cadena que contiene el nombre del tipo ("nil", "number", "string", "boolean", "table", "function", "thread", "userdata").

t = tipo ("esto es una cadena") - t es igual a "cadena"

t = tipo (123) - t es igual a "número"

t = tipo (tipo) - t es igual a "función"

t = tipo (verdadero) - t es igual a "booleano"

t = tipo (nulo) - t es igual a "nulo"

t = tipo (CroApp.GetBank()) - t es igual a "datos de usuario"

¿Cómo convertir el tipo de una variable en Lua?

Lua convierte automáticamente números en cadenas y viceversa cuando es necesario. Por ejemplo, si un valor de cadena es un operando en una operación aritmética, se convierte en un número. Del mismo modo, un valor numérico encontrado en un lugar donde se espera un valor de cadena se convertirá en una cadena.

a = "10" + 2 - a es igual a 12

a = "10" + 2 - a es igual a "10 + 2"

a = "-5.3e-10"*"2" - a es igual a -1.06e-09

a = "cadena" + 2 - ¡Error! No se puede convertir 'cadena' a número

Un valor de cualquier tipo se puede convertir explícitamente en una cadena utilizando la función estándar tostring.

a = tostring(10) - a es igual a "10"

a = tostring (verdadero) - a es igual a "verdadero"

a = tostring (nulo) - a es igual a "nulo"

a = tostring (( = "este es el campo 1")) - a es igual a "tabla: 06DB1058"

Del ejemplo anterior queda claro que la función tostring no convierte el contenido de las tablas. Puede realizar esta transformación utilizando la función de renderizado.

a = renderizar(10) - a es igual a "10"

a = render(verdadero) - a es igual a "verdadero"

a = renderizar (nulo) - a es igual a "nulo"

a = render (( = "este es el campo 1")) - a es igual a "( = "este es el campo 1)"

Para convertir explícitamente un valor en un número, puede utilizar la función estándar tonumber. Si el valor es una cadena que se puede convertir en un número (o ya es un número), la función devuelve el resultado de la conversión; de lo contrario, devuelve cero.

a = tonumber("10") - a es igual a "10"

a = tonumber("10"..".5") - a es igual a 10,5

a = tonumber (verdadero) - a es igual a "nulo"

a = tonumber (nil) - a es igual a "nil"

Organizar comentarios en Lua

Un comentario en Lua comienza con dos signos menos (--) y continúa hasta el final de la línea.

local a = 1 - comentario de una línea

Si los caracteres "--" van seguidos inmediatamente de dos corchetes de apertura ([[), el comentario es de varias líneas y continúa hasta dos corchetes de cierre (]]).

local a = 1 - [[ multilínea

comentario ]]

Los paréntesis dobles en los comentarios se pueden anidar. Para no confundirlos, se inserta un signo igual (=) entre corchetes:

local a = [[Compañía Kronos]] - [=[

local a = [[Compañía Kronos]]

El número de caracteres “=" determina el anidamiento:

local a = [=[definición de alguna cadena [] en Lua]=] --[==[

local a = [=[definición de alguna cadena [] en Lua]=]

Operaciones utilizadas en Lua

Las expresiones escritas en Lua pueden utilizar los siguientes tipos de operaciones:

1. Operaciones aritméticas.

Lua admite las siguientes operaciones aritméticas:

+ (adición);

- (resta);

* (multiplicación);

/ (división);

^ (exponenciación);

% (resto de la división).

tenga en cuenta

Las operaciones aritméticas se aplican tanto a números como a cadenas, que en este caso se convierten en números.

2. Operaciones de comparación.

Las siguientes operaciones de comparación de valores están permitidas en Lua:

== (igual);

~= (no igual);

< (меньше);

> (más);

<= (меньше или равно);

>= (mayor o igual que).

tenga en cuenta

Las operaciones de comparación siempre devuelven el valor booleano verdadero o falso.

Las reglas para convertir números en cadenas (y viceversa) no funcionan para comparaciones, es decir, la expresión “0” == 0 resulta falsa.

3. Operaciones lógicas.

Las operaciones lógicas incluyen:

y (Y lógico).

El operador and devuelve su primer operando si es falso o nulo. De lo contrario, la operación devuelve el segundo operando (y este operando puede ser de cualquier tipo).

a = (nulo y 5) - a es igual a nulo

a == (falso y 5) - a es igual a falso

a == (4 y 5) - a es igual a 5

o (OR lógico).

La operación o devuelve el primer operando si no es ni falso ni nulo; en caso contrario, devuelve el segundo operando.

a == (4 o 5) - a es igual a 4

a == (falso o 5) - a es igual a 5

tenga en cuenta

Los operadores lógicos y y o pueden devolver valores de cualquier tipo.

Los operadores lógicos yo evalúan el valor del segundo operando solo si es necesario devolverlo. Si esto no es necesario, el segundo operando no se evalúa. Por ejemplo:

a == (4 o f()) - la función f() no será llamada

no (NO lógico).

La operación not siempre devuelve verdadero o falso.

4. Operación de concatenación.

Para concatenar (unir) cadenas, utilice la operación... (dos puntos).

a = “Kronos.”-”..“Inform” - la variable a recibirá el valor “Kronos-Inform”

tenga en cuenta

Si uno o ambos operandos son números, se convierten en cadenas.

a = 0..1 - la variable a recibirá el valor “01”

5. Operación de obtención de longitud.

Lua define un operador de longitud # que se puede utilizar para obtener la longitud de una cadena.

a = "cadena"

len = #a - len es igual a 6

len = #“otra línea” - len es igual a 10

tenga en cuenta

También puede utilizar la operación # para averiguar el índice (o tamaño) máximo de una matriz. Para obtener más detalles, consulte el artículo "Trabajar con matrices en Lua".

Prioridad de las operaciones en Lua

En Lua, las operaciones se realizan según la siguiente prioridad (en orden descendente):

2. no # - (unario)

6. < > <= >= ~= ==

Llamar scripts desde formularios

Cada formulario (incluidos los formularios anidados) tiene un script independiente asociado, que generalmente contiene funciones que manejan eventos para el formulario y sus elementos.

Cuando se inicia el formulario, su script se carga en el entorno global. Cuando ocurre un evento en un formulario o su elemento, el sistema llama a la función de controlador asociada con este evento.

Cabe señalar que el script del formulario, aunque no contiene una llamada a la función del módulo, es en realidad un módulo. Esto significa que las variables declaradas en el script del formulario sin la palabra clave local no se colocan en el entorno global y solo están disponibles dentro de este script. Si necesita que un valor esté disponible para scripts de otras formas, debe definirse explícitamente en la tabla global _G:

local a = _G.var

Bloques de declaraciones (instrucciones)

Los operadores básicos de Lua incluyen:

asignación;

operador condicional;

Operadores para organizar bucles.

Un grupo de declaraciones se puede combinar en un bloque (declaración compuesta) usando la construcción do...end.

hacer - inicio del bloque

<оператор1>- cuerpo de bloque

<оператор2>

<операторN>

final - final del bloque

Un bloque abre un nuevo ámbito en el que se pueden definir variables locales.

a = 5 - variable global a

local a = 20 - una variable local a se define dentro del extremo final

CuadroMensaje(a) --> 20

MsgBox(a) --> 5 (aquí la referencia es a global a)

Operador de asignación en Lua

Una asignación cambia el valor de una variable o campo de tabla. En su forma más simple, una tarea podría verse así:

a = 1 - a la variable a se le asigna el valor 1

a = b + c - a la variable a se le asigna la suma de los valores de las variables b y c

a = f(x) - a la variable a se le asigna el valor devuelto por la función f(x)

Lua permite la llamada asignación múltiple, cuando varias variables a la izquierda del operador de asignación reciben los valores de varias expresiones escritas a la derecha del operador de asignación:

a, b = 1,5*c - a es igual a 1; b es igual a 5*c

Si hay más variables que valores, a las variables "extra" se les asigna cero.

a, b, c = 1, 2 - a es 1; b es igual a 2; c es igual a cero

Si hay más valores que variables, los valores “extra” se ignoran.

a, b = 1, 2, 3 - a es igual a 1; b es igual a 2; valor 3 no utilizado

Se puede utilizar la asignación múltiple para intercambiar valores entre variables:

a = 10; b = 20 - a es igual a 10, b es igual a 20

a, b = b, a - ahora a es 20, b es 10

Declaración condicional (si) en Lua

La declaración if prueba la verdad de una condición dada. Si la condición es verdadera, se ejecuta la parte del código que sigue a la palabra clave then (then sección). De lo contrario, se ejecuta el código que sigue a la palabra clave else (sección else).

si a > b entonces

devuelve a - si a es mayor que b, devuelve a

devolver b - en caso contrario - devolver b

La sección else es opcional.

si un< 0 then

a = 0 - si a es menor que 0, establezca a en 0

En lugar de declaraciones if anidadas, puede utilizar la construcción elseif. Por ejemplo, el siguiente código:

Será más fácil de entender si lo reemplaza con lo siguiente:

devuelve "Ivan" - si a es 1

elseif a == 2 entonces

devuelve "Peter" - si a es 2

elseif a == 3 entonces

devuelve "Sergey" - si a es igual a 3

devolver “No existe tal jugador” - si es - ninguno de los anteriores

Mientras bucle en Lua

El operador while está destinado a organizar bucles con una condición previa y tiene la siguiente forma:

mientras hacer

... - cuerpo del bucle

Antes de cada iteración del ciclo, se verifica la condición. :

si la condición es falsa, el ciclo finaliza y el control se transfiere a la primera declaración que sigue a la declaración while;

si la condición es verdadera, se ejecuta el cuerpo del bucle, después de lo cual se repiten todas las acciones.

mientras i > 0 haga - ciclo de 10 a 1

t[i] = "campo"..i

a = (3, 5, 8, -6, 5)

mientras que i > 0 lo hago, busque un valor negativo en la matriz

si un[yo]< 0 then break end - если найдено, прерываем цикл

i = i - 1 - de lo contrario pasa al siguiente elemento

si i > 0 entonces

MsgBox("Índice de valor negativo: "..i)

MsgBox("La matriz no contiene valores negativos")

Nota

Bucle con poscondición (repetición) en Lua

El operador de repetición está destinado a organizar bucles con una poscondición y tiene la siguiente forma:

... - cuerpo del bucle

hasta

El cuerpo del bucle se ejecuta hasta que se cumpla la condición. no se hará realidad. La condición se verifica después de ejecutar el cuerpo del bucle, por lo que, en cualquier caso, el cuerpo del bucle se ejecutará al menos una vez.

Sumar los valores del array a hasta que la suma no supere 10

a = (3, 2, 5, 7, 9)

suma = suma + a[i]

hasta suma > 10

MsgBox("Se agregaron elementos "..i..". La suma es "..sum")

Puede utilizar la instrucción break para salir de un bucle antes de que se complete.

Nota

Lea más sobre las características del uso del operador de descanso en el artículo "Operadores de descanso y devolución"

Bucles con declaración for en Lua

El operador for está diseñado para organizar bucles y permite dos formas de escritura:

simple (numérico para);

extendido (universal para).

Forma simple de la declaración for

Una forma simple de la declaración for se ve así:

para var = exp1, exp2, exp3 hacer

... - cuerpo del bucle

El cuerpo del bucle se ejecuta para cada valor de la variable del bucle (contador) var en el intervalo de exp1 a exp2, con el paso exp3.

Nota

Es posible que no se especifique el paso. En este caso se toma igual a 1.

para i = 1, 10 hacer - bucle de 1 a 10 con el paso 1

MsgBox("i es igual a "..i)

para i = 10, 1, -1 hacer - bucle de 10 a 1 con el paso -1

MsgBox("i es igual a "..i)

tenga en cuenta

Las expresiones exp1, exp2 y exp3 se evalúan sólo una vez, antes del inicio del ciclo. Entonces, en el siguiente ejemplo, la función f(x) se llamará solo una vez para calcular el límite superior del bucle:

para i = 1, f(x) haz un bucle desde 1 hasta el valor devuelto por la función f()

MsgBox("i es igual a "..i)

Una variable de bucle es local a la declaración de bucle y no está definida al final del bucle.

for i = 1, 10 do - bucle desde 1 hasta el valor devuelto por la función f()

MsgBox("i es igual a "..i)

MsgBox("Después de salir del bucle, i es igual a "..i) - ¡Incorrecto! yo es igual a cero

tenga en cuenta

El valor de una variable de bucle no se puede cambiar dentro de un bucle; las consecuencias de dicho cambio son impredecibles.

Para salir de un bucle antes de que se complete, utilice la instrucción break.

a = (3, 5, 8, -6, 5)

for i = 1,#a do - busca un valor negativo en la matriz

si un[yo]< 0 then - если найдено...

index = i - guarda el índice del valor encontrado...

romper - e interrumpir el ciclo

MsgBox("Índice de valor negativo: "..index)

Nota

Lea más sobre las características del uso del operador de rotura en el artículo "Operadores de rotura y devolución")

Esta serie de tutoriales que tengo en mente tratará sobre el lenguaje de programación Lua. Intentaré que la presentación sea lo más accesible posible para los principiantes y me centraré en ellos. Es decir, los codificadores experimentados de Lua probablemente no aprenderán nada nuevo de aquí (estoy seguro de que solo encontrarán lugar para objeciones y comentarios, que, de hecho, incluso son bienvenidos de su parte), pero si no tiene Tienes una amplia experiencia en programación, entonces creo que te llevarás algo.

Toda la serie no obedecerá a ningún sistema. Las lecciones introducirán secuencialmente una serie de construcciones del lenguaje, de modo que en la tercera o cuarta lección ya puedas escribir tus propios programas. Mi objetivo es animarte a aprender el idioma por tu cuenta, ayudarte a sentirlo y no explicarlo de la A a la Z. Si quieres dominar el idioma por completo, lee la guía de referencia (que, aunque es deficiente, es traducido al ruso: http://www.lua.ru/doc/). Cuanto antes pases de las lecciones "para principiantes" en Internet a estudiar el libro de referencia, mejor.

Si algo no está claro, asegúrese de hacer una pregunta en los comentarios y yo y otros participantes intentaremos ayudarlo.

Lua es un lenguaje de programación de propósito general popular, fácil de aprender, integrado, interpretado y tipado dinámicamente. No, no es necesario que entiendas la mitad de las palabras dichas en la oración anterior; lo principal es saber que es popular y sencillo. Por cierto, se ha ganado su popularidad gracias a su sencillez, así como al pequeño tamaño de la distribución (unos 150 kilobytes). Los scripts Lua son compatibles con una gran cantidad de aplicaciones, incluidos los juegos. World of Warcraft y S.T.A.L.K.E.R. Utiliza el lenguaje Lua. Mi motor de juegos favorito te permitirá crear fácilmente una variedad de juegos usando Lua. Como puedes ver, ¡Lua te abre muchos horizontes!

Antes de comenzar, debes configurar un entorno de programación: es decir, encontrar un programa que acepte el código Lua que escribas y lo ejecute: un intérprete. Hay tres opciones:

1. Descargue la distribución oficial de Lua desde uno de los sitios que la suministran.

Desde el sitio web oficial de Lua sólo puedes descargar los códigos fuente del intérprete. Sin embargo, si consulta http://lua.org/download.html en la sección Binarios, puede encontrar enlaces a sitios con archivos ejecutables para Windows. Uno de ellos: . Descargue uno de los archivos desde allí (que coincida con su plataforma: Win32 o Win64) y descomprímalo en algún lugar, preferiblemente en un directorio con una ruta corta: como C:\lua. De ahora en adelante asumiré que estás usando Windows y que tu intérprete está ahí.

En este sentido, es más fácil para los usuarios de sistemas operativos basados ​​en Linux: sólo necesitan utilizar un gestor de paquetes e instalar Lua desde los repositorios. En Debian y Ubuntu esto se hace con el comando apt-get install lua, y en Fedora, Red Hat y distribuciones derivadas - yum install lua. Sin embargo, no confíes ciegamente en mí y consulta el manual de tu sistema operativo para saber exactamente cómo se hace esto por ti.

2. Utilice un intérprete en línea.

Encontrado en http://www.lua.org/demo.html. Al principio puede que sea suficiente, pero luego, cuando toquemos módulos, te verás obligado a utilizar la versión offline. Usar el intérprete en línea es muy simple: ingrese su programa en el cuadro de texto y haga clic en el botón Ejecutar. El programa se ejecutará y la ventana Salida mostrará el resultado de su programa, así como los informes de error, si los hubiere, que haya realizado.

3. Utilice un IDE.

Por ejemplo ZeroBrane Studio: http://studio.zerobrane.com/. Hay otros: busque en Internet.

Actualmente se utilizan dos versiones ligeramente diferentes de Lua: 5.1 y 5.2. Me centraré en la versión más reciente: la versión 5.2, pero me aseguraré de señalar diferencias importantes entre esta y la 5.1, ya que esta última también es bastante común. Por cierto, Lua 5.1 ejecuta código una vez y media más rápido que Lua 5.2, para que lo sepas.

=== Lección No. 1 ===

Entonces comencemos. Cree un archivo main.lua en una carpeta aislada de archivos extraños y escriba en él:

200?"200px":""+(this.scrollHeight+5)+"px");">
-- principal.lua --
imprimir("¡Hola mundo!")

Luego ejecútelo en la línea de comando (no olvide moverse al directorio con main.lua usando el comando cd):

200?"200px":""+(this.scrollHeight+5)+"px");">
> C:\lua\lua.exe principal.lua

El intérprete de Lua responderá con:

200?"200px":""+(this.scrollHeight+5)+"px");">
¡Hola Mundo!

En principio esto era de esperar. En el programa llamamos a la función de impresión. La función de impresión toma una cantidad arbitraria de parámetros y los muestra secuencialmente en la pantalla. En este ejemplo, le pasamos la cadena (cadena de caracteres) "¡Hola mundo!". Puedes pasarlo con la misma facilidad como parámetro:

200?"200px":""+(this.scrollHeight+5)+"px");">
print(8) -- algún número decimal
-- generará: 8

Imprimir(0xDEADBEEF) -- número hexadecimal
-- generará: 3735928559

Print("0xDEADBEEF") - ¡pero esto es una cadena, no un número! ¿Ves las comillas?
-- generará: 0xDEADBEEF

Print(1.35e-4) -- número de punto flotante (número fraccionario)
-- Generará 0.000135. 1,35e-4 debe entenderse como "1,35 veces
- por diez elevado a menos la cuarta potencia”, por si alguien no lo sabe.

Imprimir((198*99)-3*500 + 14/88) -- expresión
-- Imprime el valor de la expresión: 18102.159090909. No es una mala alternativa
- ¡calculadora de escritorio!

Print(198/7, "fertilizante", 2^9) -- varios parámetros arbitrarios
- algo así. Se mostrarán los valores de cada uno de ellos, separados por signos.
-- pestañas:
-- 28.285714285714 fertilizante 512
-- ¡Tenga en cuenta que no se muestran las citas sobre fertilizantes!

Print(1.35) - ¡dos números, no la fracción decimal 1.35!
-- Se utiliza una coma para separar los parámetros.
-- Salida:
-- 1 35

El signo "--" no es sólo una imitación del signo de guión, que se inserta por motivos de belleza. El signo "--" en Lua marca comentarios: sugerencias para el programador que el intérprete ignora y que pretenden hacer que el código sea más fácil de entender. Puedes intentar escribir en el programa:

200?"200px":""+(this.scrollHeight+5)+"px");">
-- imprimir("nada")

El intérprete pensará que se trata de un comentario y no ejecutará la instrucción.

Nota para la anfitriona: si desea imprimir solo una línea, puede escribir la llamada de impresión así, sin paréntesis:

200?"200px":""+(this.scrollHeight+5)+"px");">
imprimir "Sólo una cadena"

La comodidad es ciertamente cuestionable: sólo tenga en cuenta que esto es posible. Sin embargo, tales llamadas son inaceptables:

200?"200px":""+(this.scrollHeight+5)+"px");">
imprimir 2 no funcionará, 2 no es una cadena.
imprime 2*2 + 6 - no funcionará de todos modos

Cadena = "¡¡cadena!!" - asignó el valor "cadena!" a la variable str
-- lea sobre las variables a continuación
print str - tampoco funcionará.

En cada uno de los casos anteriores, el programa simplemente se negará a funcionar. Por lo tanto, en una llamada "sin corchetes", el nombre de la función sólo puede ir seguido de una cadena literal (es decir, una secuencia de caracteres entre comillas) y nada más. Hablaré de esta característica con un poco más de detalle en el futuro, pero por ahora, es suficiente.

Cualquier buen lenguaje de programación te permite declarar variables: pequeños contenedores que pueden contener algunos datos. En Lua esto se hace así:

200?"200px":""+(this.scrollHeight+5)+"px");">
<имя_переменной> = <выражение>

Por ejemplo:

200?"200px":""+(this.scrollHeight+5)+"px");">
estrella = 8 - Ahora la variable estrella almacena el número 8
wars = "owl" - En la variable wars - la cadena "owl"
jedi = 42/2 -- En la variable jedi - el número 21
luke = star*jedi -- En la variable luke - el número 168 (sí, 21 por 8)

También se pueden visualizar los valores de las variables y expresiones con ellas:

200?"200px":""+(this.scrollHeight+5)+"px");">
imprimir (estrella, guerras, jedi, jedi-star+luke)
-- Salida:
-- 8 búho 21 181

Simplemente no intentes agregar las variables Star y Wars: ¡intentar agregar 8 a "búho" no te servirá de nada!

Como habrás notado, el nombre de una variable puede ser casi cualquier cosa: lo principal es que no comienza con un número. En serio, incluso puedes declarar una variable llamada imprimir, y luego la función de impresión dejará de funcionar porque el nombre imprimir se referirá a la variable recién declarada. Pero hay un grupo de palabras cuyo uso está prohibido como nombres de variables: estas son palabras clave del idioma con las que aún no nos hemos familiarizado, pero que definitivamente vale la pena echarles un vistazo:

200?"200px":""+(this.scrollHeight+5)+"px");">
y romper hacer otra cosa si terminar
falso para la función ir a si está en
local nulo no o repetir regresar
entonces es cierto hasta que

Al crear una variable con uno de estos nombres, provocarás un error en el programa y definitivamente no funcionará. Tenga en cuenta: en Lua 5.1 no existe la palabra clave goto y puede llamar a una variable de esa manera, pero es mejor que no lo haga.
También tenga en cuenta que los nombres de las variables distinguen entre mayúsculas y minúsculas. Esto significa que foo, fOo, fOO y FOO son cuatro variables diferentes, por lo que si escribiste el nombre de una variable en minúsculas y luego lo escribiste en mayúsculas, lo más probable es que el programa no funcione correctamente.

Y ahora un punto importante: ¿qué pasa si, accidental o intencionadamente, te refieres a una variable inexistente? En la mayoría de los demás idiomas, esto provocará un error, pero en Lua esta situación es aceptable. Se trata como si la variable inexistente realmente existiera, pero su valor es nulo. nulo- ¡Recuerda esta palabra! es un tipo de valor especial en Lua que significa "nada". Ni cero ni una cadena vacía (una cadena como ""; intente mostrarla en la pantalla), pero simplemente nada. Compare esto con este modelo: hay dos personas, una de ellas tiene una cuenta bancaria pero no tiene dinero y la otra no tiene ninguna cuenta bancaria. En términos de Lua, se considerará que el primero tiene $0 en su cuenta y el segundo tiene $0 en su cuenta. nulo. Y ni siquiera dólares, sino simplemente nulo. Espero no haberte confundido.

Intente, por ejemplo, ejecutar este programa:

200?"200px":""+(this.scrollHeight+5)+"px");">
-- principal.lua --
foo = "barra"
imprimir(foo,baz)
-- Salida:
--barra nula

Por lo tanto, la variable baz, que no existe pero se cree que existe, tiene el valor nulo, y la función de impresión entiende esto y lo imprime en la pantalla como la cadena "nil". Lua tiene un buen método para comprobar la existencia de una variable: si el valor de la variable no es nulo, al menos se declara. Por otro lado, puedes declarar explícitamente una variable igual a nulo:

200?"200px":""+(this.scrollHeight+5)+"px");">
cool_var = nulo

Esto se puede hacer, y aunque a primera vista parezca una estupidez, a veces se hace. En lecciones posteriores aprenderá quién y por qué, y probablemente empezará a hacer lo mismo. A veces, por supuesto.
Tenga cuidado con nil: puede imprimir nil, pero no puede realizar operaciones aritméticas con él. Es decir, si puede salirse con print(nil), una construcción como 99+nil provocará un error, ¡incluso si lo hiciera! como 99+ nil era 99. Créanme, yo también me enojé cuando me enteré.

Reanudar:
1. Aprendimos sobre la función imprimir, qué puede hacer y cómo llamarla correctamente sin paréntesis.
2. Aprendimos cómo declarar variables, cómo evaluar expresiones (aunque sea un poco), qué nombres pueden tener las variables.
3. Aprendimos sobre el nil, nos impregnamos de su misterio místico y ganamos confianza en que en el futuro tendremos mucho que ver con él.

Para aquellos que son curiosos y quieren reforzar sus conocimientos, ofrezco ejercicios sencillos, lo cual no tienes que hacer si ya te sientes lo suficientemente competente:
1. Escribe un programa que imprima el estribillo de tu canción favorita.
2. Intente derivar los valores de las siguientes expresiones. Trate de entender por qué algunos de ellos funcionan y otros no. Vea qué errores son causados ​​por expresiones que no funcionan.

200?"200px":""+(this.scrollHeight+5)+"px");">
2 + "cadena";
6 + "14";
"caja" - "voz";
1 * "11b"
"148" * "1e6";


3. Escribe un programa que intercambie valores entre dos variables. Eso es:

200?"200px":""+(this.scrollHeight+5)+"px");">
a = 6502
segundo = 8086


Haz que a sea igual a 8086 y b sea igual a 6502. Para hacer esto, crea una tercera variable y haz algunos reordenamientos simples. Asegúrese de que el problema se resuelva correctamente llamando a print(a,b) antes del intercambio e print(a,b) después.

LUÁ, iau, vb. Yo. tranz. I. 1. A prinde un obiect în mână spre a l ţine (şi a se servi de el) sau spre a l pune în alta parte. ♢expr. A lua altă vorbă = a schimba (cu dibăcie) subiectul unei discuţii. A(şi) lua picioarele la spinare = a pleca… … Diccionario Român

lua- Logo Basisdaten Paradigmen: Skriptsprache, imperativo, funcional, objektorientiert … Deutsch Wikipedia

lua- [] Información general Paradigma Multiparadigma: interpretado, imperativo, funcional, orientado a objetos, basado en prototipos Apareció en … Wikipedia Español

LUA- Aparecido en 1993 Autor Luiz Henrique de Figueiredo, Roberto Ierusalimschy y Waldemar Celes Implementaciones Lua, LuaJIT, LLVM Lua, LuaCLR, Nua, Lua A… Wikipédia en Français

LUA- (portugiesisch für Mond) ist eine Skriptsprache zum Einbinden in Programme, um diese leichter weiterentwickeln und warten zu können. Eine der besonderen Eigenschaften von Lua ist the geringe Größe des kompilierten Skript Interpreters. Lua wurde… … Wikipedia alemana

lua- s. F. 1. El único planeta satélite da Terra. 2. Tempo comprendido entre dos novilúnios. 3. Mês. 4. CIO. 5. O mesmo que peixe lua. 6. Disco de ouro ou prata que os Timores usan ao pescoço, como símbolo de… … Diccionario de lengua portuguesa

lua- puede referirse a: * Lua (lenguaje de programación), un lenguaje de programación ligero y extensible * Lua (Yu Gi Oh! 5D s) * Lua (diosa), la diosa romana * Lua (arte marcial), un arte marcial tradicional hawaiano * Lua (canción), un sencillo del folk rock… … Wikipedia

Abreviatura de LUA: LUA último ancestro universal (también traducido como “Último Ancestro Universal” (LUA en inglés, Último Ancestro Universal), de lo contrario, Último Ancestro Común Universal (LUCA en inglés, último común universal... ... Wikipedia

lua- (Del gót. lôfa, palma de la mano). 1.f. Especie de guante hecho de esparto y sin separaciones para los dedos, que sirve para limpiar las caballerías. 2 de marzo. Revés de las velas por la parte donde van cazadas con viento largo o en popa. 3 de marzo… … diccionario de la lengua española

lua- Lua, römische Göttin, Tochter des Saturnus, welcher nach der Schlacht zur Sühne des vergossenen Blutes erbeutete Waffen von dem Feldherrn verbrannt wurden … Pierer's Universal-Lexikon

LUA- Dea quaedam apud vett, a luendo, expiandoque nomen sortita, quae praeerat lustrationibus, et lustris. Vídeo Turneb. Anunciante s. l. 16.c. 20. y l. 23.c. 23. y l. 19.c. 11. Eius meminit A. Gell. l. 13.c. 22. cum ait in libris Sacerdotum Pop. Rom...Hofmann J. Léxico universal

Libros

  • Programación en Lua
  • Programación en lenguaje Lua. Guía, Jerusalén a Robert. El libro está dedicado a uno de los lenguajes integrados más populares: Lua. Este lenguaje se ha utilizado en muchos juegos y en muchas aplicaciones diferentes. El lenguaje combina un pequeño volumen...



Arriba