Se o módulo CRT de Pascal estava em JavaScript

Uma tentativa de implementar o conhecido módulo CRT usado no Pascal em JavaScript. O que saiu e o que não, eu vou te dizer.

Entrada


Meu conhecimento da programação começou na 8ª série, quando aprendi em uma aula de informática o que é Pascal e quais oportunidades ele oferece. Em seguida, o Turbo Pascal foi instalado nos computadores das escolas, embora o professor de ciências da computação desejasse colocar o PascalABC.NET lá. Claro, tudo começou com as conclusões banais da linha no console, minha atividade foi principalmente destinada a uma excelente preparação para o OGE. Nenhum módulo foi estudado, porque ninguém exigiu isso no exame.

Mas mesmo quando eu conseguia "subordinar" a janela do console a mim mesmo, exibir tudo o que queria lá, fazer cálculos, aceitar informações do usuário, fiquei surpreso com o quão legal é!

Mas o tempo está passando, a vida está mudando: o exame passou, o exame passou, admissão bem-sucedida na universidade. Todo esse tempo venho estudando novos idiomas com grande interesse, como resultado do qual posso escrever sites com segurança, seja ele frontal ou traseiro. Por alguma razão, a programação na web me interessa mais.

Como chegou à CRT


De volta à escola, estudei um dos módulos Pascal interessantes chamados CRT. Na verdade, não há nada de complicado nisso, o conjunto de comandos é pequeno, mas eles permitem que você faça coisas novas na janela do console: mova o cursor em uma tela de 80x25 (tamanho da tela do DOS), altere a cor do plano de fundo e do texto, reproduza sons de uma certa frequência e duração. Foi possível criar jogos ASCII completos, o que praticamente não ocupava espaço no disco rígido devido ao seu tamanho pequeno.

E agora, depois de vários anos, decidi, com base no interesse, escrever um pequeno arquivo js, ​​quando conectado com o qual você pode trabalhar com a janela do navegador e com a janela do console. Eu direi imediatamente que é muito difícil, se possível, restaurar todos os comandos do módulo para sua integridade e segurança. Ainda assim, o JavaScript não é Pascal, por isso, existem alguns recursos aqui.

A ideia em si


O projeto possui uma estrutura muito simples de três arquivos:

  • crt.js - arquivo com funções a serem conectadas ao arquivo html
  • index.html - arquivo - a base que deve ser aberta no navegador
  • user.js - um arquivo vazio no qual o programador deve escrever seu código

Primeiro, vou nomear as equipes atualmente implementadas e depois mostrarei como elas funcionam.

Os comandos implementados:

  • gotoxy (x, y) - move o cursor para as coordenadas
  • write (str) - exibe uma string na tela
  • clrscr () - limpa a tela com um fundo pré-selecionado e move o cursor para as coordenadas 1,1
  • textcolor (int) - altera a cor do texto
  • textbackground (int) - altera a cor do plano de fundo
  • som (fr, 1000) - reproduz som com uma frequência de fr e uma duração de 1 segundo

Vamos mostrar um exemplo do "módulo":

Código:

imagem

Resultado:

imagem

Pode parecer que as letras estão separadas uma da outra. É sim. O fato é que aqui o conteúdo da página é dividido em partes por divs. Vamos lembrar o tamanho da janela do DOS (80x25). Então, quantas divs existem? Isso mesmo, 2000. Cada um deles é do mesmo tamanho. Em geral, quando você inicia uma página, a seguinte função é executada automaticamente:

imagem

Postei esse trabalho especificamente em JS. Eu queria que o arquivo html estivesse limpo e claro.

imagem

Sim, devido a esse esquema, há um efeito: quando inicio a página em um PC fraco, acho que apenas o carregamento ocorrerá por 4-5 segundos, porque o ciclo é bastante complicado. Eu não vejo o ponto de comentar em cada linha, as principais ações da foto são explicadas. Cada vez que geramos uma div com certos ID e parâmetros e a adicionamos ao corpo. Cada div contém apenas um caractere , como era por analogia no DOS (uma célula - um caractere).

