Números aleatórios: RND e RANDOMIZE
Todo jogo precisa de um pouco de imprevisibilidade. Vamos aprender a pedir números ao acaso — e a garantir que eles sejam realmente diferentes a cada partida.
1. RND(n) — sorteando um número
A função RND(n) devolve um número inteiro aleatório entre 1 e n. Se n for 100, você recebe algo entre 1 e 100.
DIGITE E VEJA
Programa 12.1 — Dez dados
USES SCREEN 1, RANDOM
SCREEN 1 : CLS
DIM i AS BYTE
FOR i = 1 TO 10
PRINT RND(6);
NEXT i
TELA ESPERADA
Uma linha com dez números de 1 a 6
Algo como 3 5 1 6 2 4 4 1 5 3 — cada RUN pode dar uma sequência diferente (leia a próxima seção).
2. Auto-seed: como o CrossScript se semeia sozinho
Todo gerador pseudoaleatório precisa de uma semente. Sem semente, ele começa sempre no mesmo ponto e produz a mesma sequência.
No CrossScript, na primeira chamada de RND(), o runtime semeia automaticamente usando JIFFY XOR R — o contador de VBLANK combinado com o registrador de refresh do Z80. No hardware real, isso basta: o tempo entre ligar a máquina e digitar RUN já é diferente a cada vez.
ATENÇÃO
Ressalva do emulador WebMSX
No WebMSX o RUN reseta a máquina de forma determinística: JIFFY começa em 0, R percorre o mesmo caminho, e o auto-seed produz a mesma sequência a cada RUN. É limitação do emulador, não do runtime nem do seu programa.
3. RANDOMIZE — semear na hora certa
O comando RANDOMIZE força uma nova semente. Duas formas:
RANDOMIZE 42— semente fixa. A sequência será sempre a mesma. Útil para depurar bugs e para level design determinístico.RANDOMIZE(sem argumento) — semeia comJIFFY XOR Rno exato instante da chamada.
A segunda forma é a mais poderosa, porque permite escolher quando capturar a entropia.
4. O padrão "Press START" (idiomático MSX)
A receita usada por praticamente todo jogo MSX comercial: mostre a tela de título, espere o jogador reagir, e só então chame RANDOMIZE. O tempo até o jogador apertar o botão é a fonte de entropia.
DIGITE E VEJA
Programa 12.2 — Semear com input do jogador
USES SCREEN 1, RANDOM, KEYBOARD
CLS
PRINT "APERTE ESPACO PARA COMECAR"
WHILE STRIG(0) = 0
WEND
RANDOMIZE
CLS
DIM i AS BYTE
FOR i = 1 TO 10
PRINT RND(100);
NEXT i
Rode este programa três vezes. A cada RUN, o tempo até você apertar espaço é diferente — e a sequência de números também.
5. Quando usar cada forma
| Situação | O que usar |
|---|---|
| Jogo com tela de título | RANDOMIZE depois do primeiro input |
| Reproduzir um bug | RANDOMIZE <semente_fixa> |
| Re-embaralhar durante o jogo (novo baralho, nova fase) | RANDOMIZE sem argumento |
| Programa simples sem input | Aceite a sequência determinística ou use DELAY antes |
CURIOSIDADE
Por que RND devolve 1 e não 0?
Herança do BASIC de 1975. Devolver de 1 a n bate direto com "sorteie um dado de n faces" e casa com FOR i = 1 TO n. Se você quiser um índice de array (0 a n-1), use RND(n) - 1.
6. Resumo do capítulo
RND(n)→ inteiro de 1 a n.- Auto-seed acontece na primeira chamada de
RND(). - Emuladores são determinísticos:
RANDOMIZEapós input do jogador resolve. RANDOMIZE npara depurar;RANDOMIZE(sem argumento) para embaralhar.- Sempre
USES RANDOM.