Pular para o conteúdo

1. Renderize a primeira sala

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.

src/main.fl:1-8 (excerpt)
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.

Comando de execução
longbow run tutorial/checkpoints/01-scene < tutorial/checkpoints/01-scene/tests/input.txt

A 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.

Frame de terminal produzido pela versão 1: Renderize a primeira sala
Frame representativo da execução registrada do checkpoint 1.

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
Transcript do frame
ARROWFALL
#####
#@.>#
#####
Stdout registrada completa
Stdout esperada
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

longbow.toml
[package]
name = "arrowfall-step-01"
version = "0.1.0"
kind = "program"
flecha = ">=0.3.0, <0.4.0"
[dependencies]

longbow.lock

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

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">#@.&gt;#</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
Comandos de verificação
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

Versões deste tutorial

  1. 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.

Represente o estado 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.