Fonte atual: curriculum/arrowfall/checkpoints/01-scene · Flecha 0.3.0 · 1/7.
O programa neste checkpoint
Até aqui: Você começa com o toolchain Flecha v0.3.0 instalado e um programa vazio.
Arrowfall começa com o menor resultado útil: um programa de terminal que já pode ser reconhecido como jogo. Ainda não há estado nem entrada. O programa atual apenas estabelece o título, o limite da sala, o arqueiro, o piso e a saída.
Esse frame estático é intencional. Antes de uma regra mover um símbolo, os símbolos precisam ter significado estável. Os mesmos quatro caracteres continuarão visíveis quando os próximos checkpoints substituírem texto literal por estado, colisão, inimigos e lógica de renderização.
Limitação atual
Ainda não há nada para jogar ou reconhecer.
Próximo comportamento necessário: Criar um frame de terminal inconfundível antes de adicionar estado ou regras.
Modelo e invariantes
Imprimir diretamente o título e uma sala pequena. Os símbolos estabelecem o contrato visual: # parede, . piso, @ arqueiro e > saída.
Funções simples e stdout são suficientes nesta versão. Adicionar um modelo de estado agora criaria estrutura sem sustentar nenhum comportamento.
O terminal é uma grade de caracteres, portanto cada linha impressa representa uma linha do mapa. Uma chamada a stdoutln por linha torna o arranjo espacial visível diretamente no código: os caracteres # externos são paredes, @ é o arqueiro, . é piso transitável e > é a saída.
Nesta etapa, o texto do código também é o dado da cena. Isso só é aceitável porque nada pode mudar. Assim obtemos uma referência precisa sem introduzir uma estrutura cujas responsabilidades ainda não conhecemos.
O invariante importante é visual, não dinâmico: todas as linhas têm a mesma largura e a sala permanece fechada. Movimento e colisão ficam deliberadamente fora do escopo até que o programa tenha estado para alterar.
Implementação
A implementação está dividida nas mudanças abaixo. Cada trecho vem literalmente do checkpoint qualificado e é explicado na parte do fluxo de dados em que participa. Os trechos não são programas independentes; o código completo compilado está disponível depois da execução.
- Criar o manifesto do programa Longbow.
- Adicionar o primeiro módulo main completo.
- Registrar entrada, stdout e frames textual e SVG exatos.
O primeiro programa completo
O programa completo cabe em um módulo. A declaração do módulo fornece a entrada ao Longbow, enquanto main escreve o frame de quatro linhas na ordem de exibição.
Trecho: src/main.fl:1–8. O arquivo completo aparece na seção de código abaixo.
module main;
void main() { stdoutln("ARROWFALL"); stdoutln("#####"); stdoutln("#@.>#"); stdoutln("#####");}Cada chamada encerra sua linha com uma quebra. Manter o título separado da sala permite que renderizadores futuros redesenhem o mapa sem tratar o título como célula.
Não há loop porque ainda não existe uma regra repetida. Um loop esconderia a única informação que este checkpoint precisa ensinar: o primeiro frame exato.
Execute e examine o resultado
O comando usa a entrada registrada do checkpoint, portanto o comportamento descrito acima pode ser reproduzido sem depender de tempo manual.
longbow run tutorial/checkpoints/01-scene < tutorial/checkpoints/01-scene/tests/input.txtA execução registrada não tem entrada padrão. O frame deve conter as mesmas quatro linhas do código, com o arqueiro na única célula de piso antes da saída.
Essa saída se torna o primeiro contrato visual. Se um caractere mudar, o fixture do frame muda junto; assim, os checkpoints posteriores podem mostrar qual comportamento visível veio de uma alteração no código.
Transcript acessível do frame
ARROWFALL######@.>######Stdout registrada completa
ARROWFALL######@.>######O que este checkpoint estabelece
Agora temos um programa Longbow compilável e uma referência exata de terminal, mas o arqueiro ainda faz parte de uma string. Nenhum valor representa sua posição.
O próximo checkpoint introduz esse valor e faz a renderização consultá-lo. Só então movimento poderá significar alterar dados em vez de editar texto.
Exercício
Troque um ponto do piso por uma parede. Exatamente um caractere do frame deve mudar; restaure antes de continuar.
Código completo e verificação
As seções abaixo preservam o código qualificado completo, o diff exato desde o predecessor e a sequência de comandos usada pela CI. São evidência de apoio para a implementação explicada acima.
Código completo testado (3 arquivos)
longbow.toml
[package]name = "arrowfall-step-01"version = "0.1.0"kind = "program"flecha = ">=0.3.0, <0.4.0"
[dependencies]longbow.lock
{ "schema": 1, "root": "root", "packages": [ { "id": "root", "identity": "local/arrowfall_step_01", "source": { "kind": "workspace", "path": "." }, "version": "0.1.0", "flecha": ">=0.3.0, <0.4.0", "dependencies": { "std": "toolchain-std" } }, { "id": "toolchain-std", "identity": "flecha/std", "source": { "kind": "toolchain" }, "dependencies": {} } ]}src/main.fl
module main;
void main() { stdoutln("ARROWFALL"); stdoutln("#####"); stdoutln("#@.>#"); stdoutln("#####");}Diff exato desde a versão anterior
--- /dev/null+++ tutorial/checkpoints/01-scene/README.md@@ -0,0 +1,50 @@+# 01 — A room appears++## Starting point++There is no previous checkpoint: we begin with an empty Flecha program.++## Why now?++A terminal game first needs something recognisable on screen. Before state,+input, or rules, a static room gives the project a visible identity.++## New behaviour++Running the program prints Arrowfall's title and a tiny room containing the+player (`@`), floor (`.`), walls (`#`), and exit (`>`).++## Files changed++- `README.md`+- `longbow.lock`+- `longbow.toml`+- `src/main.fl`+- `tests/input.txt`+- `tests/output.txt`+- `tests/frame.txt`+- `tests/frame.svg`++The exact source diff is `../../diffs/01-scene.patch`. This directory contains+the complete current code, not a fragment.++## Verify++```sh+longbow check tutorial/checkpoints/01-scene+longbow test tutorial/checkpoints/01-scene+longbow build tutorial/checkpoints/01-scene+longbow run tutorial/checkpoints/01-scene < tutorial/checkpoints/01-scene/tests/input.txt+```++Expected stdout is `tests/output.txt`; the representative frame is+`tests/frame.txt` and `tests/frame.svg`.++## Timeline++1. **A room appears** — a static scene establishes the game's visual goal.++## Challenge / acceptance++Change one floor dot to a wall, rebuild, and verify exactly one character in+the frame changes. Restore it before moving on.--- /dev/null+++ tutorial/checkpoints/01-scene/longbow.lock@@ -0,0 +1,27 @@+{+ "schema": 1,+ "root": "root",+ "packages": [+ {+ "id": "root",+ "identity": "local/arrowfall_step_01",+ "source": {+ "kind": "workspace",+ "path": "."+ },+ "version": "0.1.0",+ "flecha": ">=0.3.0, <0.4.0",+ "dependencies": {+ "std": "toolchain-std"+ }+ },+ {+ "id": "toolchain-std",+ "identity": "flecha/std",+ "source": {+ "kind": "toolchain"+ },+ "dependencies": {}+ }+ ]+}--- /dev/null+++ tutorial/checkpoints/01-scene/longbow.toml@@ -0,0 +1,7 @@+[package]+name = "arrowfall-step-01"+version = "0.1.0"+kind = "program"+flecha = ">=0.3.0, <0.4.0"++[dependencies]--- /dev/null+++ tutorial/checkpoints/01-scene/src/main.fl@@ -0,0 +1,8 @@+module main;++void main() {+ stdoutln("ARROWFALL");+ stdoutln("#####");+ stdoutln("#@.>#");+ stdoutln("#####");+}--- /dev/null+++ tutorial/checkpoints/01-scene/tests/frame.svg@@ -0,0 +1,10 @@+<?xml version="1.0" encoding="UTF-8"?>+<svg xmlns="http://www.w3.org/2000/svg" width="360" height="124" viewBox="0 0 360 124" role="img">+ <title>01-scene representative frame</title>+ <rect width="100%" height="100%" rx="12" fill="#10151c"/>+ <style>.terminal { fill: #d7f9e9; font: 15px monospace; white-space: pre; }</style>+ <text x="24" y="37" class="terminal">ARROWFALL</text>+ <text x="24" y="56" class="terminal">#####</text>+ <text x="24" y="75" class="terminal">#@.>#</text>+ <text x="24" y="94" class="terminal">#####</text>+</svg>--- /dev/null+++ tutorial/checkpoints/01-scene/tests/frame.txt@@ -0,0 +1,4 @@+ARROWFALL+#####+#@.>#+#####--- /dev/null+++ tutorial/checkpoints/01-scene/tests/output.txt@@ -0,0 +1,4 @@+ARROWFALL+#####+#@.>#+#####Comandos de check, teste, build e execução
longbow check tutorial/checkpoints/01-scenelongbow test tutorial/checkpoints/01-scenelongbow build tutorial/checkpoints/01-scenelongbow run tutorial/checkpoints/01-scene < tutorial/checkpoints/01-scene/tests/input.txtVersões deste tutorial
- 1. Renderize a primeira sala
Próxima versão
A sala é uma string fixa. A próxima versão deriva a posição do jogador de um estado próprio do jogo.
Referências
Fonte: commit Arrowfall 56bb003, verificado com Flecha oficial 0.3.0. Código, entrada, saída, diff e frame desta página são lidos desse snapshot versionado.