Scratch para los avanzados

Scratch es un lenguaje de programación orientado a la vista para niños. Existe la opinión de que este es un lenguaje para niños con el fin de jugar "programación" y no se puede sacar nada bueno de él. Cuando comencé a impartir clases para niños en Scratch, me pareció una persona con dos estudios técnicos superiores. Sin embargo, después de un tiempo tuve que cambiar de opinión. Resultó que incluso en el lenguaje de programación de este niño, hay chips ocultos que pueden usarse seriamente incluso cuando se aprende la programación profesional. Quiero compartir contigo mis descubrimientos.

Clonación y Variables en Scratch


A mi alumno le gustó el juego: "Zombis contra plantas" . Y estaba interesado en programarlo él mismo. ¿Recordemos cómo funciona este juego? En el lado derecho, tenemos una línea de plantas que dispara a los zombis que se acercan.

Hay muchas soluciones a este problema, pero en mi opinión, una solución más elegante es usar el mínimo número posible de sprites, es decir. usar clonación

¿Cómo hacer que cada clon individual tenga su propio nivel de vida? ¿Qué seleccionar variables o listas? Intentaron usar listas, pero después de un estudio más detallado, se dieron cuenta de que esta estructura de datos no ayuda a resolver el problema. Las variables y las listas en Scratch tienen 2 tipos de visibilidad para cada tipo de datos: esto es "para todos los sprites"o "solo por este sprite" . Tuve que verificar el alcance. Comenzamos con las variables.

Habiendo alcanzado la versión de trabajo de la variable con el alcance "solo para este sprite" . En los lenguajes de programación clásicos, este tipo de visibilidad se denomina local o privado, según el contexto.

La vida más variable en Scratch


Resulta que si esta variable con un alcance dado se usa en el clon, entonces se crea una instancia de la variable en el clon que pertenece al clon particular y que se usa para los cálculos internos / operación del clon. En nuestro caso, cada clon tiene su propia "vida". Si se volvió interesante, le aconsejo que consulte el directorio . Y aquí hay una imagen que muestra cómo funcionan los sprites o clones con variables de diferentes tipos de visibilidad.

Ámbitos de variables y listas en Scratch.  Y sus fronteras
La variable con el alcance para todos los sprites (la imagen de la izquierda) es una para todos. Por cierto, aquí puedes ver el trabajo con secciones críticas con niños y la carrera por un recurso. Y si el alcance de la variable es "solo para este sprite", entonces el sprite y sus clones tienen su propia variable con el mismo nombre con el que trabajan (figura de la derecha). Y los clones no tienen acceso a la variable original y a la variable de otro clon.
Este fue un descubrimiento inesperado y agradable de las propiedades de Scratch para crear tales algoritmos.

IMPORTANTE: Una variable es una herramienta muy poderosa de un programador real, por lo que enseño inmediatamente a los niños el nombre correcto de las variables, ya que esta habilidad los ayudará en proyectos de diversa complejidad.

Nombres de objetos como sus identificadores.


IMPORTANTE: todas las variables con una zona de visibilidad "solo para este sprite".

Esta herramienta fue completamente inesperada para mí. Comencemos con una historia sobre cómo un estudiante y yo encontramos esta característica del lenguaje. Mi estudiante decidió crear un juego con "inteligencia artificial". El juego representa la guerra de las galaxias en naves espaciales y el jugador tiene la capacidad de controlar una nave, mientras que los oponentes te persiguen a ti y a los demás. Para que puedan perseguirte a ti o al otro, de alguna manera deben decidir a quién perseguir. Este problema se puede resolver en la frente y establecer el orden de búsqueda de las naves, pero el juego perderá su inteligencia y se aburrirá rápidamente. Por lo tanto, el estudiante decidió ajustar el intelecto para que las naves con inteligencia persiguieran al enemigo más cercano. Veamos cómo comenzó a resolver este problema.

Solución de oscilación para cambiar entre sprites a la distancia mínima

En mi opinión, una buena solución para crear un prototipo rápido. ¿Pero cuáles son las limitaciones? Primero, la complejidad del código a medida que agrega nuevas naves. Por lo tanto, la complejidad del código aumenta y las mutaciones del código debido a la complejidad no se descartan. El tiempo para buscar errores y depurar el algoritmo aumentará. Y, por supuesto, nadie ha cancelado una métrica tan genial como el envejecimiento del código (desarrollo SW de nivel avanzado). Que hacer Y debe hacer lo siguiente, debe crear un algoritmo generalizado que se adapte dinámicamente para aumentar o disminuir el número de barcos.

Para este algoritmo, necesitamos una propiedad de lenguaje: un nombre como identificador para un objeto. Ha llegado el momento de grandes cambios y aquí, usted, como profesor, puede hablar sobre una refactorización. Este es un cambio secuencial en el código, mejorando su estructura y su optimización. Y lo más importante, para que cada cambio no rompa el programa, y ​​la cantidad de cambio también debe seleccionarse con mucho cuidado. Demasiados cambios son malos, muy pocos son largos. La habilidad de refactorización formada dará una ventaja y eficiencia al programador. Pero para la formación de la habilidad necesitas trabajar con la cabeza y no solo hurgar. Logré hacer 4 cambios en el programa original y el resultado no cambió.

