Crear una estrategia desde cero: una guía detallada. ¿Cliente inteligente o estúpido? Crea una estrategia por turnos

parque temático:
Necesitaremos:
duende de construcción
menú de objetos
SPRITES DE VARIOS BOTONES COMO:
srite con la inscripción (construcción, construcción, edificación, etc.)
una ventana que aparece
dibujo de edificio,
1) agregaremos el resto nosotros mismos
2) la palabra falsificación, creada por mí mismo, porque tendremos que falsificarlo para que coincida con nuestra fuente)
IIComencemos:
1) crear todo lo escrito en el punto I excepto 1)
Creemos una variable global llamada dinero, establezcamos cualquier cantidad inicial de dinero
También crearemos un objeto de mouse y teclado.
Creemos un texto, llamémoslo información, creemos un evento siempre y creemos una acción en él:
seleccione información en la selección de acción seleccione establecer texto en el texto escriba esto:
"dinero: " &(global("dinero".
2) agregar un menú, la tarea principal del menú no es interferir, sino ayudar al jugador a navegar (¿cómo puede interferir? - es fácil si lo colocas en el medio del juego); antes de crear el menú, Crearemos una nueva capa, a la que llamaremos menú, en sus proporciones (configuraciones, opciones) en el elemento de visualización escribimos:


Le agregaremos un objeto y tomaremos la imagen del menú que estaba en los materiales de preproducción (punto I) y colocaremos nuestro menú en un lugar apartado donde no interfiera, pero que sea visible en la pantalla.
Coloquemos también un botón hecho de materiales de preacabado (punto I) con la inscripción CONSTRUIR (o algo así)
pongámoslo en el menú
Ahora ve al Editor de hojas de eventos
cree un evento (#bla, bla, bla# - este es mi mensaje (explicación) para usted solo en lugar de bla, bla, bla, habrá mi comentario para usted; >> - acción; ll - división de ventanas, por ejemplo:

mouse y teclado ll en el objeto hecho clic ll clic izquierdo para objetar #tu botón de menú con la inscripción CONSTRUIR (o algo así)##el resto más tarde (ver punto 3)#
3)ahora la parte más difícil(Dividí esto en dos puntos para que no fuera tan complicado),
crear un objeto a partir de materiales de preacabado "una ventana que aparecerá"
luego creamos un objeto vacío llamado p1, movemos la ventana fuera de la pantalla y colocamos p1 en el lugar donde debería aparecer tu ventana cuando presionas el botón de compilación (o algo así CHVER)
¡Genial! Ahora ve al editor de hojas de eventos.
Anotemos el evento inacabado hasta el final:
Texto ll establecer texto ll bla-bla-bla)
mouse y teclado ll en el objeto hecho clic ll clic izquierdo para objetar #tu botón de menú etiquetado CONSTRUIR (o algo así)#>>
4)La segunda parte de la parte más difícil.:
creemos un sprite donde se dibujará la imagen del edificio (materiales de preacabado), llamémoslo h1
creemos un objeto vacío, llamémoslo p2, ahora colóquelo en el lugar donde debería abrirse la ventana,
Creemos un sprite, también una ventana (materiales de preacabado), en la ventana escribiremos bellamente el nombre del edificio, su costo y descripción (opcional) y lo llamaremos i1
creemos otro sprite vacío llamado p3, colóquelo al lado de p2, solo de manera que solo toque p2 con la esquina superior izquierda
Ahora creemos varios eventos, pero primero convertimos el evento anterior en una nueva acción:
ratón y teclado ll en el objeto hecho clic ll clic izquierdo para el objeto #el botón de su menú con la inscripción CONSTRUIR (o algo así)#>> el sistema creará un objeto relativo al objeto ll #su ventana# #número de capa bajo el nombre menú# # X ;Y-no cambies# al objeto p1
>>sistema creará un objeto relativo al objeto ll #tu segunda ventana# #número de capa bajo el nombre menú# #X;Y-no cambiar# al objeto p2
También necesitamos hacerle un evento:
copiar el evento e invertirlo
nuevo evento
mouse&keyboard ll está sobre el objeto ll h1>>sistema ll crear objeto en relación con el objeto ll i1 #número de capa bajo el nombre menú# #X;Y-no cambiar# al objeto p3
Hagamos un objeto con un edificio (use materiales de preproducción) y llamémoslo casa.
Creemos una ventana donde aparecerán nuestros edificios cuando sean seleccionados en el menú, llamémoslo rlo
eventos:
ratón y teclado ll en el objeto hecho clic ll clic izquierdo en h1>>sistema creará un objeto relativo al objeto ll casa #número de capa bajo el nombre menú# #X;Y-no cambiar# al objeto rlo
>> el sistema restará del valor ll #cantidad de dinero que se debe quitar durante la construcción#
Ahora era imposible construir un evento.
Te contaré mi antiguo método de prohibición (cuando termine de escribir, exploraré otro método que me puso azul cuando recordé el mundo del parque temático del juego)
eventos:
casa ll en caso de colisión con otro objeto ll a casa
>> casa la destruiremos
>> el sistema restará del valor ll - #duplicará la cantidad de dinero que se quitó durante la construcción##nota que debes poner - cantidad#
básicamente todo.
III lo que quiero decir:

Me molestó mucho el colapso de mi juego. Era un juego de estrategia, y este artículo fue compilado de acuerdo con su esquema. Les pido que no critiquen demasiado, escribí durante mucho tiempo, si encuentran errores de habla, escriban. y corregirlos
y también aquí está el código fuente para que lo veas, mira, en principio todo es igual como está escrito aquí, solo que esta era una versión demo del juego. Lo principal es no cambiar nada, de lo contrario habrá errores. !
Úsalo, experimenta, compruébalo, haz lo que quieras, está bien para mí.

KaMiKaZa:
Todas las expresiones del "sistema" deben incluirse en la etiqueta "Código".
Entonces creo que será mejor.
Además me parece que aquí no vendrían mal las capturas de pantalla. Y también el código fuente, para principiantes.

parque temático:
No sé cómo tomar capturas de pantalla de eventos.

Bueno, eso no es necesario.

iamnp:
theme_park, hay un botón especial en el teclado: PrintScreen

parque temático:
Sé que algunas personas simplemente lo hacen de manera diferente. Además, cada uno tiene su propio sprite.
y si configuro todos estos sprites, pocas personas lo entenderán.
Bueno, ¿tal vez alguien le dé un plus? ¿No es de extrañar que estuviera luchando?

burlachenko:
Para que una lección de este tipo sea de interés para alguien, es necesario formatearla en consecuencia, pero aquí "de todos modos fue".
Y sin embargo, si quieres, poco a poco, cuando tengas tiempo, por favor “embellézalo”.

parque temático:
Ok, volveré a casa de la escuela y me prepararé.
PD. fuente agregada

Serega Lébedev:

iamnp, ¿a dónde van estas capturas de pantalla después?

KaMiKaZa:

Al portapapeles.
ir a cualquier editor de texto y realice la operación "Pegar", o presione Ctrl+V.

En este artículo, es poco probable que mencione algo desconocido. Todos los cálculos son simples y comprensibles para cualquiera que sepa qué es Ajax. Ya escribí un artículo sobre cómo combinar un cliente con un servidor en juegos en tiempo real (). En este artículo, abordo los mismos problemas que se aplican a los juegos por turnos.

Entonces que es juego por turnos? La siguiente definición se puede encontrar en Wikipedia. estrategia por turnos - es un género de juegos de computadora cuya característica principal es que los jugadores se turnan para realizar movimientos, a diferencia de la estrategia en tiempo real.. Simplificaría un poco esta definición:

  • Estrategia paso a paso - es un juego de estrategia por turnos.
  • Juego de estrategia - Este es un género de juegos en el que la clave para lograr la victoria es la planificación y el pensamiento estratégico..
  • Juego por turnos - es un género de juegos cuya característica principal es que los jugadores se turnan para realizar movimientos.
