
La historia que contaré comenzó hace 13 años en una lección de informática. Mis amigos de séptimo grado y yo resolvimos todos los problemas en Pascal y nos divertimos jugando el primer Quake. Nuestro maestro vio esto, se me acercó y dijo una sola frase que distorsionó mi imagen del mundo: "Si quieres jugar juegos en la lección, escríbelos tú mismo". Desde entonces ocasionalmente hago juegos. Uno de ellos es un simulador de fútbol, que se discutirá.
Esta es una historia emocionante sobre mi camino como desarrollador, proyectos inacabados y por qué a veces no es necesario completarlos.
Descargo de responsabilidad: desde los eventos descritos en este texto, tomé un curso de desarrollo de Unity y publiqué algunos de mis juegos en Google Play y en la Tienda Windows. Ahora soy el editor del blog Yandex.Money y cuento esta historia para compartir experiencias con la comunidad.
En el desarrollo de juegos en idioma ruso de aquellos tiempos había una característica interesante: MS DOS casi había terminado y los programadores domésticos estaban aserrando activamente juguetes para Windows. Una gran cantidad de simulaciones salieron como un hombre de la computadora, tanques, varias cartas y juegos "lógicos". Y los discos con estos juegos también se vendieron en grandes cantidades. Acerca de cómo se compilaron tales colecciones, poco se escribe en las "Pruebas del probador", pero aún no lo sabía.
Seguramente muchos de ustedes recuerdan este hermoso menú:

La vida, por supuesto, lo palmeó
En uno de estos discos, conocí al entrenador del juego, un administrador de fútbol de texto. Allí podrías tomar un equipo de la Premier League inglesa e intentar llevarlo al campeonato. Y este juego se distribuyó de acuerdo con el modelo shareware: puedes jugar dos temporadas y luego pagar. Por supuesto, no era posible pagar de ninguna manera, porque para esto era necesario enviar una transferencia bancaria al creador del juego, y a los 13 años, no vas al banco, ni siquiera lo piensas. Yandex.Money ya existía, pero hasta que apareció el Cajero, quedaban 8 años, por lo que también era un inconveniente. Mis amigos y yo jugamos durante dos temporadas, y luego comenzamos de nuevo.
Tuve que buscar una solución, y en el proceso escribí uno de mis primeros juegos: Entrenador, con una liga rusa más interesante para mí, una copa y un montón de errores. No cambié el nombre, simplemente cambié el deuce a tres. Resultó así:
Entrenador 3 v2.52
¿Qué necesita cualquier equipo de fútbol? Por supuesto, los jugadores. Naturalmente, nadie sabía de ninguna licencia para clubes y jugadores: nos reunimos con un compañero de clase e hicimos listas de equipos de memoria. Por lo tanto, por ejemplo, CSKA y Spartak todavía tenían 11 personas cada uno (sí, era un simulador sin reemplazos), pero Luch-Energia de Vladivostok se quedó con dados vacíos en lugar de jugadores.
Como recuerdo ahora: 2005, me armé con un libro de texto de ciencias de la computación para el grado 9 (era casi mi Visual Basic 6 favorito) y abrí el editor de formularios; aprendí la palabra IDE mucho más tarde. Dibujó un botón en el formulario, hizo clic y abrió el editor de código. Lleno de orgullo en mí mismo, escribí
Private Sub Command1_Click() End End Sub
y haga clic en "Ejecutar". Todo funcionó y realmente me agradó. Después de un tiempo, apareció un simulador de fútbol basado en texto: Coach v2.52.

Abogados de RPL, si lees esto: este juego nunca se ha publicado ni vendido por dinero
Entonces me pareció que esta es la perla del código del programa. Por supuesto, en ese momento no sabía mucho y, por ejemplo, las clasificaciones se almacenaban en seis matrices de Label directamente en el formulario. Sin guardar, sin matrices variables, solo hardcore. Naturalmente, surgieron errores extraños debido a esto:

Todos los equipos jugaron 2 partidos, pero algunos de ellos 3, y otros uno a la vez.

