Snippets

Jorge Araya Navarro Creo que esto es una maquina de estado finito

Created by Jorge Araya Navarro
package main

import "fmt"

// código disponible para ejecutar desde el navegador en https://play.golang.org/p/YGem8KTfNr

// Aplicación de prueba de concepto para la retención de estados. La idea es
// poder servir a varios usuarios a la vez según el contexto de las acciones
// que han realizado anteriormente sin complicadas selvas de sentencias `if`,
// mi objetivo es simplificar la implementación de "bots" para Telegram
// Messenger.

// Este código toma inspiración en el concepto "actor model"

// Mesa define un objeto que representa un juego de cartas
type Mesa struct {
	Jugadores []string // mantiene una lista de jugadores que podemos ciclar
	Jugador   int      // Indica qué jugador posee el turno
	Fase      func(message string)
}

func (m *Mesa) a(message string) {
	fmt.Printf("Fase a de %s\n", m.Jugadores[m.Jugador])
	// dentro de cada una de estas funciones alguna computación debería
	// llevarse a cabo, luego establecemos el comportamiento el cual deberá
	// procesar el siguiente mensaje
	m.Fase = m.b
}

func (m *Mesa) b(message string) {
	fmt.Printf("Fase b de %s\n", m.Jugadores[m.Jugador])
	m.Fase = m.c
}

func (m *Mesa) c(message string) {
	fmt.Printf("Fase c de %s\n", m.Jugadores[m.Jugador])
	fmt.Printf("Mensaje: %s\n", message)
	m.Fase = m.d
}

func (m *Mesa) d(message string) {
	fmt.Printf("Fase d de %s\n", m.Jugadores[m.Jugador])
	fmt.Printf("Fin del turno de %s\n\n", m.Jugadores[m.Jugador])
	// calculamos cual es el siguiente jugador con el derecho al siguiente
	// turno
	if m.Jugador < len(m.Jugadores) {
		m.Jugador++
	} else {
		m.Jugador = 0
	}
	// establecemos la función a manejar el siguiente mensaje
	m.Fase = m.a
}

func main() {
	mesa1 := Mesa{
		Jugadores: []string{"Marcos", "Mateo", "Lucas", "Juan"},
		Jugador:   0,
	}
	// iniciamos el juego
	mesa1.a("Inicio del juego")
	// hacemos que los jugadores "jueguen", para que todos puedan jugar
	// debería haber 4 fases por jugador, el primer jugador ya ha jugado la
	// primer fase, lo cual quiere decir que hay (4 * 4) - 1 movimientos
	// por hacer.
	for i := (4 * 4) - 1; i > 0; i-- {
		mesa1.Fase("comando sin importancia")
	}
}

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.