Diseñar un juego con Stateflow
Este ejemplo muestra cómo implementar el juego de Tetris utilizando un gráfico de Stateflow®. Este modelo es una versión rediseñada de la clásica demo de Stateflow sf_tetris
. El nuevo diseño incorpora estos paradigmas de programación:
Descomposición paralela para separar las tareas de preprocesamiento y posprocesamiento de la lógica de control principal del juego.
Jerarquía de estados y subgráficos para proporcionar abstracciones semánticas que simplifiquen el diseño del gráfico.
Operadores de detección de cambios para solicitar entradas desde el teclado.
Separar subcomponentes utilizando descomposición paralela
El gráfico TetrisLogic implementa la lógica del juego. El gráfico consta de tres estados paralelos que se ejecutan en este orden:
WaitingArea
realiza las tareas de preprocesamiento, como generar aleatoriamente el siguiente tetromino (una forma compuesta por cuatro cuadrados). Durante la simulación, el cuadrado más pequeño a la derecha de la IU del juego muestra este tetromino.MainArea
implementa la lógica de control principal para el juego. Para representar el área de juego, este estado utiliza un arregloarena
de 21 por 12. En cada paso de la simulación, el gráfico actualiza el arreglo en función del estado del juego y de la entrada del jugador.Draw
realiza tareas de posprocesamiento, como llamar al script de MATLAB®sf_tetris_gui
. Este script muestra el área de juego como una imagen y captura las pulsaciones de tecla del jugador.
Simplificar el diseño del gráfico utilizando jerarquía y subgráficos
Mediante la jerarquía de estados y subgráficos, puede abstraer gráficamente la lógica del juego, presentar una visión general de alto nivel del flujo del juego y ocultar la complejidad interna de cada fase del juego. Por ejemplo, cada subestado del estado paralelo MainArea
representa una fase separada del flujo del juego.
El juego comienza generando un tetromino nuevo (subestado
NewShape
).El tetromino se mueve hacia abajo o hacia los lados en función de la entrada del jugador (subestado
Moving
).Cuando el tetromino toca al fondo del área de juego u otro tetromino debajo de él, este deja de moverse (subestado
Stopped
).Si el tetromino se detiene en un punto demasiado alto del área de juego, el juego finaliza (subestado
GameOver
). De lo contrario, el gráfico congela el tetromino (subestadoFreezeShape
), ajusta la puntuación (subestadoScore
), avanza al siguiente nivel si fuera necesario (subestadoNextLevel
) y pasa al siguiente tetromino (subestadoNewShape
).
Capturar las entradas del teclado mediante la detección de cambios
El subgráfico Moving
mueve el tetromino en función de la entrada del jugador. De forma predeterminada, el subestado MoveSlowly
está activo. El tetromino se mueve lentamente hacia abajo por el área de juego mientras los subestados paralelos de MoveSlowly
supervisan la entrada del teclado. Si el jugador pulsa la barra espaciadora, el subestado MoveFast
se convierte en activo. El tetromino baja rápidamente al fondo del área de juego.
Para recopilar las entradas del teclado, el subgráfico utiliza el operador de detección de cambios hasChanged
. Cada vez que el jugador pulsa una tecla, sf_tetris_gui
añade una entrada al gráfico, lo que hace que el correspondiente operador hasChanged
devuelva un valor de true
. Dado que MoveSlowly
tiene una descomposición paralela, el gráfico puede procesar varias pulsaciones de tecla en cada unidad de tiempo.
Asignaciones de teclas
Para interactuar con la IU del juego, utilice estas teclas:
Mover a la izquierda: flecha izquierda o J
Mover a la derecha: flecha derecha o L
Rotar en el sentido de las agujas del reloj: flecha hacia arriba o I
Rotar en el sentido contrario a las agujas del reloj: flecha hacia abajo o K
Bajar hasta el fondo: barra espaciadora
Pausar y reanudar el juego: P
Salir: Q