香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 111|回复: 20

《自学游戏开发·程序篇一——了解计算机的世界》

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-2-14 18:13:22 | 显示全部楼层 |阅读模式
想法创意都有了,就差一个程序员了?有没有想过:也许你配不上一个程序员。
成为一个独立游戏开发者,我认为他自己首先应该成为半名程序员。
这里是知乎专栏《自学游戏开发》,在上一篇文章《一个游戏是如何被设计和开发出来的》中,我们已经概览了一个大型游戏的开发过程。但是由于程序方面的内容不便可视化展示,所以那篇文章主要是展示了设计和美术制作流程。现在我们需要来讲一讲的程序方面的事情。首先,我们需要认识到:
1、掌握编程技能的重要性

如果你想成为一个独立游戏开发者,不会编程几乎是不可能的事情。就像一个厨师不会用刀案锅铲。 “电子游戏”是一个什么?我们这里不谈玩法设计,它的物理本质就可以说是一个计算机应用程序(程序是一串CPU指令、指令是一串代表01的电磁信息集合;请勿再溯源)。开发游戏其实就是开发一个程序(软件)。而开发程序的过程,我们把它叫作 编程。只有学会了编程、掌握了一款游戏引擎,我们才会真正明白:游戏,作为一款软件来说 它的本质是怎样的,它是如何运作的。你不知道汽车是如何工作的,你就制造不出一辆车。了解程序,就是了解游戏在电脑上工作的原理。掌握这些知识,不单单是程序员的立身之本,也应该是每一位游戏设计者的基本素养。再者,如果你从未接触过游戏开发,现在开始学习任何其他游戏开发知识,你是不可能在两个月之内自己动手制作出一款可玩的游戏的。但是,你学习编程与游戏引擎的使用,你便能做到。群友真实经历,@小小故事汇 在我的引导下从职业厨师开始学做游戏,经历两个月的学习之后已经能够独立做出“飞机大战”那样可玩的小游戏了。你若学习美术、或是“设计”,这都不可能实现。这是编程的强大之处。

作为一个专职的“游戏设计师”(游戏策划),并不是只会拍脑袋出主意就行了。我认为一个合格的“游戏设计师”至少应当能够编写逻辑脚本,把自己设想的主意用代码实现出来,不要把任何细小的事情都塞到专业程序员的待办事项里。职业的程序员会为设计师提供底层的服务,让设计师不用操心计算机底层的事务,只要把精力放在游戏逻辑本身上。事实上,现在各大游戏引擎的设计思路都是如此,比如 Unreal Engine 4 强大的Blueprint系统和CryENGINE推出的Flowgraph和Schematyc系统,都是为设计师们服务的,让他们不用敲任何代码就能编写出基本的游戏逻辑(基于可视化编程)。 为了让设计师们能够自己动手丰衣足食,程序员们已经做出了许多努力,想成为设计师的你,有什么理由不学习一下基础编程呢?千万不要想:程序的事情就交给专业的人来做吧。“我”就不需要学了。这种人,就是那种常常说“就差一个程序员了”的人;这种人,也常常是那种只会空想,给团队制造试错成本的那种人。因为他们不懂程序,但要让别人来为他的想法买单。他们不知道他们临时冒出的一个“好主意”可能要让一整个团队忙活好几个月。所以,我建议,每一个想要成为游戏设计师的朋友,都接触学习一下编程。