Los juegos por turnos incluyen:
  • Estrategias por turnos
  • Juegos de cartas
  • Juegos de mesa (ajedrez, go, monopolio, etc.)
Observo que los juegos por turnos imponen menos restricciones en la complejidad del protocolo de interacción en comparación con los juegos en tiempo real. A saber, El tiempo de reacción ante un evento en particular no juega un papel clave.. Generalmente el jugador tiene 10 segundos para tomar una decisión. Incluso si el ping es gigantesco, digamos 3 segundos, entonces el jugador todavía tiene 7 segundos para pensar. Además, el ping puede saltar y saltar, pero esto no nos importa en absoluto (en juegos en tiempo real, esta situación prácticamente acaba con cualquier protocolo).

Normalmente (en el 95% de los juegos por turnos) exactamente un jugador toma la decisión en un momento dado. En consecuencia, se reduce el número de solicitudes a las que debemos responder adecuadamente.

Por lo tanto, al crear un protocolo, nos centraremos principalmente en la facilidad de su implementación y soporte. Esto nos permitirá obtener más beneficios en menos tiempo.

El razonamiento anterior se basa en el desarrollo de 2 meses de un determinado juego de cartas.

¿Cliente inteligente o estúpido?

Primero, decidamos qué tan "inteligente" puede ser nuestro cliente. Estoy debatiendo si vale la pena duplicar la lógica de la aplicación (reglas del juego) en el cliente. Por supuesto, el servidor debe ser inteligente para evitar posibles ataques a la aplicación. ¿Pero vale la pena enseñar lógica empresarial al cliente?

Esto depende directamente de cuánto pesa la cantidad total de datos sobre el estado de tu juego. Si esta cantidad de datos es grande, lleva mucho tiempo recopilarla en el servidor y transferirla al cliente, entonces tiene sentido implementar parte de la lógica en el cliente para aliviar el servidor. Por ejemplo, en Civilization el indicador de memoria utilizada siempre está fuera de serie. ¿Puedes crear algo similar, dejando solo la interfaz de usuario en el cliente?

Por otro lado, cuanto más inteligente sea el cliente, más caro será el desarrollo del juego. Permítanme señalar que el tiempo de desarrollo del servidor no depende de ninguna manera de la erudición del cliente. Incluso si el cliente es super-duper-mega inteligente, si el usuario quiere recargar la ventana del navegador, el servidor tendrá que recopilar y reunir todos los datos sobre el juego para transferirlos al cliente. A la "Cargando una partida guardada". Conclusión: un cliente inteligente puede acelerar una aplicación, pero siempre requerirá recursos adicionales para desarrollarla.

Sugiero lo siguiente prueba:

1. ¿El volumen del canal lo permite?

Calcule el peso promedio de la cantidad total de datos del estado del juego. A continuación, multiplique por el número promedio de solicitudes al servidor por segundo. Si el número resultante excede la capacidad del canal de datos saliente, entonces el cliente estúpido es inaceptable. Si este número supera el 20% del canal saliente, entonces debería pensar si funcionará.

2. ¿Requiere mucha mano de obra?

Calcule la complejidad del algoritmo de recopilación de datos del juego (en fracciones de segundo). Aquí, tenga en cuenta todas las consultas a la base de datos. A continuación, multiplique por el número promedio de solicitudes al servidor por segundo. Si el tiempo excede un segundo, entonces un cliente estúpido es inaceptable. Si este número supera los 200 ms, entonces debería pensar si durará.

Continuación:

¡Hola a todos! Ahora te diré cómo hacer un RTS simple (RTS - Real Time Strategy, es decir, una estrategia en tiempo real) abre una hamaca 8.1 (la operatividad no está garantizada en 8.0) crea un objeto objControl, es decir, este será nuestro objeto principal, crear un evento de creación (Crear) Agregar evento => Creación (Agregar evento => Crear) el evento de creación se realiza solo una vez; al crear, haga clic en la pestaña de control a la derecha menú vertical y haga clic derecho en Ejecutar código y escriba el código (es mejor no copiar el código, sino escribirlo usted mismo, es mucho más fácil de recordar):

200?"200px":""+(this.scrollHeight+5)+"px");">startx=0; //Declarar una variable para el punto inicial de x
iniciando=0; //Declarar una variable para el comienzo del punto por y
draw_rect=falso; //No dibujar un rectángulo de selección


Variable: Un fragmento de memoria que contiene información. Tienen su propio nombre con el que podrás contactar con ellos. Las variables en GML pueden contener un número real o una cadena. Por ejemplo, una mesa es una variable, madera o vidrio es un valor.
Ahora creamos un evento de paso (Paso, Agregar evento => Paso) y realizamos la operación nuevamente (haga clic derecho en Ejecutar código):

200?"200px":""+(this.scrollHeight+5)+"px");">
if mouse_check_button_pressed(mb_left) //Si se presiona LMB
{
draw_rect=verdadero; //Dibujamos un rectángulo
startx=ratón_x; //Inicio posición x = posición x del mouse
starty=mouse_y; //Posición inicial = posición del mouse
con todo seleccionado = falso; //Esta aún no es una variable declarada, descubriremos qué hará más adelante
}

If mouse_check_button_released(mb_left) //Si se libera LMB
{
draw_rect=falso; //No dibujamos un rectángulo
para(i=0;yo<=instance_number(par);i+=1) //Читайте про цикл for ниже
{
ii=instance_find(par,i); //Buscamos un objeto que aún no ha sido creado
if(collision_rectangle(startx,starty,mouse_x,mouse_y,ii,true,false)) //Aquí está nuestro rectángulo de colisión (contacto)
{
ii.seleccionado=verdadero;
}
}
}

El código es grande y complejo mientras aprendemos sobre la declaración condicional if:
El código con if se ejecuta así:

200?"200px":""+(this.scrollHeight+5)+"px");">
si (condición)
{
acción
}

También puede contener una declaración else (de lo contrario), ejemplo:

200?"200px":""+(this.scrollHeight+5)+"px");">if (condición)
{
acción
}
demás
{
acción 2
}

Y for es un operador de bucle, se ejecuta así:

200?"200px":""+(this.scrollHeight+5)+"px");">
para (<переменная> ; <выражение> ;<действие переменной>)
{
<действия>
}


El operador for es algo muy poderoso, ayuda mucho en situaciones difíciles.

Operador: acciones integradas en un lenguaje, por ejemplo, las más comunes son int, if, else, string, switch, for, case, break, exit, etc., etc.

Ahora también creamos un evento de dibujo (draw) y escribimos de la misma forma:

200?"200px":""+(this.scrollHeight+5)+"px");">if draw_rect=true
{
alfa=.8;
draw_rectangle_color(startx,starty,mouse_x,mouse_y,c_green,c_green,c_green,c_green,true);
}

Aquí todo es fácil, aquí lo mismo sólo en ruso:
si necesitamos dibujar un rectángulo, seleccionamos transparencia y dibujamos un rectángulo
aquí están los argumentos

200?"200px":""+(this.scrollHeight+5)+"px");">draw_rectangle_color(x1,y1,x2,y2,color 1, color 2, color 3, color 4, contorno)


contorno: si solo se dibujará el borde (verdadero) o el rectángulo relleno (falso)
Encontramos una nueva palabra: constante, esta es una expresión numérica o un código reemplazado por una palabra, la hamaca tiene constantes incorporadas:

200?"200px":""+(this.scrollHeight+5)+"px");">true - 1
falso - 0
pi - 3,1415...