O trabalho com coordenadas e cores baseia-se nestas variáveis:

imagem

Os comandos gotoxy (x, y), textcolor (int), textbackground (int) simplesmente alteram o conteúdo das variáveis ​​xnow, ynow, color, bgcolor.

Com flores, existem pontos interessantes. No DOS, como sabemos, era possível escolher uma cor de um conjunto em que havia apenas 16 cores. Em Pascal, você pode acessar a cor usando o número (0-15). Além disso, no DOS, o plano de fundo foi selecionado apenas entre as oito primeiras cores e o texto entre as 16. No Windows, no PascalABC.NET, quando o módulo está conectado, o plano de fundo pode ser alterado de todas as 16 cores. Talvez nem todos tenham entendido o que eu queria transmitir agora, mas vamos explicar com um exemplo:

imagem

Todas as cores usadas no console estão listadas aqui. Se tentarmos alterar o plano de fundo no DOS para verde claro (10), o plano de fundo ficará verde (2), enquanto a fonte se tornará a cor que solicitamos. Por alguma razão, a capacidade de alterar o plano de fundo no DOS (Free Pascal) é limitada a oito cores.

E agora sobre o comando clrscr, que limpou a tela com uma cor específica. Em JS, eu implementei assim:

imagem

Não há nada complicado aqui. Percorremos todas as divs, onde em cada conteúdo o deixamos vazio (já que os caracteres do DOS são apagados) e alteramos o plano de fundo para a cor selecionada previamente pelo comando textbackground. E, é claro, não se esqueça de retornar o cursor para a posição 1.1 (no canto superior esquerdo da janela).

O mais interessante é a saída da string com o comando write . Sim, lembro que ainda há escrita, mas achei que um comando seria suficiente, pois nessa situação não estaríamos interessados ​​em mover o cursor para uma nova linha.

Implementação:

imagem

Aqui era necessário proteger o navegador contra erros, caso a linha do usuário fosse além das bordas da janela (e não há divs lá!). Portanto, foi decidido fazer um loop com quebra de proteção.

Cada letra deve ocupar a célula totalmente alocada, para que o tamanho da fonte seja governado pelo tamanho da div. Além disso, não esqueça que o plano de fundo atrás das letras deve mudar para o que foi definido pelo comando textbackground.

E, finalmente, a última função é o som. Infelizmente, aqui tive que mudar o esquema de trabalho da equipe, pois é difícil implementar a cadeia de som-atraso-som. A propósito, ainda não consegui implementar o atraso, não há idéias, pois setTimeout não é adequado aqui.

Lembramos que, para emitir, por exemplo, som com uma frequência de 200 Hz e uma duração de 1 segundo, você precisa escrever o código:

sound(200); delay(1000); nosound; 

Em JS, eu tive que fazer isso:

imagem

Mas então funciona! Implementação:

imagem

Eu nunca usei uma função tão específica em minha atividade. Ela teve que espiar na documentação. Se alguém verificar o trabalho, tenha cuidado, pois os ouvidos altos podem doer.

É verdade que, ao usar esta função, o Chrome, por razões óbvias, começa a jurar:

imagem

Tentei resolver o problema com o setTimeout, no entanto, isso nem sempre funciona.

Mas se você clicar rapidamente na página durante o carregamento, o som será reproduzido, mas essa é uma história completamente diferente.

Conclusão


Mesmo após o layout ativo dos sites, quero tentar escrever algo incomum, mesmo que não tenha benefícios práticos. O Pascal com seu módulo CRT realmente teve um efeito sobre mim na época, o que me incentivou a aprender ainda mais as linguagens de programação. Ou talvez você devesse escrever algo no estilo ASCII?

Por precaução, postou no GitHub

Source: https://habr.com/ru/post/pt438690/


All Articles