作者:扶余城里小老二
链接:https://www.zhihu.com/question/356351510/answer/1595886454
这可能是一个长篇。会陆续更新30天。先上图,证明自己学过编程。
陪伴我20年的显示器
20年了,还没坏。sun公司都倒闭了。当年我也是JAVA的迷弟。只不过后来,我转了全栈。专心搞c++了。我是看《java未眠夜》,入了java的。后来买了这台显示器。好家伙21寸,1600x1200。现在都够用。
正题:先说一下学习历程,再讲突飞猛进的点
1 20世纪八十年代,我爷开了一个超市,里面有个合作伙伴,上了一台雅达利游戏机
当时,我是茶饭不思,等机器没人玩的时候,我就玩玩《钓鱼》这款游戏。爸爸跟我说,你想不想将来长大了也做一款? 我当时就暗下决心将来要做游戏。
2 我妈在某行工作(保密),有供员工学习的80486电脑,我每当有机会,就去跟班上的程序员学习。那个时候,他用debug调试+basic编程,还有cobol语言。我就跟他学如何用basic做数学题,画几何图形。
3 后来pascal来了,turbo c也来了。一路买书跟上。特意买了本强哥写的《C语言程序设计》。
4再后来windows3.11来了,3。2也来了。我就开始学习word和Excel了。当然wps也一起学了。
5然后win95来了,3d max也来了。特意买来学习。那个时候,我是全校最靓的仔。
6 win98来了,vc6来了,delphi,c++builder也陆续进入眼帘,
太震撼了,
最终,我在mfc和bcb6里,选择了bcb的拖拽组件。写代码。
你问我那个时候靠什么挣钱?
7 互联网来了,qt来了,lua也来了。 java,js ajax 都来了。连php也来了。php,js ajax 还有java都是走马观花,在图书馆里,看了半年,都没看进去,继续坚定走c++和lua配合路线。
8网络游戏来了,大名鼎鼎的《传奇》《千年》《红月》等等。。看雪论坛也出现了,我们讨论的当然是怎么通过 ollydbg 来了解 网游的构造的。(别多想,纯技术学习)
9《天龙八部》来了,这个对我影响巨大,此时,圈内的技术讨论已经日益成熟,各种应用库雨后春笋般出现,只要想学技术,大约20w就能学会,就能过当时所有的驱动。很显然我没有去学(错过了几个亿)。这个游戏,有个附加程序叫《天龙扫地僧》,是用lua脚本写脚本。显然,天龙也是lua和c++,我就在这个时期学习使用lua脚本。
源文件
这是一个很好的学习宝库
10 pal5来了。不知道哪位大哥,还把它的lua源码给导出来了。又给我好好地上了一课
瞬间明白,当时的单机游戏的流程控制。
11 区块链来了 ,当时,我笑话那个,拿30万区块的人买一个汉堡。
12 人皇sky走了, 手游来了,错过了。虽然,育碧 tx wy的前员工出来办班,大肆宣扬手游时代来临,我还是当了耳旁风,继续在写pc端的程序。
13 区块链开始如日中天,各个群的人都开始讨论,一些执行力强的人,甚至找我参与改个hash算法,也发行这玩意。(现在想想,如果那个时候就切入,我可能早已经改变命运了,可惜只是改算法而已。)
14 我来到了知乎。我不想再沉沦下去,错过太多了,想要干点什么。于是开始重构sdlpal(仙剑1民间c源码),先是做了lua版本,然后又用c++(古典)重构。。重构完毕很是沮丧,因为感觉就像个没有灵魂的翻译。
15 打开cpp英文官网和b站的搬运c++ 11,14,17的视频教程。把sdlpal的c++重构版升级17.结果还是很不开心,因为还是那个老架构。新瓶装旧酒而已。
16 引入了boost coroutine2 将所有层级架构打散,通过协程的思想,来重构整个框架。最终达到完全解耦的目的。换句话就是说,不论 图形sdl,sdl2,qt,ue4,cocos 怎么换,只需修改代理接口即可,跟其他模块没有任何关联。脚本也是,不论是用js脚本,还是lua脚本,还是Python/ target=_blank class=infotextkey>Python脚本系统,也仅仅是更换个代理接口而已,声音引擎也是一样。
17 sdlpal将架构组件 理论化。(目前正在)
18 通过重构得来的模块化架构和调度经验,去复刻一款 怀旧游戏(Github尚没有怀旧版本的源码)。(下一步)
19 做游戏的怪 自动升级,打装备,抢玩家装备。(目前所有游戏都欠缺的内容,钱途无量)(下二步)
20 躺着挣钱。。(理想)
瓶颈1: 从0开始接触dos
dos操作系统,全是命令行,我那个时候,就翻书学会了dir cd cd.. 这样,翻阅各个目录,找exe和com文件。这个阶段很快就过去了。(其实是遍地找游戏。)
瓶颈2:从0 开始编程,
小学1年级,班级老师新学期要排座,同学们都充满了各种想法,都想让自己排到心仪的座位。这个时候,就开始各种不和谐出现了,我那个时候,暗下决心等2年级排座的时候,能贡献一份力,证明自己。于是,在程序员老师的建议下,开始画流程图。当然了,都是很简单的。
然后写成basic代码,又看了更复杂的,一些,就这样,练了1百个不到那么多流程图。
既然是排序,就找了最简单的 冒泡法。看着流程图的图形,就尝试自己写代码,然后测试。用文件做缓存,每个sub函数操作完就保存到文件中,然后再用另外一个sub函数读取出来,并操作。
使用edit文件 编辑文本。把同学的学号,身高,男女,都放入进去。经过冒泡排序之后,就可以了。然后将运算结果到文件中,打开文件就看到排好的序号了。就这样,再接再厉,写了 学生课程表,学生成绩查询。等软件。就这样,学生相关的微型软件和流程图,用了1年的时间,才能够流畅先写需求,再画图,再写代码,再修改,再画流程图。。。然后完成。一直都没有图形化,很是悲伤。
理想中,排座。可当时我的basic能力不足。
那个时候想做这样的游戏,可是一直没有办法。因为只要做出这样的,同学们才会认可我。
瓶颈三 试图做第一款游戏
求程序员老师,给我画了张流程图。因为这种难度的项目自己还是很难想想的。
想从basic开始做。于是,就从最基础的画线开始学习
使用一个函数 画一种形状,这样一个一个打造函数,最后的成果类似于下图。
不是当时的成品图,在网络上找的类似的。
具体跟这个流程很像,命令行俄罗斯方块_精神与时间-CSDN博客
第四点。就这样,一直沉沦了好久,小学6年内,几乎没有什么像样的进展。大量时间,都在正常学习,玩游戏,抽卡,以及小姐姐的视听光盘度过之中。这些东西简直就是拦路虎。可能就是需要消化掉这些东西才行,或者说basic还是太简单了。能见到的关于basic的书,都太肤浅了。第一次就准备转行了,我跟程序员老师说:“我比别人提前学了6年的电脑编程,为什么,我的水平跟他们差不多?”老师语重心长地说:“小朋友,编程是需要过程的,小学6年级,没怎么让你做项目,是因为学业很重,毕竟一年52周,咱们在一起学习实践也就每年52天。你能学到多少呢?”我非常生气地说:“不行,我比他们提前6年学电脑,我要有一个态度,咱不能让他们随便就超过我啊?”。老师就说:“好吧,那就卷起来吧!!”于是给我一段话,让我把文字上升到图形。
就这张图,理解了一周时间。我问老师,什么叫抽象啊?不太懂。于是就有了下图
又过了一周,我基本搞明白了,从此以后,我不仅仅会画流程图了,还会画群组关系图了。
在这之后,我每每遇到看不懂的内容,就用群组关系图,来表达一些复杂的分支结构。然后不断进行细化,层层分级,最终落实到叶节点。
再比如,当时为了阅读一本厚书,画过类似的图
第五点,突破 ifelse难题。
程序做不大,主要是我对流程控制和数据转发的不理解。于是,我很气,气自己这么不聪明,明明就是9年义务教育出来的人,为什么,他们就行,我就不行呢。后来,走投无路了,我就用编辑器,做了一个ifelse软件
自从做了这个软件,ifelse 和switchcase,就是拖拽实现了,每当有看不懂的逻辑,就让小精灵sprite来演示。每一个方块里,都是一个数据包,这些数据包由lua来安装初始化。就这样,慢慢地我的ifelse逻辑越来越好了,写的代码逻辑bug少了很多。当然了,光是这样,也不能挨个点每个方格看啊,于是,就做出来内存表
这个就好很多了,逻辑变换,一目了然,内存数据也一目了然,随时暂停。观看数据组,反正32g内存,大到,根本用不完。
这个软件就是c++做的,可以看得出来c++操作内存的功力特别雄厚。
第六点:内存变量可视化,破解盲人摸象误区
再后来,连表格都不用了,直接在背景里画数据。这么庞大的数据量,其实就是使用指针关联的。这样的话,哪个npc动了,朝向。坐标,触发事件id,拥有的物品。。等等,都一目了然。就是因为这样,所有参与者的数据,在第一时间内,都了解到了,对整个编程环境的变化就有了直观的感知,所有的算法和数据结构,能用游戏内容来表示,就坚决使用。不仅仅自己看得懂,朋友们也看得懂,还有趣。
然后,配合命令行,找触发的内容
就这样,很快就把游戏的运行流程,和数据流通,以及触发机制,搞明白了。
为以后的,模块分离做好了坚实的基础。比如这个是sdl版的pal。将来要做成qt版的pal呢?
第七点:如何让自己脱离沉迷游戏的误区。这个学会了,绝对突飞猛进。而且是火箭发射。
这是好多年前做的了,都忘记了什么游戏了,这个就是研究路该怎么走的。你想想,astar是可以的,navmesh也是可以的。总之有了 走路,就可以节省很多时间了。然后就是 找怪,看血,看蓝,分析怪的等级,然后查表,选择打还是跑。再做的就是捡包啊。这些满满的都是数据结构和算法,指针 还有汇编的应用,走的是算法岗。当然还有另外一个途径,那就是看图找色。绿色安全,走图形学路线。
这种实战,绝对是成就感爆棚,可做多了,就是千篇一律,毫无挑战,毕竟这些游戏就是做给青少年的,他们的智力也就那样了。所以技术会了,就赶紧继续前进。停留的话,过几年,你发现,你落伍了,时代变了,你的竞争对手也变了。因为后面,还有opencl和cuda,以及各种多线程算法在等着我们去挑战。反正就是,会搞这个了,基本上,对各种游戏都是,喜欢了,做一套工具,然后就不在玩了,继续学习新技术去挑战了。
大家都知道,编程是需要可持续性的,也就是说,要不断地学习和实践。第一次突飞猛进的点就是接触了思维导图,可以一张图涵盖一门编程语言的所有的知识点,这张图该怎么画呢?很显然,最初的时候却只能看大佬们的作品,可大佬们的作品该如何落地,被我们进行拆解,然后再进行重组,变成自己的理解方式。这就是事一门学问。对于任何一个编程人士来讲,越早接触,越容易,建立起一套属于自己的知识树体系。边学习,边构思思维导图,
然后再建立起卡片式记忆法。各种抽象知识点图示化。
想要学习这套方法的同好,可以在关注夜曲编程之后,回复“免费教程”,就可以领取一份为期20天左右的交互式教程。
要知其然,更要知其所以然。这虽然是一套免费教程,可内容的构思极其精妙。把原本正常的教材里枯燥又孤立的知识点,于是初高中学英语的卡片式相结合,更加符合既有的学生思维模式。构筑技巧。以及拆解技巧。
关注我,带你学习更多编程技巧。