你只是想静静地画图,做一个安静的美术人员?如果你只是想平静地度过这一辈子,顺便在游戏制作领域出一些力,贡献一些艺术力量,那么你只需要专注于升华自己的艺术上限就好了。如果你想对这个领域搞点事情,比如说优化一下美术资源的制作流程,提升游戏画面的行业标准,那么你就不能只是会用Photoshop画画图、用3Ds max建建模,你需要知道Photoshop这款软件是怎么被开发出来的,它的每种图层混合模式采用了什么算法,这些算法用代码如何实现,如果我要扩展它的调色盘功能应该从哪里开始编写。一个能回答这些问题的艺术家,和一个只会用PS画画的艺术家,对于工具的理解是完全不同的(假设他们的艺术修养一样高)。而前者,更有可能推动整个数字绘画领域向前步进。为什么那些艺术创作软件都出自于国外的开发者呢?开发一款艺术创作软件,不仅需要专业的程序员,更需要具备编程素养的艺术家们来领导。而我国的艺术从业者们,有几个具备扎实的编程能力? 而往往一说到这些,那些“大师”们就会开始贬低工具的重要性,转而强调艺术本身。从“从艺动机”层面,许多选择艺考的人其实就是因为文化成绩太差;从思想层面,几乎少有艺术家会想去改进他们所用的工具。如果你不是这样的人,如果你想要成为一个推动数字艺术领域进步的人,有机会的话,你就应当认真了解一下计算机的世界。另外,回到游戏美术本身,一个游戏最终如何展现你画的图、你做的模型,这完全是由渲染管线和Shader脚本来控制的,这些都是代码写出来的。所以你认为游戏美术只是画画?那只是其中的一个小环节。当然了,说这些只是希望你能对游戏美术具备更多的认识。至于初学,我还是不会给你徒增痛苦让你去学编程的。别紧张,从窗户上下来吧朋友。
包括做音乐也是,现在编曲软件之强大,无不是具备音乐素养的程序员们的功劳。奥巴马说每一个现代人都应该学一下编程,不是随便说说的。写到这里,我希望每一位读者都已经在心里提升了掌握编程能力的重要性。
在后文中,我们开始来认识一下计算机与编程的世界,再之后是编程与游戏制作的关系,最后是编程学习路径。我会力图让每一个高中生看到下面的文字时也能够理解我在说什么,你不用具备什么前置知识,嗑着瓜子顺序看下去便好。
2、计算机与编程的世界

是先学C还是C#?还是JAVA?还是Python?还是Unity?还是OpenGL?首先你都知道这些是什么吗?每一个想学游戏编程的人都经历过这样的问题:入门编程语言该学什么?我在知乎问答想要自己做一款游戏,需要学习哪些知识?中明确说明了先学C#再学Unity。但是仍然有无数人私信问我到底该先学C还是C#。这不是因为他们没有认真看我的回答,而是他们不知道为什么要这样安排,以及很多其他前辈建议他们要先学这样或那样。道听途说,只言片语的回答是解决不了大家心中的困惑的,因此在本篇文章中我想为大家介绍一下计算机和编程语言的世界,这可能会花费一些功夫,因为从来没有人能够在一篇文章的篇幅内完整地介绍整个计算机的世界。我也只能尽力尝试,让大家了解那些语言各是什么,之间是什么关系。在此章节完成之后,我再会解释我们学习安排是如何设置的。
请注意,我现在要开始装逼了:这件事情如果要溯源的话最早可以追溯到亚里士多德开创出“逻辑学”;19世纪的乔治·布尔(George Boole)在此基础上发展出“数理逻辑”(如果你已经开始学编程的话一定会知道关键字:bool;3ds Max里也有“布尔”运算。就是以此人之名。);20世纪克劳德·艾尔伍德·香农(Claude Elwood Shannon)在“数理逻辑”基础上发展出“逻辑电路”。“逻辑电路”就包括了我们高中所学的:继电器、与门、或门、非门、异或门等等。利用这些工具,我们就能够制造出会计算加法、减法的逻辑电路。(还有非常重要的“触发器”、“振荡器”等等。后来的一系列发明,比如说:电子管、晶体管、集成电路可以统统看成是对前面技术的升级和替换。)我们得到了会计算的逻辑电路,又经历了一系列的升级和优化,那么现在我们的计算机是如何运作的呢?首先可以分为两个层,一层是CPU&存储器的电路实现,一层是0与1的世界。如果我在这里讲电路设计的问题,我想很多只是单纯想做游戏的人可能会疯掉(其实是我讲不来)。有一本很好玩的书,叫《穿越计算机的迷雾》,作者以闲谈扯淡的方式,从电与磁的发现一直讲到了CPU的实现,作为计算机硬件入门是一本不错的兴趣书。关于硬件,我们业余选手可以不用知道那么多,只要知道:CPU会执行我们的一些命令,我们的命令是存在“存储器”里的0101010110101001010…这样的数字来代表
作为常识我们知道,计算机只认识0和1(至少你现在知道了),那么我们就来看一下它是如何运用0和1来工作的。
汇编:

