
A história que vou contar começou há 13 anos em uma aula de ciência da computação. Meus amigos da sétima série e eu resolvemos todos os problemas em Pascal e nos divertimos jogando o primeiro terremoto. Nosso professor viu isso, veio até mim e disse apenas uma frase que distorcia minha imagem do mundo: "Se você quiser jogar na lição, escreva você mesmo". Desde então, ocasionalmente, faço jogos. Um deles é um simulador de futebol, que será discutido.
Esta é uma história emocionante sobre o meu caminho como desenvolvedor, projetos inacabados e por que às vezes eles não precisam ser concluídos.
Isenção de responsabilidade: desde os eventos descritos neste texto, participei de um curso de desenvolvimento do Unity e publiquei alguns de meus jogos no Google Play e na Windows Store. Agora sou o editor do blog Yandex.Money e conto esta história para compartilhar experiências com a comunidade.
Havia um recurso interessante no desenvolvimento de jogos em língua russa da época - o MS DOS estava quase acabando e os programadores domésticos estavam vendo brinquedos para o Windows. Um grande número de simulações surgiu como um homem de computador, tanques, várias cartas e jogos "lógicos". E os discos com esses jogos também foram vendidos em grandes quantidades. Sobre como essas coleções foram compiladas, pouco está escrito nos "Testes do testador", mas eu ainda não sabia.
Certamente muitos de vocês se lembram deste belo menu:

A vida, é claro, deu um tapinha nele
Em um desses discos, conheci o jogo Coach - um gerente de futebol de texto. Lá você pode pegar um time da Premier League inglesa e tentar trazê-lo para o campeonato. E este jogo foi distribuído de acordo com o modelo shareware: você pode jogar duas temporadas e depois pagar. Obviamente, não foi possível pagar de forma alguma, porque para isso foi necessário enviar uma transferência bancária ao criador do jogo e, aos 13 anos, você não vai ao banco, nem pensa nisso. O Yandex.Money já existia, mas até o Caixa aparecer, restavam 8 anos, portanto também era inconveniente. Meus amigos e eu jogamos por duas temporadas e começamos de novo.
Eu tive que procurar uma solução e, no processo, escrevi um dos meus primeiros jogos - o treinador, com uma liga russa mais interessante para mim, um copo e um monte de insetos. Não mudei o nome, apenas mudei o empate para três. Aconteceu assim:
Coach 3 v2.52
O que um time de futebol precisa? Claro, os jogadores. Naturalmente, ninguém sabia sobre licenças para clubes e jogadores - acabamos de nos reunir com um colega de classe e fazer listas de times de memória. Portanto, por exemplo, CSKA e Spartak ainda tinham 11 pessoas cada (sim, era um simulador sem substituições), mas a Luch-Energia de Vladivostok ficou com dados vazios em vez de jogadores.
Como me lembro agora: 2005, eu me muni de um livro de ciências da computação para a 9ª série (era quase o meu Visual Basic 6 favorito) e abri o editor de formulários - aprendi a palavra IDE muito mais tarde. Desenhou um botão no formulário, clicou e abriu o editor de código. Cheio de orgulho de mim mesmo, digitei
Private Sub Command1_Click() End End Sub
e clicou em "Executar". Tudo funcionou e realmente me agradou. Depois de um tempo, um simulador de futebol baseado em texto apareceu - Coach v2.52.

Advogados de RPL, se você ler este - este jogo nunca foi publicado ou vendido por dinheiro
Então me pareceu que essa é a pérola do código do programa. É claro que naquele momento eu não sabia muito e, por exemplo, as classificações foram armazenadas em seis matrizes da Label diretamente no formulário. Sem salvar, sem matrizes variáveis - apenas hardcore. Naturalmente, erros estranhos surgiram por causa disso:

Todas as equipes jogaram 2 partidas, mas algumas delas 3 e outras uma de cada vez

Você também pode comprar Roy Keane e Andriy Shevchenko em Spartak. Não tenho certeza do que estava em pelo menos um simulador de futebol da época
Em geral, imagine que você tenha esquecido profundamente como usar bancos de dados, gravar algo em arquivos de texto e armazenar dados em matrizes. A única coisa que resta são os controles nos formulários. Assustador E de alguma forma, os dias da semana da sétima série pareciam ter decidido que ele era capaz de jogar.
Eu não tinha a fonte desta versão, mas tenho certeza de que havia algo assim:
m = Form1.Label5(0).Caption Form2.Label3(m).Caption = Form2.Label3(m).Caption + 3
Alguns recursos do VB6 não foram escritos no livro didático. Portanto, por exemplo, quando descobri que o Shape pode ser derramado de maneiras diferentes, fiz uma janela inteira para isso com a escolha do gramado no estádio do clube:

Você seria capaz de cortar a grama em uma flauta de tubos de webcast?
Moralidade importante # 1 - Explore o poder das ferramentas que você usa todos os dias.
Eu tinha certeza de que um dia enviaria esse jogo para algum tipo de jogo múltiplo - foi por isso que escrevi um certificado. Claro, então foi visto por dois testadores e meio. Mas desde que aconteceu, seja publicado.
readme.txtCoach 3 V2.08 - Edição de 2006
Olá Obrigado por comprar este jogo.
1.Instalação
2.Requisitos do sistema
Plataforma 3.Test
4. O que há de novo
5. dicas
6. Desinstalação
7.Muito obrigado ...
1.Instalação
Execute o Setup.exe e descompacte os arquivos em uma pasta com: \ Arquivos de programas \ Football Manager 2005
E descompacte o arquivo setup2.exe
2.Requisitos do sistema
No P4-2500, tudo é extremamente simples.
Pentium 1-233 MHz (recomendado 300 ou superior)
HDD 5MB
16 MB de RAM (32 ou superior recomendado)
Vídeo 16 MB
Windows 9x, Me, NT, 2003, Longhorn. No XP, ele funciona apenas se o arquivo msvbvm60.dll estiver no diretório raiz com: \ windows \ system
O mouse
Plataforma 3.Test
Celeron 1100 MHz
160 MB de RAM
Vídeo 16MB
Windows XP SP2
4. O que há de novo
Fez muitas coisas novas.
Por exemplo, agora no campeonato da Rússia, 14 equipes participam!
O diálogo "Equipe" foi alterado, um menu sobre o treinador do clube apareceu.
Agora o jogo depende de táticas!
Rivais fortes.
Pela primeira vez desde o treinador 1, os pontos são normalmente concedidos a você.
Liga dos Campeões, Supertaça da Rússia.
5. Dicas.
Não modifique ou exclua arquivos da pasta com: \ arquivos de programas \ football manager 2005 \ clubs \ emblemas
Após a instalação, copie o arquivo MSVBVM60.DLL para a pasta c: \ windows \ system
6. Desinstalação
Não é necessário desinstalar, basta apagar a pasta do jogo.
7.Muito obrigado ...
Kusherbayev Daniyar para testes beta.
Karneyev Mikhail, Trofimenko Mikhail para testes beta e conselhos valiosos.
Para rfpl.org para a forma das equipes da Premier League.
27/01/06
PS O nosso vai ganhar!
Se soubesse que voltaria a esse projeto nos próximos 13 anos, é claro que seria mais responsável em preservar tudo o que está relacionado a ele. No entanto, o Coach 2.5 permanece na história e é lançado agora, diretamente da pasta, chamada assim:
E:\prod\dev\My_old_dev_projects\Dev\ ,
Certamente havia versões anteriores, mas eu não tinha onde fazer backup naquela época, e as fontes até 2005, juntamente com as versões anteriores, foram perdidas quando um disco rígido de 2,3 gigabytes travou. suspira nostalgia E lembre-se, quando colocar Blood 2, você teve que apagar o Age of Empires 2?

Captura de tela da versão 1.62. Se o Windows 10 1803 fosse lançado em 2004, eu não teria deixado essa ação
Importante moral # 2 - faça backups.
Bem e mais importante - a jogabilidade. Eventos aleatórios, independentes de qualquer coisa - foi o que chamou a atenção das longas horas de desenvolvimento e teste. E testamos assim - jogamos até que algo engraçado caísse.

Não pergunte o que são pontos de ataque. Não me lembro
Vê esta caixa rosa nervosa? Agora vou falar sobre ele.
Shinnik e simulador visual de futebol
Juntamente com o Coach, mais dois jogos foram distribuídos nesses discos. O primeiro - "FC Shinnik", de Yevgeny Sharov - era uma gestão medíocre da equipe, mas você podia assistir à partida. A julgar pelos créditos, também foi realizado por um longo período de tempo - de 1996 a 2000. O segundo jogo foi o dosovskiy "Futebol 4x4" - não havia absolutamente nada de impressionante lá, exceto os homens que corriam, mas me fascinou tanto que decidi fazer o mesmo jogo para si mesmo.
No início, devido à falta de experiência, uma caixa rosa apareceu. Ele se moveu pelo campo, indicando onde o jogo estava acontecendo. E, tipo, até influenciou alguma coisa. Isso não foi suficiente e eu fiz o segundo projeto de futebol da minha vida - o Football View.

Sim, sim, estas são faixas manchadas. Na década passada, era de alguma forma mais simples.
Enigma - como mover jogadores constantemente pelo campo, quando você não pode pendurar um script separado para cada um, o que levará em conta a posição, os vizinhos e a distância da bola? A solução é usar o cronômetro e girar os jogadores no loop, mudando-os aleatoriamente para a largura do sprite. O código é direto de 2005, então agora estou com muita vergonha.
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
Importante moralidade # 3 - escreva comentários claros e detalhados.
Outro cronômetro verificou se a partida havia terminado:
If Val(Label5.Caption) = "90" And Val(Label2.Caption) > Val(Label1.Caption) Then MsgBox (" . " + Label3.Caption): End
E agora - o pior. A bola se moveu pelo campo com quatro marcadores, chamados pas_vverh, pas_vniz, pas_vpravo e pas_vlevo. Alguns agora tiveram uma contração nos olhos, outros foram reler urgentemente Stroustrup, outros ainda fizeram uma pergunta idiota - "Mas vemos que no GIF a bola não se move para cima e para baixo". Claro, porque não consegui coordenar corretamente os quatro cronômetros.
Estou vendo o código agora e entendo que ele ainda fornece controle indireto da bola , mas não 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 a nona e a décima série, meu colega e eu estávamos ocupados escrevendo um simulador do sistema operacional, para não termos mãos no futebol. "Sim, isso é galinhas para rir", pensei, quando em 2009 eu ainda descobri um executável antigo, "preciso reescrever tudo do zero".
Como refatorar não-refinador
Reescrever do zero é uma ótima idéia quando o projeto é pequeno, e uma dúzia de maneiras apareceu na minha cabeça para torná-lo melhor e mais conveniente do que era. Eu precisava de um simulador de futebol de texto perfeito e, claro, tudo deu errado de novo.
Em 2009, ficou mais fácil com a Internet e eu fui ao site da Premier League e comecei a pensar em como remover as formações armazenadas desta forma:

Também não sabia como capturar a análise de páginas, mas sabia muito pouco sobre xml e csv. Portanto, a solução técnica era muito estranha:
- As mãos copiam o conteúdo da página e colam no Excel. As informações para cada jogador ocupavam quatro linhas e, em algum lugar próximo, pendia uma fotografia. Eu não os usei e os descartei facilmente.
- Todas as linhas do Excel precisavam ser copiadas para o arquivo de texto parse.txt
- Um analisador foi escrito que leu o arquivo linha por linha e espalhou informações sobre os jogadores em quatro listas - na posição nominal em campo.
- Todas essas listas foram salvas em um arquivo de texto de um determinado formato, que o jogo comeu facilmente após o lançamento.
Existem alguns lugares engraçados no código do analisador, por exemplo, uma linha comentada. Não consigo imaginar por que e de onde veio dali.
' If Val(List1.List(I)) * 0 = 0 Then MsgBox (List1.List(I))
Às vezes, o analisador foi bloqueado e o arquivo com o comando ficou assim:
gk 71 22 81 30 91 16 df 3 2 83 14 96
Isso levou a erros estranhos dentro do próprio jogo.