Bueno, lo descubrimos, ahora necesitamos crear un nuevo objeto: un objeto principal que se conectará con sus hijos. Llamémoslo par (para cambiar el nombre es necesario cambiar el código en el evento de paso del objeto de control), escriba en el evento de creación:

200?"200px":""+(this.scrollHeight+5)+"px");">selected=false; //Aquí está nuestra variable, si el objeto está seleccionado

Esto es todo. Ahora, por supuesto, necesitamos un objeto que pueda moverse, lo llamamos objTest y escribimos el código en el evento de creación:

200?"200px":""+(this.scrollHeight+5)+"px");">gox=x; //Adónde ir...
goy=y; //por y
seleccionado=falso; //No estamos seleccionados =)
object_set_parent(self,par) //Aquí está la elección del padre

Nueva acción:

200?"200px":""+(this.scrollHeight+5)+"px");">object_set_parent(ind,obj)

Establece el objeto principal en el objeto denominado ind.
Y un nuevo operador: self, significa que la acción irá hacia sí misma.
No temas, todavía queda un poco en el evento de paso:

200?"200px":""+(this.scrollHeight+5)+"px");">si distancia_al_punto(gox,goy) > 20
{
mp_potential_step(gox,goy,6,sólido);
}
si (seleccionado = verdadero) && mouse_check_button_pressed (mb_right)
{
gox=ratón_x;
goy=mouse_y;

Formación de estrategia.
No puedes confiar en los aficionados:
sus planes pueden funcionar inesperadamente,
y nadie está preparado para esto.

(A. Cuningham)

En los dos números anteriores aprendimos hacer juegos 2D simples, controlar sprites, desplazarse por la pantalla del juego, rastrear colisiones de objetos del juego, crear una interfaz (botones, mouse, teclado, áreas de texto) y trabajar en modo de pantalla completa y ventana. Todo esto se hizo usando como ejemplo un juego de arcade.

Esta vez pasaremos de los juegos de arcade a un género más "serio": las estrategias. Aquí tendremos que dominar toda una serie de mecanismos nuevos, pero aquí tampoco habrá nada complicado. En este artículo nosotros Estudiemos la estructura de una estrategia por turnos.(y también estrategia en tiempo real- es aún más fácil hacerlo con LKI-Creator) y haremos un juego como ejemplo, diseñado, sin embargo, sólo para multi usuario modo (y también editor de mapas para ella). Nos ocuparemos del modo para un jugador en el próximo número de nuestra columna, dedicada a fundamentos de la inteligencia artificial.

Como esta ya es la tercera lección, no entraremos en detalles. todo código de ejemplo: afortunadamente, muchas cosas se han hecho exactamente igual que las dos veces anteriores. Como referencia, hay un programa de ejemplo (hay muchos comentarios en él) y artículos anteriores.

Bueno, puedes encontrar los materiales de nuestras clases pasadas en nuestro CD, en la sección “Juego hazlo tú mismo” especialmente creada para tal fin.

Formulación del problema

Escribamos un juego de estrategia que consista en una batalla entre dos ejércitos de fantasía. El objetivo de la batalla es capturar varios obeliscos, colocado en el mapa. Antes de la batalla desplegamos nuestras tropas, compuestas por 6 espadachines, 4 arqueros, 2 caballeros, 2 magos y 1 fantasma, dentro del territorio que nos ha sido asignado. Además de ellos, hay neutrales en el mapa. dragones.

Características de los luchadores.
Combatiente Movimiento Golpes Rango Daño Proteccion Capacidades
Espadachín4 8 1 7 2 -
Arquero4 5 7 5 1 -
Caballero3 15 1 9 4 Curación, Golpe de Caballero
mago3 12 5 6 0 bola de fuego
Fantasma4 7 2 5 5 Regeneración
El dragón6 30 2 12 5 Vuelo

Las características de los luchadores se presentan en la tabla. Tratamiento- este es el derecho de curar a un guerrero vecino (excepto un fantasma) hasta que alcance su salud completa una vez por batalla. Golpe de caballero- el derecho a infligir el triple de daño una vez por partida. bola de fuego- El ataque del mago elimina puntos de vida no sólo del objetivo inmediato, sino también de las casillas circundantes. Regeneración- recuperación de 1 golpe por turno. Vuelo- el derecho a superar obstáculos.

El juego se juega en modo multijugador, en la versión Hot Seat (se juega desde una computadora, turnos uno a la vez). Después del turno de los jugadores, los dragones neutrales hacen su turno y atacan a cualquier enemigo dentro de un radio de 7 celdas.

El grupo termina cuando un bando captura más de la mitad de los obeliscos presentes en el mapa o muere por completo.

El mapa se configuró inicialmente en el editor de mapas. Hay obeliscos, dragones y obstáculos (objetos a través de los cuales no puedes moverte ni atacar).

Preparándose para el trabajo

Antes de comenzar, necesitaremos reinstalar el paquete. LKI-Creador. El hecho es que, en comparación con la última vez, se le han realizado muchos cambios y adiciones.

(Espero que Delfos ya lo tienes instalado; si no, lea las recomendaciones sobre este tema en nuestro artículo anterior, en la edición de junio de la revista, en el CD de esta edición o en el sitio web).

Es importante: la versión anterior de LKI-Creator tenía algunos problemas de compatibilidad con las nuevas versiones de Delphi. En esta versión están eliminados.

Tome el archivo con los textos y las imágenes del programa de nuestro CD (sección "Juego con sus propias manos") y descomprímalo en el directorio del proyecto.

Ahora puedes descargar archivos necesarios de aquí .

Deberíamos tener tres subdirectorios. Uno - Unidades - almacena bibliotecas DirectX y módulos del paquete LKI-Creator. En otro - Proyecto - trabajaremos; las fotografías que necesitaremos se colocan allí con antelación, y versión previa nuestra sala de juegos. En el tercero, Escort, un programa ya preparado que deberíamos implementar.

Ahora instalemos (reinstalemos) LKI-Creator. En el menú de Delphi, abra el elemento Componente y seleccione Instalar componente. Si ya instaló este paquete, permanezca en la pestaña En el paquete existente; de ​​lo contrario, vaya a la pestaña En el paquete nuevo y complete las líneas vacías como se muestra en la figura (en la línea superior, la forma más fácil es seleccionar LKI2dEngine. pas usando el botón Examinar, y en la parte inferior simplemente escriba LKI). Luego haga clic en Aceptar y seleccione Instalar. Ahora debería ver la pestaña LKI en el panel superior de Delphi.

Ahora solo queda subir nuestro proyecto. En el menú Archivo, seleccione Abrir, abra el archivo Proyecto\Obelisk.dpr…

¿Dónde está el mapa, Billy? ¡Necesitamos un mapa!

Sin embargo, antes de entrar en temas importantes, necesitaremos trabajar un poco más en el motor gráfico.

En Star Escort, nuestro proyecto anterior, el "mapa" no tenía significado: las estrellas estaban colocadas aleatoriamente y no afectaban nada, y la posición de otros objetos estaba especificada directamente en el código o determinada por casualidad. Esto no es adecuado para todos los proyectos. Esto significa que es hora de que agreguemos a nuestro motor mapa de la zona.

Probablemente ya puedas adivinar cómo se verá: colocamos un objeto de mapa en la ventana del proyecto y luego lo registramos en la propiedad. Mapa nuestro motor.

Así es... pero tenemos más de una clase de tarjeta. Miremos más de cerca...

tipos de tarjetas

El mapa consta de algo. paisaje Y objetos instalado en él. El paisaje se divide con mayor frecuencia (pero no siempre) en células llamadas losas- losas.

Como sabemos por un curso de geometría escolar, un plano se puede cubrir sin espacios ni superposiciones con polígonos regulares de tres tipos: triángulo (equilátero), cuadrado, hexágono. Los campos triangulares no son particularmente convenientes, por lo que se utilizan con mayor frecuencia celdas cuadradas o hexágonos.

En cierto sentido, vivir con cuadrados es más fácil: si tenemos una matriz bidimensional de celdas, inmediatamente queda claro cómo encontrar las celdas adyacentes a una celda determinada. Estos son +1 y -1 para cada uno de los dos índices. Con los hexágonos todo es un poco más complicado... pero el tablero hexagonal tiene una propiedad muy valiosa: todas las direcciones en él son iguales. Este no es el caso de una cuadrícula cuadrada: las diagonales son significativamente diferentes de las horizontales y verticales. Por lo tanto, para cálculos estratégicos serios, los hexágonos pueden ser mejores que los cuadrados.

También hay cartas sin mosaicos. LKI-Creator admite dos tipos: gráfico y mosaico.

Un mapa gráfico es un mapa en el que sólo unos pocos puntos clave tienen significado, además quizás de áreas especiales (por ejemplo, las intransitables), y el resto es sólo un patrón que no tiene ningún efecto en el juego. Así es como se hacen a menudo los mapas estelares, como en, por ejemplo, Master of Orion: las estrellas y los agujeros negros son puntos clave, el resto es fondo. En este modo, a veces se crean mapas globales, por ejemplo, para un juego de rol.

El mapa de mosaico está dividido en áreas, y dentro del área todos los puntos son iguales, no puedes moverte a lo largo del "mosaico". Esto es bueno para las estrategias globales, donde una provincia es la unidad mínima de territorio.

En las imágenes se muestran ejemplos de cartas de varios juegos, indicando el tipo.

Entonces la mayoría bidimensional Los mapas (tridimensionales, artículo especial) se pueden dividir en cuatro clases:

  • Rectangular- TLKIRectMapa. Este es un mapa en mosaico, las celdas son cuadrados. Un mapa así, por ejemplo, en Civilization III.
  • Hexagonal- TLKIHexMapa. Mapa en mosaico con celdas hexagonales. Se utiliza en muchos juegos de guerra, y no solo: así es, por ejemplo, como se creaba tradicionalmente el mapa de batalla de Heroes of Might & Magic.

    Estos dos tipos de cartas son descendientes de la clase general. TLKITiileMapa.

  • Grafovaya- TLKIGraphMapa. Esta tarjeta tiene fondo (propiedad de fondo) y los puntos clave resaltados en él son objetos estáticos. La posición de otros objetos en este mapa se expresa mediante coordenadas ordinarias (como una nave espacial en el espacio interestelar) o por referencia a un objeto (la misma nave en órbita de un planeta). Estas son las cartas Maestro de Orión, Arcano (global), etc.
  • Labor de retazos- TLKIClusterMapa. Tiene una propiedad de fondo, como la del gráfico, y una segunda propiedad: mascarilla, que determina qué punto pertenece a qué región, y la propiedad Fronteras, que define las conexiones entre los “jirones”. Así están dispuestos los mapas, por ejemplo, en Medieval: Total War o Victoria.

Es importante: Las clases de mapas no se describen en el módulo LKI2dEngine, sino en LKI2dMap.

Ángulos de inclinación

Pero si cree que esto agota las capacidades de LKI-Creator para mostrar mapas, está muy equivocado.

El mapa se puede presentar. vista superior o isométrico- mira en ángulo con la vertical. Por ejemplo, el mapa de Civilization III o Heroes of Might & Magic IV es isométrico, pero Civilization I adopta una vista de arriba hacia abajo.

Normalmente, la isometría se utiliza para mapas en mosaico, mientras que los mapas de gráficos se utilizan con una vista superior, ya que la escala de los mapas de gráficos suele ser menor. Pero hay excepciones: por ejemplo, en Medieval: Total War hay un mapa isométrico mosaico.

La propiedad del mapa es responsable de la isometricidad. esisométrico y dos parámetros que fijan el ángulo en el que mira nuestra cámara: Fi Y theta.

El primero es responsable de la rotación del mapa con respecto al eje vertical: por ejemplo, si lo configura en 45 grados (se mide en grados), entonces la celda rectangular de la cuadrícula se orientará con un ángulo hacia arriba, como en Civilization. . En Phi=0, uno de los lados de la celda será horizontal.

El segundo controla la inclinación de la cámara con respecto a la vertical. Por conveniencia, se da como la relación entre unidades de longitud horizontales y verticales. Digamos que si queremos que nuestra celda se dibuje la mitad de alto que de ancho, debemos establecer Theta en 2.

Con un mapa en mosaico, no podemos elegir estos ángulos arbitrariamente: después de todo, (todavía) no tenemos 3D. Dependen directamente de los parámetros de las baldosas. Por ejemplo, si tenemos un eje en forma de diamante con un ángulo hacia arriba y el eje vertical tiene la mitad del tamaño del eje horizontal, entonces debemos configurar los parámetros 45 y 2.

Pero los mapas de gráficos y mosaicos le dan derecho a asignar estos parámetros como desee (e incluso, si lo desea, cambiarlos en el proceso), pero no debe dejarse llevar por esto, además del hecho de que tales turnos toman un muchas veces tampoco se ven muy bien. Y no olvides que si tu mapa es artístico, con dibujos, inscripciones, etc., girarán con él... En general, a veces es más fácil dibujar un mapa mosaico teniendo en cuenta la rotación requerida; afortunadamente, las distancias. A menudo no desempeñan ningún papel allí.

Articulaciones

Mapa de mosaico, vista superior.

Los mapas de mosaicos tienen otro problema: la unión de mosaicos. Está controlado por el parámetro. Estilo de borde de mosaico. Muy a menudo esto azulejoRecto, un modo en el que los mosaicos simplemente encajan sin ningún efecto de borde, o azulejoBorde, en el que se dibujan líneas que separan un mosaico de otro: los límites de las celdas (en el último caso, no olvide definir color celosías en parámetro AzulejoBordeColor).

Pero hay una opción más astuta, cuando los mosaicos idénticos se encuentran uno al lado del otro sin cambios, y se usan diferentes usando un mosaico especial "de transición". Esto generalmente se hace si el mapa consiste principalmente en amplias extensiones de un tipo de territorio, por ejemplo, grandes áreas verdes, y una celda individual no es importante y el jugador no debe notarla. Esta es la carta de Heroes of Might Magic. Pero si cada celda se procesa por separado, como en Civilization, entonces este método no es adecuado y es mejor separar claramente las celdas entre sí. Tecnología “fusionada” (también llamada mascarilla) se especifica mediante el valor TileBorderStyle igual a azulejoenmascarado. Hablaremos de su estructura en otro momento; este es un tema bastante complejo.

Teja

Elemento de mapa - objeto de clase TLKItilo- tiene una estructura simple. Inicialmente contiene: coordenadas, el sprite que lo dibuja, el código del tipo de mosaico (que determina lo que tenemos aquí: ¿una colina, un desierto, una carretera, un mar?) y la capacidad de cross-country (esto es relevante en la mayoría de los juegos). El último es el número de unidades de movimiento que se gastan para moverse a través de esta casilla. tierra equipo. Para casillas intransitables, este es un número negativo.

Otro parámetro - Objetos, una lista de objetos ubicados en este mosaico (escriba TLKIGameObject).

Para saber en qué celda se hizo clic, el mapa tiene un método Azulejo del ratón(x,y) devolviendo el mosaico seleccionado.

Los métodos de mosaico incluyen esvecino(Mosaico, Distancia). Esta función devuelve verdadero si el mosaico no está a más de celdas de distancia del mosaico dado (de forma predeterminada, este parámetro es igual a uno, es decir, si simplemente escribe IsNeighbour(Tile), la función devolverá verdadero para el mosaico inmediatamente adyacente. al mosaico dado. Para una cuadrícula cuadrada, aquellos mosaicos que bordean diagonalmente también se consideran "vecinos".

Funciones primer vecino Y SiguienteVecino se utilizan para verificar todas las celdas adyacentes a una determinada. El primero de ellos apunta a alguna celda vecina, y al segundo se le puede llamar solo después de llamar al primero, y muestra los siguientes vecinos, uno a la vez.

Enumeración de vecinos

// Causar daño a una célula.

procedimiento TObeliskTile.Damage(dmg: entero);

si(Objetos.Cuenta > 0) y// Nosotros podríamos tener

// no más de un objeto por celda

(Objetos.ID > 0) // Objetos pasivos

// no dañado

Dec(Objetos.Golpes,

// Resta automáticamente la protección contra daños

Max(0,dmg-(Objetos como AbeliskGameObject).Defensa);

si Objetos. Golpes y luego mueren; // Quitamos a los muertos

// Ataque de bola de fuego

procedimiento AbeliskTile.Bola de fuego;

var Vecino: TObeliskTile;

Vecino:= Primer Vecino como TObeliskTile;

Vecino.Daño(6);

Vecino:= PróximoVecino como TObeliskTile;

hasta Vecino = nulo; // Hasta que se acaben los vecinos

Un ejemplo está en la barra lateral "Enumeración de vecinos". Este procedimiento calcula la bola de fuego que impacta en una celda y en todas sus vecinas.

Esto es interesante: por su trabajo no importa en absoluto, tenemos una red hexagonal o una cuadrada.

A menudo necesitamos otros parámetros y normalmente la clase de mosaicos que componen el mapa es descendiente TLKITile. Entonces, en el ejemplo, TObeliskTile se hereda de TLKITile.

Es importante: Si traemos un mapa en mosaico a nuestra pantalla de juego, las coordenadas, así como los métodos TLKIGameObject relacionados con la distancia, de forma predeterminada comienzan a medir la distancia en mosaicos en lugar de puntos. Las coordenadas de botones, iconos, etc. ¡Continúa midiéndose en píxeles! Pero este modo se puede desactivar; esto puede resultar útil para estrategias en tiempo real.

Seleccionando una tarjeta

Entonces, comencemos con una red rectangular (TLKIRectMap), un mapeo isométrico (parámetros angulares 0, 1.5). Deje que se dibuje la cuadrícula (estilo TileBorder). Digamos al motor que se debe mostrar este mapa en particular. Hasta ahora, se han completado todas las acciones necesarias sin escribir una sola línea de código.

Estas operaciones deben realizarse antes inicialización del motor, así como declaración de fuentes.

Declararemos las figuras, como antes, como sprites.

editor de mapas

Mapa de mosaico, isométrico.

Hay bastantes dificultades aquí. Exactamente el mismo motor, las mismas declaraciones de mosaicos... La interfaz, como seleccionar un mosaico, cargar/guardar, etc., se puede hacer fácilmente medios estándar Delfos: nadie nos obliga a traducirlo al modo de pantalla completa. No analizaremos esto aquí; todo está en el archivo de ejemplo. El código de ejemplo utilizado deliberadamente. la forma más sencilla; Si lo desea, puede, por ejemplo, convertir la paleta de objetos y la paleta de mosaicos en gráficas.

El editor tiene sólo dos funciones que no conocemos. La primera es bastante simple: es una nueva función del mouse diseñada específicamente para mapas en mosaico. Función TLKIRectMap.SelectTile devuelve un puntero al mosaico exacto en el que se hizo clic, para que podamos manejar fácilmente el clic.

Pero la segunda novedad merece una consideración más cuidadosa.

De hecho, hay muchas formas de guardar datos y leerlos. Elegimos el método codificado en el archivo. Base de cañón. Cannon es una herramienta para leer y escribir objetos descendientes. TCannonObjeto con verificación de tipo y algunas otras características.

Veamos el código (“Escribir tarjeta”).

Grabar una tarjeta

procedimiento AbeliskMap.Save;

var i,j: número entero;

GuardarInit(FName);

WriteStr(MapaNombre);

Escribir(Mapa.Ancho, TamañoDe(Mapa.Ancho));

Escribir(Mapa.Altura, TamañoDe(Mapa.Altura));

para yo:=0 a Mapa.Ancho-1 hacer

para j:=0 a Mapa.Altura-1 hacer

Escribir(Map.Tiles.Code, SizeOf(entero);

Así es como funciona. Primero necesitas abrir el archivo usando un procedimiento especial. Iniciar guardar, cuyo único parámetro es el nombre del archivo. Luego guardamos el encabezado para el control de tipo usando un procedimiento especial. Escribir encabezado. Luego anotamos todo lo que necesitamos siguiendo el procedimiento escribircadena para cadenas y para todos los demás campos: Escribir(su segundo parámetro es el tamaño de los datos escritos en bytes). Puede escribir sus propios procedimientos para los campos de objetos según sea necesario Ahorrar con un registro de encabezado. Finalmente cerramos el archivo con el procedimiento FinGuardar.

Todos los objetos que tienen su propio encabezado deben declararse por separado. en el capitulo Inicialización módulo (sección opcional que viene después Implementación, que contiene comandos que deben ejecutarse desde el principio, al iniciar el programa), debes escribir la siguiente línea, por ejemplo:

RegisterUserName(tpMap, "TObeliskMap");

TpMapa es una constante que debes declarar también. Equipárelo, digamos, 1. Y en el constructor del objeto TObeliskMap, asigne el valor de esta constante al parámetro TipoID.

¿Por qué todo este alboroto? Además de la coincidencia de tipos, obtienes un beneficio muy importante.

Si el formato del archivo cambia, digamos, debido a la adición de nuevos campos, no necesitará escribir ningún "convertidor" que convierta los archivos antiguos en nuevos. Su código los leerá automáticamente.

Este código inicializará automáticamente el nuevo campo como vacío si no se guarda en el archivo. Y puede escribir un archivo simplemente agregando la línea WriteStr(Name) hasta el final.

Comentario: Si aún no entiendes para qué sirve este proceso, no te preocupes. Puede utilizar métodos de grabación y guardado más convencionales. Pero en proyectos de juegos verdaderamente a gran escala, este camino ofrece ventajas significativas.

Vamos a jugar

En primer lugar, necesitamos crear una nueva clase derivada de TLKIGameObject. Echaremos de menos las propiedades del antiguo. En la nueva clase, debe agregar campos para las características principales: alcance, movimiento, etc.

Es importante: Nuestro antiguo parámetro de velocidad permanece con nosotros, pero indica la velocidad de la pieza que se mueve por la pantalla, y no la distancia que recorrerá por turno. Si estuviéramos haciendo una estrategia en tiempo real, no necesitaríamos un nuevo parámetro, pero en caso contrario sí tendremos que introducirlo.

En nuestra pantalla aplicaremos botones TLKIButton en forma de arqueros, espadachines, magos, fantasmas, caballeros.

Primero tenemos el arreglo. Definiremos la zona de ubicación para un lado como las tres "líneas" superiores del mapa, para el otro, como las tres "líneas" inferiores.

El código funciona así. Al presionar cualquiera de los botones, se activa la instalación del luchador correspondiente; Al hacer clic en un cuadrado desocupado en el área de colocación, se coloca la figura allí y se desactiva el botón. Tan pronto como se desactivan todos los botones, el movimiento se transfiere al enemigo.

Al comienzo de cada nuevo movimiento, todos los botones se vuelven a encender: esto se hace para que a una persona le resulte más fácil notar a quién aún no se parece. En consecuencia, al hacer clic en el botón se selecciona la figura y, tan pronto como se realiza un movimiento, el botón desaparece. Otro botón, "Finalizar turno", aparece solo después de la fase de colocación.

La última vez ya hicimos operaciones para habilitar y deshabilitar elementos de la interfaz, por lo que no analizaremos esta operación en detalle; mire el código de ejemplo.

movimiento de la figura

// Si la celda seleccionada está ocupada por el enemigo, atacamos,

// si estamos libres, nos movemos, si estamos ocupados con los nuestros

// o un obstáculo - ignora el clic

Azulejo:= Map.MouseTile(MouseX, MouseY);

si(Azulejo = nulo)// Haz clic fuera de la ventana del juego.

entonces salida;

// Moviente

si(Azulejos.Objetos.Contar = 0)

y(Dist(Auto)

y no Movido entonces

// Comprobemos si podemos llegar allí.

si no HasWay (mosaico) entonces salida;

MoveObj(ID, Tile.x, Tile.y);

// El juego se basa en turnos: muévete inmediatamente.

Movido: = verdadero;

//

si atacado entonces

Icono.IsVisible:= FALSO;

// Ataque

si(Azulejos.Objetos.Recuento > 0)

y(Dist(Auto)

y no atacado entonces

Obj:= Azulejo.Objetos;

// Atacamos solo a los enemigos.

si Obj.Lado = Lado entonces salida;

Obj.Daño(dmg);

Atacado:= verdadero;

// Si el movimiento está completo, elimine el icono

si Movido entonces

Icono.IsVisible:= FALSO;

El movimiento se procesa de la siguiente manera (ver “Movimiento de pieza”). Se localiza la celda en la que se hizo clic. Si hay un enemigo encima y está dentro del alcance, éste sufre daño; si está vacío y dentro del alcance, la pieza se mueve (si los obstáculos lo permiten); si está ocupada, pero no por un enemigo, el clic se ignora. .

Cuando ambos bandos se acercaron, los dragones actuaron. Operan de manera muy simple: seleccionan al no dragón más cercano que esté a 7 casillas de ellos y atacan. Consulte el código de Dragon Actions.

Acciones del Dragón

// Comprobando fichas dentro de 7 casillas del dragón.

para i:= Máx(0, x - 7) a Min(Tamaño máximo, x + 7) hacer

para j:= Máx(0, y - 7) a Min(Tamaño máximo, y + 7) hacer

si (Map.Tiles.Objects.Count > 0) y

(Mapa.Azulejos.Objetos.Código>1)

// 0 - código de obstáculo, 1 - dragón

entonces comenzar

// Seleccionar un punto para mover

si x=yo entonces hacha:=yo

demás si x>i entonces hacha:=i+2

demás hacha:= i-2;

si y=j entonces sí:=j

demás si y>j entonces sí:= j+2

demás sí:= j-2;

MoveObj(NO, hacha, sí);

// ataquemos

Mapa.Tiles.Daño(12);

// Rompiendo el ciclo: no más de un ataque

// cada dragón por ronda

Finalmente, sólo queda comprobar si más de la mitad de los obeliscos están ocupados por tropas de un bando y, si lo están, ¡detener el juego y declarar al ganador!


Entonces, tenemos un juego de estrategia. Sin embargo, para una felicidad total, lo que falta, en primer lugar, es la inteligencia artificial, que permitirá darle al juego un modo para un jugador (no consideramos el procedimiento más simple para controlar dragones). Eso es lo que haremos la próxima vez. ¡Nos vemos en un mes!

En números futuros

En los siguientes números hablaremos de:

  • sistemas de partículas para visualización de humo, chispas, etc.;
  • trabajar con transparencia;
  • motores tridimensionales;
  • Conceptos básicos de IA;
  • depurar el programa;
  • crear un plan de juego y un guión,
  • redactar un documento de diseño;
  • equilibrio del juego;
  • pensar en los personajes del juego y sus líneas;
  • trabajar con Photoshop y paquetes 3D;
  • animaciones;
  • música y actuación de voz;
  • y mucho más.

Es muy posible aprender a hacer todo esto con tus propias manos. Pronto verás esto.

Escríbenos…

Para aquellos que piensan que el paquete se puede complementar con algo: en primer lugar, no olviden que no hay Versión definitiva paquete, pero sólo el que implementa las funciones descritas en nuestros artículos. Quizás algunas de sus ideas ya se hayan implementado y estén esperando su turno (consulte la barra lateral "En números futuros"). Y en cualquier caso: a la hora de ofrecernos una idea, intenta justificar por qué tu propuesta sirve para muchos juegos a la vez, y no solo para uno en concreto.

Para trabajo independiente

Mientras espera el próximo número, puede trabajar en su propio proyecto o intentar mejorar este. Aquí hay algunas ideas para su propia implementación:

  • divide los objetos de obstáculos en destructibles (árboles y arbustos) e indestructibles (rocas), y asegúrate de que las bolas de fuego y el aliento del dragón quemen la vegetación;
  • crear pozos (celda marrón) o un fuego que arda durante varios turnos (celda roja) en el lugar donde se desencadenó el ataque de fuego;
  • permitir que espadachines y caballeros cubran a sus vecinos, dándoles +1 a la defensa;
  • suaviza el movimiento de las figuras en la pantalla.

¿Y si en tiempo real?

No es más difícil crear un juego de estrategia en tiempo real si simplemente les das a los jugadores diferentes medios de entrada. La forma más sencilla de hacerlo es a través de la red; hablaremos de esto en uno de los próximos números. También serán necesarios los siguientes cambios:

  • no se necesita campo Velocidad del juego en la clase TObeliscoObjeto- usar Velocidad del motor base (la velocidad de movimiento en la pantalla es igual a la velocidad del juego);
  • el cálculo de distancias enteras está deshabilitado;
  • el código de movimiento de la figura se reescribe, teniendo en cuenta el hecho de que es necesario trazar una trayectoria alrededor de obstáculos;
  • Se elimina el botón "fin de movimiento".

Eso es todo. ¿Intentarás hacerlo tú mismo?

Hoy en día, es fácil encontrar muchas estrategias comerciales, el único problema es que la mayoría de ellas no funcionan o no son lo suficientemente efectivas. En tal situación, crear una estrategia desde cero es una excelente solución al problema.

Y aunque en cada situación concreta la creación de un vehículo será diferente, las principales etapas siguen siendo las mismas. Es decir, puedes crear algo así como una guía universal, pasando secuencialmente por todas las etapas, y al final obtendremos un sistema completamente viable.

Aunque consideraremos la opción de crear una estrategia desde cero, comenzando con una idea y terminando con la introducción de un filtro y el desarrollo final del vehículo, esto no significa que todos los sistemas ya preparados deban descartarse inmediatamente por ser obviamente ineficaces. . Se pueden utilizar varios TS como base y simplemente agregar algunos filtros para eliminar señales falsas.

Principales etapas de la creación de una estrategia.

Si toma de 5 a 7 indicadores al azar e intenta crear un vehículo que funcione a partir de ellos, es poco probable que obtenga algo útil. Primero debes pensar en la idea principal de la estrategia y solo luego pasar a seleccionar las herramientas. Se puede sugerir la siguiente secuencia de acciones:

  • Si el sistema se crea desde cero, entonces el primer paso es trabajar en la idea. En esta etapa, sólo necesita decidir cuál será su estilo de negociación, por ejemplo, si las transacciones se realizarán a lo largo de la tendencia o en contra de ella, o tal vez la estrategia esté planificada exclusivamente para romper. Todavía no estamos pensando en detalles;
  • Después de elegir el estilo comercial adecuado, puede comenzar a resolver los detalles. Antes de seleccionar instrumentos, es necesario determinar claramente los pares de divisas y los plazos de trabajo, el tiempo de negociación, etc.;

Importante! Al elegir un período de tiempo, no es aconsejable ser demasiado pequeño, especialmente si el comerciante no tiene experiencia en especular en intervalos de tiempo pequeños. Para los principiantes, generalmente es mejor no bajar de H1-H4; puede leer más sobre cómo elegir el intervalo de tiempo óptimo.

  • la siguiente etapa es la selección de los instrumentos adecuados, y aquí la abundancia de opciones puede jugar una broma cruel al comerciante, porque tiene docenas de indicadores a su disposición, la capacidad de utilizar análisis de velas, ondas, técnicos y fundamentales. De toda esta variedad, debe elegir varios instrumentos que mejor se adapten a su estilo comercial previsto;
  • Una de las principales reglas de cualquier estrategia es que la señal recibida debe ser confirmada por varios filtros, pero es aconsejable limitar su número. Por ejemplo, para las estrategias de indicadores, no es deseable que el número de indicadores exceda de 3 a 4; de lo contrario, habrá confusión en las señales y, si planea trabajar utilizando el análisis técnico, los indicadores desempeñarán un papel de apoyo;
  • se desarrollan reglas para el apoyo de posiciones, el resultado debe ser un algoritmo de acciones para cualquier escenario;
  • la última etapa es ejecutar el vehículo primero en una cuenta de historial y luego en una cuenta de demostración, o mejor aún, en una cuenta de centavos real. El objetivo principal es probar la viabilidad de la estrategia en condiciones reales, y una cuenta real (aunque sea un centavo) le permitirá sentir toda una gama de emociones, desde la euforia hasta la amargura de las pérdidas.

También puede aconsejarle que no se obsesione con la complejidad del vehículo. La práctica demuestra que la complejidad excesiva no es en absoluto un indicador de eficacia. Cómo sistema más simple, más fácil será comerciar.

¿Qué debe incluirse en el vehículo?

Crear una estrategia es un poco como un set de construcción: sólo necesitas elegir las piezas correctas. Al crear un vehículo puedes y debes utilizar:

  • indicadores. Además, no se debe perseguir ni su número ni su excesiva complejidad, incluso en vehículos totalmente mecánicos, de 3 a 5 piezas son suficientes;
  • patrones gráficos: banderas, banderines, triángulos, cabezas y hombros, dobles fondos y cimas conocidos todavía funcionan bien;
  • construcciones gráficas;
  • niveles de Fibonacci;
  • elementos del análisis fundamental: ahora es difícil ganar dinero únicamente con las noticias, pero es necesario tener en cuenta el calendario económico al negociar. Al menos simplemente mueva las transacciones al punto de equilibrio antes de la publicación de estadísticas importantes para EE. UU. o Europa, o incluso cierre completamente las ganancias.

También existen varias técnicas cuyos beneficios son cuestionables:

  • La martingala es una táctica inicialmente no rentable, la única posibilidad de éxito es que antes de la pérdida puedas recuperar el monto del depósito y ganar un poco;

  • Tampoco es aconsejable utilizar el bloqueo a menos que sea absolutamente necesario, ya que entonces es bastante difícil salir del castillo;
  • También es mejor no utilizar señales del exterior. Las señales del exterior significan, por ejemplo, una comparación del número de vendedores/compradores, varios índices del estado de ánimo de la mayoría de los comerciantes, etc. Pero también hay una serie de recursos que puede escuchar, por ejemplo, Autochartist da buenas señales basadas en patrones gráficos;
  • También es mejor no utilizar elementos de análisis de ondas (al menos para principiantes). Aunque hay excepciones, por ejemplo, el trading en Wolfe Waves se basa precisamente en el análisis de ondas, pero no es particularmente complejo.

Desarrollo de una estrategia de indicadores simple.

Supongamos que la idea principal de la estrategia es operar exclusivamente en la dirección de la tendencia. Además, no entrará en el mercado en el momento en que surja una tendencia, lo cual es bastante arriesgado, sino después de que se complete una pequeña corrección.

La estrategia debería funcionar en casi cualquier par de divisas; esto es necesario porque, debido al largo período de tiempo, las señales no aparecerán con mucha frecuencia. Por lo tanto, la situación se evaluará utilizando entre 5 y 7 pares de divisas al mismo tiempo. En cuanto al marco temporal, D1 es adecuado; partimos del hecho de que Forex en la etapa inicial es solo una adición al trabajo principal, por lo tanto, operaremos con velas diarias.

Ahora debes decidir cómo se determinará exactamente el momento de ingresar. Hay muchas opciones para identificar una tendencia:

  • visualmente, pero mirar fijamente no le permitirá desarrollar reglas comerciales claras;
  • utilizando uno o más promedios móviles;
  • según el valor del indicador ADX, si es más de 30, entonces hay una tendencia fuerte, menos de 20, el mercado está en calma;
  • utilizando construcciones gráficas;
  • Las Bandas de Bollinger le permiten juzgar la fuerza de una tendencia por la distancia entre los límites superior e inferior del canal.

En general, hay muchas opciones, pero como la estrategia debe ser lo más simple posible, nos centraremos en las medias móviles. O mejor dicho, una MA, juzgaremos la dirección de la tendencia por la posición del precio con respecto a ella. Puede comenzar con períodos que promedien el precio durante un período de tiempo completo (semana, mes, trimestre, etc.), por ejemplo, 20 promediará el precio durante el último mes. Lo más difícil es elegir el período de MA adecuado, pero aquí tendrás que proceder mediante prueba y error.

La idea principal del trading será la siguiente: esperamos que aparezca el movimiento de tendencia, luego se produce una corrección dentro de un día y, una vez finalizado, se cierra el trato. Si todo esto se presenta en forma de reglas claras, entonces el algoritmo de acciones se verá así (usando el ejemplo de compras):

  • primero verificamos la posición del precio en relación con la MA, el precio debe estar por encima de la línea;
  • A continuación necesitamos encontrar un movimiento de tendencia, necesitamos una vela con un cuerpo grande y sombras pequeñas (es aconsejable que el valor de la sombra no exceda el 10-15% del tamaño del cuerpo de la vela);
  • debería ir seguida de una vela con un rango diario pequeño (distancia del máximo al cierre). El precio de cierre no debe alcanzar el nivel del 50% del día anterior; ese día se produce la corrección del precio.

En este caso, la corrección puede realizarse según 2 escenarios:

  • Cuando se forma una vela con una larga sombra debajo, puede abrir una operación inmediatamente al cierre del día. Esta forma de vela indica que la corrección ya se completó;
  • una posible opción es cuando la vela de corrección cierra al mínimo, es decir la reversión aún no se ha completado, en este caso hay que esperar hasta que se cierre la siguiente vela; si es blanca, se puede abrir una posición larga.

En cuanto al mantenimiento de la posición y las órdenes de protección, el stop loss debe colocarse al menos más allá del centro de la vela de cuerpo grande. Para alcanzar el nivel objetivo, basta con apartar el valor de la misma vela del nivel de compra, se puede utilizar un trailing stop.

Se han formado las reglas de la estrategia, solo queda probarla en acción. La práctica demuestra que incluso un algoritmo tan simple produce más de la mitad de las operaciones rentables (y si la operación se pone a cero temprano, la probabilidad de pérdida disminuye).

Entrada al inicio de la tendencia.

El TS propuesto anteriormente omite parte del movimiento de tendencia, pero no requiere mucho tiempo para el análisis del mercado. Si es posible seguir el comportamiento del precio del día, entonces se puede intentar seguir la tendencia desde el principio de su formación. Entonces, la idea principal de la estrategia es ingresar al mercado después de que el precio comience a salir del canal horizontal.

Y aquí es muy importante recibir una señal fiable a tiempo, al principio de la tendencia. Las medias móviles pueden volver a ayudar, pero se utilizarán de forma algo diferente que en la estrategia anterior. Puede tomar varias MA con diferentes períodos y juzgar la formación de una tendencia por su ubicación entre sí.

Este no es un enfoque revolucionario; Bill Williams utilizó algo similar en su famoso Alligator. Por tanto, este indicador puede incluso tomarse como base del TS.

Si agregamos Alligator con configuración estándar a H1, podemos ver que da muchas señales falsas; nuestra tarea es eliminarlas. Para ello, entraremos al mercado con una orden pendiente, y el nivel de su colocación se determinará mediante Fractales.

Como resultado, el flujo de trabajo se verá así (usando el ejemplo de compras):

  • Buscamos un área plana en el gráfico (todas las líneas de Alligator están entrelazadas caóticamente entre sí);
  • A continuación, necesitará una vela fractal (y debe ubicarse encima de las líneas, sin siquiera tocarlas con la sombra inferior);
  • se coloca una orden de compra justo por encima de su máximo y una orden de protección más allá del borde inferior de la zona de consolidación;
  • TP es fijo (50-70 p) o utiliza un trailing stop. En general, es bastante difícil predecir la fuerza de un movimiento de tendencia, por lo que es mejor utilizar un trailing stop que un TP fijo o determinar el nivel objetivo utilizando el mismo análisis técnico.

Este ejemplo no es desarrollar una estrategia desde cero, sino más bien una ligera adaptación de una estrategia ya conocida al mercado moderno.

Ejemplo de un sistema combinado simple

La idea sigue siendo la misma: entrada al final de la corrección, pero resolveremos este problema de otra manera. El objetivo sigue siendo el mismo: determinar el momento de finalización de la corrección y entrar en la dirección de la tendencia, pero si antes usábamos la media móvil, ahora usaremos los niveles de Fibo y el oscilador para determinar la finalización de la reversión.

Nos interesará un movimiento de tendencia pronunciado, que también se puede determinar visualmente. Después de esto, sólo necesita estirar los niveles de Fibo hasta allí, esto es necesario para determinar los niveles potenciales para completar la corrección. El nivel de corrección más significativo es el 38,2%, se permite negociar con rebotes del 50% y el 61,8%.

Pero el hecho de que el precio toque el nivel de Fibo no es suficiente; se necesita confirmación. El estocástico puede hacer frente a esta tarea bastante bien (puede intentar utilizar el RSI para el mismo propósito). Por ejemplo, para una transacción de compra, el precio debe estar cerca del nivel de corrección y el estocástico en ese momento debe estar en la zona de sobreventa.

Después de que el precio toque el nivel, esperamos hasta que el estocástico salga de la zona de sobreventa y compre. El stop se puede colocar más allá del siguiente nivel de corrección y el TP se puede colocar al menos en el máximo reciente antes del inicio del retroceso.

Los niveles de Fibo y un oscilador son solo el mínimo necesario para recibir una señal. Si lo desea, puede complicar el sistema introduciendo filtros adicionales.

Estrategias basadas en el análisis técnico

Si se utiliza el análisis técnico en su forma pura, la tarea se vuelve algo más sencilla: ya no es necesario desarrollar un vehículo desde cero. Existen numerosas técnicas y herramientas cuya eficacia ha sido probada a lo largo de los años, y el comerciante sólo puede elegir las adecuadas y utilizarlas en las construcciones.
En principio, para operar con éxito basta con:

  • líneas de tendencia: las construimos en diferentes períodos de tiempo, comenzando por el más alto y descendiendo gradualmente hasta el de trabajo;
  • Los niveles de Fibonacci deberían adaptarse a los movimientos de precios más importantes de la historia. De importancia clave serán los niveles de corrección del 38,2, 50 y 61,8%, la práctica demuestra que la corrección suele terminar en estos niveles;
  • MT4 también implementa otras herramientas de análisis técnico, por ejemplo, las horquillas de Andrews, un conjunto de herramientas de Gann, varios tipos de canales, etc.

Pero para un pronóstico bastante preciso, los niveles de Fibonacci y las líneas de tendencia son suficientes; las áreas de concentración de niveles y líneas suelen actuar como soporte/resistencia. El comercio se puede realizar tanto para una ruptura como para un rebote desde niveles y líneas.

En cuanto a filtros adicionales, puedes agregar patrones de velas japonesas y algún tipo de indicador para buscar divergencias (el mismo Estocástico o MACD). Puede leer más sobre el uso del análisis técnico.

Filtros para sistemas comerciales.

Cualquier vehículo comercial, incluso si la idea funciona y el comercio es generalmente rentable, genera muchas señales y algunas de ellas no son rentables. Una vez que se hayan formado las reglas del sistema, puede utilizar una serie de filtros universales que ayudarán a mejorar la proporción de transacciones rentables/no rentables.

Hay una serie de filtros que se adaptarán a casi cualquier estrategia:

  • situación en plazos más altos. Si, por ejemplo, la estrategia se lleva a cabo en H1 según una estrategia mecánica, entonces no estaría de más observar lo que sucede en H4 y D1;
  • rango diario promedio, es decir, la distancia que recorre el precio en promedio por día; al operar intradía, esto ayudará a filtrar una serie de señales. Imaginemos que durante el día el precio se mueve en promedio 100-120 pips, si en uno de los días el precio por la noche ya había pasado 90-100 pips en una dirección, y el TS da una señal para ingresar al mercado en el misma dirección, entonces tiene sentido ignorarlo, las estadísticas dicen que es poco probable que el tráfico continúe ese día;

Importante! El cumplimiento de esta regla conducirá al hecho de que algunas operaciones rentables se perderán, pero la proporción de operaciones rentables/perdedoras aumentará.

  • También importa el número de velas después de que se forma la señal, incluso hay un filtro de 5 velas, en el que nos detendremos con más detalle.

Cuando el TS da una señal, lo ideal es que la situación comience a desarrollarse a nuestro favor casi inmediatamente después de concluir la transacción (es decir, en las siguientes 1 a 3 velas). Si esto no sucede, cuanto más tiempo haya pasado desde que se concluyó la transacción, menos influencia tendrán en el mercado aquellos factores que importaban cuando el comerciante ingresó al mercado. Su influencia se desvanece con el tiempo.

Se pueden tomar 5 velas como criterio, si después de cerrar la transacción el precio no se ha movido en una dirección rentable durante 5 velas, entonces es mejor cerrar la transacción manualmente. Esto significa un escenario en el que el gráfico permanece en su lugar, pero si el precio ha pasado al lado no rentable, entonces este filtro no se aplica.

Esta condición se aplica a casi todos los plazos (a excepción de m1-m5). Por supuesto, todavía existe la posibilidad de que el precio, habiendo rondado un nivel, se mueva en la dirección correcta, pero nuestra elección es la estabilidad. Es mejor sacrificar un par de operaciones rentables, pero evitar entre 3 y 5 operaciones no rentables.

resumiendo

Empezar a trabajar sin un sistema comercial es como la muerte, todo comerciante debería recordar esto. En este caso, perder el depósito es sólo cuestión de tiempo.

Elegir un vehículo adecuado no es difícil; además, se pueden encontrar buenos sistemas que funcionan en el dominio público. También puedes encargarte de crear tu propia estrategia, sobre todo porque para ello no se requieren conocimientos de lenguajes de programación, basta con tener una idea y al menos un conocimiento básico de cómo funciona el mercado y qué indicadores se utilizan y con qué fines.

El proceso en sí recuerda a montar un juego de construcción: primero planteamos un problema y luego simplemente seleccionamos las herramientas necesarias para resolverlo. Después de verificar el historial, puede continuar con la prueba TS en una cuenta demo o cent.


Arriba