Apple ][ Coding Challenge: Fractal Tree

Hola Youtube. Bienvenidos a Codificando Juntos. En el episodio anterior,
programé el juego de la serpiente en Applesoft BASIC en esta
computadora Apple II Plus imprimiendo texto en la pantalla. Hoy estoy muy
emocionada porque ¿adivinen qué vamos a hacer hoy? Gráficos de computadora. (CANTANDO) Codificando juntos. Siempre seremos los mejores
amigos para siempre. Estaré allí cuando sea. Si te sientes mal,
lo haré mejor. Sepa qué medir. El bucle for que tenemos,
la alegría, el placer. Así que vamos a
disfrutar del clima. Estos son los días
que siempre atesoraré. Cariño, estamos programando juntos. Siempre seremos los mejores
amigos para siempre.

Codificando juntos. Codificando juntos. Tengo todo lo que necesito
aquí, mi manual de referencia de Apple II , mi
manual de referencia de programación básica para Applesoft BASIC y mi
nuevo tutorial de Applesoft recién publicado en 1979
. Solo para refrescar su memoria, para
imprimir texto en la pantalla , uso el comando Imprimir. Si quiero dibujar en la
pantalla en lugar de usar la impresión, puedo ingresar al modo de gráficos
con el comando GR. Echemos un
vistazo al tutorial sobre cómo funciona el modo gráfico. Lo primero que
me muestra cómo hacer es cómo configurar el color del televisor. Ahora, uno de estos
días, voy a poner mis manos en un televisor a color. Pero por ahora, solo tengo
este monitor monocromático. Buenas noticias para usted, la
forma en que estoy capturando la salida
del Apple II a través de un convertidor
analógico a HDMI y en una PC moderna con
Open Broadcast Studio, aunque no puedo
verlo, en realidad verá el a todo
color en el video que estás viendo en este momento.

Una de las cosas buenas del
modo de gráficos es que todavía tengo un pequeño
aviso aquí en la parte inferior. Obtengo unas tres
filas de texto para trabajar mientras tengo el
modo de gráficos en la parte superior de la pantalla. Y puedo configurar el
color, intentemos… qué, me dice que es
morado, morado claro, lavanda. Y luego
tracemos un punto, 0,0. Mira eso. ¿Es morado? No sé. Veo
verde justo aquí. Pero probablemente estés
viendo púrpura en la parte superior izquierda, como
Procesamiento o P5, 0,0, arriba a la izquierda. Ahora, ¿cuál es la
resolución de su pantalla? Esa es la esquina superior derecha
, 39 coma 0. Así que tenemos 40 píxeles de
ancho y 40 de abajo. Allí, las cuatro esquinas. También puedo dibujar líneas con
Hline para líneas horizontales y Vline para líneas verticales. Si quiero dibujar una
línea horizontal de 0 a 39, esas son las posiciones horizontales
en una posición vertical
como 20, ahí vamos. Línea horizontal en el medio. Línea vertical hacia arriba y
hacia abajo en el medio.

Limpia la pantalla. Vuelva al modo de texto. Y aquí estamos. ¿Qué debemos tratar de hacer? ¿Qué tal si programamos
una pelota que rebota? Si recuerdas,
si quiero escribir algún código que
pueda ejecutar, tengo que darle números de línea. Entonces, comencemos con la línea número
10, ingresando al modo de gráficos. Línea número 20, vamos a
crear una x y una y para donde estará la pelota. Luego, en la línea 30, establezcamos
el color, una bonita bola morada. Línea 40, tracemos la bola. Y en la línea 50,
volvamos a la línea 30. Y ahí vamos. La pelota no se mueve porque
necesito agregar una velocidad x y una velocidad y. ¿Y si los hago al azar? Algún valor entre
0 y 3 para la velocidad x. Algún valor entre
0 y 3 para la velocidad y. Podría incluir
números negativos en el azar, pero esto es solo para
fines de demostración. Dejaré eso como un desafío
para que pruebes en un emulador.

Ahora, justo después de
trazar la posición xy, hagamos que x incremente la
velocidad x y la velocidad y. Intentemos ejecutar esto. Oh, error de sintaxis en la línea 25. Así que esto es algo que
he notado mucho al programar en Applesoft BASIC. Hay
muchas palabras reservadas. Y si alguna vez uso
esas palabras reservadas incluso como parte de un
nombre de variable, puedo tener problemas. Así que intentemos xs
solo para x velocidad. También podría usar dx o delta
x o vx para la velocidad x. Me gusta vx en realidad. Esos deberían ser los
cambios que necesito hacer. Mira eso. Empezó a moverse. Y es aleatorio y
diferente cada vez. Pero recibo un
error de cantidad ilegal. ¿Porqué es eso? Porque he dejado los límites
de donde se me permite dibujar. Entonces puedo agregar una declaración if.

Sobreescribamos la línea 50 y digamos,
si x es mayor que 39, entonces vx es igual a vx por menos 1. Eso debería invertir la
dirección de la velocidad x. ¿Puedo realmente decir un o? Creo que podría poner un
o aquí porque también quiero hacer esto. Si es o si x es
menor que 0, entonces vx es igual a vx por menos 1. Y luego 60, bueno,
hagámoslo 70 porque sé que voy a hacer una y.

También vamos
a decir ir a 30. Así que todavía tenemos una
cantidad ilegal. ¿Es porque
no he hecho el y todavía? Me gusta cómo
parece que es como tratar de dibujar algo más
allá de donde puede, y puso estos signos de libra. Intentemos agregar la y. ¿Sabes cuál es el problema? Si x es mayor que
39, eso significa que es 40. ¿Y qué fue lo
último que hice? Parcela xy.

Así que en realidad
me permití tratar de trazarlo en la columna
40, que no existe. Hay diferentes formas en
que podría manejar esto, tal vez mayores o iguales. Pero ahora mismo, por motivos de simplicidad
, hagamos que el límite sea
38 y menor que 1. Luego, hagamos la y. ¿Qué he hecho aquí? Eché a perder mi número de línea. Así que la línea 50 todavía está ahí. Ahora, tengo que cambiar x e
y, verificar x, verificar y. Y ahora,
necesito decir en la línea 80. Y en realidad no
necesito configurar el color nuevamente. Entonces puedo ir a la línea 40. Vaya, mira eso. Ahí está mi
pelota que rebota o mi araña gigante. Y finalmente ha
cubierto todo el terreno de a dónde irá,
y simplemente se sobrescribe a sí mismo. Ahora, por supuesto,
probablemente estés notando que está dibujando un rastro. No estoy borrando el
fondo como podría hacerlo en, por ejemplo, Procesamiento o P5. Esto es en realidad un gran
tema de discusión. Damos por sentado
ese procesamiento y en JavaScript, hay un
cuadro de animación de solicitud, ese controlador, lo que se conoce como
animación de doble búfer.

Siempre hay un
búfer de memoria fuera de la pantalla de lo que se
dibuja en la pantalla que puede intercambiarse para que
no veamos estos pasos intermedios de borrar, dibujar, borrar, dibujar. Si alguna vez ha visto
parpadear un programa de gráficos por computadora , es porque la
animación de doble búfer no está implementada correctamente. Esto es algo sobre lo
que realmente creo que me gustaría hacer otro
video, cómo hacer una animación de doble búfer. Tal vez pueda crear un
renderizador 3D simple en BASIC. Oh, eso sería divertido.

Pero por ahora, veamos
cómo borrar la posición anterior de la
bola para que solo veamos una moviéndose. Entonces, ¿qué tal si justo
antes de cambiar x e y, guardo la posición anterior de
x e y? Digamos que x anterior es igual a
x, y anterior es igual a y. Luego, en la línea 30,
establezcamos el color en negro y tracemos la
x anterior y la y anterior. De esa manera, después de haber
cambiado x e y, puedo volver a establecer el color, y dejar
que sea blanco por ahora porque en realidad
no tengo idea de cómo se ve en lo que estás viendo. Solo para asegurarme de que tengo
algo que funciona , establezcamos el color en 15. Y luego, en la línea 55,
tracemos x coma y.

Veamos qué pasa. Así que esto está funcionando. Pero no está borrando
la posición anterior. Y obtuve un
error de cantidad ilegal en 55. 55 es la trama xy. Vamos a depurar esto
imprimiendo los valores de x e y en la línea 52, seguidos
de un espacio y luego de y. Esto ahora está funcionando muy bien. Parece que mis valores aleatorios
eran un poco raros allí. Sí, ahí vamos. Así que obtuve un número negativo.

Claramente, algo
salió mal allí, probablemente debido
a la forma en que estoy usando valores de punto flotante. Podría simplemente, en cualquier momento
que llegue al borde, si pasara un poco
, podría deslizarlo de regreso a la última columna, última
fila, primera columna, primera fila. Vamos a hacer eso. Entonces, en la línea 60, en
lugar de solo invertir la x, necesito invertir la
x y volver a colocar la x en una posición. Necesito hacer dos cosas, lo que
significa que necesito una subrutina. Y lo mismo para la línea 70. La primera subrutina,
inversa vx. Si x es menor que uno, en
realidad puedo volver a establecer x en 0. Oh, me doy cuenta de que
esto también resolverá
el problema de usar 38 y 1 como límite. Pero no nos preocupemos
por eso ahora. Si x es menor que
1, entonces x es igual a 0.

Si x es mayor que
39, entonces x es igual a 39. Regresa. ¿Que pasa conmigo? Estoy siendo tan inconsistente
con mis bordes. Veamos si esto funciona. ¡Vaya! Oh, creo que me olvidé de devolver. Aquí vamos. No hay errores, no importa lo que haga. Todavía no borra la
posición anterior correctamente. Permítanme arreglar todos los límites
para que sean lo que deberían ser. 48? ¿Cómo llegó a ser 48? Realmente debería estar
trazando x e y después de hacer
esto porque aquí es donde están mis restricciones ahora. Entonces podemos deshacernos de esta huella. Me siento bastante seguro ahora. Podemos deshacernos de la
línea 50, la línea 55. Y en la 75, podemos decir Plot. Podemos decir Color
15, Parcela x coma y. Por cierto, puedo enumerar una sola
línea de código diciendo Lista 75. Y olvidé los iguales. ¿Error de cantidad ilegal en 75? Oh Dios mío. Iría sub 1000 también en la línea 70. Allá vamos. Ahora, tengo mi
pelota perfecta para rebotar. Simplemente no estoy borrando
la posición anterior. ¿Cómo voy a hacer eso? Oh, no. Veo el problema.

Mi lógica es 100% correcta. Ir a 40 es donde trazo px, py. 30 es donde configuro
el color en negro. Ahí vamos, todos. ¿Sabes lo que
deberíamos hacer que haga? Deberíamos hacer que emita un pitido
cuando toque el borde. ¿Cómo hago un sonido? Sonido es igual a Peek. Oh, me vendría bien un Peek. Veamos nuestros Peeks. Hacer clic en el altavoz es 49200. Eso me da un
error de sintaxis probablemente porque, como
me dice aquí, necesito configurarlo en una variable. ¿Escuchaste algo? no lo hice ¿Escuchaste ese zumbido? me encanta eso Bien, escribamos
otra subrutina. Y luego quiero llamar a esta
subrutina de zumbido en las subrutinas de límite x e y. Aquí vamos.

Ese es el
sonido más satisfactorio que existe. Esto es demasiado divertido. Hay tantas cosas que podría hacer aquí. Podríamos intentar crear
Pong, Brick Out. Podríamos hacer una versión más elegante
del juego de la serpiente con color. No me detendré aquí
porque, si bien les he mostrado GR, el modo de gráficos,
tengo algo aún más emocionante y futurista que
mostrarles, gráficos de alta resolución. ¿Qué pasa si ahora digo trama. Bueno, establezcamos el
color nuevamente en 15. ¿Qué pasa si digo plot 10 comma 10 ? No veo nada. Hplot 10 coma 10? Oh, mira eso. Un pequeño punto allí arriba
en gráficos de alta resolución. Asombroso. Vamos a necesitar una
pizarra para esto. Gráficos de alta resolución. Para
gráficos de alta resolución, en lugar de tener una
cuadrícula de baja resolución de 40 por 40, ahora tengo un lienzo
para dibujar que tiene 280 píxeles de ancho
por 160 píxeles de alto.

Y creo que
HGR2 me permitirá dibujar 20
píxeles más a continuación. Pero me gusta tener mi capacidad
de tener un símbolo del sistema aquí. Y como hemos visto, en
lugar de plot, ahora tengo
Plot de alta resolución o Hplot. Dice aquí, ahora, los gráficos de alta resolución en cuanto a color
son realmente maravillosos,
pero tienes que hacer algunos sacrificios
para poder usarlos. Hay menos
colores disponibles. Los colores de alta resolución van
desde 0, negro, hasta 7, blanco. Vamos a establecer el color en
blanco solo para comenzar. Ahora, veamos si podemos
dibujar una línea desde la parte superior izquierda hasta la parte inferior derecha. Con 280 por 160, los píxeles del borde
son índice 279, 159. Oh, mira esa hermosa línea. Esto me da muchas ganas
de hacer un bucle for y dibujar algunas
líneas giratorias. Voy a borrar nuestro
programa de pelota que rebota diciendo Nuevo. Así que hagamos un bucle,
donde x va de 0 a 279. Dibujemos de x coma 0
a 297 menos x coma 159. ¿Me permitirá hacer eso? 40 Siguiente x. Hagamos que el paso sea
un poco más alto.

Simplemente no sé
dónde puse eso. Déjame mirar aquí. Acabo de ponerlo
con el bucle for. Así que puedo decir en la línea 20,
x es igual a 0 a 279 paso 5. Impresionante. Probablemente debería parar aquí. Pero quiero probar algo
bastante alto grado de dificultad. ¿Puedo hacer mi
desafío de codificación, un árbol fractal , aquí mismo en Applesoft BASIC
en esta computadora Apple II Plus? Ahora, no tengo
acceso a Push. No tengo acceso a Pop. No tengo Rotar. Pero creo que puedo
hacerlo con Línea y algo de trigonometría básica.

¿Qué pasaría si comenzara a dibujar
una línea desde el medio inferior aquí hasta el centro? Entonces digamos que lo que
quiero hacer es dibujar la siguiente línea la mitad de larga pero
girada, digamos, 45 grados. ¿Que significa eso? No nos preocupemos por
reducir la línea. Sabemos que esto es alrededor de 80 píxeles. Entonces, ¿cuál es el desplazamiento
de x y el desplazamiento de y para encontrar el siguiente punto? Sin duda, esto es algo
que he cubierto extensamente en videos sobre
coordenadas polares y trigonometría. Me aseguraré de incluir
un montón de recursos y referencias a esos
videos junto con este. Pero la
respuesta rápida aquí es si conozco este ángulo usando la
letra griega theta para anotarlo, el seno de ese ángulo
es el lado opuesto y dividido por la longitud de esta
línea, que acabo de decir que era 80. El coseno de este ángulo es el
el lado adyacente x dividido por 80.

Entonces, puedo
obtener estas compensaciones para encontrar este
punto diciendo que x es igual a 80 veces el coseno de
ese ángulo y es igual a 80 veces el seno de ese ángulo. Esta va a ser la longitud
de una rama dada del árbol. Y luego necesito encontrar
la siguiente rama del árbol dibujando una línea
desde su punto final hasta un nuevo punto
desplazado por un ángulo. Veamos si puedo hacer que
funcione en un programa BASIC. Empecemos nuevamente. Entra HGR. Establezca el color en 3. Simplemente haga que todo sea blanco. Necesito un largo. ¿Cuál es la longitud de
esta primera rama? ¿Qué dije, 80? Entonces necesito dibujar una línea. Si finalmente voy a
comenzar a dibujar este patrón de árbol, necesito comenzar con este
punto, moverlo a este punto y luego moverlo a este punto. Así que necesito una variable para eso. Llamemos a eso
x, que estaría en la parte inferior, 159, ey, que
estaría en el medio, 140.

Perdón por interrumpir. No sé lo
que estaba pensando. Pero escribí x es
159 ey es 140. La horizontal del medio es 140. Eso es lo que debería ser x. La y inferior debería ser 159. Va a estar mal durante
el resto de este video. Será un poco torcido,
pero entiendes la idea. Me aseguraré de corregirlo
en cualquier código que publique.

50 parcela de xy a xy menos l. Ahí está mi línea. ¿Es realmente el medio? No, ese no es el medio. Intercambia las x
y las y, Shiffman. Aproximadamente, hagamos
que la longitud del arco sea menor. Comienza en 50. Ahora, ¿qué estoy haciendo aquí?
dx es igual a la longitud por el coseno de un ángulo. Y digamos que el ángulo
es de unos 45 grados, que es de 90 grados es de aproximadamente 1,5
radianes, 1,6, se divide por la mitad. Llamémoslo simplemente
0.7 para una aproximación. Y, de hecho, hagamos que sea
una variable, a para el ángulo, y dy es la longitud por el
seno de ese ángulo. Establezcamos el
ángulo en la línea 25.

El ángulo es 0.7. Una vez que hayamos dibujado esa
primera línea, vamos a mover y. Y luego la siguiente línea
será Hplot x comma y to x plus dx comma y plus dy. Echemos un vistazo
a todo este asunto. Entonces, en teoría, estoy dibujando una línea
desde la parte inferior hasta la mitad y luego calculo el
desplazamiento en función de algún ángulo y dibujo una nueva línea
hasta ese nuevo punto. Bien, entonces, ¿en qué
me equivoqué aquí? El ángulo es en realidad
este ángulo de aquí. Y quiero que sea
este ángulo aquí arriba. Así que creo que puedo
invertir lo que estoy haciendo con y y decir Hplot xy to x
plus dx, y minus dy. Mucho mejor. Esto se parece a los
comienzos de mi árbol. Así que ahora tengo las matemáticas
que necesito para ramificar. Pero necesito algún tipo de bucle. Porque en última instancia,
quiero adjuntar otra rama a esta rama. Y también quiero tener otro
que va en la otra dirección, si has mirado mis
videos de recursión fractal.

Comienzo con esta línea,
adjunto dos líneas a esa línea, y a esas, adjunto
dos más, y a esas, adjunto dos más,
y así sucesivamente. Este es un proceso
conocido como recursividad. Y nuevamente, tengo varios
videos donde cubro esto mucho más extensamente. La pregunta es ¿puedo
hacer recursividad en BASIC en esta computadora Apple II? Creo que sí. Primero lo primero. Necesito una subrutina para
dibujar cada línea del árbol.

Y voy a
poner eso en 1,000. De hecho, en 1000,
voy a calcular dx y dy. Entonces pongamos en una
variable la siguiente posición xy. Lo pondré en una
línea, menos dy. Y luego vamos a dibujar. Bueno, solo voy a
poner la línea 1900 Return. Ya no quiero 50, 55, 60,
ni 70, ni 80. Entonces, en la línea 50, digo GoSub 1000. Y luego, en la línea 60,
voy a decir Fin.

Cuando vuelva
, estará hecho. OK, así que tengo esa línea. Oh, porque el ángulo, a la
derecha, esa primera línea, ahora es una rama a la derecha. Entonces, de hecho, hagamos que
el ángulo comience en cero. Y tengamos una variable
para el ángulo delta. Voy a llamar a eso da. Veremos dónde entra eso. Pero ahora, está bien, lo está
haciendo horizontalmente. Aquí es donde
todo se invierte porque mi eje y es
realmente mi eje x, lo cual es un poco incómodo. Pero creo que va a
haber una forma fácil y rápida de resolver esto cambiando en última
instancia el seno y el coseno o la x y la y. No sé qué va a
ser lo menos confuso para mí.

¿Sabes que? También podría comenzar el
ángulo en 90 grados. Eso es aproximadamente pi por
0,5 con mi ángulo delta. ¿Y sabes qué? Esto debería estar en una
línea de código separada porque voy a querer
cambiar ese ángulo delta con bastante frecuencia. Así que hagamos esa línea 27. Ahí vamos. Tengo la primera
rama del árbol. Muy bien, ¿qué hago ahora? Tan pronto como dibujo esa
línea, lo siguiente que hago es mover xy a su siguiente posición,
alterar el ángulo, ¿y luego qué? GoSub 1000. Hazlo de nuevo. Entonces, dentro de esta subrutina
que comienza en la línea 1000, voy a reiniciar
la subrutina. Sólo necesito una condición de salida. Si acabo de decir GoSub 1000,
lo hará para siempre. Entonces, ¿qué más puedo hacer aquí? Además de cambiar el
ángulo, reduzcamos la longitud.

Así que agreguemos otra variable. Llamémoslo psiquiatra. Entonces, cada nueva línea tendrá
aproximadamente 2/3 de la longitud. Y así, en la línea 1060,
longitud es igual a longitud por reducción y luego GoSub 1000. Oh, no, no. Si l es mayor que 10,
entonces GoSub 1000 siempre que haya más de 10 píxeles. Así que calcula el desplazamiento. Obtener la nueva posición. Dibujar la línea. Mover al siguiente lugar. Cambia el ángulo. Cambia la longitud
y hazlo de nuevo. Ese es un lado del árbol. Mira eso. Así que ahora, solo necesito
ir también al otro lado. Inmediatamente después de usar GoSub 1000,
¿qué debo hacer? Necesito girar hacia atrás en
la otra dirección. Eso sería 1080.

A es igual a– Acabo de
cambiarlo por da. a menos da por 2. 1090, si l es mayor
que 10, entonces GoSub 1000. Bueno, desafortunadamente,
tengo un problema. Además de
invertir el ángulo, también tengo que volver
a la posición anterior. No creo que
esto vaya a funcionar. Creo que voy
a necesitar una matriz para realizar un seguimiento de todas
las posiciones anteriores. Pero en teoría, podría
decir que x es igual a x menos dx, y es igual a y menos dy es
lo que quiero deshacer. Después de dibujar
la segunda línea, necesito volver
al ángulo original y reducir la longitud,
agregar da atrás y decir l es igual a l dividido por Shrink. Oh, tipo de llegar allí. Pero mira, todas mis
posiciones están mal. Así que este es el principal problema. Esta simple resta
no me está llevando al lugar correcto.

Necesito una matriz para
realizar un seguimiento de lo que se conoce como una pila de todas
las posiciones anteriores. Y de hecho, algo
que puedo usar es esta idea de un nivel. Esto tal vez sería el
nivel 0 del árbol. Este es el nivel 1 del
árbol, 2, 3, etcétera. Así que cada
generación, también podría llamar a esa generación,
es algo de lo que quiero hacer un
seguimiento por separado. Entonces, al comienzo
del programa, justo antes de ir a GoSub
1000, agreguemos la línea 45. El nivel es igual a 0. Y también quiero tener
un número máximo de niveles. Bueno, probemos 2 para empezar. Llámalo MaxLev es igual a 2. Luego, en lugar de que mi
condición de salida sea la longitud, hagamos un seguimiento de en qué
nivel del árbol estoy. Entonces, 1070 sería, si el nivel
es inferior al nivel máximo, entonces GoSub 1000.

Y 1090 también sería, si el
nivel es inferior al nivel máximo, entonces GoSub 1000. Luego, cada vez que
obtengo una nueva posición , paso al siguiente nivel . Y después de haber dibujado
esas ramas, vuelvo a un nivel anterior. Hagamos una lista de 1000 a 2000,
así que esta es solo la subrutina. ¿Qué está pasando
en la subrutina? Encuentro el desplazamiento. Obtengo el nuevo puesto. Trazo la línea. Voy a la siguiente posición. Subo el nivel. yo giro Si no estoy al final,
regresa y haz el siguiente. Luego deshacer. Ve por el otro lado. Vuelve y haz el siguiente.

Luego, vuelve de
nuevo al nivel anterior si tienes que continuar. Error de cantidad ilegal en 1030. De nuevo, me voy al espacio exterior. No estoy haciendo un seguimiento de
las posiciones correctamente. Voy a necesitar una matriz. Pongámoslo un poco
torpemente en la línea 48. Recuerde, para una matriz
, uso Dim para la dimensión. Llame al nivel máximo de x. Justo antes de
aumentar el nivel , guardemos la
posición x actual y la posición y actual . Podría usar una
matriz bidimensional aquí, solo tener la
cantidad máxima de niveles y luego dos para la
segunda dimensión en lugar de dos matrices.

Pero de todos modos, esto es un poco
más fácil para mí pensar. Y luego, una vez que haya
vuelto al nivel , debería poder simplemente actualizar
y recuperar esa posición. Estoy seguro de que me estoy perdiendo
algo aquí. OK, no volví a aparecer. Por lo tanto, podría ver esto como
la segunda rama correcta para dos niveles, pero no volvió a
aparecer aquí correctamente. ¿Porqué es eso? Extrañamente, parece que la x
volvió, pero la y no. Así que eso podría ser un error tipográfico. Oh, ya no
necesito hacer esto.

No necesito
intentar retroceder con 1085. Eso es lo que hará mi matriz. Ooh, así es, más cerca. Pero tengo que
volver a allí. ¿Dónde… lo
guardé en el lugar equivocado? Tal vez se supone que debo guardar x
e y antes de obtener nx y ny. Si muevo la línea 1040
a la 1043, mira eso. Oh Dios mío. Estoy seguro de que si cambio
los niveles máximos a tres, aquí hay algún
problema inesperado. Pero esto está muy cerca. El nivel máximo es igual a 3. Oh, Dios mío. Es un árbol fractal
en el Apple II. Oh, esto es asombroso. Está bien, solo vamos. Vamos a por ello. El nivel máximo es igual a, intentemos, 7.

Eso podría ser demasiado ambicioso. Mira qué lento va dibujando
todos los pedacitos a pedacitos. Bueno, ahora ves
lo que es posible con
gráficos de alta resolución, recursión, dibujo de líneas, formas algorítmicas. ¿Puedes hacer tu propio árbol? ¿Puedes alterar los ángulos? Oh, ¿sabes qué sería divertido? Hagamos solo una cosa. Quiero mostrarles cómo puedo
obtener información de mí, el usuario. Tal vez pueda ingresar
un ángulo y un número máximo de ramas o
algo así o un color. Solo hagamos el ángulo. Sólo voy a
entrar en el ángulo. Vamos a enumerar sólo el
comienzo del programa. Entonces, incluso antes de entrar
en el modo de gráficos, realmente desearía que
hubiera… solía haber un comando para volver a numerar todos los números. Y solía ser Renumber.

O Renum. Lo siento, otra vez desde
el futuro otra vez. Parece que el
comando Renumerar que recuerdo con tanto cariño, simplemente
no está disponible cuando el Apple II Plus arranca sin
ningún disco puesto. Pero estoy bastante seguro de que era
parte de DOS 3.3, ProDOS. Si recuerdas, si sabes,
házmelo saber en los comentarios y te vincularé a algunos
recursos sobre cómo renumerar un programa BASIC. Así que tengo que usar
entre 0 y 10. Puedo decir, llamémoslo línea 2. Puedo usar la entrada, y
puedo ingresar una variable, da. Deshagámonos de la línea 27. Y digamos en la línea
5, digamos Input da, 0.5. ¿Es ese un ángulo diferente? Creo que es.

0.1. Hazlo mucho más extremo. Sí, ahí vamos. Sí, así que voy a salir de
la pantalla con eso. No tengo ninguna comprobación de errores. Hagamos 1.5. Vaya, eso es salvaje. Probablemente debería imprimir una consulta
y decir Inicio y todo eso. Así que hagamos esto un
poco más agradable antes de irme. Introduzca un ángulo en radianes. 1 es igual a Casa. Muy bien, vamos a
ejecutar este programa. Te dibujaré un árbol. Introduzca un ángulo en radianes. Me gusta Probemos 2 o 1.8. Esto es demasiado divertido,
pero tengo que parar aquí. Espero
que aceptes lo que he hecho.

Encuentra uno de los emuladores. Los vincularé en
la descripción de este video. Intenta ejecutar este código. Hazlo tuyo. ¿Cómo puedes alterar el árbol? ¿Puedes probar el color? Una de las ventajas que tendrá es
que probablemente se ejecutará un poco más rápido que aquí. ¿Cuál debería ser el tema
del próximo video Coding Together? ¿Debería ser una
animación de doble búfer y un renderizador 3D en este Apple II Plus? ¿Necesitas que
regrese a Procesamiento y P5? Porque yo también podría hacer eso. Déjame saber en los comentarios
en Twitter @Shiffman, @thecodingtrain, cualquiera de estos
lugares donde me puedes encontrar. No puedo esperar a estar
contigo de nuevo programando juntos..

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *