
L'histoire que je vais raconter a commencé il y a 13 ans lors d'un cours d'informatique. Mes amis de septième année et moi avons résolu tous les problèmes de Pascal et nous nous sommes amusés à jouer au premier Quake. Notre professeur a vu cela, est venu vers moi et a dit une seule phrase qui a déformé mon image du monde: "Si vous voulez jouer à des jeux dans la leçon, écrivez-les vous-même." Depuis, je fais parfois des jeux. L'un d'eux est un simulateur de football, qui sera discuté.
C'est une histoire passionnante sur mon chemin en tant que développeur, des projets inachevés et pourquoi parfois ils n'ont pas besoin d'être terminés.
Avertissement: depuis les événements décrits dans ce texte, j'ai suivi un cours de développement Unity et publié certains de mes jeux sur Google Play et le Windows Store. Maintenant, je suis rédacteur en chef du blog Yandex.Money et je raconte cette histoire pour partager mon expérience avec la communauté.
Dans le développement de jeux en russe de cette époque, il y avait une fonctionnalité intéressante - MS DOS était presque terminé et les programmeurs nationaux sciaient activement des jouets pour Windows. Un grand nombre de simulations sont sorties en tant qu'ordinateur, chars, cartes diverses et jeux "logiques". Et les disques avec ces jeux ont également été vendus en grande quantité. Sur la façon dont ces collections ont été compilées, peu de choses sont écrites dans les "Tests du testeur", mais je ne savais pas encore à ce sujet.
Beaucoup d'entre vous se souviennent sûrement de ce magnifique menu:

La vie, bien sûr, l'a tapoté
Sur l'un de ces disques, j'ai rencontré pour la première fois le coach de jeu - un manager de football textuel. Là, vous pourriez prendre une équipe de la Premier League anglaise et essayer de l'amener au championnat. Et ce jeu a été distribué selon le modèle du shareware: on pouvait jouer deux saisons, puis payer. Bien sûr, il n'était pas possible de payer de quelque façon que ce soit, car pour cela il fallait envoyer un virement bancaire au créateur du jeu, et à 13 ans, vous n'allez pas à la banque, vous n'y pensez même pas. Yandex.Money existait déjà, mais jusqu'à ce que Cashier apparaisse, il restait 8 ans, donc c'était aussi gênant. Mes amis et moi avons joué pendant deux saisons, puis nous avons recommencé.
J'ai dû chercher une solution, et dans le processus, j'ai écrit un de mes premiers matchs - Coach, avec une ligue russe plus intéressante pour moi, une tasse et un tas de bugs. Je n'ai pas changé le nom, j'ai juste changé le diable en trois. Il s'est avéré comme ceci:
Coach 3 v2.52
De quoi a besoin une équipe de football? Bien sûr, les joueurs. Naturellement, personne ne connaissait de licences pour les clubs et les joueurs - nous venons de nous réunir avec un camarade de classe et avons fait des listes d'équipes de mémoire. Par conséquent, par exemple, le CSKA et le Spartak ont toujours eu 11 personnes chacun (oui, c'était un simulateur sans remplaçant), mais Luch-Energia de Vladivostok s'est retrouvé avec des dés vides au lieu de joueurs.
Si je me souviens bien: 2005, je me suis armé d'un manuel d'informatique pour la 9e année (c'était à peu près mon Visual Basic 6 préféré) et j'ai ouvert l'éditeur de formulaire - j'ai appris le mot IDE beaucoup plus tard. J'ai dessiné un bouton sur le formulaire, cliqué et ouvert l'éditeur de code. Fier de moi, j'ai tapé
Private Sub Command1_Click() End End Sub
et cliquez sur "Exécuter". Tout a fonctionné et m'a vraiment plu. Après un certain temps, un simulateur de football textuel est apparu - Coach v2.52.

Avocats RPL, si vous lisez ceci - ce jeu n'a jamais été publié ou vendu pour de l'argent
Il m'a alors semblé que c'était la perle du code programme. Bien sûr, à ce moment-là, je ne savais pas grand-chose et, par exemple, le classement était stocké dans six tableaux de Label directement sur le formulaire. Pas de sauvegarde, pas de tableaux variables - juste hardcore. Naturellement, des bugs étranges sont apparus à cause de cela:

Toutes les équipes ont disputé 2 matchs, mais certains d'entre eux 3 et d'autres un à la fois

Vous pouvez également acheter Roy Keane et Andriy Shevchenko dans Spartak. Je ne sais pas ce que c'était dans au moins un simulateur de football de l'époque
En général, imaginez que vous avez nettement oublié comment utiliser des bases de données, écrire quelque chose dans des fichiers texte et stocker des données dans des tableaux. La seule chose qui reste est les contrôles sur les formulaires. Effrayant Et en quelque sorte, les jours de la semaine de la septième niveleuse semblaient avoir décidé qu'il était capable de jouer.
Je n'avais pas la source de cette version, mais je suis sûr qu'il y avait quelque chose comme ça:
m = Form1.Label5(0).Caption Form2.Label3(m).Caption = Form2.Label3(m).Caption + 3
Certaines fonctionnalités de VB6 n'étaient pas écrites dans le manuel. Par conséquent, par exemple, quand j'ai découvert que la forme peut être coulée de différentes manières, j'ai fait toute une fenêtre pour cela avec le choix de la pelouse dans le stade du club:

Seriez-vous capable de tondre la pelouse sur une flûte de tuyaux diffusés sur le Web?
Moralité importante n ° 1 - Explorez la puissance des outils que vous utilisez tous les jours.
J'étais sûr qu'un jour j'enverrais ce jeu à une sorte de multi-jeu - c'est pourquoi j'ai même écrit un certificat. Bien sûr, il a ensuite été vu par deux testeurs et demi. Mais depuis que c'est arrivé, qu'il soit publié.
readme.txtCoach 3 V2.08 - Édition 2006
Bonjour Merci d'avoir acheté ce jeu.
1.Installation
2.Exigences du système
3. plate-forme de test
4. Quoi de neuf
5.Conseils
6. désinstallation
7.Merci beaucoup ...
1.Installation
Exécutez Setup.exe et décompressez les fichiers dans un dossier avec: \ Program files \ Football Manager 2005
Et puis décompressez le fichier setup2.exe
2.Exigences du système
Non P4-2500. Tout est extrêmement simple. Donc,
Pentium 1-233 MHz (300 ou supérieur recommandé)
HDD 5MB
16 Mo de RAM (32 ou plus recommandés)
Vidéo 16 Mo
Windows 9x, Me, NT, 2003, Longhorn. Sur XP, cela ne fonctionne que si le fichier msvbvm60.dll se trouve dans le répertoire racine avec: \ windows \ system
La souris.
3. plate-forme de test
Celeron 1100 MHz
160 Mo de RAM
Vidéo 16 Mo
Windows XP SP2
4. Quoi de neuf.
J'ai fait beaucoup de nouvelles choses.
Par exemple, maintenant dans le championnat de Russie 14 (!) Équipes participent au lieu de 8.
Le dialogue "Team" a été changé, un menu sur l'entraîneur du club est apparu.
Maintenant, le jeu dépend de la tactique!
Rivaux puissants.
Pour la première fois depuis l'entraîneur 1, des points vous sont normalement attribués.
Ligue des Champions, Super Coupe de Russie.
5. Conseils.
Ne modifiez pas et ne supprimez pas les fichiers du dossier avec: \ program files \ football manager 2005 \ clubs \ emblems
Après l'installation, copiez le fichier MSVBVM60.DLL dans le dossier c: \ windows \ system
6. désinstallation
Aucune désinstallation n'est requise. Effacez simplement le dossier du jeu.
7.Merci beaucoup ...
Kusherbayev Daniyar pour les tests bêta.
Karneyev Mikhail, Trofimenko Mikhail pour les tests bêta et de précieux conseils.
À rfpl.org pour la forme des équipes de Premier League.
27/01/06
PS Ours va gagner!
Si je savais que je reviendrais sur ce projet au cours des 13 prochaines années, alors, bien sûr, je serais plus responsable de préserver tout ce qui y est lié. Néanmoins, Coach 2.5 est resté dans l'histoire et est lancé même maintenant, directement à partir du dossier, qui s'appelle ainsi:
E:\prod\dev\My_old_dev_projects\Dev\ ,
Il y avait sûrement des versions antérieures, mais je n'avais nulle part où sauvegarder à ce moment-là, et les sources jusqu'en 2005, ainsi que leurs versions antérieures, ont été perdues une fois lorsqu'un disque dur de 2,3 gigaoctets s'est écrasé. soupire la nostalgie Et rappelez-vous, quand mettre Blood 2, vous avez dû effacer Age of Empires 2?

Capture d'écran de la version 1.62. Si Windows 10 1803 était sorti en 2004, je n'aurais pas laissé cette action
Morale importante # 2 - faites des sauvegardes.
Eh bien et surtout - le gameplay. Des événements aléatoires, indépendamment de tout - c'est ce qui a attiré l'attention des longues heures de développement et de test. Et nous l'avons testé comme ça - nous avons joué jusqu'à ce que quelque chose de drôle tombe.

Ne demandez pas quels sont les points d'attaque. Je ne me souviens pas
Vous voyez cette boîte rose nerveuse? Maintenant, je vais vous parler de lui.
Shinnik et simulateur de football visuel
Avec Coach, deux autres jeux ont été distribués sur ces disques. Le premier - «FC Shinnik» de Yevgeny Sharov - c'était une gestion médiocre de l'équipe, mais vous pouviez regarder le match. À en juger par les crédits, cela a également été fait pendant un certain temps - de 1996 à 2000. Le deuxième match était le dosovskiy «Football 4x4» - il n'y avait absolument rien d'impressionnant là-bas, sauf pour les hommes en cours d'exécution, mais cela m'a tellement fasciné que j'ai décidé de faire de même jeu pour vous-même.
Au début, faute d'expérience, une boîte rose est apparue. Il a traversé le terrain, indiquant où se déroulait le match. Et, comme, a même influencé quelque chose. Ce n'était pas suffisant et j'ai réalisé le deuxième projet de football de ma vie - Football View.

Oui, oui, ce sont des bannières maculées. Au cours de la dernière décennie, c'était en quelque sorte plus simple.
Devinette - comment déplacer constamment les joueurs sur le terrain, lorsque vous ne pouvez pas accrocher un script séparé pour chacun, qui tiendra compte de la position, des voisins et de la distance au ballon? La solution consiste à utiliser la minuterie et à tordre les joueurs dans la boucle, en les décalant au hasard sur la largeur du sprite. Le code vient tout droit de 2005, alors maintenant j'ai très honte.
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
Moralité importante n ° 3 - rédigez des commentaires clairs et détaillés.
Un autre chronométreur a vérifié que le match était terminé:
If Val(Label5.Caption) = "90" And Val(Label2.Caption) > Val(Label1.Caption) Then MsgBox (" . " + Label3.Caption): End
Et maintenant - le pire. Le ballon a traversé le terrain avec quatre minuteries, appelées pas_vverh, pas_vniz, pas_vpravo et pas_vlevo. Certains avaient maintenant un œil qui tremblait, d'autres sont allés d'urgence pour relire Straustrup, d'autres ont posé une question stupide - "Mais nous voyons que sur le GIF, la balle ne bouge pas de haut en bas." Bien sûr, parce que je ne pouvais pas coordonner correctement les quatre temporisateurs entre eux.
Je regarde le code maintenant et je comprends qu'il prévoit même un contrôle indirect du ballon , mais cela ne fonctionne pas.
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
Tout au long de la neuvième et de la dixième année, mon camarade de classe et moi étions occupés à écrire un simulateur du système d'exploitation, nous n'avons donc pas mis la main sur le football. "Oui, ce sont des poulets pour rire", pensais-je, quand en 2009 j'ai encore déterré un vieil exécutable, "j'ai besoin de tout réécrire à partir de zéro."
Comment refactoriser non-refactory
Réécrire à partir de zéro est une excellente idée lorsque le projet est petit, et une douzaine de façons sont apparues dans ma tête pour le rendre meilleur et plus pratique qu'il ne l'était. J'avais besoin d'un simulateur de football de texte parfait, et bien sûr, tout s'est encore mal passé.
En 2009, c'est devenu plus facile avec Internet, et je suis allé sur le site de Premier League et j'ai commencé à réfléchir à la façon de supprimer les files d'attente qui étaient stockées sous cette forme:

Je ne savais pas non plus comment saisir, analyser les pages, mais je savais très peu de choses sur xml et csv. Par conséquent, la solution technique était très étrange:
- Les mains copient le contenu de la page et le collent dans Excel. Les informations pour chaque joueur occupaient quatre lignes, et quelque part à proximité, une photo était accrochée. Je ne les ai pas utilisés et je les ai facilement éliminés.
- Toutes les lignes d'Excel devaient être copiées dans le fichier texte parse.txt
- Un analyseur a été écrit qui lit le fichier ligne par ligne et diffuse des informations sur les joueurs dans quatre listes - à la position nominale sur le terrain.
- Toutes ces listes ont été enregistrées dans un fichier texte d'un certain format, que le jeu mangeait facilement après le lancement.
Il y a des endroits amusants dans le code de l'analyseur, par exemple, une telle ligne commentée. Je ne peux pas imaginer pourquoi et d'où ça vient.
' If Val(List1.List(I)) * 0 = 0 Then MsgBox (List1.List(I))
Parfois, l'analyseur était obstrué et le fichier avec la commande ressemblait à ceci:
gk 71 22 81 30 91 16 df 3 2 83 14 96
Cela a conduit à des bugs étranges dans le jeu lui-même.

Dans le cadre du milieu de terrain Zenith pourrait jouer le Portugal avec une note de 86.
Cette version a plus de gestion d'équipe et moins de plaisir. La tactique n'a à nouveau eu pratiquement aucun effet sur quoi que ce soit, mais il était possible d'acheter et de vendre des joueurs, ils ont été blessés et ont reçu des cartes. Garder le classement sur le formulaire est une chose du passé, maintenant tout était en mémoire et travailler avec lui est devenu beaucoup plus pratique.
Il y avait un problème avec le rendu d'un tas de nombres sur le formulaire, mais il a été résolu avec élégance:

So-so UX
Bien sûr, il y avait encore des morceaux dans le code que vous ne verriez pas sans larmes:
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
Ce jeu était presque parfait - il était possible d'acheter légalement Igor Akinfeev comme attaquant à Amkar, puis de voir comment la Nizhny Novgorod Volga est devenue la championne de Russie. Et en général, tout est devenu beaucoup plus décent - enfin, je le pensais au début. Quatre ans plus tard, tout n'était pas si rose.
RFPL 2 - Résurrection
En 2013, j'ai déjà réussi à travailler comme programmeur pour de l'argent. J'ai pensé et voulu écrire une nouvelle version du simulateur - un nouveau regard sur l'ancien code a montré qu'il n'y avait rien de bon du tout. Eh bien, ce n'est absolument rien.
Moralité importante n ° 4 - il est parfois préférable de réécrire à partir de zéro.
Le site Web de RFPL avait changé à ce moment-là, j'ai donc écrit un autre analyseur (son code est tombé dans l'oubli), mais maintenant il n'y a plus d'erreurs ennuyeuses avec le pays. J'ai mis en place une structure distincte pour les joueurs, où j'ai indiqué, entre autres, l'affiliation au club - cela a facilité la mise en œuvre des transferts et la tenue des statistiques. Et ils ont tous obtenu des points, selon la "célébrité" et la position sur le terrain.
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

Le bouton «Autocomposition» est apparu pour les joueurs particulièrement paresseux - il a lui-même rempli les postes avec les «footballeurs» les plus puissants. Malheureusement, seulement je jouais encore
À ce moment-là, j'ai également compris le tableau - je n'étais pas trop paresseux et j'ai créé un tableau "classique" compréhensible avec les indicateurs nécessaires, qui peuvent être vus immédiatement. Parallèlement à cela, des statistiques sont apparues sur les meilleurs buteurs.

Des sauvegardes ont été ajoutées, des transferts encore meilleurs, résultats des matchs parallèles de chaque tour. Maintenant, je le regarde et je comprends que tout cela est très enfantin et naïf, mais ensuite ça a semblé impressionnant. Tout sauf une chose. Voir:

Honteux. Balle. Au lieu de cela. Rose. Carré.
Moralité importante n ° 5 - parfois, il vaut mieux ne rien faire que de faire un carré rose.
Quelques années se sont écoulées et j'ai décidé d'enseigner à l'ordinateur comment jouer au football. Ou du moins faire semblant de jouer au football. Avec un ballon, des joueurs sur le terrain, sans texte ni listes. Et voici l'endroit pour une autre morale importante, qui coïncide avec le titre de la section:
Si vous ne faites pas de sauvegardes, vous n'aurez rien à dire dans cette section.
À partir d'un grand projet sur Unity de 2016, dans lequel il y avait de bons modèles de mouvement d'agent, de jeu de position et de mouvement de balle presque intelligent , il y avait un petit GIF d'un des premiers stades de développement.

Par conséquent, je vous en parlerai une autre fois, quand je réécrirai tout à partir de zéro.
De quoi s'agit-il?
J'aime me souvenir de cette histoire depuis le tout début. J'aime à penser que ce "simulateur" de jouet a apporté plus d'expérience et de plaisir que certaines classes universitaires et tâches de travail. Rappelez-vous comment j'ai enregistré le premier mail, auquel les joueurs reconnaissants enverront des lettres, et comment en 2007 j'ai écrit sur le forum de la ville "Lire des manuels sur Internet est de la triche, j'apprendrai tout en tapant." Ce sont de merveilleuses sensations que vous avez probablement sous différentes formes.
Il y avait beaucoup de conseils évidents dans ce post - sur les sauvegardes, les commentaires et le besoin de refactoring - tout le monde le sait sans moi. Et surtout, n'oubliez pas de penser à Lyubov Nikolaevna Kaftunkina, mon professeur d'informatique:
"Si vous voulez jouer à des jeux dans la leçon, écrivez-les vous-même."