
我要讲的故事始于13年前的一门计算机科学课。 我和我的七年级朋友解决了Pascal中的所有问题,并且在玩第一届Quake时很开心。 我们的老师看到了这一点,走到我面前,只说了一个短语,歪曲了我对世界的印象:“如果您想在本课中玩游戏,请自己编写。” 从那以后我偶尔做游戏。 其中之一是足球模拟器,将对此进行讨论。
这是一个令人振奋的故事,讲述了我作为开发人员的道路,未完成的项目以及为什么有时不需要完成这些项目。
免责声明:自从本文中描述的事件以来,我参加了Unity开发课程并将我的一些游戏发布到Google Play和Windows Store中。 现在,我是Yandex.Money博客的编辑,并讲这个故事与社区分享经验。
在那个年代的俄语游戏开发人员中,有一个有趣的功能-MS DOS即将结束,而国内程序员则积极地为Windows看到玩具。 作为计算机人,坦克,各种纸牌和“逻辑”游戏,出现了大量的模拟。 带有这些游戏的光盘也大量出售。 关于这些集合是如何编译的,在“测试人员的测试”中几乎没有写,但是那时我还不知道。
当然,许多人都记得这个美丽的菜单:

生活当然拍了拍他
在其中一张光盘上,我第一次遇到了游戏Coach-文字足球经理。 在那里,您可以从英超联赛中选拔一些球队,并尝试将其带入冠军。 这款游戏是根据共享软件模型分发的:您可以玩两个赛季,然后付费。 当然,不可能以任何方式付款,因为为此必须向游戏的创建者发送银行转账,并且在13岁时,您不打算去银行,甚至都没有考虑过。 Yandex.Money当时已经存在,但是直到Cashier出现,还剩下8年,因此也很不方便。 我和我的朋友玩了两个赛季,然后我们又重新开始了。
我必须寻找解决方案,在此过程中,我写了自己的第一批游戏-Coach,这对我来说是一个更有趣的俄罗斯联赛,一个杯子和一堆臭虫。 我没有更改名称,只是将演绎方式更改为三个。 原来是这样的:
教练3 v2.52
任何橄榄球队需要什么? 当然是球员。 当然,没人会知道俱乐部和球员的任何执照-我们只是和一个同学聚在一起,从记忆中列出了球队名单。 因此,例如,CSKA和Spartak仍然各有11个人(是的,这是没有替代品的模拟器),但是符拉迪沃斯托克(Vladivostok)的Luch-Energia留下了空骰子,而不是玩家。
我现在还记得:2005年,我为自己准备了一本9年级的计算机科学教科书(那是我最喜欢的Visual Basic 6),并打开了表单编辑器-我后来才学到IDE单词。 在表单上绘制一个按钮,单击并打开代码编辑器。 我为自己感到骄傲
Private Sub Command1_Click() End End Sub
然后点击“运行”。 一切正常,我真的很高兴。 不久之后,出现了一个基于文本的足球模拟器-Coach v2.52。

RPL律师,如果您阅读此书,则该游戏从未发行或出售过
在我看来,这就是程序代码的明珠。 当然,那时我还不太了解,例如,排名是直接从Label的六个数组中存储在表单上的。 没有保存,没有变量数组-只是硬核。 自然地,由于以下原因出现了奇怪的错误:

所有球队参加了2场比赛,但其中一些比赛进行了3场,另一些比赛一次

您也可以在Spartak购买Roy Keane和Andriy Shevchenko。 我不确定当时至少有一个足球模拟器是什么情况
通常,假设您已经彻底忘记了如何使用数据库,向文本文件中写入内容以及将数据存储在数组中。 剩下的唯一是表单上的控件。 吓人的 这位七年级学生的工作日似乎以某种方式决定了他能够进行游戏开发。
我没有该版本的来源,但是我确定有这样的东西:
m = Form1.Label5(0).Caption Form2.Label3(m).Caption = Form2.Label3(m).Caption + 3
VB6的某些功能未在教科书中编写。 因此,例如,当我发现可以用不同的方式浇注Shape时,我在俱乐部体育场选择草坪时为此做了一个完整的窗口:

您可以在网播长笛上割草吗?
重要道德#1-探索每天使用的工具的功能。
我确定有一天我会将此游戏发送到某种多人游戏中-这就是为什么我甚至写了证书的原因。 当然,然后有两个半测试人员看到了它。 但是既然它发生了,就让它出版。
readme.txtCoach 3 V2.08-2006版
你好 感谢您购买此游戏。
1.安装
2.系统要求
3,测试平台
4.新增功能
5,提示
6,卸载
7,非常感谢你...
1.安装
运行Setup.exe并将文件解压缩到以下文件夹:\程序文件\ Football Manager 2005
然后解压缩setup2.exe文件
2.系统要求
没有P4-2500,一切都非常简单。
奔腾1-233 MHz(建议300或更高)
硬盘5MB
16 MB RAM(建议32或更高)
影片16 MB
Windows 9x,Me,NT,2003,Longhorn。 在XP上,仅当msvbvm60.dll文件位于以下目录的根目录中时,它才起作用:\ Windows \ system
鼠标。
3,测试平台
赛扬1100 MHz
160 MB RAM
影片16MB
Windows XP SP2
4.新增功能。
发了很多新东西。
例如,现在在俄罗斯冠军赛中,有14(!)个团队参加了比赛,而不是8个。
“团队”对话框已更改,有关俱乐部教练的菜单已出现。
现在,游戏取决于战术!
强大的竞争对手。
自教练1以来,这是第一次通常会给您积分。
冠军联赛俄罗斯超级杯。
5.提示。
不要使用以下内容修改或删除文件夹中的文件:\程序文件\ Football Manager 2005 \俱乐部\标志
安装后,将MSVBVM60.DLL文件复制到c:\ windows \ system文件夹
6,卸载
无需卸载,只需擦除游戏文件夹即可。
7,非常感谢你...
Kusherbayev Daniyar用于Beta测试。
Karneyev Mikhail和Trofimenko Mikhail提供了Beta测试和宝贵的建议。
以rfpl.org为形式的英超球队。
06年1月27日
PS我们的会赢!
如果我知道我将在未来13年内重返该项目,那么,我当然会更负责任地保存与之相关的一切。 尽管如此,Coach 2.5仍然保留在历史中,甚至从文件夹开始即刻启动,它被称为:
E:\prod\dev\My_old_dev_projects\Dev\ ,
肯定有较早的版本,但是那时我没有备份的地方,直到2.3 GB硬盘崩溃时,直到2005年的源以及它们的较早版本一度丢失。 怀旧的叹息 ,还记得,什么时候放血2,您必须删除帝国时代2?

版本1.62的屏幕截图。 如果Windows 10 1803于2004年发布,那么我就不会再执行此操作了
重要的道德准则2-进行备份。
那么,最重要的是-游戏玩法。 随机事件,与任何事物无关-吸引了漫长的开发和测试时间。 然后我们像这样测试它-我们一直玩到有趣的事情消失为止。

不要问什么攻击点。 我不记得了
看到这个紧张的粉红色盒子? 现在,我将向您介绍一下他。
Shinnik和视觉足球模拟器
与Coach一起,在这些光盘上又发行了两个游戏。 第一个-来自叶夫根尼·沙罗夫(Yevgeny Sharov)的“ FC Shinnik”-球队的管理水平中等,但您可以观看比赛。 从积分的角度来看,它也做了很长时间-从1996年到2000年。第二场比赛是dosovskiy“ Football 4x4”-除了奔跑的人以外,那里绝对没有什么令人印象深刻的,但它让我着迷,以至于我决定做同样的事情自己玩游戏。
起初,由于经验不足,出现了一个粉红色的盒子。 他越过田野,指示比赛进行的方向。 而且,甚至影响了某些东西。 这还不够,我做了人生中的第二个足球项目-足球观。

是的,是的,这些都是被涂抹的标语。 在过去的十年中,它变得更简单了。
谜语-当您无法为每个人都挂一个单独的脚本时,如何考虑场地的位置,邻居和到球的距离,如何不断地在场地上移动球员? 解决方案是使用计时器并在循环中扭曲播放器,将其随机移动到小精灵的宽度。 该代码直接来自2005年,所以现在我很as愧。
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
重要道德#3-写下清晰详细的评论。
另一个计时器检查比赛是否结束:
If Val(Label5.Caption) = "90" And Val(Label2.Caption) > Val(Label1.Caption) Then MsgBox (" . " + Label3.Caption): End
而现在-最糟糕的了。 球通过四个计时器在球场上移动,这四个计时器分别称为pas_vverh,pas_vniz,pas_vpravo和pas_vlevo。 现在有些人抽搐了一下,另一些人紧急去重新阅读Straustrup,其他人问了一个愚蠢的问题-“但是我们看到在GIF上,球并没有上下移动。” 当然,因为我无法正确地相互协调这四个计时器。
我现在正在查看代码,我知道它甚至可以提供间接的控球功能 ,但是它不起作用。
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
在整个九年级和十年级,我和同学都在忙着编写操作系统的模拟器,因此我们没有动手玩足球。 “是的,这真是令人发笑。”我想,当我在2009年挖出一个旧的可执行文件时,“我需要从头开始重写所有内容。”
我如何重构非重构
当项目很小时,从头开始重写是个好主意,而且我脑中出现了十多种方法来使它比以前更好和更方便。 我需要一个完美的文本足球模拟器,当然,一切都再次出错。
在2009年,互联网变得更容易了,我去了英超联赛网站并开始考虑如何拿走以这种形式存储的阵容:

我也不知道如何进行页面解析,但是我对xml和csv知之甚少。 因此,技术解决方案非常奇怪:
- 双手复制页面内容并将其粘贴到Excel中。 每个玩家的信息占据了四行,附近挂着一张照片。 我没有使用它们,很容易将它们丢弃。
- Excel中的所有行都需要复制到parse.txt文本文件中
- 编写了一个解析器,该解析器逐行读取文件,并将有关播放器的信息分散在四个列表中-位于字段的标称位置。
- 所有这些列表都保存在某种格式的文本文件中,游戏在启动后可以轻松食用。
解析器代码中有一些有趣的地方,例如,注释行。 我无法想象它的原因和来源。
' If Val(List1.List(I)) * 0 = 0 Then MsgBox (List1.List(I))
有时解析器被阻塞,带有命令的文件看起来像这样:
gk 71 22 81 30 91 16 df 3 2 83 14 96
这导致了游戏本身内部的奇怪错误。

作为真力时中场的一部分,葡萄牙可以打出86级。
此版本具有更多的团队管理能力,却没有那么有趣。 战术再次对几乎没有任何影响,但是有可能买卖球员,他们受伤并收到卡牌。 保持排行榜成为过去已经成为过去,现在所有内容都已存储在其中,并且使用它变得更加方便。
在表单上渲染一堆数字时出现问题,但是可以很好地解决:

马马虎虎
当然,代码中仍然有很多内容您不会哭的:
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
这场比赛几乎是完美的-可以合法地购买伊戈尔·阿金费耶夫(Igor Akinfeev)作为安卡的攻击者,然后看看下诺夫哥罗德·伏尔加河如何成为俄罗斯冠军。 总的来说,一切都变得更加体面了-好吧,起初我是这么认为的。 四年后,一切都不那么美好。
RFPL 2-复活
到2013年,我已经设法成为一名赚钱的程序员。 我想并想要编写一个新版本的模拟器-对旧代码的重新审视显示一点都没有。 好吧,那绝对不是。
重要道德4-有时最好从头开始重写。
那个时候RFPL网站已经改变了,所以我写了另一个解析器(它的代码已经被遗忘了),但是现在这个国家不再有烦人的错误了。 我为球员建立了一个单独的结构,除其他事项外,我在其中指出了俱乐部的隶属关系-这样可以更轻松地实现转会和保持统计数据。 他们全都获得了积分,这取决于“明星”和球场上的位置。
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

对于那些特别懒惰的玩家来说,出现了“自动排版”按钮-它本身就是最强大的“足球运动员”。 不幸的是,只有我仍然玩过
到那时,我还弄清楚了表格-我不太懒惰,并做了一个易于理解的“经典”表格,其中包含必要的指标,可以立即看到。 与此同时,统计数据出现在得分最高的得分手上。

增加了节省,甚至更好的转移,每一轮平行比赛的结果。 现在,我看了一下,明白这一切都是幼稚和幼稚的,但随后看起来却令人印象深刻。 除了一件事,其他一切。 请参阅:

丢脸 球 相反。 粉红色 正方形。
重要道德5-有时最好不要做任何事情,而要做成一个粉红色的正方形。
又过了几年,我决定教计算机如何踢足球。 或者至少假装他踢足球。 持球时,场上的球员没有文字和清单。 这是另一个重要道德的地方,与本节标题一致:
如果您不进行备份,那么本节将无话可说。
从2016年开始在Unity上进行的一个大型项目中,其中有良好的特工运动模型,定位游戏和几乎精巧的球运动模型,其中有一个来自早期开发阶段的小型GIF。

因此,当我再次从头开始重写所有内容时,我会再告诉您一次。
这是怎么回事?
我想从一开始就记住这个故事。 我喜欢认为这种玩具“模拟器”比某些大学课程和工作任务带来了更多的经验和乐趣。 记住我是如何注册第一封邮件的,感谢玩家将向其发送信件,以及2007年我如何在城市论坛上写道“在互联网上阅读教科书是作弊的,我将通过打字学习一切。” 这些都是奇妙的感觉,您可能会以不同的形式出现。
这篇文章中有很多明显的技巧-有关备份,注释和重构的需求-没有我,每个人都知道这一点。 最重要的是,一定要记住我的计算机科学老师Lyubov Nikolaevna Kaftunkina的想法:
“如果您想在本课中玩游戏,请自己编写。”