Estamos tratando de cambiar la solución y usar la rotación hacia el objeto por nombre

Tenga en cuenta que todavía no he eliminado bloques, pero los dejé. Por qué Porque si algo sale mal, podemos devolver la opción anterior, comenzando de nuevo. Pero tan pronto como verifique la ejecución correcta del script actualizado, los eliminaré de inmediato para no distraerme en el futuro.

¿Te has dado cuenta? Ahora en el bloque "convertir a ..." hay una variable y esto funciona. Es decir comprobamos con un mínimo esfuerzo que este enfoque funciona. Esto es simplemente asombroso. Ahora podemos comenzar a escribir algoritmos que nos permitirán determinar el objeto de búsqueda del barco más cercano.

¿Qué es útil para nosotros? Esto es de estructuras de datos: son variables y listas. De los algoritmos, esto es encontrar el número mínimo (distancia) en la lista. También necesitamos un algoritmo que determine el nombre del objeto a perseguir a la distancia mínima.

Se escribirá mucho código ahora. Pero para no ahogarnos y confundirnos en el montón de scripts más tarde, necesitamos usar otra función genial, es decir, crear nuestros propios bloques. Esta función es muy poderosa, pero rara vez la usan los escolares y algunos programadores, y aún así le permite crear un algoritmo de programa que es comprensible desde la primera lectura. Por cierto, puede leer sobre las técnicas para crear código comprensible en el libro de Martin Fowler "Refactorización". Mejora del código existente »

Como con cualquier construcción a gran escala, necesitamos planificar todo. Planifiquemos en qué orden desarrollaremos los bloques:

  1. Una lista de los nombres de todos los barcos,
  2. Cálculo de la distancia a todos los barcos,
  3. Búsqueda de distancia mínima
  4. Busque el nombre del barco para perseguir la distancia mínima encontrada.

La regla principal es que cada "pieza" creada y el cambio deben ser verificados.

Para crear un algoritmo generalizado, necesitamos sacrificar algo, por ejemplo, los nombres originales de los sprites, tendremos que estandarizarlos y obtener el siguiente diseño.

Se cambiaron los nombres de los sprites.

Y ahora estamos listos para describir 1 parte del programa. Escribimos todo para el primer barco. Ejecute este script por separado y vea el resultado. Vamos!

Nuevo bloque: complete la lista de nombres de barcos

Si agregamos un nuevo barco, necesitamos cambiar solo un dígito en este algoritmo. Genial Genial!

Seguimos conduciendo. Y enseñémosle el algoritmo 2. Miramos lo que pasó. Este es inmediatamente el resultado final con funciones auxiliares.

Nuevo bloque: complete la lista de distancias

¡Hurra! Funciona Puede verificar esto de la siguiente manera, debe ser 0 uno de los valores en la lista de distancias. Si este no es el caso, busque un error.

Iremos más lejos! Busca la distancia mínima. Noté que la distancia siempre es positiva. Y siempre habrá un número mínimo: 0. ¡Ay, sí, sí! La conclusión es buscar un mínimo, pero no cero. Puede probar su mano y optimizar el código usted mismo, para no calcular la distancia desde el barco 1 al barco 1 (esto no es un error tipográfico).

Encuentra el valor mínimo pero no cero

Entrenamos el sprite de la nueva función y lo obtenemos.

Nuevo bloque: Encuentra el nombre del barco por distancia

¡No te olvides de consultar! Para hacer esto, incluso puedes detener el juego y ejecutar un script por separado.

Escribimos todo lo necesario, ahora lo principal es usar estas funciones correctamente.

Algoritmo ensamblado para determinar el barco más cercano.

Si todo funciona correctamente para usted, debería ver lo siguiente:



Noté que la nave con "inteligencia artificial" está dividida entre diferentes oponentes. Puede mejorar el programa y complicar la toma de decisiones. Por ejemplo, si a la nave perseguida le queda poca vida, entonces la termina, y si la encuentra más cerca y con aún menos salud, primero termine con la más débil.

Por cierto, en este programa puedes reducir el número de acciones y mejorar los algoritmos. Prueba tu mano. Puedes obtener este programa aquí .

Para resumir



Aquí, en tales casos, aprendí cómo Scratch permite a los estudiantes aprender rápidamente muchas técnicas de programación reales. En él puede hablar sobre el trabajo de secciones críticas, sobre algoritmos generalizados, sobre variables y su alcance, sobre cómo crear sus propios bloques y estructurar su código. Y también en este idioma puedes hablar sobre habilidades profesionales, por ejemplo, refactorización.

Esta es solo una pequeña parte del kit de herramientas del programador, pero es muy importante. Y en Scratch cada vez es más fácil de explicar.

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


All Articles