MSXInício
Capítulo 12Disponível

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 com JIFFY XOR R no 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çãoO que usar
Jogo com tela de títuloRANDOMIZE depois do primeiro input
Reproduzir um bugRANDOMIZE <semente_fixa>
Re-embaralhar durante o jogo (novo baralho, nova fase)RANDOMIZE sem argumento
Programa simples sem inputAceite 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: RANDOMIZE após input do jogador resolve.
  • RANDOMIZE n para depurar; RANDOMIZE (sem argumento) para embaralhar.
  • Sempre USES RANDOM.
Comunidade

Discussão · Números aleatórios: RND e RANDOMIZE

Curta, marque como lido e comente o que achou deste capítulo.

0 comentários
Entre para participar
Crie uma conta ou faça login para curtir, marcar como lido e comentar.

Carregando comentários…