También puedes comprar Roy Keane y Andriy Shevchenko en Spartak. No estoy seguro de lo que era en al menos un simulador de fútbol de esa época
En general, imagine que ha olvidado por completo cómo usar bases de datos, escribir algo en archivos de texto y almacenar datos en matrices. Lo único que queda son los controles en los formularios. Miedo Y de alguna manera los días de la semana del estudiante de séptimo grado parecían haber decidido que podía jugar.
No tenía la fuente de esta versión, pero estoy seguro de que había algo como esto:
m = Form1.Label5(0).Caption Form2.Label3(m).Caption = Form2.Label3(m).Caption + 3
Algunas características de VB6 no se escribieron en el libro de texto. Por lo tanto, por ejemplo, cuando descubrí que Shape se puede verter de diferentes maneras, hice una ventana completa para esto con la elección del césped en el estadio del club:

¿Serías capaz de cortar el césped en una flauta de tubos de transmisión web?
Moralidad importante n. ° 1: explore el poder de las herramientas que utiliza todos los días.
Estaba seguro de que algún día enviaría este juego a algún tipo de juego múltiple, por eso incluso escribí un certificado. Por supuesto, luego fue visto por dos probadores y medio. Pero como sucedió, que se publique.
readme.txtCoach 3 V2.08 - Edición 2006
Hola Gracias por comprar este juego.
1.Instalación
2.Requisitos del sistema
3. plataforma de prueba
4. Qué hay de nuevo
5.Consejos
6. Desinstalación
7.Muchas gracias ...
1.Instalación
Ejecute Setup.exe y descomprima los archivos en una carpeta con: \ Archivos de programa \ Football Manager 2005
Y luego descomprima el archivo setup2.exe
2.Requisitos del sistema
No P4-2500. Todo es extremadamente simple.
Pentium 1-233 MHz (se recomienda 300 o superior)
HDD 5MB
16 MB de RAM (se recomienda 32 o superior)
Video 16 MB
Windows 9x, Me, NT, 2003, Longhorn. En XP, solo funciona si el archivo msvbvm60.dll está en el directorio raíz con: \ windows \ system
El raton.
3. plataforma de prueba
Celeron 1100 MHz
160 MB de RAM
Video 16MB
Windows XP SP2
4. Qué hay de nuevo.
Hizo muchas cosas nuevas.
Por ejemplo, ahora en el campeonato de Rusia participan 14 (!) Equipos en lugar de 8.
El diálogo "Equipo" ha cambiado, ha aparecido un menú sobre el entrenador del club.
¡Ahora el juego depende de tácticas!
Fuertes rivales.
Por primera vez desde el Entrenador 1, normalmente se le otorgan puntos.
Liga de Campeones Supercopa de Rusia.
5. Consejos.
No modifique ni elimine archivos de la carpeta con: \ archivos de programa \ football manager 2005 \ clubs \ emblems
Después de la instalación, copie el archivo MSVBVM60.DLL a la carpeta c: \ windows \ system
6. Desinstalación
No se requiere desinstalación. Solo borra la carpeta del juego.
7.Muchas gracias ...
Kusherbayev Daniyar para pruebas beta.
Karneyev Mikhail, Trofimenko Mikhail para pruebas beta y valiosos consejos.
Para rfpl.org para la forma de los equipos de la Premier League.
27/01/06
PD: ¡El nuestro ganará!
Si supiera que regresaría a este proyecto en los próximos 13 años, entonces, por supuesto, sería más responsable de preservar todo lo que esté relacionado con él. Sin embargo, Coach 2.5 ha permanecido en la historia y se inicia incluso ahora, directamente desde la carpeta, que se llama así:
E:\prod\dev\My_old_dev_projects\Dev\ ,
Seguramente había versiones anteriores, pero no tenía dónde hacer copias de seguridad en ese momento, y las fuentes hasta 2005, junto con sus versiones anteriores, una vez se perdieron cuando un disco duro de 2.3 gigabytes se bloqueó. suspira nostalgia Y recuerda, cuando poner Blood 2, tuviste que borrar Age of Empires 2?

Captura de pantalla de la versión 1.62. Si Windows 10 1803 se lanzó en 2004, entonces no habría dejado esta acción
Moraleja importante n. ° 2: hacer copias de seguridad.
Bueno y lo más importante: la jugabilidad. Eventos aleatorios, independientes de cualquier cosa: eso es lo que llamó la atención de las largas horas de desarrollo y pruebas. Y lo probamos así: jugamos hasta que algo gracioso se cayó.