请注意为了方便讲解我就自己创造例子了,可能和实际情况有出入,但是更容易帮助理解。先看一下这一行代码:
00000001 00001100 00001010看不懂?普通人类当然看不懂,但是机器看得懂,而且机器就只能看懂这种形式的信息。这个叫做机器语言,也是二进制码。二进制码是构成如今计算机世界的基础,我们电脑里的任何文件、应用程序归根结底的都是以二进制码的形式存在的。比如:我们常常能够在电脑的文件夹里看到这样一个文件夹:



这其中“Bin”就是单词“Binary”的缩写,意思是二进制文件。打开bin文件夹,我们会看到各种.exe和.dll文件。对于我们来说,.exe就是一个应用程序嘛,比如说:QQ.exe、LOL.exe。



大家难道没有好奇过:为什么应用程序的的后缀是“exe”呢?原因:“exe”是英文词组“Executable File”的缩写,意思就是可执行文件。“可执行文件”的意思是:可以被CPU执行的文件。我们前面说过,CPU只能执行0101001这样的指令。所以“可执行文件”其实就是这种指令的集合,也就是是一堆二进制码 “00001111 01010011 00100110 00001111 01010011 ……”。所以它才会常常被放在bin(binary)文件夹里。(有没有发现,那些曾经我们看不懂的文件夹结构、文件名后缀,其实设计得都是有道理的)



我们玩的每一个游戏,它们的本质都是这样的二进制文件。所以编写一个游戏,其实最终最本质就是编写出这样的文件:0101010101110010101010101001010101……可是……
我知道这也太特么为难人了!鬼看得懂这些01是什么意思啊!(鬼:我也看不懂啊~)但没有办法,现代的计算机只能识别这种简单的机器语言。(即便是量子计算机也是玩01这样的量子比特) 为了让这些机器语言更容易被我们人类所理解,先驱们发明了汇编语言。(对,就是那个大家都说最难写的编程语言“汇编-Assembly Language”)但其实汇编语言很简单,有了汇编,我就能跟你解释前面的0011是怎么回事了。再来看之前的那行代码:
00000001 00001100 00001010请注意这不是一串随便瞎写的0和1,它是有规律的!你们看,以八个0或1为一组,每组中间有个空格。这其中,每一组我们叫做一个“字节”(byte),每一个0或者1,我们叫做一个“比特”(bit)。第一个字节:00000001,假设我们规定,它代表一个命令:加法(ADD)。我们再规定,如果CPU遇到“加法”命令,它就把后面两个字节相加,把结果存到前一个字节所在的地方。于是我们的CPU就能够计算加法了。规则是给它这三个数:



第一个是表示加法命令的“00000001”,第二个A和第三个B是两个加数,每次都不同,所以我用x表示那些比特位。同样的道理我们能够制定出减法命令、乘法命令、复制命令等等。比如复制命令:我们规定“00001111”代表复制命令,如果CPU遇到“00001111”,它就把后面第二个字节的数据,复制到后面第一个字节的数据所表示的位置上(注意这些字节里的二进制数不仅可以当数字用,也可以当命令用,也可以用来表示储存位置)。于是我们就有了复制数据的功能了。



这些功能,都是CPU中的逻辑电路为我们提供的,我们只需要发送规定好的指令便能使用这些功能。注意,指令的本质是一串0和1代表的信息,但是我们很难去记忆和区分00010011和01001101这样的数字,所以我们就用“ADD”代表00000001(加法指令),用“COPY”代表00001111(复制指令)。Add和Copy在英文里本来就是加和复制的意思,这就很好记。而“ADD”、“COPY”等这些指令集合起来就形成了汇编语言。它实际上就是把机器语言(一串0和1)直译成了英文单词。一般CPU认识的指令不多,就那么十几个(加上变种一般也就几十个)。所以汇编语言中的指令一一对应也不多,大致分为三种:

  • 数据传输类:复制、加载、存储……
  • 算数/逻辑类:布尔运算、加法运算、自加运算……
  • 控制类:转移、停止……
就这么几个指令能干啥?你别说,我还真有办法能让你亲自见证一下,就这么几个指令,可以让CPU干些什么事。首先,下载《Human Resource Machine》这个小游戏。然后开始玩吧。我已经让群友们验证过了,不管有没有学过编程都可以玩几下。而游戏的主体内容,其实就是以一种有趣的方式在写汇编代码。在过关这个游戏之后,你会发现你自己用这几个最简单的指令,让计算机实现了一些简单的功能,诸如:比较两个数字的大小、判断一个数字的正负、让计算机数数、用加法实现了乘法运算、从一组数中找到最小的数……如果你在游戏里过五关斩六将实现了这些功能,那么你就相当于解决了上个世纪计算机科学早期那些先驱们所面对的问题。给自己一个奖励吧,点击文章末尾的“赏”就会看到编程学习大礼包!额,你说你没有通关?没关系,最后几关是比较难,而且这个游戏只是为了让你体验一下汇编编程的感觉。
现在你会发现,汇编语言其实没有多复杂,而且比起那些0011的代码,真是太好识别了。但是那还不够,比如我要计算一个:
X=Y*Z+(Q/10.5)+P-2这个自然的表达式人人都能看懂吧?但是用汇编语言写出来就不那么好看了:
Mov   X,  Y
Mul   Y,  Z
Div   Q,  10.5
Add   Y,  Q
Sub   P,  2
Add   Y,  P一眼看上去不知道是在干嘛。而且汇编语言也不够“自然”,比如我要做一个赋值操作:
X=Y;上面这种写法很自然,我们在学数学的时候就是这么写的,但是在汇编语言中它是这么写的:
Mov   X, Y直译就是:把Y移动到X的存储位置(这是计算机硬件能够实现的操作)。再比如:
if    x<y  
then  x=y   
else  y=x

如果x<y那么x=y否则y=x这几行命令,我们用自然语言就能读懂它在干嘛:比较两个数的大小,然后把大的数赋值给小的数。用汇编语言写就是这样:
Cmp X,Y
JLE LessCase
Jmp SkipCase
LessCase:
Mov X,Y
SkipCase:
Mov Y,X用自然语言写很简单的三行命令,用汇编写就需要这么多行才能实现。
还记得当初我们为什么需要汇编吗?因为机器只能识别0和1构成的指令,但是那种数字指令对我们人类来说很难识别和记忆,所以我们用英文单词来一一对应那些数字指令,那些英文单词构成的指令集合就成为了汇编语言。新的知识点:当我们写出汇编代码后,在真正交给CPU运行之前,我们得把汇编代码翻译成机器码,因为CPU只认识0和1构成的机器语言。(因为机器指令和汇编指令是一一对应的,所以翻译过程很简单,就像把简体字翻译成繁体字)。
先驱们尝试把汇编语言简化的过程中,想到:既然要翻译,那么我们能不能创造一种更简洁的语言,然后把它翻译成相对复杂的汇编呢?就像把文言文翻译成语素成分更复杂的现代文。
"私见张良,具告以事"———翻译为———>"私下会见张良,把事情详细地告诉了他"



从这个想法出发,C语言诞生了。(实际上C语言是在B语言的基础发展出来,B语言是在BCPL的基础上发展出来的,BCPL是在CPL的基础上发展出来的。在CPL之前还有个十几种其他编程语言。不要管辣么多,静静听我吹就好。)
(在这儿停顿,看到这里,新手朋友们可能已经费尽了许多脑细胞了,如果你已经阅读/思考疲劳的话,可以在这儿停顿,起来走一走看看窗外。也许你并不能全部理解上文的内容,那没有关系,那不会影响你学习编程,但如果能理解的话,对今后学习将会有助益。我能保证后面的内容将会越来越简单。你大可以带着疑问先阅读完全文,再回过来读一次。)

C语言

你们看,汇编语言多复杂,因为它和机器硬件实现的指令一一对应,所以光改造它而不改造机器指令的话毫无意义。所以我们不如创造一种新的语言,然后把它翻译成汇编吧!C语言帮助我们实现了设想。C语言有许多强大的优点。但是在此,(顶着老师和同行们的压力)我想让新手知道的是:函数。
函数是什么?当我们在写代码的时候,可以想象为我们写的每一行都是一个指令。我们写十几行指令来实现一个乘法运算,用二十几行写一个排序操作。程序猿是世界上最懒的物种,他们不想每次要做乘法时都写十几行代码。能不能用一行指令代表十几行指令?就像:



指令集A和指令集B所描述的就是完全同样的事情。但是A用了7个指令,B用了5个指令。如果你要在这件事件上偷懒,你是愿意以A的形式还是B的形式来写这个指令集呢。我不知道你的选择是什么,但是作为世界上最懒的物种来说,程序猿在编程的时候,能少写一行就不会多写,能少敲一个字母就绝对不会敲两个。所以在碰到上面这个问题时,采用B的写法无疑。那么如何实现呢?假设指令集A中的每条指令都是计算机能够识别的指令,指令集B中的第3条“把大象装进冰箱”是计算机不能识别的,是我们自己虚构的。但是我们要使用这条指令,因为它对于我们来说很省事。现在很简单,只要规定:我们每次写“把大象装进冰箱”这条虚构指令,就自动把它翻译成“打开冰箱、把大象塞进去、关上冰箱”这三条原生指令。翻译过程不用担心,前人们已经写好了各种翻译器能够现实这种效果。
那么,上面我们虚构出来的那条指令:把大象装进冰箱。其实就是我们所谓的函数!下面展示的是在C语言中创建一个函数的形式。
把大象装进冰箱(大象x)
{
   打开冰箱;
   把 大象x 塞进去;
   关上冰箱;
}下次想干这件事件的时候,就只要写一句:把大象装进冰箱(大象巴拉)。括号里写哪头大象,就装哪头。 那么把大象装进冰箱()就是一个函数。
有了函数这个东西,世界上任何复杂的任务都可以被拆分成最简单的单个任务。当我们学C语言的时候,一定要把函数的用法学好。我认为这也是新手学习C语言的主要任务。

更高级的编程语言

按照学院派的编程学习路线,计算机专业基本都是先学C语言,然后学C++,(然后学数据结构),然后学C#/Java/Python/JS....,然后回去再学汇编呀、电路呀什么的。想必大家都熟悉这套方案。
其实学习一个东西,从根源开始了解接触,从底层学到顶层是一个自然的遵循逻辑的学习方式。在计算机世界中,如果说从真正的根源开始学的话,估计真得从逻辑电路开始了,然后学到汇编语言,再学到C语言,再学C++。但是为什么学院们都选择从C语言开始呢?一是因为相比起汇编语言,C语言更能够学以致用,使用起来更方便;二是因为,现在许多流行的编程语言,比如C++、JAVA、C#、Python都是类C语言的,首先是语法上都是仿照C语言的风格来设计的,其次它们的一些技术原理是建立在C语言的基础之上的。它们之间的关系就好比“汉语”与“北京话”、“四川话”、“重庆话”、“广东话”之间的关系,其中C语言就是汉语。所以C语言作为广大语言的根基,把它当做入门编程语言来学习是没有问题的。再以它为中心,向高层语言和底层原理来扩展学习,往往计算机专业的同学到大三就能把整个计算机体系打通。


编程语言发展史
刚刚我们才讲到了C语言。并且说了游戏领域中比较重要的几种语言与C语言的关系。从这张图中我们应该能够更清晰看到这几种语言的发展脉络。每一种新的语言诞生,都摒弃了一些前者的弊病,加入了自己优秀的特性。但无论怎样,每一次编程语言的发展和进步都是在前人的基础之上进行改良和创造,很少有几个语言是凌空出世的。正因为这样,所以编程语言之间的差别,并不是天差地别。并不是我选择了学习JAVA,就意味着放弃了C#;也并不是我如果不先学C语言,我就学不懂C++。编程语言之间都是触类旁通的,只要先掌握了其中一种,那么其他的语言就能很快掌握。
再看一眼上面的图,接下来我来讲讲C、C++和C#、Java、JS、Python的关系。
C++