Como parte do meia Zenith poderia jogar Portugal com uma classificação de 86.
Esta versão possui mais gerenciamento de equipe e menos diversão. As táticas novamente quase não tiveram efeito em nada, mas foi possível comprar e vender jogadores, eles foram feridos e receberam cartas. Manter a classificação no formulário é coisa do passado, agora tudo estava na memória e trabalhar com ele se tornou muito mais conveniente.
Ocorreu um problema ao renderizar vários números no formulário, mas foi resolvido com elegância:

UX mais ou menos
Claro, ainda havia partes no código que você não veria sem 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 jogo foi quase perfeito - foi possível comprar legalmente Igor Akinfeev como atacante em Amkar e depois ver como o Nizhny Novgorod Volga se tornou o campeão da Rússia. E, em geral, tudo se tornou muito mais decente - bem, eu pensava assim no começo. Quatro anos depois, nem tudo era tão róseo.
RFPL 2 - Ressurreição
Em 2013, eu já conseguia trabalhar como programador por dinheiro. Pensei e queria escrever uma nova versão do simulador - uma nova olhada no código antigo mostrou que não havia nada de bom. Bem, isso não é absolutamente nada.
Moralidade importante # 4 - às vezes é melhor reescrever do zero.
O site da RFPL havia mudado nessa época, então escrevi outro analisador (seu código caiu no esquecimento), mas agora não havia mais erros irritantes no país. Criei uma estrutura separada para os jogadores, onde indiquei, entre outras coisas, afiliação a clubes - isso facilitou a implementação de transferências e a manutenção de estatísticas. E todos eles ganharam pontos, dependendo do "estrelato" e da posição no 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

O botão “Autocomposição” apareceu para jogadores especialmente preguiçosos - ele próprio encheu as posições com os “jogadores de futebol” mais poderosos. Infelizmente, só eu ainda joguei isso
Naquela época, eu também descobri a tabela - eu não estava com preguiça e fiz uma tabela "clássica" compreensível com os indicadores necessários, que podem ser vistos imediatamente. Junto com isso, as estatísticas apareceram nos melhores marcadores.

Salvas foram adicionadas, transferências ainda melhores, resultados de partidas paralelas de cada rodada. Agora eu olho para ele e entendo que tudo isso é muito infantil e ingênuo, mas depois parecia impressionante. Tudo menos uma coisa. Veja:

Vergonhoso. Ball. Em vez disso. Rosa. Square.
Moralidade importante nº 5 - às vezes é melhor não fazer nada do que fazer um quadrado rosa.
Mais alguns anos se passaram e eu decidi ensinar o computador a jogar futebol. Ou pelo menos fingir que ele joga futebol. Com uma bola, jogadores em campo, sem texto e listas. E aqui está o lugar para outra moral importante, que coincide com o cabeçalho da seção:
Se você não fizer backups, não terá nada para falar nesta seção.
De um grande projeto no Unity de 2016, no qual havia bons modelos de movimento de agentes, jogo posicional e movimento quase inteligente de bola, havia um pequeno GIF de um dos estágios iniciais de desenvolvimento.

Portanto, vou falar sobre isso em outro momento, quando reescrever tudo do zero novamente.
Sobre o que é tudo isso?
Eu gosto de lembrar essa história desde o começo. Eu gosto de pensar que esse simulador de brinquedos trouxe mais experiência e diversão do que algumas aulas da universidade e tarefas de trabalho. Lembre-se de como registrei o primeiro e-mail, para o qual jogadores agradecidos enviarão cartas e como em 2007 escrevi no fórum da cidade "Ler livros na Internet é trapaça, aprenderei tudo digitando". Essas são sensações maravilhosas, que você provavelmente tem de diferentes formas.
Havia muitas dicas óbvias neste post - sobre backups, comentários e a necessidade de refatoração - todos sabem disso sem mim. E o mais importante, lembre-se do pensamento de Lyubov Nikolaevna Kaftunkina, minha professora de ciência da computação:
"Se você quiser jogar na lição, escreva você mesmo."