No preguntes qué son los puntos de ataque. No me acuerdo
¿Ves esta nerviosa caja rosa? Ahora contaré sobre él.
Shinnik y simulador visual de fútbol
Junto con Coach, se distribuyeron dos juegos más en esos discos. El primero, "FC Shinnik" de Yevgeny Sharov, fue una gestión mediocre del equipo, pero se podía ver el partido. A juzgar por los créditos, también se hizo durante bastante tiempo, de 1996 a 2000. El segundo juego fue el dosovskiy "Football 4x4", no había absolutamente nada impresionante allí, excepto por los corredores, pero me fascinó tanto que decidí hacer lo mismo. juego para ti mismo.
Al principio, debido a la falta de experiencia, apareció una caja rosa. Se movió por el campo, indicando dónde estaba pasando el juego. Y, como, incluso influyó en algo. Esto no fue suficiente y realicé el segundo proyecto de fútbol en mi vida: Football View.

Sí, sí, estos son carteles manchados. En la última década, fue de alguna manera más simple.
Riddle: ¿cómo mover a los jugadores por el campo constantemente, cuando no puedes colgar un guión separado para cada uno, que tendrá en cuenta la posición, los vecinos y la distancia al balón? La solución es usar el temporizador y girar a los jugadores en el bucle, cambiándolos aleatoriamente al ancho del sprite. El código es directo de 2005, así que ahora estoy muy avergonzado.
Private Sub Igroki_Timer() k = k + 1 ′ For i = 1 To 8 Randomize (x) x = Int(Rnd * 4) If x = 1 Then Image2(i).Top = Image2(i).Top — 360 If x = 2 Then Image2(i).Top = Image2(i).Top + 360 If x = 3 Then Image2(i).Left = Image2(i).Left + 360 If x = 4 Then Image2(i).Left = Image2(i).Left — 360 y = Int(Rnd * 4) If y = 1 Then Image3(i).Top = Image3(i).Top — 360 If y = 2 Then Image3(i).Top = Image3(i).Top + 360 If y = 3 Then Image3(i).Left = Image3(i).Left — 360 If y = 4 Then Image3(i).Left = Image3(i).Left + 360 ′ If Image2(i).Top = Image1.Top And Image2(i).Left = Image1.Left Then Igroki.Enabled = False: pas_vpravo.Enabled = True If Image3(i).Top = Image1.Top And Image3(i).Left = Image1.Left Then Igroki.Enabled = False: pas_vlevo.Enabled = True ' If Image2(i).Top <= 1080 Then Image2(i).Top = Image2(i).Top + 720 If Image3(i).Top <= 1080 Then Image3(i).Top = Image3(i).Top + 720 If Image2(i).Top >= 4320 Then Image2(i).Top = Image2(i).Top — 720 If Image3(i).Top >= 4320 Then Image3(i).Top = Image3(i).Top — 720 ′ If Image2(i).Left <= 480 Then Image2(i).Left = Image2(i).Left + 3720 If Image3(i).Left <= 480 Then Image3(i).Left = Image3(i).Left + 3720 If Image2(i).Left >= 6600 Then Image2(i).Left = Image2(i).Left — 3720 If Image3(i).Left >= 6600 Then Image3(i).Left = Image3(i).Left — 3720 Next i End Sub
Moralidad importante # 3: escriba comentarios claros y detallados.
Otro cronómetro comprobó que el partido había terminado:
If Val(Label5.Caption) = "90" And Val(Label2.Caption) > Val(Label1.Caption) Then MsgBox (" . " + Label3.Caption): End
Y ahora, lo peor. La pelota se movió por el campo con cuatro temporizadores, que se llamaron pas_vverh, pas_vniz, pas_vpravo y pas_vlevo. Algunos ahora tenían un ojo tembloroso, otros acudieron urgentemente a volver a leer Straustrup, otros hicieron una pregunta tonta: "Pero vemos que en el GIF la pelota no se mueve hacia arriba y hacia abajo". Por supuesto, porque no pude coordinar correctamente los cuatro temporizadores entre sí.
Estoy mirando el código ahora y entiendo que incluso proporciona un control indirecto de la pelota , pero no funciona.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If (KeyCode = vbKeyLeft) Then pas_vlevo.Enabled = True If (KeyCode = vbKeyRight) Then pas_vpravo.Enabled = True If (KeyCode = vbKeyUp) Then Pas_verh.Enabled = True If (KeyCode = vbKeyDown) Then Pas_vniz.Enabled = True End Sub
Durante el noveno y décimo grado, mi compañero de clase y yo estuvimos ocupados escribiendo un simulador del sistema operativo, por lo que no tuvimos manos en el fútbol. "Sí, esto es pollos para reír", pensé, cuando en 2009 todavía desenterré un viejo ejecutable, "necesito reescribir todo desde cero".
¿Cómo refactorizo no refactorio?
Reescribir desde cero es una gran idea cuando el proyecto es pequeño, y una docena de formas aparecieron en mi cabeza para hacerlo mejor y más conveniente de lo que era. Necesitaba un simulador de fútbol de texto perfecto y, por supuesto, todo salió mal nuevamente.
En 2009, se hizo más fácil con Internet, y fui al sitio web de la Premier League y comencé a pensar en cómo eliminar las alineaciones que estaban almacenadas de esta forma:

Tampoco sabía cómo capturar, analizar páginas, pero sabía muy poco sobre xml y csv. Por lo tanto, la solución técnica fue muy extraña:
- Las manos copian el contenido de la página y lo pegan en Excel. La información para cada jugador ocupaba cuatro líneas, y en algún lugar cercano colgaba una fotografía. No los usé y los eliminé fácilmente.
- Todas las líneas de Excel debían copiarse en el archivo de texto parse.txt
- Se escribió un analizador que leía el archivo línea por línea e información dispersa sobre los jugadores en cuatro listas, en la posición nominal en el campo.
- Todas estas listas se guardaron en un archivo de texto de cierto formato, que el juego comió fácilmente después del lanzamiento.
Hay algunos lugares divertidos en el código del analizador, por ejemplo, una línea comentada. No puedo imaginar por qué y de dónde vino allí.
' If Val(List1.List(I)) * 0 = 0 Then MsgBox (List1.List(I))
A veces el analizador se ahogaba y el archivo con el comando se veía así:
gk 71 22 81 30 91 16 df 3 2 83 14 96
Esto condujo a errores extraños dentro del juego en sí.

Como parte del centrocampista Zenith podría jugar contra Portugal con una calificación de 86.
Esta versión tiene más gestión de equipo y menos diversión. Las tácticas nuevamente casi no tuvieron efecto en nada, pero fue posible comprar y vender jugadores, se lesionaron y recibieron cartas. Mantener la clasificación en el formulario es cosa del pasado, ahora todo estaba en la memoria y trabajar con él se volvió mucho más conveniente.
Hubo un problema al representar un montón de números en el formulario, pero se resolvió con elegancia:

Más o menos UX
Por supuesto, todavía había partes en el código que no mirarías sin lágrimas:
For i = 1 To 15 If tbl(i) = team2 Then i = i + 1 k = k + 1 If k = 1 Then tr = Int(Rnd * 5) + 2: xa = Int(Rnd * tr): ia = i If k = 2 Then xb = Int(Rnd * tr) If xa > xb Then pts(ia) = pts(ia) + 3: gm(2, ia) = gm(2, ia) + 1: gm(4, i) = gm(4, i) + 1: gm(5, ia) = gm(5, ia) + xa: gm(5, i) = gm(5, i) + xb: gm(6, ia) = gm(6, ia) + xb: gm(6, i) = gm(6, i) + xa If xa < xb Then pts(i) = pts(i) + 3: gm(2, i) = gm(2, i) + 1: gm(4, ia) = gm(4, ia) + 1: gm(5, ia) = gm(5, ia) + xa: gm(5, i) = gm(5, i) + xb: gm(6, ia) = gm(6, ia) + xb: gm(6, i) = gm(6, i) + xa If xa = xb Then pts(i) = pts(i) + 1: pts(ia) = pts(ia) + 1: gm(3, i) = gm(3, i) + 1: gm(3, ia) = gm(3, ia) + 1: gm(5, ia) = gm(5, ia) + xa: gm(5, i) = gm(5, i) + xb: gm(6, ia) = gm(6, ia) + xb: gm(6, i) = gm(6, i) + xa Form6.List1(ng).AddItem tbl(ia) + Str(xa) + «:» + Str(xb) + " " + tbl(i) k = 0 End If
Este juego fue casi perfecto: fue posible comprar legalmente a Igor Akinfeev como atacante en Amkar, y luego ver cómo el Nizhny Novgorod Volga se convirtió en el campeón de Rusia. Y, en general, todo se ha vuelto mucho más decente, bueno, eso pensé al principio. Cuatro años después, no todo era tan color de rosa.
RFPL 2 - Resurrección
Para 2013, ya me las arreglé para trabajar como programador por dinero. Pensé y quise escribir una nueva versión del simulador; una nueva mirada al antiguo código mostró que no había nada bueno en absoluto. Bueno, eso no es absolutamente nada.
Moralidad importante n. ° 4: a veces es mejor reescribir desde cero.
El sitio web de RFPL había cambiado en ese momento, así que escribí otro analizador (su código se ha olvidado), pero ahora no había más errores molestos con el país. Establecí una estructura separada para los jugadores, donde indiqué, entre otras cosas, la afiliación al club; esto facilitó la implementación de transferencias y el mantenimiento de estadísticas. Y todos obtuvieron puntos, dependiendo del "estrellato" y la posición en el campo.
Type player Surname As String FirstName As String Num As String Team As String Goals As Integer Shots As Integer Saves As Integer AttPts As Integer DefPts As Integer MidPts As Integer GoalPts As Integer Position As String Star As Boolean Stamina As Integer Yellow As Integer TeamPts As Integer Injured As Integer fromStart As Boolean fromBench As Boolean End Type

El botón "Autocomposición" apareció para los jugadores especialmente perezosos: llenó las posiciones con los "futbolistas" más poderosos. Desafortunadamente, solo yo todavía jugué esto
Para entonces, también descubrí la tabla: no era demasiado vago e hice una tabla "clásica" comprensible con los indicadores necesarios, que se pueden ver de inmediato. Junto con esto, las estadísticas aparecieron en los mejores anotadores.

Se agregaron salvamentos, transferencias aún mejores, resultados de partidos paralelos de cada ronda. Ahora lo miro y entiendo que todo esto es muy infantil e ingenuo, pero luego se veía impresionante. Todas menos una cosa. Ver:

Vergonzoso Pelota. En cambio Rosa Plaza
Moralidad importante n. ° 5: a veces es mejor no hacer nada que hacer un cuadrado rosa.
Pasaron unos años más y decidí enseñarle a la computadora a jugar al fútbol. O al menos finge que juega al fútbol. Con una pelota, jugadores en el campo, sin texto y listas. Y aquí está el lugar para otra moraleja importante, que coincide con el título de la sección:
Si no realiza copias de seguridad, no tendrá nada de qué hablar en esta sección.
De un gran proyecto en Unity de 2016, en el que había buenos modelos de movimiento de agentes, juego posicional y movimiento de pelota casi inteligente , hubo un pequeño GIF de una de las primeras etapas de desarrollo.

Por lo tanto, te contaré sobre esto en otro momento, cuando vuelva a escribir todo desde cero.
¿De qué se trata todo esto?
Me gusta recordar esta historia desde el principio. Me gusta pensar que este "simulador" de juguetes trajo más experiencia y diversión que algunas clases universitarias y tareas laborales. Recuerda cómo registré el primer correo, al que jugadores agradecidos enviarán cartas, y cómo en 2007 escribí en el foro de la ciudad "Leer libros de texto en Internet es hacer trampa, aprenderé todo escribiendo". Estas son sensaciones maravillosas, que probablemente tengas en diferentes formas.
Hubo muchos consejos obvios en esta publicación, sobre copias de seguridad, comentarios y la necesidad de refactorizar, todo el mundo lo sabe sin mí. Y lo más importante, asegúrese de recordar el pensamiento de Lyubov Nikolaevna Kaftunkina, mi profesor de informática:
"Si quieres jugar juegos en la lección, escríbelos tú mismo".