public:vj1231:arbolesdedecision:start
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| public:vj1231:arbolesdedecision:start [2026/10/06 10:01] – [Ejemplo] mperez | public:vj1231:arbolesdedecision:start [2026/10/06 11:07] (actual) – [Árboles dirigidos por datos (data-driven)] mperez | ||
|---|---|---|---|
| Línea 41: | Línea 41: | ||
| * Visualizar y exportar el árbol como imagen o código. | * Visualizar y exportar el árbol como imagen o código. | ||
| - | ====== | + | ====== |
| - | + | ||
| + | En el enfoque Orientado a Objetos (Nodos en Código) se crea la estructura del árbol en memoria. Se definen clases para los nodos (ej. '' | ||
| ===== Clase NodoDecision ===== | ===== Clase NodoDecision ===== | ||
| Línea 85: | Línea 86: | ||
| </ | </ | ||
| - | {{ : | + | |
| - | ====== Ejemplo | + | ===== Ejemplo ===== |
| Línea 93: | Línea 94: | ||
| {{: | {{: | ||
| + | Los tres árboles de decisión representados en formato de texto serían: | ||
| - | Puedes ver y ejecutar el ejemplo en este {{ : | + | ### 🟢 NPC Normal |
| + | es el más simple: solo decide entre perseguir o patrullar según si detecta al jugador. | ||
| + | ``` | ||
| + | ¿ve_al_jugador? | ||
| + | ├─ Sí → Acción: seguir_jugador | ||
| + | └─ No → Acción: patrullar_borde | ||
| + | ``` | ||
| + | |||
| + | ### 🟠 NPC Tímido | ||
| + | |||
| + | Es el más complejo (3 niveles de profundidad). Su comportamiento cambia drásticamente dependiendo de si está en " | ||
| + | - Si **está en alerta**, prioriza su seguridad (huye hacia un guardia o completa un informe). | ||
| + | - Si **no está en alerta**, se comporta de forma más agresiva (inicia la alerta si el jugador está cerca, o lo sigue si está lejos). | ||
| + | |||
| + | ``` | ||
| + | ¿en_mision_alerta? | ||
| + | ├─ Sí → ¿muy_cerca_guardia? | ||
| + | │ ├─ Sí → Acción: irse_al_guardia | ||
| + | │ └─ No → Acción: completar_informe | ||
| + | └─ No → ¿ve_al_jugador? | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | ``` | ||
| + | |||
| + | ### 🔵 NPC Guardia | ||
| + | |||
| + | tiene un comportamiento intermedio. Si no ve al jugador, actúa como un " | ||
| + | |||
| + | ``` | ||
| + | ¿ve_al_jugador? | ||
| + | ├─ Sí → Acción: seguir_jugador | ||
| + | └─ No → ¿tiene_posicion_reportada? | ||
| + | | ||
| + | | ||
| + | ``` | ||
| + | |||
| + | |||
| + | Puedes ver y ejecutar el ejemplo en este {{ : | ||
| + | |||
| + | ====== Árboles dirigidos por datos (data-driven) ====== | ||
| + | |||
| + | Es un caso muy similar al enfoque orientado a objetos, pero en este caso el árbol se define en un archivo de datos externo (como un JSON, XML o un formato binario personalizado). El juego carga este archivo en tiempo de ejecución (o en tiempo de carga) y un parser lo convierte en la estructura de Objetos mencionada en el enfoque anterior. | ||
| + | |||
| + | Por ejemplo, el NPC tímido se representaria de esta forma | ||
| + | |||
| + | <code json> | ||
| + | { | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | }, | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | y el código en python para leer el '' | ||
| + | |||
| + | <code python> | ||
| + | def construir_arbol(nodo_json): | ||
| + | """ | ||
| + | Lee un diccionario JSON y devuelve una instancia de NodoDecision o Hoja. | ||
| + | """ | ||
| + | tipo = nodo_json.get(" | ||
| + | | ||
| + | if tipo == " | ||
| + | # Caso base: Es una hoja. Buscamos la función en el registro. | ||
| + | nombre_accion = nodo_json[" | ||
| + | funcion_accion = REGISTRO_ACCIONES[nombre_accion] | ||
| + | return Hoja(funcion_accion) | ||
| + | | ||
| + | elif tipo == " | ||
| + | # Caso recursivo: Es un nodo de decisión. | ||
| + | nombre_condicion = nodo_json[" | ||
| + | funcion_condicion = REGISTRO_CONDICIONES[nombre_condicion] | ||
| + | | ||
| + | nodo = NodoDecision(funcion_condicion) | ||
| + | | ||
| + | # Construimos las ramas recursivamente | ||
| + | nodo.true_case = construir_arbol(nodo_json[" | ||
| + | nodo.false_case = construir_arbol(nodo_json[" | ||
| + | | ||
| + | return nodo | ||
| + | else: | ||
| + | raise ValueError(f" | ||
| + | </ | ||
| + | |||
| + | y se construiría con | ||
| + | <code python> | ||
| + | def crear_arbol(self, | ||
| + | arbol = construir_arbol(datos_json) | ||
| + | return arbol | ||
| + | </ | ||
public/vj1231/arbolesdedecision/start.1791280894.txt.gz · Última modificación: por mperez
