Pequeno experimento em Forth

# deve chegar até *

Recentemente comecei a brincar um pouco com Forth, uma linguagem de programação onde todo o estado — até onde eu aprendi — é armazenado numa pilha. Para isso estou utilizando o livro Starting Forth.

Fiz um pequeno programa para ver como eu conseguiria armazenar o estado de um jogo simples utilizando apenas uma pilha (duas, tecnicamente). Você pode encontrar o código completo no github, mas aqui vai o núcleo dele:


: INSTRUCTIONS
    ." UTILIZE J (BAIXO) K (CIMA) L (DIREITA) H (ESQUERDA) PARA SE MOVER "
    CR ;

: RENDER-COORDINATE ( fx fy px py cx cy )
    4DUP MATCH-COORDINATES IF 35 EMIT DROP DROP ELSE
         >R >R 2OVER R> R> MATCH-COORDINATES IF 42 EMIT ELSE
	 32 EMIT
    THEN THEN ;
: RENDER-LINE ( fx fy px py ly )
    >R MAX-X MIN-X DO I J RENDER-COORDINATE LOOP R> DROP CR ;
: RENDER ( fx fy px py )
    PAGE MAX-Y MIN-Y DO I RENDER-LINE LOOP ;
: CHECK-WIN ( fx fy px py )
    4DUP MATCH-COORDINATES ;
: GAME-LOGIC ( fx fy px py )
    RENDER CHECK-WIN IF ." VOCÊ VENCEU!! " 2DROP 2DROP QUIT ELSE INSTRUCTIONS THEN ;

Na pilha ficam os valores que representam as coordenadas do jogador e da comida: (FoodX FoodY PlayerX PlayerY), e eventualmente as coordenadas sendo renderizadas. O jogador é exibido como “#” (35 EMIT), enquanto a comida é exibida como “*” (42 EMIT). Se as coordenadas do jogador baterem com as coordenadas da comida, o jogo acaba.