首先经过我们上面一顿瞎BB,已经知道了C语言是怎么来的,而且知道了C语言的语法比较接近我们的自然语言,更容易读懂了。C语言写的代码,在被CPU运行之前,需要翻译成汇编代码,再翻译成机器码。我们对这个设计很满意,使用了好多年。后来在使用中,特别是开发一些大型项目,比如用C语言开发一个计算机操作系统时,发现有问题处理起来很麻烦,先辈就对C语言进行了改进。有一次改进后新增了一个叫“类(class)”的功能,这个功能很牛逼,导致那个版本的C语言直接脱胎换骨。这种与众不同的牛逼需要在名字上体现出来,所以他们学习iPhone的起名策略,在名字后面加了个“Plus”。“C Plus”=“C+”。一个不够,那就两个“C Plus Plus”=“C++”。(顺便剧透一下C#的起名策略:“C#”=“C Plus Plus Plus Plus”=“C++++”。)所以!C++是C的升级版,多了一个核心功能:类。语法没有变,本质的东西没有变,还需要被翻译成汇编,然后翻译成机器码,再交给CPU执行。所以学校里安排先学C语言,再学C++,其实这种说法是有点狗屎的,就好像是说:我们先学习“浮水”,再学习“游泳”。本来我们学习游泳的过程中就会学习浮水,但是就要把学习“浮水”先说一遍,让人误解为这是两个差别很大的东西。所以懂了吗?我再说明白一点:学习C++就是学习一个高级版本的C语言,学C++的过程中,就会先把C语言的那些东西学到。所以不存在:如果不学C语言打基础,就学不好C++。如果再有人问这个问题,就把这一章节贴到他脸上去。
另外补充:C++从C发展出来后,C语言也没有闲着,自己还是在不断发展,比如后来发展出了Objective-C。严格意义上来说,“学习C语言”和“学习C++”确实是不一样的,因为要去研究它们不同的语言特性。但是!对于没有学过任何编程的初学者来说,最开始就是学习个语法认识几个关键字而已,根本到不了研究语言特性的程度,所以两者说法对他们来说几乎没啥差别。
C#(和其他高级语言)

我们知道现在CPU厂商Inter和AMD两方对峙,操作系统是Windows、Mac OS和Android三足鼎立(我们不知道Linux)。 可是你们知道上世纪八九时年代,计算机市场是繁花绽放,各种各样的硬件、操作系统充斥在硅谷整条小吃街。那个年代的码农,随手写一个程序,并不是写完就能到处用的啊。就算现在也不是啊。原因很多,可能CPU不一样,操作系统不一样....那怎么办?先辈们想到了一个胆大包天的方法:我写一个软件,这个软件去模拟CPU硬件,然后再写其他的程序,把这些程序编译成这个虚拟CPU能够执行的机器码,然后让虚拟CPU去执行程序。(请再读三遍)



这样,只要所有的电脑都提前装好我这个虚拟CPU软件,那么其他那些杂七杂八的软件统统都在我上面可以运行了!完美解决跨平台问题。
有了这个想法之后,先辈们就开始动手去写这个牛逼哄哄的虚拟CPU软件了。他们用C语言或C++来写这种后来被称作“虚拟机”的软件。这种事情都能干得出来,他们就顺便又为自己的“虚拟机”发明了专门的编写程序的语言(真实因果关系是先发明语言,从而开发对应虚拟机)。Java语言对应JVM(Java Virtual Machine),C#语言对应 .NET Framwork(你们玩游戏的时候肯定装过这个),Python对应Python Virtual Machine......
看到这里,聪明的你已经看破了真相,原来C#、Java、Python编写的程序都不是直接交给真正的CPU运行的,而是交给了一个模拟CPU的软件运行的!把我们的程序交给了另一个程序来运行!把我们的程序交给了另一个程序运行!明白吗,为什么那些程序猿都说C#没有C++快。因为C#写的程序交给了C++写的一个程序来运行!Java写的程序也交给了C++写的程序来运行!Python写的程序也交给了C++写的程序来运行!再重复一遍就疯了……
到现在为止,我们解开了一个新手十大困惑之一:为什么C++比其他语言更快。现在我们还在章节“计算机与编程的世界”中,接下来,我们要聊一聊那几种高级语言的不同点,以帮助我们搞清楚新手十大困惑之首:我应该选哪个语言开始学编程
不同高级语言使用感受

这么说吧,当年我才大二的时候,只学过C++。从没有专门学过一天其他语言。在那个背景下,我能够用C#在Unity写小游戏,我还用Java在Android Studio里写过一个贪吃蛇。我可是一天的C#和Java都没学过。为什么我能做到呢?因为主流编程语言的语法基本都一毛一样,根本就不用怎么学啊。那种差别就像东北话和天津话的差别一样,大家都是从汉语出来的,谁听不懂啊。为了证明几种语言语法上真的很像,我写了一段伪代码,并翻译成不同语言版本,请找不同:


看,这三份代码是在干同样一件事情,是用三种语言所写的。除了第6行比较特殊,其他部分你们能看出什么区别吗?是不是真的很像?如果掌握了其中一中语法,另外两种有什么难的呢?无非就是注意一些细节不同点。总有些人问第一个编程语言学什么,我通常回答“都行都行”,看看上面这张图,我不是瞎说的啊,对于学习些基本语法,了解基本概念,先学哪个真的都行(反正都一样)。如果把我们学做游戏比喻成学做饭,语言呐、环境呐这些东西,就可以看做是厨具厨房。学做饭的时候,重要的是学习菜肴怎么做,烹饪方法心得,厨具工具的用法是基本的也是次要的。我们随便选个厨房开始学做饭,一旦学会了,那么在另一个陌生的厨房里难道就做不出饭菜了吗?不会的。就算是另一个厨房,就算那个厨房里的锅、碗、灶、铲奇形怪状从未见过,习惯习惯也不影响我们做饭呀,因为工具毕竟还是那些,变其形式而不变其本质。
那么在这种情况下,我们应该选那个语言开始学习呢?总要有一个选择。这个选择就是C#。为什么是C#呢?说一个很简单的理由,因为Unity是用C#写代码(不考虑JS)。而Unity是我最推荐新手学习的游戏引擎。所以学了C#就直接去用Unity咯。如果有人问:“我想用Unreal4或CryENGINE,我能不能从C++开始学呢?” 当然可以呀。你掌握了C++之后,如果又转变想法想用Unity来开发,也能很快上手。但是我不推荐这样,因为C++细节非常多,更繁琐一点。学起来没有C#轻松。而Unreal4和CryENGINE呢,用起来也更麻烦一点,也不建议新手拿这两个引擎来考验自己的自信心。
下次继续……

作者并非职业程序猿,也不是计算机科班出生,若文中有任何错误,望先辈们在留言中指出,以帮助我修正文章、传播正确有用的知识。
扩展阅读:
1.《穿越计算机的迷雾》

那么,下一节再见。

这里是知乎专栏《自学游戏开发》第三篇文章:《自学游戏开发·程序篇一——了解计算机的世界》。我是 窦月汐 。如果你是第一次看到本专栏,建议你跳转到自学游戏开发--关于本专栏进行了解。如果这篇文章和本专栏对你所帮助,希望你在看到其他游戏人需要帮助时 也能把本专栏推荐给他,向每一个游戏人致敬。
我公开了我的一个兴趣交流群,群号为:474891082。(为避免无聊人士,设置了5元 群费)
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-2-14 18:13:58 | 显示全部楼层
占楼支持
回复

使用道具 举报

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-2-14 18:14:19 | 显示全部楼层
快帮我查错
回复

使用道具 举报

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-2-14 18:15:18 | 显示全部楼层
不赞不是人
回复

使用道具 举报

3

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-2-14 18:16:06 | 显示全部楼层
不是职业程序猿竟然也理解这么透彻
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-2-14 18:16:26 | 显示全部楼层
又发文章了好啊
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-2-14 18:17:24 | 显示全部楼层
就喜欢这样的文章。
回复

使用道具 举报

2

主题

5

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-2-14 18:17:51 | 显示全部楼层
我记得在C++ Prime Plus上看到过,名称C++来自C语言中的递增运算符++,该运算符将变量加1。名称C++表明,它是C的扩充版本。这个是C++名字的由来
回复

使用道具 举报

0

主题

4

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2023-2-14 18:18:16 | 显示全部楼层
是的,我说学iPhone是瞎说的,时代也不对嘛
回复

使用道具 举报

1

主题

4

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-2-14 18:18:50 | 显示全部楼层
已粉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 05:02 , Processed in 0.845268 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表