quarta-feira, novembro 27, 2013

Raspberry Pi: The Oregon Trail

Continuando as minhas adaptações de jogos antigos para o Raspberry, vejamos um outro jogo em Basic, com um histórico bastante interessante.


The Oregon Trail simula uma viagem nos tempos dos pioneiros americanos, de Missouri a Oregon. Foi criado em 1971, por um professor (Don Rawitsch), para ser usado em aulas de história (detalhes na wikipedia). Em 1974, Rawitsch foi contratado Minnesota Educational Computing Consortium e aperfeiçoou o jogo, incluindo várias características historicamente corretas.

Eu conheci este jogo em 1978, quando uma versão escrita em BASIC de mainframe foi publicada na revista Creative Computing (que você pode ver aqui). Lembro que eu tinha uma cópia xerox na minha pasta de "programas a adaptar algum dia", mas nunca fui em frente. Achei o fonte original no site The Digital Antiquarian.

A adaptação para o yabasic foi trabalhosa, mas não foi muito complicada.

Os IFs precisaram se alterados de "IF condicao THEN linha" para "IF (condicao) THEN GOTO linha"

Outra diferença de sintaxe está no "computed goto". Esta construção é um antepassado dos switches/cases das linguagens atuais, fazendo um desvio usando uma variável como índice em uma lista de destinos. O yabasic usa a sintaxe tradicional de ON var GOTO linha,linha,... enquanto que o código original usava GOTO var OF linha,linha...

A função para gerar números aleatórios também é diferente. No original era usada RND() que devolvia um número fracionário entre 0 e 1, no yabasic temos RND(x) que devolve um número inteiro entre 0 e x-1.

Foi necessário dar uma mexida em alguns PRINTs e inserir algumas pausas para obter uma saída razoavelmente formatada. Para as pausas eu usei a função INKEY$, que obriga o uso de CLEAR SCREEN pelo menos uma vez.

A parte mais complicada da adaptação foi na subrotina que começa na linha 4500. O código original usa um comando incomum nos BASICs (ENTER) para fazer uma entrada temporizada. O jeito foi fazer uma "adaptação técnica", usando um INPUT comum e medindo grosseiramente o tempo de digitação.

Após estes acertos o programa rodou mas tinha ainda um bug. Atribuições como X=Y=0 são aceitas pelo yabasic, porém alteram somente o valor de X (provavelmente consideram Y=0 como uma expressão lógica, a documentação do yabasic não é totalmente clara a respeito). Felizmente o yabasic permite colocar mais de um comando por linha, separados por ':'. Trocando X=Y=0 por X=0 : Y=0 tudo funcionou corretamente.

A listagem completa do programa adaptado  pode ser baixada dos arquivos do blog, onde está com o nome Oregon.bas.

Se você não tem um Raspberry Pi mas quer rodar o programa, baixe um versão do yabasic para Windows ou Unix (daqui) e rode no seu PC.

Nenhum comentário: