二叉树

这篇博客来聊一下二叉树。呆萌数据结构系列,终于开始了树型结构的部分。这篇文章你能够学到的内容有 树,有哪些应用,二叉树的结构,什么是满二叉树,什么是完全二叉树,二叉树的遍历方式,二叉树的构建。二叉树是很基本的结构,在此基本上,会有很多很多变种,变成各种各样的树,理解了二叉树,对于后面学习其他更复杂的树型结构,会有很大的帮助。 这篇文章首先理解文字上的内容,不要管代码,对二叉树的结构,操作,理解原理,最后再看代码。 好了,下面开始吧。 树,有哪些应用 现在学习的目的,已经不是为了考试,而是为了能够用来做一些事情。对于我们来说,知识只有用起来,才是有意义的,所以,我们先说一下树型结构的一些应用。咦?为什么不是二叉树的应用呢,因为很多应用,都不是单纯地使用二叉树来实现的,而是在此基础上,使用了它的变种,所以我们这里直接说一下树型结构的一些应用。 我们使用各种各样的数据结构,本质上似乎就是为了更方便或更高效地去组织数据,操作数据。我们平时用的搜索引擎,当你输入要搜索的内容时,可能在输入了前几个字,下面就已经出现了我们想要的结果,其实背后,就是用了树型结构,才能在这样庞大的数据中,找到与我们输入内容匹配的结构。 我们手机中常用的电话薄,也是这个原理。当你找一个联系人时,输入第一个字,例如李,可能下面的结构是李四,李五,李六,但是输入第二个字时,结果就会更精确。 我们平时用的压缩软件,其数据压缩算法,也离不开树型结构。 操作系统中的文件系统,以及我们使用的数据库软件,也是树型结构的应用。 二叉树的结构 二叉树是由一个一个节点组成,每个节点,有数据部分,以及两个节点指针,一个指向左子树,一个指向右子树。二叉树每一个节点,最多拥有两个子树。就像下面中的图(图中的数字可以理解为要存储的数据)。另外,二叉树的分支,也就是左右子树,是具有左右次序的,不能随意颠倒。 什么是满二叉树 满二叉树就除了最后一层,每一个节点,都拥有左右两个子树,没有空缺。 什么是完全二叉树 在理解了满二叉树的基础上,才能理解完全二叉树。完全二叉树要满足两个条件。首先,如果不看最后一层,那这棵树是满二叉树。其次,最后一层,要尽可能的往左靠,中间不能有空缺。什么意思呢?我们看一张图。 上图中,左边的图是一个完全二叉树。如果去掉最后一层,那这棵树是满二叉树,满足。最后一层,即使缺少了一个节点,但是所有的节点都是尽可能地往左靠了,所以,也满足第二个条件。 而第二个图,不是完全二叉树。首先第一个条件就不满足。其实,最后一层的节点也不是尽可能地往左靠。什么叫尽可能得往左靠呢,如果 B 节点作为 A 节点的左子树,那就叫做尽可能地往左靠了。 二叉树的遍历方式 树的遍历(不限于二叉树),有广度优先遍历,和深度优先遍历。而深度优先遍历,分为前序遍历,中序遍历,后序遍历。 我们以下面这张图为例子,分别说一下这几种遍历方式。 广度优先遍历: 广度优先遍历,其实就是一层一层地遍历,所以又可以称为层次遍历,会先访问离根节点最近的节点。按照广度优先遍历,上面的树中节点访问顺序是这样的。 8,4,12,2,6,10,14,1,3,5,7,9,11,13,15 深度优先索索 深度优先搜索,通常采用递归的形式来进行。这里我们用简单的代码去描述,会比文字描述更直观。 前序遍历 前序遍历的顺序是先访问根节点,然后再访问子树。 void pre_order_traversal(Node root) { // TODO:操作当前节点 // 如果左子树不为空,则递归处理左子树 if(root.left != null){ pre_order_traversal(root.left); } // 如果右子树不为空,则递归处理右子树 if(root.right != null){ pre_order_traversal(root.right); } } 中序遍历 中序遍历的顺序是先访问左(右)子树,然后访问根,然后访问右(左)子树。 void in_order_traversal(Node root) { // 如果左子树不为空,则递归处理左子树 if(root.left != null){ in_order_traversal(root.left); } // TODO: 处理当前节点 // 如果右子树不为空,则递归处理右子树 if(root....

December 21, 2019 · 2 min · 猫猫

队列

生活中的一些排队行为,基本上都是队列的形式。这篇博客涉及的概念有 队列,循环队列,优先队列,双端队列。 很多编程语言已经内置了队列结构,在实际项目中可以直接使用。这篇文章里的代码实现,主要用做原理理解。 拿超市买单为例,买完东西,一般会找一个结账台排队,等待结账。如果前面已经有人在排队,那你肯定是排在当前队伍的最后面,如果再来人,肯定是排在你的后面,依次往后排。每当有一个顾客买完单,那后面的顾客就会往前走,直到整个买单队伍没有人排队。这就是队列结构。是不是很简单~ 队列 队列,是一种先进先出的结构(First in first out),也就是在队尾进行插入操作,在队头进行删除操作。队列可以用链表来实现,也可以用数组来实现,要根据实际需求来决定。 队列的操作有入列、出列、判断是否为空、判断是否已满等操作。下面将用C#来实现列表结构,看代码 public class Node { public int data; public Node next; public Node(int data) { this.data = data; } } public class LinkedListQueue { public Node head; public Node tail; // 插入一个元素 public void Enqueue(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; tail = newNode; } else { tail.next = newNode; tail = newNode; } } // 删除一个元素 public int Dequeue() { if (IsEmpty()) { Debug....

December 18, 2019 · 2 min · 猫猫

通过阅读儿童图书快速提高你的英语水平

翻译自 Improve Your English by Reading Children’s Book Series 如果我告诉你,阅读英文不需要很难,不需要再为此头痛。如果我告诉你,可以通过你感兴趣的方式阅读,来学习新的英文单词,来提高你的听说能力。你是否会认为我很 Crazy? 这篇文章,看到最后,我保证你会开始阅读,爱上阅读。 我希望你阅读儿童图书系列 What? 为什么阅读很重要 这部分内容是为那些认为阅读是浪费时间的朋友准备的。 阅读并不是浪费时间的。阅读会帮助你在很短的时间内学习到大量的新词汇。并且,这些词汇是在文章上下文中学到的,你可以清楚地学到这个词在句子中怎么用,而不需要去死背这个单词的意思。通过阅读学习是很自然的,就像我们学习母语时,什么时候背过单个字?记忆中是不是都是在读文章时,遇到不会的字了,才去查字典的? 如果你是『免费自愿阅读』的,那阅读并不是浪费时间。免费自愿阅读这个概念来自于一个很有名的教授 Steven Krashen。免费自愿阅读的意思是,你选择读的内容,是你有兴趣,并且能大概看懂(与自己当前的英文水平相匹配)的内容。 当你阅读时很开心,你学到的就不仅仅是词汇了,你甚至意识不到其实自己正在学习词汇的搭配使用,句子的结构等这些内容。你的信心得到了提高。你的语法在不需要背诵任何东西的情况下得到了提高和加强。你学到了一个句子的是怎样构成的,而不是去背诵什么主语宾语之类的。阅读也让你更容易地理解和说出更地道的英文。 即使阅读有那么多好处,那怎样去找符合自己当前英文水平并且有趣的阅读材料呢? 记住,符合自己当前的英文水平并不是说你需要知道每一个词的意思,而是指,你阅读的材料,只要能大概读懂,一句话中只有少部分单词不认识,那这个材料就很适合你。 什么是系列丛书 系列丛书在英语世界里很受欢迎,在我很小的时候,我读过很多。 做一个类比,一部电影,例如钢铁侠系列,分为钢铁侠一,钢铁侠二,钢铁侠三,这就是一个系列。书籍也是一样的,例如哈利波特一,哈利波特二,哈利波特三等。 怎样能确定阅读系列丛书是有用的呢? 我们上面提到的那个教授,Steven Krashen,在很多年前,发表了一篇文章,是关于英语学习者通过阅读儿童丛书系列 《Sweet Valley Kids》提高了他们的英语水平的故事。 文章有内容是这样的: 有四个女人,住在美国,正在学习英文,英文是她们的第二语言。他们被邀请参加一个读书节目。老师给他们需要读的书,就是《Sweet Valley Kids》。 她们很喜欢那个系列的书。Sweet Valley Kids 是短篇,只有不到100页,并且对于她们来说很容易读懂。之后,她们能够在很短的时间内,读很多书。读的越多,她们的英语水平提高的越快。很快她们读过几个系列的丛书后,就发现自己能很容易地理解电视中的英语对话。 教授的完整文章链接 Acquisition of vocabulary from the Sweet Valley Kids series: Adult ESL acquisition 推荐一些有趣的系列书籍 《Sweet Valley Kids》已经无法下载,但是这里我可以推荐另外的,我觉得不错的有趣系列。 下面的书籍都可以在 Amazon 找到 1. Greetings from Somewhere 这个系列很有趣。讲的是 Ethan 和 Ella 是一对双胞胎。他们的母亲是一个旅行作家,父亲是一个教授。他们一起去环游世界。在经过每一个城市的时候,都会有一些事情发生,他们在离开前,必须解决掉谜题。 2. Nancy Drew and the Clue Crew 南茜在英语世界里是很有名的一个角色。她是一个侦探。她和她的朋友贝丝和乔治,解决了许多出现在他们学校和日常生活中的神秘事件。...

December 14, 2019 · 1 min · 猫猫

一个不用背单词的高效英文学习法

翻译自 English Immersion Reading: A Powerful and Effective Way to Learn 你觉得英文阅读很无聊吗?你是否一直在寻找一种能让阅读更有趣,更高效地方式? 接着往下看,你将会爱上 沉浸式阅读 我们通过阅读和听力掌握一种语言,而不是通过单纯地学习语法和记忆单词。我们可以很熟练地说一种语言是因为我们听的多,读的多,而不是因为我们记住很多正确的语法规则。 通过尽可能多的读英文,听英文,去学习新单词和语句,去理解书面英语和口语,是一种高效的方式。 对于读和听的材料,需要根据自己的英文水平去定。不能太难,和太简单。如果太难,远远超出我们现在的英文水平,一句话中大部分单词不认识,是没法用的。太简单,每一个单词都认识,那对于提高就没有什么意义了。所以应该选择那些比自己当前英文水平稍微高一点的英文材料,能够大概读懂,但是里面又有新的词汇可以学习,那就很合适。 有一个方法可以使用阅读更简单一点,那就是听读,眼睛一边读,耳朵一边听。这叫做 沉浸阅读 沉浸,意味着注意力被完全带入某种东西中。例如看电影的时候,我的所有的注意力都在电影剧情上。而当我们学习语言时,沉浸则意味着我们被所有和这个语言有关的东西包围着。不管是听到的,看到的,读到的,还是正在思考的东西。 沉浸阅读可以在很多场景中使用,不仅仅是读英文书。一边看字幕一边看英文电视剧,电影。或者一边听播客一边看英文原文。这都是很有效的学习英文的方式。 接下来,我将解释为什么沉浸式阅读很强大很高效,为什么我们需要使用这种方法,以及如何随时随地在手机上,电脑上,使用沉浸式阅读提高对英文的掌握。 1. 当遇到新词时,不要去猜它的发音 当你在阅读的过程中,遇到新词汇时,不要去猜它应该怎么说,怎么发音。也不要尝试去背任何发音规则。你应该多听英语母语的人怎么说这个词,然后一遍一遍去重复。 当你一边读一边听的的时候,你就可以将发音和词汇进行匹配。这样当你看一个新词时,就会第一时间知道这个词的正确发音。这是很重要的一点。因为如果一个词一直使用错误的发音,那么错误就会越来越熟练,后面想纠正的时候,就会很困难。 2. 要学习如何说整个句子,而不是一个单词 学习一个新词时,如果你不知道怎样在句子中使用,那学习这个词是没什么意义的。 一个新词,如果从没有见过它是怎样在句子中应用的,那我们就很难自己去应用这个词。 不要去猜一个词应该怎样应用于句子中,也不应该尝试将它应用于自己造的句子中,因为可能用错。 学习英语,应该学习短语,句子,而不是单个的词汇。把请注意力放在学习语言词汇的搭配上,模式上,语句结构上,才是最重要的。 通过阅读去学习英文的一个好处就是,不需要死记硬背很多『规则』 当你一边读,一边听时,你学到的是如何说一个短语,一个句子。以及英文的什么时候着重发音,什么时候减弱发音,什么时候连读等等。一个单独的词汇发音,可能与它在特定句子中的发音是不同的。 3. 做更多有趣的练习 你需要大量的阅读和听力练习。 如果一个单词只见到一次,那就很难学会和记住这个单词的使用。但是如果见到很多次,那就很容易很自然地学会这个单词相关的短语,句子,搭配。 现在我们已经不是在英语课堂中,所以可以任何时候按自己的心情去读,去听。可以自己选择感兴趣的书籍,音频等等。 在有兴趣的资料中学习,就会很容易沉浸其中,很会更容易地学会和记住一个词的使用。 一遍一遍去听。即使现在所有的单词都不认识也没关系。即使现在所有的内容都不理解也没关系。如果使用的材料都能理解,那也没关系。这不能说明你使用的材料太简单了。你依然在听不是吗,依然在熟悉和加强正确的单词搭配,单词短语,句子,发音。 4. 你可以通过模仿来练习自己的发音 你不需要去记忆什么发音规则。要通过耳朵去听来学习发音,而不是通过眼睛去背。 如果不知道自己的发音是什么样子的,就没法提高自己的发音。 一边读,一边听,同时,模仿听到的发音。不要通过眼睛看去记忆发音。要在听的同时,去默默重复所听到的内容。 你可以使用录音记录下自己跟读的声音。然后去对比自己的发音和音频中的发音,就知道哪里不准确,哪些还需要提高。 模仿和跟读,是很有效的练习发音的方式。 5. 帮你更快地提高英语水平 没有一种快速简单的方式学习英语,也没有什么秘密魔法可以瞬间让你流利地说英语。 但是你可以通过一些方法,加快学习的速度。 学习并不是一定很难的。 通过先学习语法,再记忆单词,然后再尝试说英语,是很低效的学习方法,不要那样做。 不需要去死记硬背单词。 当你一边读一边听的时候,可能你意识不到自己正在不断地掌握英语。但其实你正在很自然地吸收单词,搭配,短语,句子的使用等等。就像平时听母语一样。有一天,你看到一些东西,或者听到什么的时候,你才意识到,你居然可以理解。 下面说说有哪些可以一边读一边听的方式 现在有很多很方便的方式,可以让我们一边读,一边听来练习自己的英语。 1. 使用英文字幕看电影或电视剧 看电影的时候通常我们会使用中文字幕,第二遍看的时候,可以尝试一下使用英文字幕,尝试去听,去跟着模仿。 TED 也是一个很好的素材。网易公开课的TED模块 2. 听那些有英文文本的播客 我认为,我的播客就不错 3. 使用亚马逊的电子书和有声读物 如果你有 Kindle,那么就可以在 Kindle 上看书,同时,在手机的 Kindle App 上,听对应的有声读物,简直完美。...

December 14, 2019 · 1 min · 猫猫

堆栈

有一堆书,一本叠一本地放入箱子里,最后放入的,一定是在最上面,对不对。取书的时候,规定只能从上面一本一本地取,如果要拿最先放入箱子里的那本书,也就是最下面的那本书,只能先把上面的拿出来。 什么是堆栈(Stack) 上面说的就是我们今天要讲的堆栈,也可以简单叫做栈。堆栈是很常用很基础的数据结构。堆栈涉及到的概念如果下。 栈顶,就是最上面的一个元素。 压栈(Push),就是将一个元素放入栈中。 弹出(Pop),就是将栈顶的元素从堆栈中拿出来。 就像上面往箱子里放书一样,最先放入堆栈的元素,在最下面,最后放入的元素,在最上面,而取元素,只能从上面一个一个取,不能从中间抽取元素。 堆栈有什么用呢 那栈有什么用呢,举几个简单的例子。我们用的很多软件,都有撤销功能对不对,其实,那个就可以用堆栈来实现。将每一步操作时的状态,保存到堆栈中,当用户要撤销时,就从堆栈中拿出最近的一个状态进行恢复,也就是最后放入堆栈中 (栈顶) 的状态数据。是不是很熟悉? 后面要学到的树的遍历,深度优先搜索,也是用堆栈来实现的。 总之呢,记住一句话,先进后出(Fist in last out) 或者 后进先出(Last in first out) 就可以完美诠释堆栈这种数据结构。 自己动手实现一下 很多编程语言已经实现了堆栈(Stack)结构,但是呢,我们这里自己实现一下,加深理解。代码使用 C#,以链表的形式来实现。(C# 语言本身已经拥有了Stack,在实际使用中,不需要自己实现) class Node { public int data; public Node next; public Node(int data){ this.data = data; } } class Stack { public Node topNode = null; // 将一个数据压入堆栈中 public void Push(int data){ Node newNode = new Node(data); newNode.next = topNode; topNode = newNode; } // 将一个栈顶数据从堆栈中弹出 public int Pop() { if (!...

December 12, 2019 · 1 min · 猫猫

链表

什么是链表 链表和数组一样,是一种线性的数据结构,由一个一个节点构成,节点中存放着数据,以及指向下一个或上一个节点的指针,通过指针,将节点链接在一起,构成整个链表结构。不同于数组,链表在内存中并不是连续的存储空间。 为什么要用链表?或者说链表有哪些优点 我们知道,数组是很方便的数据结构,但是数组有一些局限性。必须事先知道要分配多少内存空间。插入和移除是很耗费性能的操作,因为需要移动不止一个元素。 而链表,正好弥补了数组的缺点,链表是动态内存,不需要事先分配固定大小的空间,添加和删除元素,也只需要改变指针即可,不需要移动很多元素。 链表的缺点 当然,链表也有弊端。无法像数组一样随机访问,例如要访问第5个元素,是没办法直接访问的,只能遍历。每一个节点,需要额外的内存空间用来存储指向下一节点的指针。对缓存不友好,因为链表的内存空间并不一定是连续的。 链表怎样用代码表示,以及插入、删除、遍历操作 下面我们使用C#来描述一下链表 /// <summary> /// 链表中的节点结构 /// </summary> public class Node { public int data; public Node next; public Node (int data) { this.data = data; } } public class Linkedlist { public Node head; public Node tail; /// <summary> /// 插入一个节点 /// </summary> /// <param name="data"></param> public void InsertNode(int data) { Node newNode = new Node(data); if(head == null) { head = newNode; tail = newNode; } else { tail....

December 11, 2019 · 2 min · 猫猫

超简单的VPS购买和配置教程

这篇博客将一步一步教大家学习VPS的购买和配置教程,只需要简单几步,就可以拥有自己的VPS,然后愉快玩耍。可以自己搭一个科学上网代理服务器啦,托管自己的博客啦,等等。 ...

December 10, 2019 · 1 min · 猫猫

数组

数组,在数据结构中,是很基础,也很常用的一个,在很多很多业务中,都能看到它的身影。数组很简单,在不同的编程语言中,操作方式,也几乎都是类似的。 那数组是什么呢?简单来说,就是在内存中分配一块连续的空间,用来存储相同类型的元素。使用索引,可以直接访问某一个元素的数据。大多数编程语言,数组的索引是从0开始的。 数组也分为一维数组,和多维数组。就像excel中的表格,一行数据,就可以看做是一个一维数组,而多行数据,就可以看做是一个多维数组。 这个是一维数组结构 这个是多维数组结构 关于性能方面,因为数组是固定大小,连续的内存结构,所以访问元素的速度是很快的,时间复杂度是O(1),也就是说,不用遍历,能直接找到要访问的元素,几乎不消耗什么时间。 但是插入和删除某一个元素,就不一样了,假设一个数组有10个元素,删除了第4号元素,那么,4号后面的元素,都要往前移。而插入,也需要将插入位置后面的元素,往后移动。这是数组的一个弊端。 当要插入一个元素,而原本分配的数组空间已经不够时,有些编程语言会产生数组溢出。这时,我们就需要自己写逻辑,当数组空间不足时,分配一个新的更大的数组,先将原来数组的元素复制进去,然后将新元素插入。就像你要将100个桃子放进一个盒子里,但是装着装着发现盒子不够大,这时,就需要找一个更大的盒子,将原来盒子里那些拿出来放到新盒子里,然后继续新盒子里放桃子。 对于数组的操作,有很多,例如删除头部元素、删除尾部元素、在头部添加元素、在尾部添加元素、数组切片、多个数组链接等等。有一些编程语言已经内部实现了这些方法,例如Javascript,Python等,但有一些编程语言,我们就需要在用到时自己实现,例如C语言等。 好了,数组就先介绍到这里,如果有什么问题,或者有解释不准确的地方,欢迎在下面留言,谢谢~

December 10, 2019 · 1 min · 猫猫

梦开始的地方

经历过很多项目,遇到和解决过很多问题,但是没有没有以文字的形式总结过。所以这个系列,我打算从客户端的视角,去总结一个游戏项目从开始到上线,整个过程中的一些事情,人员之间的配合,客户端一些重要模块的实现,开发过程中遇到的问题等等。 一个项目的开始,可能始于某一个人的某一个微小的想法,经过一段时间的构思,然后到达公司层面,在经过很多人的会议讨论,市场调研,等等,觉得方案可行,然后就是立项,准备进入开发阶段。这个过程不是一两天完成的,可能经历了很长时间。这个阶段,也会大概预计项目周期,项目成本,什么时候上线,盈利情况预估等等。 一旦确认了项目开发,策划方面会先行,进行项目的具体设计,开会讨论,确定方案等等。 然后美术也会根据项目的方向,做一些可以看的东西,可能这些东西最终不会进到版本中,但是现阶段是需要的。 至于程序呢?这个阶段可能就开始搭框架了,做一些与具体游戏逻辑没有太大关联的,框架层面的模块,例如资源管理啦,网络通信啦,等等。 这个阶段可能会持续一段时间,然后就会逐渐进入更加规范和流程化的游戏逻辑开发。不同的程序写不同的游戏模块。 在前期开发过程中,可能会有很多东西做出来了,然后效果不太好,就被砍掉了,或者整个设计变化很大,基本上等于这个模块推到重来,这都是很正常的情况。不管是美术,策划,和程序,都会有这种情况发生,不过随着游戏的开发进度,这种情况会越来越少。 从开发到上线,游戏会经历很多测试版本,可能有公司内部测试版本,外部小规模测试版本,外部大规模测试版本,付费测试版本等等。每一次版本测试,都会得到很多信息,用于调整和改善游戏内容。经过几轮测试以及测试后的版本打磨,整个项目会越来越接近上线版本。 当然,在一切顺利的情况下,游戏最终会提交上线。然后就是后期的运营,以及上线后的版本迭代,内容更新,Bug 修复等等。 这大概就是一个游戏项目的完整生命周期。

December 8, 2019 · 1 min · 猫猫

一个游戏是怎样被做出来的

一个游戏是怎样被做出来的呢,当我开始写这篇文章的时候,才意识到,这个题目写的有点大,单纯的一篇文章,真的很难让大部分人了解一个游戏到底是怎样被做出来的,因为这里面涉及到了太多太多的细节。所以,我就来从宏观的角度来聊一聊一个游戏的开发过程是怎样的。 每一个游戏,可能都始于一个很小的想法,或者故事,然后像种子一样,慢慢成长,最后形成一个完善的体系化的设计。就像写一个故事,最开始,可能只有一个大概的方向,然后会构思里面的人物,性格,故事的发生地点,角色之间的关系,等等,有了宏观方向上的故事线,就有了大概的骨架,在不偏离故事线的情况下,去完善细节,让整个故事更有灵魂。一个游戏的构思,我觉得也是有类似之处。 首先,简单介绍一下一个游戏公司的人员,大概都分为哪些部分。从宏观上来分,大概分为策划,美术,程序,测试,音频,运营。在这里,暂时不详细地介绍每一个职位的细分以及工作的内容,等我写一篇文章专门介绍这个。 前期的概念设计,是由游戏策划来做的。游戏策划人员会细分成系统策划,剧情策划,数值策划等等。为了能让每一个人构思的东西,能够不偏离游戏的故事线,以及最后整合到一起,形成一个完整体系,所以还会有一个职位叫做策划总监,或者有的项目还会有制作人。他们会拍板每一个设计是否要采纳,当然,也是和所有策划同学讨论决定的,但是也拥有最终决定权。 设计阶段产出的内容,一般都是设计文档,或者一些参考图之类的,为后面开发阶段做准备。 现在来介绍一下美术部的同学,可以说,我们在游戏中眼睛能看到的东西,不管是一个模型,一个世界,一个按钮,一个炫酷的特效等等,都是由美术部的同学做的。美术部分,也会细分,大概分成2D和3D,2D 的同学主要做 UI,原画,3D 的同学呢,有的做场景,有的做角色,有的做动画,有的做特效等等。 在策划有了大概的设计之后,美术部的同学就可以开始做一些东西了。 与此同时,程序的同也开始工作了,一开始做的事情呢,要能就是搭建游戏的程序骨架。会写一些与具体的游戏玩法没有关系的东西,就像建造房子时的地基,不管上面的房子要建造成什么样子,地基都可以在有了大概的设计后,开工,与上面的房子建造成什么样子,关系不大,只要能承载上面的房子就 OK。程序的骨架也是一样的。这个通常称做搭框架。有很多东西,不需要从0开始写,很多模块都有现成的,要么是别人写好的,要么是之前项目中的,都可以直接或者稍微改一下就拿过来用。减少开发时间和成本。 前期的这个阶段会走的很慢,因为一切刚刚开始。慢慢地,设计方面越来越完善,很多东西走出实验阶段,美术知道具体做什么,就可以加快速度开始做。与此同时,美术做的东西,也会直接进入游戏工程中,在经过一段时间后,就可以有一个游戏的雏形了,可以叫做 Demo 版本。就是一个不完善,但是能够大概反应游戏方向的可玩版本。 在 Demo 版本出来后,验证了游戏的设计想法是可行的,就可以正式地,流程化地往下进行。 接下来的发展就很明确了。不同的策划会构思不同的游戏功能,每一个游戏功能涉及到的美术部分,会由美术部的同学去做,而这个功能的实现,就由某一个程序的同学去实现。在这个过程中,程序,美术,策划,会经常性的交流和对接,例如,有设计不明确,或者不合理,或者做不了的情况,程序都会和策划聊。或者有的事情,可能由美术那边做起来不太方便,而程序写点代码就可以完成,那这部分可能就会由程序同学写代码实现。总之大家的目标是一致的,就是把这个功能做好。 随着时间的流逝,以及大家的努力工作,游戏也会越来越完善。在这个过程中,游戏会有很多里程碑阶段的版本。在游戏相对完善时,测试同学就会介入,测试,是游戏的质量保证。测试同学会测试每一个功能,每一个细节,然后将发现的问题,反馈到 Bug 系统上,程序同学会根据测试同学反馈的问题,去进行修复。修复后,测试同学会根据 Bug 系统上问题的状态,去再次确认是否已修复。这个循环基本上是一直存在的。 在版本相对完善的时候,音频的同学,会开始为整个游戏的各个功能制作音频,然后整合到版本中。 整个制作的流程,大概就是这样。过程就这么多,但是这个过程中的每一步,都是很艰辛的。可能某一些功能,会不断地修改,完善。美术同学做的东西,也会不断的更新,每一版可能都会比上一版更漂亮。加班加点,是很正常的。 在游戏真正上线前,会有好几个阶段的不同规模的真实玩家测试。然后根据玩家的反馈,再去修改和完善游戏。经历几次测试和完善后,最终就是上线版本。游戏上线后,我们就可以从苹果的 AppStore 或者 Android 的一些应用市场下载到游戏了。 一个游戏的研发周期大概1年到几年,根据不同的游戏规模,所花费的时间是一样的。一个游戏研发成本,也是很高的,从最初的游戏概念,到最终的游戏上线,根据游戏的规模,可能要花费上百万到上千万软妹币,或者一些 3A 大作,会花费上亿美元。 一个游戏上线,并不意味着就会有盈利。一方面,游戏好不好玩是一个关键要素,其实,也需要运营同学的努力,去推广游戏。 好了,今天先介绍到这,我知道很多人读完了可能一脸茫然,还是不知道一个游戏到底是怎么做出来的,没关系,欢迎进入游戏行业亲自体会,哈哈哈哈~

December 7, 2019 · 1 min · 猫猫