外设天下 - 电脑外设发烧友聚集地

我的人缘0

[休闲灌水] 从零开始学编程做游戏:一个文科生策划的14周

4 9270
楼主
跳转到指定楼层
发表于 2014-9-14 20:02 只看该作者 倒序浏览 阅读模式
RGB(71, 71, 70)">
图1

  本文作者刘嘉俊是一名从业不久的游戏策划,他在14周的时间里,从技术小白到能写600行代码。他的方法是,在日常工作之余,每周制作一个小游戏,通过这种方式来锻炼自己对游戏系统设计和开发过程的理解。

  我没有计算机背景或美术基础,但乘中国游戏行业大发展,却也幸运入行成为一名游戏策划。我希望在日常工作之余,用一个办法来锻炼自己对游戏系统设计和开发过程的理解。因此,我参加了 Coursera 上的几个课程,并且用课程提供的方便工具来实现设想中的功能。

  这个方法我称之为“每周一游”,即每个星期快速开发一个游戏,连续进行数个星期。这是许多开发者们磨练自己想法和技巧的方式。

  一开始的成果非常基本、非常简单,但到后面挑战等级逐渐上升,到最后已经能独立完成 600 行左右的程序。

  接下来我就给各位看看我在这近四个月中的成果,以及我从中学习和体会到的内容。我尽量省略比较枯燥的实现细节,一来可以避免无聊,二来需要下功夫的东西还是亲手实践比较有帮助。如有兴趣可来我的微博交流。


  第一周:包剪锤蜥史波克(Rock-paper-scissors-lizard-Spock)

  Sheldon 喜欢的游戏。

图2

图3

    谢耳朵爱玩的游戏,石头剪子布的升级版。内容最最基本,只要在控制台里输入命令,命令通过 if-elif-else 转化成数字(0-4,分别代表出的5个东西)。

  电脑则会随机生成一个数字,转换成字符串。再根据双方数字,用 if-else 判断胜负即可。

  对我来说这是自己亲手编写的第一个游戏。它虽然简单,但包含了一个游戏必须的全部要素:它有着固定的开始和结束,以及胜负的规则。

  第二周:猜数字

图4

  猜数字游戏就是由电脑随机生成指定范围内的一个数字,由你来猜,电脑告诉你是高还是低,一定次数后未猜中则输掉的游戏。

  在这个游戏中第一次引入全局变量的概念。初始化时,上下限以及允许你猜测的次数都是读取全局变量。这样一来,我们可以在游戏核心的方法之外,使用别的方法来修改全局变量,让玩家可以自己选择数字范围和猜测次数。游戏本身则依然是 if-elif-else 这样写成的。

  这是我亲手编写的第一个可以由玩家调整游戏设置的游戏。

  第三周:秒表游戏


图5

  秒表游戏是个考反应的游戏。点击开始后秒表开始向前走,若你按停秒表时,秒表的时间恰巧停在整数(小数点后为0),则你得1分。游戏会记录你按停的总次数和得分数。

  这个游戏中涉及到为每个功能编写单独的方法。如玩家控制的按钮start()、stop()、reset();游戏本身时间前进的tick()等。同时,为了让时间正确地显示在屏幕上,还有一个将时间转化为“A:BC:D”这种形式的方法。

  我们计时的方法是定义一个叫 time 的变量。由于这个游戏中最小的计时单位是 0.1 秒,所以每经过 100 毫秒我们就让这个数字 +1。与此同时,编写一个 format() 方法经过一系列计算将这个数字转化为分、秒和0.1秒,显示在屏幕上即可。判断玩家是否得分仍然使用 if-else 结构。

  这是第一次涉及到玩家进行的复杂操作,也是第一次认识到,在游戏画面的表象之下究竟应该有些什么机制在运行。

  第四周:乒乓(Pong)

图6

  终于我们从小朋友玩的游戏进入了街机时代!

  传说 Pong 是世界上第一个电子游戏。在那个游戏机只有滚轴操作的年代,这个有着极简单画面的游戏启发了无限后来者。看着它在手下形成还有些小感动呢。

  这个游戏也是我制作的第一个不模拟现实中的“逻辑”,而是模拟“物理”的游戏。它的核心部分是球的速度变化、板子的速度变化,以及球与边界和板子的碰撞。

  为了让这个游戏不至于无限地进行下去,我让球的速度随着每一次板子碰撞上升。但上升的公式写成了指数函数,于是这球就啪啪啪越打越快每一回合很快就结束了。若改为对数函数,则会缓慢地趋近一个上限,令每一回合后期的双人对局非常紧张、充满变数。

  这是我第一次体会到游戏的“手感”到底是怎么回事。每一次对参数的细微调整对手感带来的变化,可以让设计者与游戏本身有着更深刻的接触。这是在目前分工充分的网游公司的日常工作中体会不到的感觉。

  除此之外,很快地你就能从一个简单原型中看出未来变化的可能。是否可以加入:

  “球击打在板子的不同部位,会弹向不同方向”?

  “当板子击球时,板子本身的速度会令球曲线飞出”?

  或者“连续击中球数次后玩家可以发出大招”?

  等等诸如此类。想到这里,这个游戏能成为数十年游戏业的起点,也是有其道理的。

  第五周:记忆游戏

图7

  记忆游戏就是将多对牌打乱顺序朝下放置,玩家一次翻开两张,若相同则原样留着,若不同则翻回去。所有牌都翻开后玩家胜利。

  在这个游戏中,暂且用数字来代替扑克牌。我们用了一个 list (我有点搞不太清 list, array, tuple, set 几个词的中文翻译,不乱讲了……)来以 Boolean 值(True 和 False)记录每张牌是否翻开的状态。当设为翻开时,露出数字,否则在相应位置绘制一张牌背。

  这个游戏的逻辑方面比较 tricky 的地方就是整个游戏实际上有三种状态,需要分别处理:

  新游戏,一张牌都没翻开

  翻开了(本回合内)第一张牌,等待翻开第二张

  翻开了(本回合内)第二张牌,等待判断是否相同

  于是我使用一个叫做 state 的变量,分别以 0, 1, 2 代表三种状态。在核心方法中利用 state 的值来决定接下来要做什么。

  第六周:21点(Blackjack)

图8

  啊,21 点。我人生中接触的第一个扑克游戏。是的,在我会打“拖拉机”之前,7岁的我就在DOS下的初代大航海时代的酒馆里学会了 21 点。这是年幼的我在那个游戏里玩懂的唯一一个系统……

  这是个赌博游戏。简单来说规则是:庄家给自己和玩家各发(deal)一张暗牌、一张明牌,玩家决定是否继续加牌(hit);玩家加牌结束(stand)后庄家自行加牌,接着双方摊牌。拥有最高点数的玩家获胜,其点数必须等于或低于21点。

  在编写这个游戏的过程中第一次引入了类(class)概念。因为在游戏中许多物件都会重复出现,使用类可以很方便地重复制造它们:

  每一张牌是 Class Card;

  方法 get_suit() 可以获取它的花色;

  方法 get_rank() 可以获取它的数字;

  还有一个方法来把它绘制出来。

  手牌是 Class Hand;


0
已赞
微信分享 收藏
回复

使用道具 举报

我的人缘0
2
发表于 2014-9-14 20:42 只看该作者
好家伙
回复 支持 反对

使用道具 举报

我的人缘2
3
发表于 2014-9-14 23:00 只看该作者
板凳
回复 支持 反对

使用道具 举报

我的人缘0
4
发表于 2014-9-15 08:18 只看该作者
有点意思

点评

你的头像也有点意思  详情 回复 发表于 2014-9-16 12:18
回复 支持 反对

使用道具 举报

我的人缘0
5
发表于 2014-9-16 12:18 只看该作者
测试

你的头像也有点意思
回复 支持 反对

使用道具 举报

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

本版积分规则