Scratch for the Advanced
Scratch é uma linguagem de programação visual para crianças. Há uma opinião de que essa é uma linguagem infantil para apenas tocar “programação” e nada de bom pode ser feito com ela. Quando comecei a dar aulas para crianças no Scratch, parecia-me uma pessoa com dois estudos técnicos superiores. No entanto, depois de um tempo, tive que mudar de idéia. Verificou-se que, mesmo na linguagem de programação infantil, existem chips ocultos que podem ser usados com seriedade mesmo quando se aprende programação profissional. Quero compartilhar com vocês minhas descobertas.Clonagem e variáveis no zero
Meu aluno gostou do jogo - "Zumbis contra plantas" . E ele estava interessado em programar ele mesmo. Vamos lembrar como esse jogo funciona? No lado direito, temos uma linha de plantas que atira nos zumbis.Existem muitas soluções para esse problema, mas, na minha opinião, uma solução mais elegante é usar o número mínimo possível de sprites, ou seja, use clonagem.Como fazer com que cada clone individual tenha seu próprio padrão de vida? O que selecionar variáveis ou listas? Eles tentaram usar listas, mas depois de um estudo mais detalhado, perceberam que essa estrutura de dados não ajuda a resolver o problema. Variáveis e listas no Scratch têm 2 tipos de visibilidade para cada tipo de dados - isto é "para todos os sprites"ou "apenas para este sprite" . Eu tive que verificar o escopo. Começamos com as variáveis.Tendo atingido a versão de trabalho da variável com o escopo “only for this sprite” . Nas linguagens de programação clássicas, esse tipo de visibilidade é chamado local ou privado, dependendo do contexto.Acontece que, se essa variável com um determinado escopo é usada no clone, uma instância da variável é criada no clone que pertence ao clone específico e que é usado para cálculos internos / operação do clone. No nosso caso, cada clone tem sua própria "vida". Se ficou interessante, aconselho a consultar o diretório . E aqui está uma imagem que mostra como sprites ou clones funcionam com variáveis de diferentes tipos de visibilidade.
A variável com escopo para todos os sprites (a imagem à esquerda) é uma para todos. A propósito, aqui você pode assistir ao trabalho com seções críticas com crianças e o que é uma corrida por um recurso. E se o escopo da variável for "apenas para este sprite", o sprite e seus clones terão sua própria variável com o mesmo nome com o qual trabalham (figura à direita). E os clones não têm acesso à variável original e à variável de outro clone.Essa foi uma descoberta inesperada e agradável das propriedades do Scratch para a criação de tais algoritmos.IMPORTANTE: Uma variável é uma ferramenta muito poderosa de um programador real, por isso ensino imediatamente as crianças o nome correto das variáveis, pois essa habilidade as ajudará em projetos de complexidade variada.Nomes de objetos como seus identificadores
IMPORTANTE: todas as variáveis com uma zona de visibilidade "apenas para este sprite".Essa ferramenta foi completamente inesperada para mim. Vamos começar com uma história sobre como um aluno e eu nos deparamos com esse recurso do idioma. Meu aluno decidiu criar um jogo com "inteligência artificial". O jogo representa star wars em naves espaciais e o jogador tem a capacidade de controlar uma nave, enquanto os oponentes perseguem você e um ao outro. Para que eles possam perseguir você ou o outro, eles precisam, de alguma forma, decidir quem perseguir. Esse problema pode ser resolvido na testa e definir a ordem de busca dos navios, mas o jogo perde a inteligência e fica entediado rapidamente. Portanto, o aluno decidiu ajustar o intelecto para que navios com inteligência perseguissem o inimigo mais próximo. Vamos ver como ele começou a resolver esse problema.
Na minha opinião, uma boa solução para criar um protótipo rápido. Mas quais são as limitações? Primeiro, a complexidade do código à medida que você adiciona novos navios. Portanto, a complexidade do código aumenta e as mutações do código devido à complexidade não são descartadas. O tempo para procurar erros e depurar o algoritmo aumentará. E, é claro, ninguém cancelou uma métrica tão legal quanto o envelhecimento do código (desenvolvimento avançado do SW). O que fazer? E você precisa fazer o seguinte, é necessário criar um algoritmo generalizado que se adapte dinamicamente para aumentar ou diminuir o número de naves.Para esse algoritmo, precisamos de uma propriedade de linguagem - um nome como identificador para um objeto. Chegou a hora de grandes mudanças e aqui você, como professor, pode falar sobre refatoração. Esta é uma mudança seqüencial no código, melhorando sua estrutura e otimização. E o mais importante, para que cada alteração não interrompa o programa, e a quantidade de alterações também deve ser selecionada com muito cuidado. Muitas mudanças são ruins, poucas são longas. A habilidade de refatoração formada dará uma vantagem e eficiência ao programador. Mas para a formação da habilidade você precisa trabalhar com a cabeça e não apenas bisbilhotar. Consegui fazer 4 alterações no programa original e o resultado não foi alterado.
Observe que eu não apaguei os blocos ainda, mas os deixei. Porque Porque se algo der errado, podemos retornar a opção anterior, começando tudo de novo. Mas assim que eu verificar a execução correta do script atualizado, eu os removerei imediatamente para não ser distraído por eles no futuro.Você já reparou? Agora, no bloco "virar para ..." , existe uma variável e isso funciona. I.e. verificamos com o mínimo esforço que essa abordagem funciona. Isso é simplesmente incrível. Agora podemos começar a escrever algoritmos que nos permitirão determinar o objeto de busca da nave mais próxima.O que é útil para nós? Isto é de estruturas de dados - estas são variáveis e listas. Dos algoritmos, este é encontrar o número mínimo (distância) na lista. Também precisamos de um algoritmo que determine o nome do objeto a ser perseguido na distância mínima.Um monte de código será gravado agora. Mas, para não nos afogarmos e nos confundirmos na pilha de scripts mais tarde, precisamos usar outra função interessante: criar nossos próprios blocos. Essa função é muito poderosa, mas raramente é usada por crianças em idade escolar e por alguns programadores, e ainda permite criar um algoritmo de programa compreensível desde a primeira leitura. A propósito, você pode ler sobre as técnicas para criar código compreensível no livro de Martin Fowler, “Refatoração. Melhorando o código existente »Como em qualquer construção em larga escala, precisamos planejar tudo. Vamos planejar em que ordem iremos desenvolver os blocos:- Uma lista dos nomes de todos os navios,
- Cálculo da distância para todos os navios,
- Pesquisa de distância mínima
- Procure o nome do navio para buscar a distância mínima encontrada.
A regra principal é que cada "peça" criada e a alteração devem ser verificadas.Para criar um algoritmo generalizado, precisamos sacrificar algo, por exemplo, os nomes originais dos sprites, teremos que padronizá-los e obter o seguinte layout.E agora estamos prontos para descrever 1 parte do programa. Escrevemos tudo para o 1º navio. Execute esse script separadamente e veja o resultado. Vamos lá!
Se adicionarmos um novo navio, precisamos alterar apenas um dígito nesse algoritmo. Cool Legal!Nós seguimos em frente. E vamos ensinar-lhe 2 algoritmo. Nós olhamos o que aconteceu. Este é imediatamente o resultado final com funções auxiliares.
Viva! Isso funciona. Você pode verificar isso da seguinte forma, deve ser 0 um dos valores na lista de distâncias. Se não for esse o caso, procure um erro.Nós estamos indo além! Procure a distância mínima. Percebeu que a distância é sempre positiva. E sempre haverá um número mínimo - 0. Ay-ya-yay! A conclusão é procurar um mínimo, mas não zero. Você pode tentar e otimizar o código sozinho, para não calcular a distância do navio 1 ao navio 1 (isso não é um erro de digitação).
Nós treinamos o sprite da nova função e a obtemos.
Não se esqueça de conferir! Para fazer isso, você pode até parar o jogo e executar um script separado.Escrevemos tudo o que é necessário, agora o principal é usar essas funções corretamente.
Se tudo funcionar corretamente para você, você deverá ver o seguinte:Percebeu que o navio com "inteligência artificial" está dividido entre diferentes oponentes. Você pode melhorar o programa e complicar a tomada de decisão. Por exemplo, se o navio perseguido ainda tem pouca vida útil, ele o termina e, se for encontrado mais perto e com menos saúde, acabe com os mais fracos primeiro.A propósito, neste programa você pode reduzir o número de ações e melhorar os algoritmos. Tente sua mão. Você pode obter este programa aqui .Resumir
Aqui, nesses casos, aprendi como o Scratch permite que os alunos aprendam rapidamente muitas técnicas de programação reais. Nele, você pode falar sobre o trabalho de seções críticas, sobre algoritmos generalizados, sobre variáveis e seu escopo, sobre como criar seus próprios blocos e estruturar seu código. E também neste idioma você pode falar sobre habilidades profissionais, por exemplo, refatoração.Essa é apenas uma pequena parte do kit de ferramentas do programador, mas é muito importante. E no Scratch está ficando um pouco mais fácil de explicar. Source: https://habr.com/ru/post/pt399495/
All Articles