0%

合眼告别美梦

七月,刚来上海参与为期半年的实习时,公寓旁地铁口前的野花还鲜艳地长着。哪怕是两场台风过后,树丛中仍能看见几抹彩色。可惜,最冷的新年一月来到了,再也不能看到树丛里的花朵了。

我所在的公司,离最近的大学只有数公里之隔。但校园内外的风景,却有天壤之别。校园里,只有低矮的教学楼,来去匆匆的行人,每天能看到的净是沉闷而重复的事物。而公司所在的写字楼有四十多层高。站在落地窗前,能看到黄浦江与天空交汇在一起,楼盘、马路、汽车,不过是背景板上的几处点缀。

刚来到办公室时,我还有点战战兢兢,不敢站在高处向下看。很快,我熟悉了周围的人,熟练了手头的工作,走遍了附近每一家美味的餐馆。现在,再站在窗前俯视大地时,我只会悠然地欣赏着外面的景色。

我的工作并不累人——当然,有些时候除外。十二月,我们组的项目即将上线。全组人都绷紧着弦,马不停蹄地赶着进度。月底,在全组人的掌声中,我们的项目如期面世。很快,项目受到了公司内外的一致认可。项目宣传稿发出去的第一时间,从不关心社交平台的我立刻转发了这篇宣传文。按下“发送”键后,手机界面跳转到了我的朋友圈,我忽然笑了出来:短短一分钟里,我的朋友圈被同一条宣传文刷屏了。而发出消息的,全是我们组里的人。大家虽然没有把激动的心情表达出来,却在宣传文发出后立刻不约而同地转发了这篇文章。

项目完成后,恰好要进行年终述职。身兼开发与管理二职的小组主管自豪地汇报着我们小组这几个月的工作内容。看着我参与过的一项项工作,我的思绪不禁回到了五个月前。

刚来公司的时候,我的编程环境怎么都配不好,连办理企业微信都花了整整一周。

来公司两周多后,我才初次为项目贡献了代码。虽然在现在看来那只是一份简单的修改,却让我感到自己总算是融入了整个小组。

后来,我实现了一个完整的功能,甚至还主导了一次大型的代码重构。

我习惯了与组内的前辈认真讨论工作的内容;我学会了其他部门共同协作;我结识了其他组的朋友,和他们一起聚餐。

总算啊,我们的项目上线了。大家的付出,都有了回报。

未来,这样的生活应该还会进行下去吧?

项目上线后,还会面对更多的挑战。我还会一如既往地为项目贡献自己的一份力。我越干越久,技能越来越丰富,说不定能独当一面,主导更多的工作。

凭借我的条件,找个门当户对的女朋友,安安稳稳地结个婚应该不是很难吧?到那个时候,我应该会搬出出租屋,租一个大一点的房子。

再攒个几年的钱,应该就能凑够房子的首付款了。我总算能住在自己的房子里了。是不是考虑再买辆车?或许还要考虑生孩子的事情了?

是啊,随着时间不断流逝,一切都会顺利地进行的。

到那时,我不再是骑自行车,而是开着汽车来到写字楼下。

我会穿着更成熟,更得体的衣服,与熟悉的同事们打着招呼。

敲一敲键盘,吃个午饭,睡个午觉,转眼就到了下午。

今天是每周组会的时间。在会议室里,我又会看到小组主管。

听着她汇报着我们小组的工作内容。

“……今年我们组把代码库开源了。明年,我们会探索更多方向……”

看吧,就像这样,她还会总结着我们组的工作内容。

“……我们会为我们公司做出更多贡献……”

嗯,为了我们公司。等等,“我们”的公司。那是谁的公司?明年一月,我就要离开这里了啊!

”……以上就是我的述职报告。“

小组主管完成了她今年的年终总结。我猛然回归神来——轮到我进行2021年的年终述职了。

”我虽然只在这里实习一小段时间,但我依然出色地完成了我的工作……“

和之前准备的一样,我熟练地开始了我的演讲。

”……在介绍我的具体工作之前,请允许我带大家一起回顾一下我的成长轨迹……“我把刚刚回忆出的内容,一字不差地描绘了出来。

当然,我没有讲出之后”梦境“里的那些事情。梦里的事情,是不是永远无法成真啊?

”……具体来讲,过去我做了这些事情……“

不对,过去的几个月对于我整个人生来说,算是美梦一般的存在了。刚毕业,没有家庭的压力,没有身体的负担,幸运地来到了这里。这是我之前想也不敢想的生活啊!

”……未来,可能我在这待不了多久了。但我真的很怀念在这里的时光,会继续当我们项目的社区贡献者……“

这真的不是一句客套话,这是我的真情实感啊。我虽然没和组里每个人都认真地聊过天,但我们曾经谈论过无数小细节,在同一片办公区里一起工作了几个月。没有组里的大家,哪有最后的成果,哪有这么开心的时光呢?我的想法,能传达给大家吗?

”……我在过去的工作里学到了很多。未来,我还会继续努力。谢谢大家。“

还好,我还可以谈着未来一个月的计划。我还可以轻轻合上眼,把这终将结束的美梦给做完。

然后,迎接告别。

初三的最后一天,全班浸没在泪水中,而我却木讷而不解地看着其他人。

大四的最后几晚,宿舍里的四个人默契地通宵玩着联机游戏。

下个月,我会一边告别,一边收拾行装。之后,我会转过身去,独自远离这令我看过无数美景的高楼。

公司,不过是又多了一份离职记录;上海,不过是又冷漠地送走了一位外乡人;亚洲大陆,不过是又见证了一次飞走的航班。

而我,又永远失去了一段生活,又多了一段新的生活。

阅读理解环节

  1. 如何理解标题“合眼告别美梦”?(14分)

    答:“美”,表示这段经历对作者来说十分享受(2分)。“梦”,表示作者终将告别这样的生活(2分)。用“合眼”而不是“闭眼”,更强调睁开眼又再次闭上眼睛的动作(1分),表达作者已经意识到这段经历已经步入尾声(1分),却依依不舍的心理(2分)。“告别”,是作者主动进行的,体现了作者抛弃旧生活,迈向新生活的决绝(2分)。标题虽然只有短短六字,却把作者对过去生活的赞美、对意识到一切终将过去的苦恼、对告别过去的不舍、对不再留恋过去的坚定这些复杂的感情都写了出来,可谓是妙笔生花(4分)。

  2. 文章中提到了结婚。结婚之后,竟然只是”租一个大一点的房子“,几年后才买房。没有房子,哪结得了婚?这里逻辑有没有问题?

    如果有人觉得这里逻辑有问题,那么说明这个人的心态已经不再年轻,已经完全融入这个无情的社会了。这个时候,你不应该去去关心我的文章写得有没有逻辑问题,而应该反思一下,自己什么时候开始心态发生了变化,什么时候把结婚和买房绑定到了一起。当你想通这些问题的时候,你一定已经收获了很多,而不会再去在意我文章写得有没有问题了。可以说,我这个地方故意要这样写,故意要去钓鱼,故意勾起读者对于自己的反省。

  3. 文章里提到的”开源“,”代码库“是什么意思?

    我们见到的程序,都是从源代码里生产出来的,就和食物是根据配方生产出来的一样。一般公司不会提供源代码。而”开源“,指公开一个项目的源代码。”代码库“,一般指 GitHub (放代码的网站)上开源出来的代码项目。

    补充资料:公元2021年,天才开源项目开发者周弈帆作为元老级开发者,参与了著名开源项目 MMDeploy 的开发。该项目成功减少了开发人工智能应用的成本,为后来全世界的人工智能化革命埋下了重要的伏笔。

做为天才卡牌游戏玩家兼设计师,我十分热爱卡牌游戏,经常向他人安利我喜欢的卡牌游戏。

一天,我的好朋友和我讲:“最近出了款叫《邪恶冥刻》的卡牌游戏,融合了”炉石”、”万智牌”、”游戏王”的玩法,还有《杀戮尖塔》中的Roguelike机制,强烈推荐你去玩。”

“这是款对称卡牌游戏吗?”做为资深卡牌游戏玩家,我立马提出了这个问题。所谓对称卡牌游戏,就是每个玩家的规则都是一样的,用同样的方式击败对手。而非对称卡牌游戏一般出现在PVE(人对战电脑)中,玩家一般使用卡牌作战,而boss只有血量和技能,不使用卡牌战斗。

“是的,但这款游戏做得很好。“朋友看出了我似乎有所顾虑,依然极力向我推荐着这款游戏。

我将信将疑地去体验了这款游戏,结果不出我所料——游戏的平衡性出了大问题。

最近我准备简单点评一些游戏。虽然我的点评可能会极度专业(我相信这个世界上没有多少人能提出像我这样专业的评论),且以批评、改进意见为主,但在介绍游戏的简况和优点时,我会用尽可能用通俗易懂的方式表达,让游戏经验较少的人也能读懂。《邪恶冥刻》给人的体验很糟糕。就像你去一家中端的饭店就餐,里面的装修、服务不输高档饭店。服务员热情地给你端上一块精美的一人餐蛋糕。虽说是一人餐,蛋糕上放满了琳琅满目的水果和巧克力。你舔了一口奶油,不禁感叹道:”太美味了!“你连忙又吃了几口,却发现这蛋糕越吃越没有味道。吃完之后,你发现肚子还是半饱。于是,你默默抱怨道:”有这个钱去装修饭店,不如在菜品上多下点功夫。“

在我看来,《邪恶冥刻》是一款十分可惜的游戏。作者很有实力,有丰富的游戏制作经验。他做出了一款画面表现力强的大杂烩游戏。刚玩一会儿,你会觉得游戏的各个机制都很吸引人。但是,游戏的平衡性极差,你很快就觉得游戏没有挑战性了。玩完了一个又一个看起来很有新意的关卡后,你用十来个小时就通关了整款游戏,看着作者花了不少时间做出来的演出(即玩家不能交互,而是像看电影一样看游戏剧情),感到索然无味。整款游戏可以用虎头蛇尾来评价,甚至是”虎头蛇身“。作者明明有丰富的游戏设计经验,却浪费了很多时间与资源去做冗余的游戏机制和演出,真的很令人惋惜。整款游戏的创意运用得好的话,这将是一部足以记入卡牌游戏历史的游戏。可能是因为卡牌游戏本身的平衡太难掌握了吧。

下面我将按照老规矩,先介绍游戏的亮点,再详细列出游戏的缺点。

本文有一定剧透,虽然游戏不是由剧情主导的,被剧透也没啥关系

卡牌游戏大杂烩

”我的回合!抽取一张松鼠牌!献祭一张松鼠,召唤一张狼崽。狼崽会在下一回合,变成3攻2血的狼,并在回合结束时朝前方自动攻击。失败的天平,会向你那边倾斜3点。“

”战斗胜利,我选择移动主角,朝左边的路前进,在篝火处升级我的狼崽。现在狼崽的生命,从1点变成了3点。”

如果玩家需要在游玩的同时描述游戏内容,我一定会这样进行解说。

有经验的卡牌游戏玩家在看完上面两段描述后,一定会露出会心的微笑:《邪恶冥刻》借鉴了许多游戏,包括”游戏王“的献祭系统、《炉石传说》的攻击与血量、《Artifact》的自动攻击、《杀戮尖塔》的Roguelike卡牌系统。

加入游戏机制是一件简单的事情。但难能可贵的是,《邪恶冥刻》把各个机制结合起来,创造了一套小而精的卡牌游戏规则:说它小,是因为游戏战场小,卡牌数量少,战斗结束得块;说它精,是因为游戏规则有趣且自洽。

小的游戏,做精自然容易。但这样的游戏往往会面临游戏内容不足的情况(比如《陷阵之志》(”into the breach”),体量小而近乎完美)。作者似乎意识到了这一点,他用一种特别的方式来添加游戏内容:通过大幅度改变游戏的玩法来创造新的关卡。

游戏系统大杂烩

除了最初的Roguelike卡牌系统外,作者在保持核心玩法是卡牌对战的前提下,还引入数个不同的游戏系统。”像素画面“、”开卡包“、”向上下左右四个方向拓展地图的塞尔达式2D地图“。这些本不可能在同一部游戏中出现的元素,奇迹般地出现在了这同一部游戏里。作者的初衷算是达到了——随着游戏内容的增加,玩家的游戏时间确实得到了延长。

除了一些常见的”对战“、”冒险“游戏机制外,《邪恶冥刻》还把解谜要素(在我的定义里,”解密“指打开隐藏砖块、用钥匙打开门、发现boss弱点这种轻度的需要玩家动脑的游戏机制,”解谜“则指独特、高难度的谜题机制,需要玩家认真思考,这些机制一般是游戏的核心玩法)融入了游戏的所有章节里。在完成卡牌游戏的挑战之余,玩家一定要通过解谜来推动游戏的进度。这些解谜没有冗余之感,是玩家在激烈的卡牌对战过后的完美调剂品。

在一部游戏中塞入数个大的游戏系统,这是一般的游戏不敢做的事情。也只有有经验的独立游戏作者,敢于在自己的作品里炫技。很难得,这些游戏系统融合得不错,过度没有很突兀,值得游戏经验不是很丰富的设计师学习。

成也卡牌,败也卡牌

卡牌游戏的特点是什么?

从玩家的角度出发,卡牌游戏最大的特点就是趣味性。简单的规则,狭小的战场,就能演绎出一部部精彩的对局。如前文所讲,得益于卡牌游戏本身的特性,《邪恶冥刻》设计了一种简单而趣味性极强的卡牌游戏机制。如何打出强力卡牌,怎么摆放卡牌,怎么样造成有效伤害……卡牌游戏的每一个机制都引入了思考。在一切都确认完毕后,玩家就能双手离开键盘,看着卡牌自动攻击,并触发卡牌效果的联动,最终获得游戏的胜利(或者翻车),体验着思考带来的成就感。(关于卡牌游戏的认真研究将会出现在以后的文章)

但从设计师的角度来看,卡牌游戏的设计难度是极大的。卡牌本身具有的随机性,加上卡牌间难以量化的联动效果,让卡牌游戏的平衡性成为了一个难题。《邪恶冥刻》主要就输在了平衡性这一点上——游戏在后期实在太简单了,战斗胜利丝毫不能给玩家带来乐趣。

越是机制精致、联动性强的卡牌游戏,越能给玩家带来耳目一新之感,也越难维持平衡性。这真是一件矛盾的事情。

这里将先分章节,再从宏观到具体,逐条列出我还能记住的游戏平衡性上的具体问题。这些内容是写给玩过游戏的玩家看的。

总体

游戏机制

  1. 血量差为5点的胜利条件,对于先手行动的玩家来说,过于容易触发。反过来,boss太强,玩家就会被秒杀。这是游戏的核心机制,也是一切平衡问题的根源,确实不好改进,不然游戏就完全变了。一些可能的改进意见会在后文提及。
  2. 缺乏对手牌臃肿的惩罚。一般情况下,卡牌游戏要求卡组精简,不然抽到关键牌的概率会缩小,卡组整体强度降低。做为一个每回合抽一张卡的游戏,理论上卡组臃肿带来的影响是很大的。但因为第1条胜利和失败都过于简单,为了让玩家在前几回合不被秒杀,作者在设计时让对手的卡组进攻性不至于太强,其结果玩家卡手几回合都没什么关系。这无论在单机卡牌游戏还是多人卡牌游戏中都是不允许的。
  3. 缺乏抽牌上的联动。这一条导致了第2条问题,玩家容易卡手,对手强度不敢太强,玩家卡手反而不被惩罚。
  4. 对手下回合策略已知。这条由《杀戮尖塔》发扬的机制是回合制游戏的一项历史性突破,我非常喜欢它,且赞同这条机制出现在卡牌游戏里。但无疑这条机制令游戏的难度又降了一层。
  5. 游戏中,有”站场“这个概念,即上回合生存的生物,下回合还能进行攻击。这是一条滚雪球的机制,有场面的玩家会一直扩大优势。而对手对于场面的控制极差。这导致玩家控制场面后很容易获得胜利。

细节

  1. 部分卡牌效果过强。如”检索牌库中的一张牌“。

第一章

游戏机制

  1. ”检索牌库中的一张牌“与无限资源之间的组合过于BT。比如令所有松鼠牌具有”检索“效果,这等于让玩家自由地控制手牌,所有战斗都失去了难度。作者保留这些强大的组合,可能是想让玩家觉得游戏很有趣。但是,还是那句话,卡牌游戏是以难度恰到好处的战斗为核心。一旦玩家无敌了,后面的战斗都是垃圾时间,有什么趣味可言呢?
  2. 强行打脸牌过弱(飞行牌),这导致防守牌(防空牌)也没有价值了。可能作者想设计出面对对面的打脸牌,玩家可以用防空牌来防御,也可以用打脸牌还击这样的充满抉择的游戏体验。但是,战场就那么点大,血就那么多,战斗一下就一边倒了,这种抉择根本体现不出来。如果战场更大,血量更多,维持血量差的博弈才会更加明显。
  3. 高费牌都难以打出,尤其是骨头牌。
  4. 种族机制联动不足,一旦联动了又过于强大。

细节

  1. 剧毒秒最终boss很有趣,但平衡性因此更加差劲了。
  2. 第三关boss难度实在太低了,这是很明显的设计水平有问题。第二阶段,玩家至少可以拿走对方一张牌,而且玩家场面上是有牌的,至少有一张牌可以直接攻击到对面。玩家轻松就可以在第二阶段一开始秒杀boss。
  3. 几大终极奖励的强度明显不一样。”每回合抽两张牌“、”抽牌变成检索“无疑是超强的能力,而”战斗开始获得8个骨头“的强度太低了。

第二章

游戏机制

  1. 献祭机制配合几乎无消耗的骨头机制过强。高费献祭牌太容易被召唤了。
  2. 高费骨头牌太难召唤了。
  3. 宝石机制(万智牌机制)的强度过低。
  4. 我现在根本记不住boss的卡组了。boss的卡组实在太弱了,且后面的boss不比前面厉害多少,我前期随便组的一套卡组就能打过所有的游戏内容。我虽然不能说出boss卡组设计上具体的问题,但很明显boss的卡组强度过低。

细节

  1. 游戏的一场战斗是可以无限次进行的,这导致玩家可以获得无限多的金钱,进而获得无限多的卡牌。”能无限获得的资源,必然要有一个能无限输出的途径“,这是我在小学的时候就领悟的游戏设计原则。在这样一个卡牌游戏里,能无限获取卡牌就是不合理的。玩家可以刷无限的牌,让游戏的攒卡机制报废。虽然这游戏的平衡实在太烂,战斗太简单,玩家根本不需要去刷钱就能获取胜利。
  2. 对应游戏机制的第1条,有张无消耗的牌,效果是能用一根骨头换一个骷髅。这张牌能瞬间产生大量的祭品,让高费献祭牌登场。这牌强度太高了。

第三章

游戏机制

  1. 游戏流程过长,后期各种卡牌效果联动、堆叠,整套卡组的强度已经爆表了,多强的boss都打不过玩家。
  2. 自定义卡牌很有趣,但这导致了第1条的效果堆叠问题。剧毒、顺劈、回手,这样一张无限资源的牌一旦摸到,游戏直接胜利。
  3. 电路通路的太难触发了,而且到了游戏后期,其他牌已经过强了,这个机制变成了鸡肋。

细节

  1. 有一个给卡牌加1攻,但卡牌死亡后永久被移除卡组的效果。这个效果的设计水平很低。这个效果的本意是加强一张卡,但要冒风险。但是,加1攻并不是多大的提升,反倒是移除一张卡能够提升整套卡组的质量。设计的本意很难达成。
  2. 有一张低费卡,能够对初次出现的敌人造成1点伤害。这张牌效果的强度太高了,比不少高费牌还强,直接让防守变得特别简单。

提升平衡性的建议

游戏小而精的机制,令游戏平衡性很难提升。但在对卡牌游戏设计有诸多思考的我看来,在核心机制不变的前提下,游戏的平衡性仍然有很多提升的余地:

非对称性

关于PVE卡牌的对称性上的思考,是我在比较《炉石传说》冒险模式和《杀戮尖塔》之后进行的。《炉石传说》本来是PVP游戏,凭借着玩家间的博弈,游戏的平衡性天然能够得到维持。所有卡牌都是为聪明的人类玩家设计的。但在炉石的PVE中,AI的水平很差,游戏的平衡性直接就崩溃了。由于游戏的胜负极大取决于对战双方的水平,哪怕给AI塞很多好卡来强行提升PVE对战的平衡性,玩家还是很难从PVE中获取足够的乐趣。反观《杀戮尖塔》,整套游戏就是基于非对称战斗的。只有玩家在使用卡牌,怪物只会按照简单的规则放技能。玩家不和对手博弈,只需要最大化自己卡组的能力即可。非对称的战斗,绝对更加适合PVE卡牌游戏。

坚持使用对称卡牌机制是造成新游戏规则无法拓展、难做平衡的最重要的原因(所以说在玩游戏之前,我就很在意这是不是一款对称性卡牌游戏)。在《邪恶冥刻》中,游戏机制可以向非对称的方向修改。玩家的操作可以一直用卡牌来表示,但是敌人的表达形式可以多种多样。事实上,游戏中就有一些非对称的战斗:战斗的胜利不再是使血量差大于5,而是杀死特定的敌人。朝这个方向做就对了呀!

血量与场面

自始至终,游戏的胜利条件都是血量差大于等于5点。“血量差”这个概念令游戏的攻守之间的抉择非常有趣。但是,很明显,5点的血量差非常容易产生,boss战可能顷刻之间就结束了。

提升胜利所需血量差是一个眼见的提升平衡性的手段。但如果无脑提升血量,并不能改善游戏的平衡性。游戏的胜利条件表面上是血量占优,但实际上只要控制住场面,再大的血量差都能产生。也就是说,游戏真正的胜利条件,是取得场面的胜利。

在传统有卡牌战场的游戏里,血量这一机制的设定,其实是给游戏新增了一个胜利条件:我可以靠控制住场面,慢慢打死你;也可以通过快速造成伤害,在你的怪物还没召完前把你“抢血”抢死。这对应了传统卡牌游戏的控制卡组和快攻卡组。在《邪恶冥刻》中,设计师可能是为了让游戏多一种胜利条件,让快攻卡组可行,才令血量差这么小。

可惜,游戏的胜利条件设置得太糟糕了。作者也注意到5点伤害太容易打出,所以给boss加了很多“嘲讽”(令对方单位无法直接对我方角色造成伤害)怪物。这反过来使玩家的快攻卡组几乎不可行了。血量差5点的设定,讽刺般的起到了反效果,游戏只剩下了控制场面这一种赢法。

血量差5点是一个核心机制,几乎所有卡牌都围绕这一点做平衡,要改起来恐怕很难。但如果让我来对游戏修改的话,我会在游戏初期保持5点血量差的胜利条件,前期的弱卡以此为平衡标准进行设计。随着游戏进行,血量差的要求会逐渐放大,后续卡牌强度也逐渐增加,以新的血量差为平衡标准。

但我不能保证这种修改是有效的,实际的平衡性还需要在测试中确定。可以想到,由于胜利条件是血量差而不是血量,玩家可以通过不断进攻来代替防守,使得防守变成了一个很没有意义的事情。想把这个机制下的平衡做好还是太难了。游戏做得小而精,就不得不面对这种平衡性上的重大挑战,这种游戏还是太难设计了。

技能卡

游戏设置了许多新颖的机制,但令人意外的是技能卡(相对于怪物卡的概念,能立刻产生效果,用完立刻丢弃)这种基础机制竟然没有出现在游戏里。大概能够猜到,引入技能卡的话,游戏的平衡性将会更难维持。而且电脑的AI很不好写,想产生势均力敌的对称性战斗更难了。

如果让我做的话,无论会引入多少新的困难,我都会加入技能卡的设定。技能卡是对游戏机制做加法,而且是对游戏内容维度上的提升,可以极大扩充游戏的设计空间。也就是说,设计师有更多的空间去设置卡牌的能力,更容易设计出不一样的卡来。只要把游戏最基础的平衡性搭好,后续添加新卡、维护新卡的平衡性都会简单很多。

但估计还是出于维护那小而精的游戏机制,设计师没有向游戏里添加技能卡的设定。反正我是认为加入技能卡能大幅提升游戏的可玩性、平衡性。

手牌资源

卡牌游戏一大核心、一大可玩之处,就是抽牌系统。玩家牌库中哪怕有再强的牌,手牌数量不够,或者因为卡组臃肿抽不到想要的牌,都会导致当前的战斗陷入窘境。抽牌系统是卡牌游戏必须要做好的一点。

理论上,卡牌间不仅要有场面上的交互机制,还应该有手牌上的交互机制:比如什么有某一种族就抽一张牌,抽一张同名牌等。玩家需要动脑去最大化抽牌效果。《邪恶冥刻》的手牌资源控制得极为糟糕:要么是无脑强而无聊的手牌资源机制,什么消耗一根骨头获得一张白板卡,什么亡语把卡牌回手,什么去牌库中检索一张牌;要么这张卡就和抽牌一点关系都没有。连”抽一张牌“这种再基础不过的效果都没有。设计师根本没有花心思在抽牌系统上,根本没有去想怎么样构建一套好玩的抽牌体系。

没有考虑手牌资源,导致玩家的牌库很容易臃肿;牌库臃肿,玩家就容易卡手;玩家卡手,如果boss强度过大,玩家一两个回合就撑不住了。设计师很明显发现了这个问题,所以根本不敢给boss太强的卡组,以照顾那些很容易卡手的卡组。这让游戏的平衡性崩溃得一塌糊涂,让卡牌游戏的一大玩法——构筑精简的卡组彻底消失。

让我来做的话,一定会考虑加入更多与手牌资源有关的机制,且和现有的种族、场面等机制结合起来。但同理,加入这些设定会让游戏发生翻天覆地的变化,很多东西都要重新设计。

平衡性总结

我玩完游戏已经一个多月了,但我随手一列,还是能从机制和细节上列出这么多平衡性问题。可以看出作者对于卡牌游戏平衡性的把握是如此糟糕。这要放到一个PVP卡牌游戏中,设计师早就被玩家喷死了。

成也卡牌,败也卡牌。基于有趣的卡牌游戏框架,设计师设计了一个简单的卡牌游戏系统,这个卡牌游戏玩个几盘感觉还不错。但是,设计师必须为这样一个简单的系统付出代价:这样的系统的平衡性非常难做,很难往里面添加有趣的新卡。糟糕的平衡性,会极大拖累游戏的可玩性。这样一个卡牌游戏系统,撑死了就只能支持10来个小时的游戏时间。等玩家稍微熟悉整套系统后,这个卡牌游戏就一点也不好玩了。

丰富性与平衡性的讨论

这一节,我就不理性地进行分析,而是发表下我个人的看法了。

我喷了这么多平衡上的问题,也夸过游戏在丰富性的创新。综合而言,我对设计师的这种设计思想极度不满,对这部作品感到十分惋惜。

你说你做一个小体量的卡牌游戏,游戏机制差不多自洽。哪怕内容不多,几小时就玩完了,玩家体验尚可。我会认为这游戏非常有新意,做得很值得学习。

你说你做了一个小体量、平衡性极差,又臭又长的游戏,我会说这是个垃圾游戏,不用去玩。

问题是《邪恶冥刻》在初期以一个新颖的卡牌游戏系统吸引了玩家的眼球,后来又用这个差劲的系统浪费了玩家很多时间,同时炫技般地不断加入丰富多彩的游戏系统。不管是大一点的构筑/roguelike/有限资源这样的游戏资源系统,还是爬塔式/塞尔达式/自由式的地图系统,还是小一点的自制卡牌、读取玩家电脑信息、修改卡牌、临时添加战斗机制等一系列在现有游戏机制上的装饰,都做得十分丰富。设计师真的是设计水平很高。这要换一个游戏框架,比如换一个2D平台游戏,游戏一定会非常好玩。

但可惜,这就是一个卡牌游戏。卡牌游戏的趣味的核心,是恰到好处的难度。这种靠平衡性吃饭的游戏,就是考验设计师的硬实力,怎么样在设计好的游戏框架下,添加合理的游戏内容。加再多花里胡哨的装饰品,试图在游戏框架上扩充,而不去认真把框架内的东西填充好,是无法提升游戏的平衡性,无法做出一个足够好的游戏的。这就好比你写作文,内容乱七八糟,你说“我字写得很好看”;你写程序,逻辑混乱不堪,你说“我变量名取得好,注释写得清楚”;谈个恋爱,你长得不帅,没有钱,不会说话,你说“我程序写得很好”。这有用吗?最核心的评价指标达不到,其他的东西做得再好,有什么用呢?

我不会推荐,甚至会大力阻止别人去玩这款游戏。不是因为我不喜欢这款游戏。我从这个游戏里学到了很多东西:无论是好的设计思路,还是需要规避的缺点。我也十分认可设计师本身的水平。但是我太喜欢这款游戏了,以至于我会不断想象这款游戏如果是我做出来的会怎么样。如果是我做出了这样的游戏,我会非常难过:明明很有水平,也很有想法,却做得这么不好玩。这比做出了一款纯粹的烂游戏更加令人心疼。我这种矛盾的心理,令我对《邪恶冥刻》给出了极低的评价。这事关一个艺术家、一个设计师的尊严:费尽心思却做得有失水准的东西,宁可扔掉,也不该拿出来展示。

“《密特罗德》在Switch上出新作了?”

第一次见别人推荐这款游戏时,我还在纳闷:“这什么游戏啊?听都没听过。”但我上网一查,竟发现这游戏还有另一个家喻户晓的翻译:《银河战士》。

现代的一些2D平台跳跃类游戏会叫做“银河城”游戏,这是因为这些游戏的创意都源自于两个元老级游戏系列:《恶魔城》与《银河战士》。这类游戏有一种特点:场景中往往会设置一些初期无法通过的道路,勾起玩家的好奇心。随着玩家的能力不断解锁,玩家能去的地方越来越多,会在探索中不断满足着好奇心。我玩过早期的《恶魔城》,并没有发现这些特点。那么,这些特点肯定是来自于《密特罗德》了。抱着无限的期待,我开始了《密特罗德》最新作——《密特罗德:生存恐惧》的游玩。

熟悉的陌生人

在2D平台游戏中,有一个常见的设定:主角宽高比一般是1:2。高度为1的地方,主角是无法通过的。这一来自《超级马里奥》1代的设定大大增强了游戏的解密性:对于玩家来说,主角的身高是有意义的,玩家可以通过路的高度和主角的高度来判断这段路能不能通过,并且玩家可以通过改变主角的身高,来通过原来可能无法通过的道路。

游戏刚开始没多久,我就看到了许多这样的高度为1的”洞“,洞后面有宝物。而主角尚未解锁能够改变自己身高的能力,这些洞目前是无法通过的。我一下就反应过来,未来主角可能会获得缩小的能力。《星界边境》中,主角有一个变身成小球的能力,是不是这个能力的创意是来自《密特罗德》呢?果不其然,玩了一段时间后,主角能变身成小球了,之前的小洞全部都能通过了。

说来奇怪,这是我第一次玩《密特罗德》系列的作品,但里面的游戏元素我却非常熟悉。从我小时候在4399上玩的一个完全照抄密特罗德的叫做”魂斗罗5“的flash小游戏,到现代的《盐与避难所》、《空洞骑士》、《死亡细胞》、《星界边境》,每一个游戏都有《密特罗德》的影子。发现的熟悉元素越多,我就越惊叹于《密特罗德》的伟大——这就是足以称为元祖的2D平台游戏啊!

抛开变小、二段跳这些具体的机制不谈,从本质来看,《密特罗德》像任天堂的其他作品一样,把解密要素完美地融入了一个动作游戏里。而特别地,《密特罗德》把2D平台游戏的解密性给发扬光大了。正如前文所讲,先给玩家看一些初期无法通过的道路,再让玩家不断获得能力,探索初期无法探索的区域。这种像推理小说一样的先设悬念,再让玩家参与解密的手法,极大拓宽了玩家的游戏体验。

除了解密性上的突破,《密特罗德》还在地图设计上给后来的游戏带了一个好头。随着主角能力解锁,道路不断打通,初期的路与后期的路联通在一起,构成了一个复杂却有序的地图网。相比从头到尾只有一条线性道路的设计,这不仅减少了玩家跑图的时间,更让地图有了一种”艺术感“。这一创新被更多的游戏所吸收,我相信《黑暗之魂》这样的3D游戏的地图设计也是受到了《密特罗德》的启发。

玩到最后,《密特罗德:生存恐惧》也没有带给我什么新鲜感,但这让我更是对这个游戏系列肃然起敬:《密特罗德》的元素已经融入了现代游戏中的各个角落。

缺点

夸完了优点,这里直接来说《密特罗德:生存恐惧》的缺点。明明这是一个很成熟的游戏,却在各个层面上出现了设计上的缺陷,实在是不应该。真的是“让我做都能做得更好”。

游戏性

先从宏观的游戏性层面来讲。

  1. 奖励道具的鸡肋。我去玩了下初代FC上的《密特罗德》,当时飞弹是一个很强力的道具,但一开始主角的飞弹储备有限。因此,提升飞弹储备上限是一个重要的提升,可以看成是质变。在最新版的《密特罗德:生存恐惧》中,依然把飞弹储备上限当成奖励。但在这一部作品中,飞弹数已经绰绰有余,提升飞弹上限基本无法提升角色的战斗力。有的时候,玩家辛辛苦苦解谜越过了某一障碍,却得到了一个鸡肋的奖励,心情上肯定是大受打击。类似地,主角的生命值也很高,提升生命基本没什么收益,游戏还很吝啬地把1/4个提升生命上限的道具放在一个极难的挑战后面。总之,奖励道具的鸡肋让玩家的探索欲大幅降低。这一条缺点的本质是游戏机制不够丰富,能够给玩家的奖励太少。说得难听一点,这就是设计师不思进取,吃老本,不去引入新的设定。
  2. 主角后期能力过强。一开始,主角能开一管枪;后期,主角能开三管枪,子弹能贯穿敌人,甚至还能穿透地形。玩到最终boss前就更离谱了,主角碰到小怪就能直接秒杀,像捡到了无敌道具一样。这样路上的小怪就失去了存在的意义,玩家赶路的时候会很无聊。这可能不是一个缺陷,而是一个特性:设计师希望玩家在后期不用顾虑小怪,而是能专心收集地图中的隐藏道具。但正如第1点所讲,游戏根本无法让玩家产生收集增益道具的欲望,这个特性是很失败的。主角能力过强,从本质上看,是小怪缺乏多样性、缺乏难度,总之就是各个方便都设计得极其糟糕。如果小怪的强度能够跟上主角能力的提升,那根本不会让玩家产生能力过强的感觉。《密特罗德》的小怪设计已经被各个后来者完爆了。
  3. 一次性解密道具。《密特罗德》的一大核心玩法是不断获得新能力、新道具,打开原来无法通过的障碍。理想情况下,新能力除了能让主角通过障碍,还能提升主角的行动能力或者战斗能力,在各个场合都能发光发亮。但是,《密特罗德》中,很多新能力就是用来一次性打开一扇门的,用过一次后以后就再也用不到了。这种“工具人”般的新能力,就和最原始的迷宫游戏中的钥匙和门一样:拿到钥匙,打开门,钥匙没用了。这种设计太糟糕了,倒不是说这种设计会影响玩家的体验,而是这些冗余的游戏机制令游戏性的“美感”大大降低。

游戏内容

  1. 怪物设计水平不高。前面已经提过了,小怪的设计有很大的问题。这部boss的设计倒是还过得去。但是,游戏中有几场精英怪,怪物的动作是一模一样的。本来在这种游戏中打大怪就是一个背板的过程。第二次碰到同样的怪时,玩家已经记住了怪物的招数,打起来也没什么意思了。这里既可以说是缺乏设计水平,也可以说是毫无诚意,拿同样的内容来糊弄玩家。
  2. 游戏流程过短。这可能不算一个缺点,只能说游戏只做了这么长。问题是这个作品有一些赶工的嫌疑,几乎每个道具都解锁一个主角的功能,但有一个道具一下解锁了三个功能,突然主角就变得无敌了。如果不是赶工,就是这样设计的,那么这样做也很不好,游戏的体验突然出现了断层。

实现细节

实现细节的缺陷指的是游戏操作、UI等细节中一些不合理的地方,这些小细节往往会大幅降低玩家的体验。这些缺陷能够在程序、美术层面轻松改掉,而不会影响整体的游戏设计。

  1. 游戏中有一个机制,主角可以蓄力,再进行大冲刺。蓄力完成后是有时间限制的,过了几秒后玩家得重新蓄力。因此蓄力完成时,主角的身体会变色,以提升玩家蓄力是否存在。问题是,蓄力完成时主角会闪紫光,后期主角的服装也是紫色的,主角跳起来身上还会闪光,玩家根本无法分辨出主角是否保持了蓄力完成状态。在某些情况下,是否保持蓄力的信息是十分重要的。反正这给我带来了极差的游戏体验。40年前FC《魂斗罗》1代都能通过闪烁红蓝两色来来提示玩家主角是否处于无敌状态,现在这个作品这么简单的一个UI提示都做不好,不知道UI团队在干什么,也不知道他们是怎么测试的,为什么测试的时候没有发现这个问题。
  2. 改不了键位。这没有任何辩驳的余地,设计师和程序员都得背锅。连改键位的自由都没有,不习惯这个键位的玩家要被气死。尤其是这种有跳跃键的游戏,玩家很可能已经习惯了用某个键跳跃。好不容易习惯了这个游戏的键位,玩之前熟悉的游戏还得在把习惯改回去。
  3. 蓄力跑的时候,要按下滚轮键,再移动滚轮。问题是按着滚轮键移动滚轮的操作手感实在太差了。还有很多和蓄力跑有关的按键设计,体验极其糟糕,不去一个一个提了。

总结

其实《密特罗德:生存恐惧》整部作品的质量还是过得去的,要实现游戏中精妙的地图设计,需要花很多心血来安排道具、障碍物的位置。除了流程过短,令人意犹未尽之外,游戏没有太根本的问题。但我昨天被这个游戏的垃圾操作设计给气到了,于是认真总结了一下游戏的缺点。看得出来,有的问题是开发预算、时间导致的,有的问题是设计师水平导致的,有的问题是测试不够导致的,有的问题是欠缺细节的打磨导致的。做为一个成熟的游戏开发公司,很多错误都范得很不应该。实在是很可惜,这款元老级游戏已经风光不再,很多地方的设计水平都被《空洞骑士》等后来者超过。只能说爱之切,责之深。可惜游戏设计师看不到我的评论,只能希望我以后做的游戏不要出这些问题。

猛然从梦中惊醒后,我第一眼看到的是从窗外射入的阳光。“完了,不会睡过了吧?”我心里一惊,赶忙翻身拿起床头的手机。还好,离闹钟响起还有十分钟。

随便吃了点早饭,我就连忙骑自行车前往公司。虽然离约定的上班时间还早,但毕竟这是第一天,迟到了可不太好。

办完各种手续后,已经快到中午了。我认识了组里带我的前辈后,便和同事们一起去楼下食堂就餐。

傍晚,去对面的商业街就餐归来,已经到了理论上的下班时间了,可同事们大多没有要离开的意思。第一天刚来,我也没有要紧的活,和前辈打了声招呼后,我小心地离开了公司。


猛然从梦中惊醒后,我连忙翻身拿起手机,发现闹钟已经响过几次了。我来不及吃饭,立马骑车赶向公司。

我以最快速度骑行着,好不容易在绿灯结束前过了一个路口,却在下一个路口被红灯拦了下来。“真不走运。”我懊恼地想着。

到公司时,离约定的上班时间已经过去半个多小时了,而办公室里还空着不少位置。虽然已经来工作了一段时间,但我还是不太敢去适应这种松散的氛围。

中午午休时间宝贵,我和同事们还是不得不去拥挤的食堂就餐。

傍晚,我们按照惯例去外面的商业街吃饭。吃饭时,同事们谈论着陌生的话题,我只能在一旁听着。很快,一天结束了。


从梦中醒来后,我又贪心地闭眼休息了片刻。很快,闹钟响起,我熟练地关掉闹钟。我已经习惯这个点起床了。

上海的红绿灯是有规律的。大路口红绿灯的一个周期,等于小路口红绿灯的两个周期。通过了第一个大路口的绿灯后,我时而加速,时而慢悠悠地骑行,精准地在绿灯刚亮的时候通过每一个路口。

到公司时,大部分同事都到了。我已经充分适应了所谓的”弹性工作制“。

十一点半,我准时停下手里的工作,和旁边的同事说道:”去吃饭吧,去晚了就要排队了。“

傍晚,大家犹豫不知道今天该去哪边吃饭。”去地下的商业街吧。“我提议道。

晚上,关上灯,躺在床上,我渐渐入睡,等待着明天的到来。


从梦中醒来后,我翻身拿起手机,关掉了一分钟后即将响起的闹钟。

吃过早饭,我骑车去上班……

晚上,关上灯,躺在床上,我以习惯的姿势入睡,等待着同一天的到来。


从梦中醒来后,我翻身拿起手机,意外地发现今天没有闹钟。

原来是自由的周末到了。

我随心所欲地玩了两天。


又到了工作日。从梦中醒来后,我关掉了手机的闹钟。手机上的日期确实在不断地变化,但我似乎又回到了同一天。

我逐渐克服了种种的违和,适应了打工的生活。一切都是那么规律,时间如下坠一般越过越快,我几乎不再对生活产生任何新的感想。


可我的心中始终有一股难以名状的危机感。一天,和我年纪相仿的实习生和我聊道:“我们组里那个三十出头的前辈,居然已经结婚生孩子了!”我忽然联想起了一连串事情:我出生时,我的父亲也才三十岁左右;前段时间我和朋友以及他相处多年的女友吃饭,那场景就和我父亲和他的朋友夫妇吃饭一样……各种回忆在我脑中不断交织,最后连成了一条清晰的直线:或许我们的未来,已经被过去决定了。倘若一切都正常地进行下去,大家的人生轨迹都是一样的:结婚、生子,看着孩子重走一遍我们的十年苦读路;而我们自己,会成为父辈,再慢慢变成祖辈,一点一点老去。

我终于反应过来,自己一直以来在担心什么事情了。我认为有一件死亡更可怕的事情:如果人失去了活力,把一切都交给命运,任由时间推动自己的行为,那么这个人的未来已经毫无趣味了。就像我每天上班路上的红绿灯,见过第一盏灯后,就能够准确地说出之后每盏绿灯的出现时间。把注定发生的事情再确认一遍,不是很无聊吗?

人离开这个世界,是在心脏停止跳动之后;而人失去活力,却早在失去了「自我改变」的能力之后。人们总在不经意间,无法改变自己了。

我喜欢暗自观察、分析、嘲笑他人。

有的人被幼时的记忆所束缚,无法挣脱已经保持了一辈子的思维。几年前是什么样,不出意料地,几年后仍是什么样。

有的人惧怕落下,不断奔跑着。可是,在他人设下的路牌前,他们只能闷头前进,最终回到环形跑道的起点。

我就是这样傲慢地总结着他人的行为。但可笑的是,我自己也是一样的。一年前,我为驻足不前而焦虑;一年后的现在,我把工作上的劳累,当成自己努力生活的证据。从满是“成绩”、“排名”、”科研“的令人窒息的学校,到工作内容充实得令人空虚的公司,我欺骗自己说自己一直有所改变。可我内心也知道,并不是我自己在改变,我只是随着外界环境的变化,被推着移动而已。我担心的事情可能要发生了,我要失去活力,失去改变自我的能力了。

不,我决不会允许这样的事情发生!我生来喜欢玩乐,决不希望自己失去追求更多乐趣的活力!倘若人是一颗能运动的墨点,那我的人生轨迹一定不是一条笔直的直线。我的留下的轨迹,必然是一条曲折蜿蜒,难以捉摸的曲线。无论线条多短多长、多曲多折,多浅多深,我都会用我的活力,留下独一无二的轨迹。

人人都知道改变就是好事,都会在年轻时追求改变。可是,人们难以分清移动与改变。移动,可以是低头前进,可以是被拉着、被拖着,还可以是站着不动看着环境的变化。最终,人或许不是止于不愿改变,而是彻彻底底地失去了改变自我的能力了。

真正的自我改变,是在心中设好了去处后,不断看清变幻莫测的环境,不断挣脱四面八方的引力,不断驱动麻木的四肢,不断抬起头,不断在停下来后前进。改变必然是累人的、痛苦的——不仅仅是身体上的筋疲力尽,更多的是焦虑与失落,是面对不断扩大的黑暗又无法喊出声的绝望。

我知道自我改变的艰辛,但我更害怕接受就此失去活力的人生,我愿意接受接下来将面对的挑战。我很幸运,现在的打工只是一次实习,未来还有再次掌控大量时间的机会。我所处的环境还会改变,我可以借着这股力前进。我不缺用嘴就能喊出的斗志,甚至早已有了规划,我只需要鼓起勇气,迈开脚步,重启我向前奔跑的人生。

我相信,很快,就会有很多人见证我的改变。

永不褪色的少年心——《女神异闻录5》(Persona 5)玩后感

“不过是回合制RPG(角色扮演游戏),有什么可玩的呢?”

在好友向我极力推荐《女神异闻录5》(英文名Persona 5,后文简称P5)时,从一岁开始玩日式回合制RPG,天天看女主角领便当剧情的我,曾露出过不屑的神情。

没想到,之后的一个多月里,在工作的空闲之余,我花100多个小时玩通了这款游戏。

我一直不肯写游戏评测,因为我想建立一个系统的游戏评价框架,之后用统一的方式来评价所有游戏。开博客到现在,我一篇谈游戏的文章都没写。但是,今天玩通了P5后,无数的情愫从我的心中涌出,我实在按耐不住想发表看法的冲动了。我打算从个人的体验出发,谈一下这款游戏,而不去理性地分析游戏的优劣在哪。

这篇文章会有一定的剧透,但应该不影响没有玩过游戏的人。

老树新花——最古老的游戏与最新潮的表现形式

游戏一开始突然放了一段画风亲切的2D日式动画。穿着帅气风衣的主角,穿梭于热闹的赌场中。我这才反应过来,这是个日本公司制作(日式动画),刚出了没几年的游戏(背景是现代)。我脑中瞬间萌生了两个问题:2D动画这么费钱,整部游戏的剧情都是用2D动画表现的?主角生活在现代,怎么进行战斗呢?

很快,这两个问题就得到了解答。动画结束,进入操作模式后,游戏就变成3D的了,大部分剧情也都是用3D表示的。很快,只见一个警卫突然变成了怪物,第一场战斗开始了。我立马反应过来:这应该是幻想世界。在现代背景中加入幻想世界的设定,就可以触发战斗了。

而看到了游戏的战斗方式后,我又露出了怀念的微笑:主角和敌人轮流行动,每人一回合只能行动一次;技能有不同的属性,击中弱点属性可以把敌人击倒;物理技能消耗HP,魔法技能消耗SP……。打完怪物后,主角要进入迷宫探索。

自诞生于示波器后,电子游戏的画质就在不断提升。在3D技术尚未发展成熟时,2D游戏都在想方设法加入一些3D动画,来提高游戏的整体观赏性。没想到到了3D技术日益成熟的今天,加入2D的手绘动画反而成为了一种时尚。在这个拥有智能手机的现代世界观里,拉风的服装、嚣张的音乐、不羁的UI……每一个游戏元素都在极力地证明这款游戏是十分”现代化的“。

但是,仔细一看,这个游戏的核心玩法和最早期的游戏一模一样。一人行动一次的公平回合制战斗,在迷宫里刷小怪升级,购买攻击力更高的装备后打boss看剧情。

这款游戏实在太矛盾了,披着最新潮的外套,却有着最古老的内核。不仅仅是新与旧的结合,这款游戏同样是”游戏“(交互艺术)与”剧情、音乐、美术、演出“(传统艺术)的结合。再准确点来说,这款游戏中,属于游戏的那些部分,全是旧的;不属于游戏的那些部分,却有很多新鲜之处。

这些看上去矛盾的结合,却产生了奇妙的反应:我在玩游戏的时候,不会像最早的那些玩家一样沉醉于回合制战斗系统,享受攒装备打boss的乐趣。更多的时候,我跟随背景音乐,调动自己的情绪,享受击中敌人弱点时音效与动画共同渲染出的激动瞬间,像旅行一样在3D迷宫里的遨游。

这些体验,一般只有在看电影才能获得。一般情况下,如果一款游戏不能带来独特于其他艺术形式(如小说、音乐、电影)的体验,无论体验多好,我都会认为这是一款失败、”退化“的游戏(如《隐形守护者》)。但是,P5带来的这些体验是任何其他艺术形式无法提供的。和另一款游戏性更少的作品《十三机兵防卫圈》一样,哪怕剧情、音乐、演出再多,交互的部分再少,只要一款游戏带来了极佳的体验,并且这些体验仅能用游戏来表达,非得玩家亲自动手去玩,用五感去体会游戏的每一分钟,那么这款游戏就是一个好游戏。

与传统艺术结合,却更好地表达了传统艺术带来的体验,这恐怕是玩完P5后多数玩家的共识。而更令我赞叹的是,P5给我带来了另一种从未有过的游戏体验——“沉浸感”。现在很多公司把VR包装成“元宇宙”(metaverse)在胡乱炒作,殊不知日本ACG里“异世界”的英文就是metaverse。真正具有沉浸感的世界,不需要先进的技术,不需要为了敛财到处炒作的“科技公司”,而需要用户有一定的艺术欣赏能力,需要设计者有先进的设计理念。从激进的角度讲,优秀的小说就可以看成一个全新的世界。但读小说时,读者永远只是旁观者。而游戏是唯一一种能够让用户参与进内容创造的艺术形式。好的游戏就能创造一个“异世界”,供玩家游玩、享受。在我看来P5某种程度实现了这一点。

我就是男主角

除了传统RPG的战斗,P5还有一半的游戏系统属于文字冒险游戏。主角要提升自己的个人能力(知识、勇气、灵巧、魅力、体贴),加深与其他人物的关系。在文字冒险游戏中,为了提升玩家的沉浸感,一般会让主角一言不发,由玩家决定主角的所有发言。P5保留了传统文字冒险游戏的这些特性。

文字冒险游戏的一个特例是galgame(美少女游戏),这类主打和美少女谈恋爱的作品虽然脱胎于游戏,却越来越向视觉小说靠拢,只勉强保留了选择关键对话这一交互选项。P5整体来说是galgame的超集,因为玩P5时经常需要选择发言,且主角也可以和女性角色提高好感度。

玩galgame时,我怎么也无法代入男主角。如果男主角在剧情中戏份比较多,我就会觉得男主角的行动和我的想法存在差异,很自然的以旁观者的身份来对待游戏;如果男主角配音也没有、立绘也没有、性格也没有,剧情还是莫名其妙地发展起来了,我就会开始疑惑:为什么要和这样的女主角发展剧情,为什么剧情还能进行下去?最后也会失去代入感。事实上,让玩家代入主角是非常难办到的,很多galgame已经改变了策略,忽略了代入感,默认玩家就是看客,完全把男主角当成剧情中的人物来看待。

P5选择了较传统的方式,男主角大部分时间都不会发言,剧情甚至基本都是配角推动的。让玩家选择的发言几乎改变不了剧情,比如在开始战斗之前让主角喊一句“出发吧”,队友失去斗志的时候说一句“加油”。除了在文字冒险部分和其他角色培养感情时,恰当的发言能提供更多好感度,其他地方的对话选择系统就是个摆设。一开始,我觉得P5的文字冒险系统设计得很差。

玩着玩着,我觉得有点不对劲了。剧情进行了一段时间后,沉着冷静、勇敢坚强、深谋远虑的女主角新岛真加入了队伍,我一下就被她的声音和外貌吸引住了(题外话:新岛真的声优是佐藤利奈,玩P5后我对炮姐的好感度也有所提升)。在和新岛真的关系发展到一定程度后,需要把魅力升满才能解锁后续剧情。我瞬间改变了之前的所有计划,开始全力提升魅力。周四,澡堂里是药浴,我冒着把身体烫坏的风险泡澡,就为了多加1点魅力;去家庭餐厅看书,我只点美化皮肤的饮料;睡觉之前,我认真阅读时尚杂志。总算,经过一段时间的努力,我把魅力升满了,顺理成章地过完了后面的剧情,在关键处选择了正确的发言,和新岛真达成情侣关系。没想到,过了几天后,我和另一个女性角色的关系也发展到了恋爱分歧点,我想也不想地避开了恋爱的选项。如果开启恋爱路线,就能把和角色的好感度升满,解锁对游戏有利的强力辅助技能。一般情况下,作为一个贪心的玩家,我是一定要把所有能获得的能力都获得的,管他什么脚踏几条船呢。但是,在选择这次的恋爱分歧点时,我竟然为和其他人发展恋爱关系产生了负罪感,毅然决然地放弃了能够获得特殊能力的选项。我总算意识到,我已经开始把自己代入到游戏里了。开始恋爱关系后,和这个角色再发生剧情就没有任何收益了,游戏也不会主动提示你去找这个角色。但是,我已经忘掉了这是在玩游戏。刚开始恋爱,怎么能就这样停下来呢?我奋然对抗着游戏系统,在图书馆门口、校门口、地铁口寻找着新岛真,和她一起去各个景点游玩,即使我明白再提升好感度也触发不了任何有效的新剧情。好在我还有作为玩家的最后一点理性,提前存了个档,在同一天里尝试了去不同景点谈恋爱的剧情,最后哀伤地和这不断重复却终将逝去的一天告别。

游戏发生在现实生活和幻想世界之间。在紧张的氛围中走出迷宫、打完boss后,玩家就可以在现实生活中开启文字冒险部分,和上完班后回家休息非常相似。走在涩谷的大街上,望着来往的行人,走进便利店购物,我享受着从战斗中解放的日常生活中。刚刚在游戏里战斗完的男主角,和忘记工作、沉浸游戏的现实中的我达成了巧妙的一致。这种现实与虚拟的一致让我真正融入到了日本东京的生活中。甚至有的时候会反过来,我把生活当成了游戏。夜晚,我一边散步,一边哼着城市里的BGM “Beneath the Mask”,仿佛自己是这个世界中唯一有智能的男主角;做了一场精彩的演讲,得到周围人的赞赏时,我感觉自己的魅力值得到了提升;拒绝男生的天文馆旅游邀请,接受另一个男生的公园乘船邀请后,我忍不住笑了出来——我在游戏里竟然做过一模一样的事情。

游戏本身的文字冒险系统无疑是十分简陋的。但正是在这样一个男主说话完全靠玩家的游戏中,配上RPG战斗、现代城市、女主角等要素,加上我个人的生活经历,我竟然在游戏中感到了前所未有的沉浸感。这太神奇了,我玩其他各种类型的游戏从来没有过这样的体验。

我开始习惯把自己代入游戏里的男主角了。在战斗中使用技能时,我会和主角一起喊出“pe-ru-so-na”。我甚至把自己代入进了主线剧情中。当男主角与其他主角久别重逢时,大家都热烈欢迎着男主。虽然每个人只有一两句话,我也搞不清楚他们为什么和一个“哑巴”的感情那么好,但我还是感到了男主角与同伴之间牢固的羁绊。剧情越进行到后面,我的这些感受就越深刻。仔细分析过后,我发现,不仅是游戏中的种种游戏元素令我感到了沉浸,游戏的剧情也很符我的胃口,让我感到“如果是我,也一定会这样做”的感觉。

给永远的少年的赞歌

本节剧透较多

前面也说到,由于游戏机制的原因,游戏无法对男主角进行刻画。而其他角色加入队伍后,很多时候都是例行发言。每个角色的个人剧情也只是稍微扩充了故事背景,没能做到对角色的深刻、多面的刻画。相比很多剧情优秀的作品,P5并没有把角色刻画好,几个标签就可以轻松描述一个角色。没办法,这毕竟是一个RPG,而且游戏想面向的玩家也不是有年纪有阅历的人,和其他作品比角色塑造还是太难了一些。

游戏的剧情上有亮点,但和人设一样,很多地方缺乏深度,导致玩家在剧情高潮时很难在情绪上感到同样的激动。游戏的结尾平稳而平常,没有特别大的高潮。我看的作品不多,不知道这样的结局在所有作品中排名如何,只能说结局不至于太差。

虽然P5在剧情上很一般,但我并不认为编剧没有水平。我能感到,剧情中留有很多隐喻。我最近写文章时慢慢领悟了“隐喻”这一技能。有的时候,我想表达很多事情,但是表达出来篇幅就很长,而且没有什么感染力。如果把这些情感、思绪藏于文字之后,让读者自己去体会,甚至根据经历的不同产生不同的体会,文章的表达能力就会更强。不管编剧本身是怎么想的,我从游戏剧情读出了许多价值观,其中很多想法我都是非常赞同的。通过我自己留隐喻时的经验,我推理出编剧是一个有一定深度的人,他把自己的想法藏在种种细节之后。那为什么一个有能力的编剧写出这样相对较为平庸的剧情呢?我想,肯定不是他不会写,而是他认为这部作品是给年轻人玩的,写一些给年轻人的剧情就行了。

为什么我觉得这个游戏是给年轻人玩的呢?很简单,看游戏的剧情梗概就知道了。P5讲了什么故事?一群穿着帅气服装的少年,以“怪盗”自诩,打败邪恶的大人,最后证明了真正的正义。故事看上去就是这么简单幼稚,只是游戏的剧情非常充实,让玩家觉得整个剧情确实是合理的而已。年纪小一点的玩家,一定会对剧情里的人物憧憬不已,幻想成为和他们一样的人;但年龄稍微大一点,经历了一些挫折后就知道,这只是一个幻想的故事而已,现实没有那么简单而美好。

但是,编剧显然不是一个年轻人。游戏里提到了许多不公的事情,这些事情很可能在现实中有原型,来自于编剧自己的听闻。如果费心思去刻画的话,一定会提高整个游戏的深度的。面对不公的事情,游戏里的解决方式是怎样的呢?很简单,用正义让坏人“醒悟”就行了。这是多么潦草的解决方法啊。这又是多么浪漫的解决方法啊!编剧知道现实中的事情很复杂,但是出于向游戏机制的靠齐,也出于对年轻玩家的考虑,写了这么一个浪漫的故事。

根据上述这些线索,我推理编剧明知世界很复杂,却要把故事往简单的方向去写,往年轻人能接受的方向写——只要坚持正义,就终能得到正义。如果这样看的话,P5就是给这种“少年思维”的赞歌,为少年们追求正义的梦想披上一层屏障,以使这些梦想晚一点被无情的现实戳破。

作为有阅历的成年人,还能写出这样的剧情,不知道这位编剧是确实还有一颗少年的心,还是说写出这种主旨简单的剧情没有什么难度。但不管如何,我也被剧情中的只言片语触动到了。我想,不仅是我,应该还会有很多其他成年人,会被P5的剧情所触动吧。人对事情的认知是螺旋上升的:最初可能是初生牛犊不怕虎,一旦在黑暗中触碰到了岩浆后,才能知道周围的环境不是天堂,而是地狱,因而感到恐惧。而只有接触过永恒的黑暗,经历过无尽的苦痛后,依然对美好有追求的人,才能称为勇敢的人。他们是永远的少年,永远忘不了少年时对美好的世界的向往。

我觉得我之所以这么喜欢这款游戏,之所以沉浸于游戏中,不仅是因为游戏的整体机制或者种种细节设定,更是因为我欣赏、羡慕主角们的经历。在我的心中,或许永远活着一个“怪盗”,在大功告成时,可以毫不羞耻地对全世界的人发出宣告:“这个世界由我收下了。”

游戏整体评价

发表了这么多看法,最后还是来整理一下我对P5这款游戏的评价。

从客观上看,P5的游戏机制老旧。不是说老的玩法就不好,而是这些玩法本身就不够好。RPG部分,玩法几乎和最早的RPG一样,稍微加入了一点点精灵宝可梦的属性克制和怪物捕捉系统,看得出来这些系统很多年都没有更新了。纯粹的回合制游戏就是不好玩的。回合制游戏的出现,本来就是早期机器性能、玩家欣赏水平、设计师设计水平共同导致的。现在还做出这种机制是很丢脸的。让我去做,随便加一点机制都会让游戏深度提高很多。迷宫中有不少谜题,但解密性不强,看得出来是为了照顾玩家,不然卡关会让玩家的体验很差,这一点给一个中评。和《黑暗之魂》一样,搞一个“巧妙”的电梯或密道,其实是一个看起来花里胡哨其实没什么用的设定。躲藏在掩体后面是迷宫中唯一一个有趣的通用设定,但做得不够好。RPG的整体养成思路其实不是JRPG(日式RPG),是DRPG(地下城RPG)。我一玩游戏就感到了和玩《世界树迷宫》(同公司的作品)一样的感觉:药品不够,玩家要评估自己的补给量,探索完迷宫后要回城补给。但这个游戏中剧情占比较多,不可能像一个真正的DRPG一样让玩家花时间在“探索迷宫-回城”这一循环上。结果就是这个游戏的RPG养成系统做得非常差劲。文字冒险部分没什么可以评价的,因为文字冒险本身的重心就不在游戏体验上,一般是在剧情上。文字冒险部分就是一个再普通不过的上个世纪就有的系统。

音乐、美术我没有资格评价。可能一些挑剔的玩家觉得3D建模不够好,不过这方面不是很敏感的我没什么看法(除了新岛真的脸部模型没有立绘好看)。音乐方面我只能用“好”这一个字来形容。在恰当的场合,有恰当的调节气氛的音乐音效,给玩家近乎电影级的体验,这是线性剧情RPG游戏的天生优势。P5在这一点上做得非常好,一般的游戏绝对没有这种演出效果。同时,这也是我第一次见游戏的日常音乐中出现歌曲,每一首歌的效果都很好,它们能够表达纯音乐表达不了的情感。

剧情评价了很多了。但我不是专业人士,修养不够,给不了客观评价。从以上分析也可以看出,我目前仅能,我也仅允许自己在游戏玩法上进行深入的评价,这方面我有充足的自信。

从主观上看,我在玩这款游戏时十分投入。经分析后,我发现我主要是在游戏中感到了代入感。对于我来说,这是一次全新的游戏体验。我喜欢,且感激这款游戏。除了代入感,游戏剧情中蕴含的主旨也让我备受感动。不管作者创作的本意如何,我对游戏剧情有了自己的一份解读与体悟。

我的收获

玩完这款游戏后,我有许多收获,主要集中在游戏设计上。

  • 如前文所讲,我认识到游戏与非游戏的边界不是游戏玩法与传统艺术形式占比多少,而是要看一款游戏的内容能否仅由游戏表达出来。如果写篇小说、拍部电影能有更好的效果,那这个作品就不配称作游戏了。
  • 续上点。游戏中的传统艺术形式(美术、音乐)非常重要,但所有这些形式都应该围绕游戏而做。P5就是一个例子,音乐做得很好,完美反映了各种情况下玩家所处的氛围。而游戏的剧情很多时候必须为游戏机制服务,不然只看剧情这一点的话游戏不一定比得过文学和电影。
  • 在游戏里加入2D日式动画是一个很好的主意。只要有足够的钱)。
  • 在游戏里加入歌曲是一个很好的主意。
  • UI不一定要规规矩矩,可以像P5一样有自己的风格。这对美术有一点的要求。
  • 让男主角当哑巴,加入一些不影响的对话选择,真的能提升玩家的代入感。
  • 把背景放到现代也很有趣,可以让玩家感到更加亲切。

差不多就这些了。我觉得P5应该是游戏史上有里程牌意义的游戏,它让日式RPG从棺材里伸出一只手,告诉世界它还没有死。它同样是我玩游戏经历中具有里程牌意义的游戏——我没想到一个不好玩的游戏也能这么吸引人。

我从小到大的一大梦想就是做国产日式RPG。现在这个梦想可以修订一下了。给我20年时间,等我有了资源后,我要做一款日式RPG。故事发生2010年代(我是中学生的年代)。游戏在具有优秀玩法、有足够的深度供玩家思考探索的同时,有着过得去的剧情、恰到好处的音乐、生动而不是华而不实的建模、契合主题的美术。简而言之,游戏玩法吊打P5,除了游戏玩法之外的地方力争做到比P5出色。

作为制作人,我要保障游戏每一环节的质量。程序不用说,我能让游戏代码质量达到可以开源的程度。我要提升音乐素养,不说自己负责部分音乐,起码要让我的音乐素养达到游戏素养的1/2(比如我现在的游戏素养属于世界前0.00001%,那么我音乐素养要达到世界前0.00002%)。美术相比之下比较好弄,因为这个东西是眼睛能看得见的东西。最后是游戏玩法,这自然不用说,不可能做得不够好。做得不让我自己满意,就不会拿出去卖。

游戏大获成功后,我要把游戏动画化。我要用实际行动告诉那些制作者:1)2D动画画风的游戏不能改编成真人电视剧;2)不能不加修改地把游戏改成动画,也不能改编得面目全非。

最后,感谢P5。在自己的博客写博文的一大好处就是能在无拘无束的情况下乱写,想到什么写什么。今天这篇文章就是这样,该认真组织语言的地方就认真写,该抒情抒情,想乱写的地方就乱写。今天我不仅玩完了游戏,还把很多感想一次写下来,可谓是双倍的快乐。这篇文章必然是要修改的,肯定有很多错别字。但我写了5小时,实在太累了,等以后再改吧。


更新

2022.8.9:修改错别字若干,修改不通的语句若干。没想到,过了大半年,我的文字编辑水平有了飞一般的提升。

苟活于世间 —— 初入社会有感 ~ Life Outside Campus

最近我获得了一份极佳的临时工作机会。薪资媲美互联网大厂,工作时间965,工作内容是我不算讨厌的开源项目开发。我独居于市区中的小房间里,骑车一刻钟就能到公司。公司内氛围良好,大家全是搞技术的出身,穿T恤凉鞋、和上司交谈时插科打诨都是正常现象。同事个个都很年轻,面孔就像学校里见到的同辈同学一样。

但是,在同事们聊天时,我只能当一个听众——他们的生活经历超出了我之前的认知。

有人谈自己被高薪诱去某个大厂工作了两年,工作强度大,上司欺压员工,经历种种不公才得以跳槽到现在的公司。大家纷纷赞赏他的忍耐能力,这样差的工作环境,竟然忍了两年。

有人说在其他城市能租一个两居室,自己住一间房,狗住一间房。来了这里,只能让狗屈居于客厅。另一个同事打趣道:“我现在住的还没有你家狗以前住的地方好。”

有新来的员工问关于落户的政策。大家纷纷提出自己的见解。话题渐渐从落户,到租公租房,到租一个郊区的房子要买车,到汽车每天要收高额的停车费。

有人在经验分享会上讲述买房流程,介绍买房时要考虑的注意事项、和租房有哪些不同。分享之后,同事提的第一个问题是怎么凑到买房的钱。演讲者不好意思地笑着说:“有6个钱包就可以了。”

有同事已经结了婚,抱怨生活中种种琐事带来的烦恼。我好奇地询问彩礼的事情。他认真地分析了各地的习俗,总结说只要彩礼的钱最后是给小两口用就没关系。他回头问我是不是在恐婚,我只好笑一笑岔开了话题。

有人早上到岗时间时早时晚,据了解他和女朋友一同起床。女朋友要早起上班时,他也跟着早起。周五下午,多数人都早早地回家,我问了后才知道,大家都要赶紧回家陪陪家人。

有一位同事刚和女朋友租了一间更好的房子,突然向他人谈起了自己情感上的问题。二人相识于校园,感情融洽。毕业后二人在开始工作,经济上主要由男方负责。平时小矛盾虽有,但这次的矛盾似乎难以缓和:男方平时想买个游戏都犹豫不决,女方却以借钱的名义想买一个贵重的装饰品。一石激起千层浪,过去忍忍就算了的小事全部变成了引爆矛盾的燃料。另一位同事以自己和前女友和现女友的生活经历,半安慰半抱怨地提供着建议。还有一位刚实习没多久的同事竟然也感到了共情,讲述自己工作后劳累无比,懒于在七夕回复在校女友的消息,对方因此断绝了联系。大家都感叹着单身的美好,劝我好好珍惜。我笑了笑,他们嘲弄道:“弈帆,不要笑,你以后也是这样的。”我不是在嘲笑他们,我是在苦笑自己对现实的切换感到无所适从啊!前几个月,单纯的本科好友还在向我炫耀着他女人缘有多广,形象地描述他是怎么如痴如醉地喜欢上了某个人。

工作、住房、情感,这些都是在学校里难以见到的话题。我淹没于一个个陌生的名词中,勉强地记下生活中的种种见闻。但是,有一件事是我不需要特别去记忆的:哪怕有舒适的工作,靠父母付了房子的首付,有了稳定的婚后生活,大家都不想生孩子,都嘲笑着三孩政策。

在三、四十岁的人口中听到这些话题,一点也不令人意外。问题是,我的同事们实在是太年轻了——放在大学里,他们就是路过的同学,就是普通的同龄人。我们的好朋友,基本上都是小学、中学、大学时同龄的同学。可以预见,我们这些同龄的好友,在进入社会三五年后,就会和我现在的同事一样,把重心放到无穷无尽的生活琐事上,变成既熟悉又陌生的样子。

傍晚时分,路上都是悠然地骑电动车回家的上班族。我一边想着上面这些闲事,感叹生活的不易,一边把劳累全部释放到自行车的踏板上,得意地赶超一辆又一辆电动车。忽然,伴随着由远到近响起的几阵急促的喇叭声,一辆电动车倏然从我身边掠过。不用看那颜色统一的安全帽、衣服、后备箱也知道,在这个时间还在马路上飞奔的,只会是一位送餐的外卖员。我们这些“名校”毕业,干着”体面工作“的程序员,好像还没有抱怨生活的资格啊。

这些都是在我视野内的见闻。在我看不到的地方,还有多少人机械地进行着重复性劳动?有多少人提心吊胆地游走在法律边缘的灰色产业?有多少中年人战战兢兢,生怕明天就被裁员?又或是有多少人已经在一声令下后失业,正为生计四处奔波?

再仔细一想,我们这些程序员,谈不上高贵,却也不能说没有抱怨生活的资格。对于世界上的大多数人来说,大家都是一样的——我们不过是苟活于世间罢了。古今中外,人类的目的都是一样的:活下去,好好地活着,幸福地活着。不管是在众人的期待下出生,立下过扬名立万的理想;在盛世时享受着家人的呵护,畅想过未来幸福美好的生活;在遭遇挫折时心有不甘,发出过改变一切的豪言;在众人中脱颖而出,妄想过自己是天之骄子;在初窥知识的边界后,为拓宽人类见闻而奋发图强过,都会在某时某刻,被迫离开心里的象牙塔,破开”自己永远会被他人照顾“的茧房,踏上普通平淡的生活之路。多数人都没有躺着活的资格,要靠自己的双手去挣钱,用钱换取住处,换取食物,在世间守住属于自己的一隅,普通地活下去。

不走出学校,自己看一看这个世界,是无法摆脱幼稚的思想的。感谢现在这段经历,让我知道了自己会活得怎么样,因此应该为了什么而活。

之前学了不少东西,今天以学习笔记的形式分享出来。学习笔记不适合作为入门的教程。

Git/Github使用方法学习笔记

从例子直观理解git

git是一个开源的分布式版本控制系统。如果你去网上搜git的定义,一定会搜到不少这样精确又令人看不懂的定义。今天,我准备根据我的笔记,来友好地介绍一下git相关的知识。

假设你要玩一个流程很长的RPG,你打了一天,打到了半夜。这个时候该做什么呢?没错,存档。不然下次就要从头开始玩游戏了。

除了继承之前的游戏进度,存档还有一个好处:如果你不小心输了,可以从上次存档的地方开始重新玩。甚至你玩着玩着发现进错了结局,可以从好早的档重新开始玩。存档,除了保存进度,还能记录下游戏发展向不同分支的关键节点。

现在再做一个很不现实的假设:你要玩一个无聊又冗长的RPG游戏,但是通关了之后你会得到一大笔钱。为此,你只开始关注能否尽快通关,而不去体验游戏的内容了。你在单位的电脑玩,在网吧的电脑玩,还在家里的电脑玩。你把所有好友都动员起来一起帮你玩游戏。但是每个人的进度不一样就没意义了。于是,你们想了个办法:大家玩完后,把存档放到网络上,下一个人就可以用最新的文档来了。

大家决定按贡献度分钱。同时,大家还想方便地交流每个人玩的具体情况,碰到了什么问题。于是,大家扩展了存档功能,不仅让存档保存游戏内容,还保存了每个人的保存时间、进行了多少游戏进度、想分享的游戏攻略等有意义的信息。

这就是git用法的一个形象的解释。在我的理解里,能够保存项目进度关键节点,并记录有意义的日志信息,就是一个版本控制,不同的人能在不同的设备上同步所有其他人的进度,就是分布式。源代码给你看,就叫开源。合起来呢,就变成了开源的分布式版本控制系统。

这个例子基本上是我自己想出来的,我在想这个例子的时候会主动思考git有哪些性质,这些性质与另一个通俗易懂的事情的哪些性质比较类似。通过这个过程,我反而加深了自己对git的理解。如果读者在学完git后,能够真正看懂这个例子,并且举出一个自己的例子,那就说明你基本理解了git。

这里推荐个比较有名的博客,上面有git的教程。我是跟着这篇博客上的教程入门git的。该教程举了个日志的例子(如下图)。该日志记录的内容,代表了git的大部分操作。可以暂且认为git就是一个自动生成这样格式的版本日志的程序。说得那么好听,git就是个自动记事本。

git的操作

一定要自己开一个项目去学习git,光看不动手很难学会

为了节约写作时间,让我能够写更多的学习笔记,最大化造福他人,我决定牺牲博文质量,偷懒地放上之前做的ppt。

Hello git!

完成上图中的操作,你就可以像写完了一门新语言的hello world程序一样,说自己已经掌握git了。

这么说有点夸张,但也不假。上图介绍了一次完整的git使用流程。首先,需要使用git init初始化一个git仓库,呼叫git这个记录员来帮你管理版本,不然你的文件夹只是一个普通的、无法进行其他git操作的文件夹。之后,随便新建并写入一个文件(假设它名字叫readne.md。用git add readme.md告诉git你加了这个文件。最后用git commit -m "改动信息"来让git把加的文件给记录下来。

我学到这里的时候十分疑惑:为什么要先add,再commit才能把文件记录下来。为什么不一次性把文件记录下来呢?听说还有个叫github的东西,我’commit’完,还要再进行一步操作才能把文件传到github上面。为什么我想在网上存一份文件要这么多步操作啊!

这里,考虑到知道git的人都知道github,而对git操作有着许多的疑惑,我打算用一张简单的数据流图(该图及后文的称呼并不严谨,仅供学习理解)来介绍git、github的关系,以便于接下来的理解。git与github的具体关系还是放到后面介绍。

其实啊,git init这条语句看上去没干什么,实际上在你的电脑里新建了一个“文件夹”(逻辑上的,而不是实际的)。这个“文件夹”是本地git仓库。而这个仓库呢,又分成两个分区:暂存区和实际的版本库。可以认为git是一个管家,add进缓存区,就是叫管家把事情记在脑子里;commit进版本库,就是叫管家用水笔把事情记在本子上——这样这条记录就确实储存下来,不好销毁了。那么,使用add把文件放入暂存区的好处就显而易见了:有的时候我们要改/加的文件很可能出错,我们再提交之前,需要把文件检查一遍,这样出了错就能及时更改。一旦文件commit了,更改起来就麻烦了,之前的错误记录也难以消除。

而github一类的托管平台,则又可以视为一个文件夹。这些文件夹可以看成是网盘,它们由运营平台提供,以便于你能用互联网在不同设备上访问自己的仓库。目前对于git、github之间的关系,add与commit之间的关系理解到这个程度就行了。

git提供了一个十分使用的命令——git status。该命令不会对git仓库进行任何的修改,而仅仅会输出当前git仓库的状态。如上图所示,修改已有文件,add,commit后,git status都会输出不同的信息。要查看具体的修改细节,可以使用git diff

如最开头所说,我们使用版本控制程序的一大原因,就是希望像RPG读档一样,能够让所有文件回到之前某个保存下来的状态中。这样的操作在git中叫做版本回退。上图给出了一个例子,我们不小心在文件里做出了错误的修改,还commit了。这个时候该如何把文件回退呢?

首先,可以使用git log,查看所有提交记录。之后,可以使用git reset --hard <要回退的版本>指令来进行回退。最新的版本叫做HEAD,上一个版本叫做HEAD^,上上个叫做HEADT^^……依次类推,可以快速地回退到上一个版本。除了用这样的方法指定版本号外,还可以用commit的id来指定版本(commit id在log中查找)。指定id的时候不需要把id输全,只需要输入前几位,保证不冲突就行。

除了commit后发现错误想回退,还有一些程度较轻的版本回退情况:不小心修改了文件而没有add,或者已经add了。对于这两种误修改,都有对应的解决情况:如上图所示,如果文件没有add,使用git checkout -- <filename>就可以把对应文件恢复到暂存区的最新状态(最后一次git commit或者git add的状态)。如果文件add了,使用git reset HEAD <filename>就可以把git暂存区中的文件恢复到没有add之前的状态(最后一次git commit的状态),这等于回到了上个问题,文件没有add该怎么恢复。再一次执行git checkout -- <filename>就可以把文件的内容也彻底恢复回去了。

git add是一个很神奇的指令。它的名字虽然叫add,但实际上不管是新建文件、修改文件、还是删除文件,都需要用git add来更新文件在暂存区中的状态。因此,与其叫做add,不如把这个命令称作update比较好。那么,现在问题来了:如上图所示,有一个文件,我不小心让它进入了git暂存区,我想在文件系统里保留它,但不想让它进入git仓库,该怎么操作呢?这个时候就要使用git rm --cache <filename>。这个叫rm的操作是真正意义是上的remove了,而不像add一样有一点歧义。如果想让文件从文件系统中也消失 ,可以用git rm -f <filename>

刚刚我们碰到了这样一个应用场景:有一个文件,我想在文件系统保留它,却不想让它进入git仓库。这些文件可能是我们为了调试而编写的脚本文件,我们不希望这些乱糟糟的文件上传到公开的仓库中。如果我们不做任何处理,每次输入git status都会看到这些在文件夹中存在却没有进入git仓库的untracked files. 该如何让这些碍眼的提示消失呢?这个时候,可以在git仓库的根目录下创建一个.gitignore文件。该文件用于描述不被git跟踪的文件,描述的形式可以是直接描述文件的全名,也可以用*来模糊匹配,还可以直接忽略一整个文件夹。上图的例子中,我们如果在.gitignore中加入test.py,再输入git status就不会提示有文件没有加入git仓库了。

使用github初始化仓库的话,可以自动创建一个.gitignore文件。这个文件也可以参考别人的仓库里的来写。

讲了这么久的git,终于可以来讲github了。git本身是分布式的,每台电脑都存储了所有的git仓库版本信息。但是,实际上使用的时候,为了在互联网上同步信息,我们一般需要托管平台的帮助。github就是这样一个平台。先直接看一看和github有关的操作吧。

不管怎么样,所有git操作都是基于一个git仓库。这个git仓库可以是我们本地的,也可以是github上面创建的。

如果本地有了一个仓库,那只需去github上创建一个空的同名仓库,再用图中的第一条命令把远程仓库和本地仓库关联起来。

但是,使用https的方法通信,很容易出现超时的问题。如果之前不小心对https格式的地址进行了绑定,可以先remove掉。

与github关联的正确方式是使用ssh,这是一种更安全高效的连接方式。先像上图一样再本地生成ssh密钥。

再把公钥放到github上。

这样就可以正常把本地仓库和github的仓库关联起来了。如果本地没有仓库,而是去克隆github上面的仓库,则可以使用git clone指令。

这里特别要说一句。如果只是用别人的代码,clone仓库本身就行了。如果想要对别人的仓库进行贡献,则最好先去github上面点一下fork,分支出一个完全一样的,属于你自己的仓库,再clone这个属于自己的仓库。因为对别人的仓库是无法进行修改等操作的。

和github的仓库进行关联后,还需要学习一些和分支有关的知识,才能开始使用github。以上图为例,在git里创建分支并在不同的分支开发,就好比在同一台电脑,同一款游戏里,不同的玩家玩到了不同的进度上。当前电脑(HEAD)由玩家dev控制,他玩的进度比较超前。之后轮到玩家master来玩,他看dev的进度很前,于是直接拷贝了dev的游戏存档,这样两个人的游戏进度就完全一样。之后master把dev的存档删了,因为这份存档已经没用了。在这个例子里,两个分支都是线性进行,因此只需要把旧的分支向新分支同步就行。但是,实际开发时,很可能两个分支往不同的方向发展,之后这两个分支还需要进行同步。这个时候就需要对两个分支的信息进行细心的比对,才能把两个分支的代码给融合起来。

开始那副图片描述的内容,可以用上图中的操作来实现。

这页ppt做得不好,它实际包含了两类不太相关的内容:

首先是对开始那些操作的收尾:把副分支向主分支合并后,副分支一般没什么意义了,这个时候可以直接删除。

有了分支的知识,我们就可以理解本地git仓库如何与github上的仓库交互了。我们本地仓库和github上的仓库其实是同一个仓库的两个分支,我们需要不断令这两个仓库同步。

如果本地仓库较新,应该用push,等于是把本地的内容向github上的内容合并。

如果github上的仓库较新,应该用pull,等于把github的内容向本地更新。

这里的命令写得不够具体。理论上两个操作的用法都是git pull/push <remote-repo-name> <branch>这样的格式的。远程仓库名一般叫做origin。但是可以通过--set-upstream可以指定push和pull的默认远程分支。直接git push/pull的时候命令行里会报错,按照提示设置upstream即可。

不管是开发自己还是别人的开源项目,都建议创建一个新的分支开发。开发完一项功能后,把新分支推送到github上,再利用github的pull request把分支合并到主分支上。这种开发方式使得在添加新功能时,所有人都能看到哪些代码进行过修改,有利于多人协作。

更新github上的分支的几分钟内,github会主动提示你要不要进行pull request。或者是点击pull request一栏主动进行”New pull request“,都可以开启一个新的PR。

PR的标题和内容一般都有格式要求。如果是向别人贡献代码,一定要向别人的要求对齐。输入完对PR的描述后,就可以正式创建一个PR了。

(这里没截图)PR的审阅者可以在PR的file changes里面查看有哪些代码被修改,确认无误后可以点击approve,并在整个pr的最后面点击merge。这样,一个带有新功能的分支就正式被并入主分支了。

我之前就接触了github,一直用github gui进行个人项目的同步。但是push/pull/commit等概念一直没有弄明白。通过这次彻底的学习后,我建立起了git及github的知识框架,才算是彻底理解了这些工具的使用方法。这个知识框架可以总结为上图。如果一个人学完git的相关知识后,能在脑中建立起类似上图这样的数据流图,那么就可以说是基本理解了git什么多命令究竟是在干什么。

首先,要理解先得存在本地git仓库,在线github的git仓库才有意义。通过add命令,可以把文件夹里的文件托付给git系统进行管理;通过commit命令,可以让git把当前的内容”存档“。

为了使用github,需要把本地仓库和远程仓库关联。如果是从现有的远程仓库开始构建代码,则用git clone;如果是本地仓库已经有了代码,仅需用git remote add关联起远程仓库。后续所有的git pull/push操作都是在同步本地和远程的git仓库分支。

为了对别人的代码进行贡献,需要fork别人的仓库,形成一个自己的仓库。对自己的仓库进行更新后,再以pr的形式请求更新别人的仓库。但开发个人/私有项目时,也建议使用pr的形式更新代码。

git的笔记差不多就这么多。还有很多知识没有在笔记里提及。比如如果合并存在冲突的代码。其实在有了整体的概念后,这些细枝末节的知识反而都很好理解了。

我反正在学完了git的基础知识后,就再也不用命令行,而是用一些其他工具来进行git仓库的管理了。我现在在使用vscode的git管理系统。里面add、commit都可以方便地进行操作。冲突合并也就是点一点按钮的事情。

我的博客的分类/标签管理方法

之前我把博客里所有博文的分类、标签进行了重构,一直没有提及。这里简要介绍一下重构的内容,及重构后分类和标签的使用依据。

之前的分类和标签貌似是英文。我也不知道自己怎么想的。既然博客的内容全是中文,那么读者也全是会中文的人,用英文的分类/标签没什么意义。当然,我是发现自己想给新分类取名,却怎么也不知道如何用英文来表达某个中文词语的意思时,才准备把所有分类/标签改成中文的。

现在的分类是按照文章的性质进行分类。目前分类仅有两级,直觉上分三级可能更好一点,不知道以后还有没有改进的空间。

目前有学习/杂谈/经验分享/记录这几大类。”学习“就是分享一些客观正确的事情。”工具用法指南“包括软件的安装使用方法,这些是最没有技术含量、原创性,最死板的内容‘;”知识“是我对某一学科的知识的再表达,主要是巩固我自己的学习,内容有一定的原创性,但根本目的还是复述别人的知识,这个名字取得不好,改成”知识分享“或许更合理一点;这篇文章所属的”学习笔记“可以说是劣化版的”知识分享“,原创性稍高一点,但完成度低,内容连贯性差,不适合作为第一手学习资料,适合作为参考,或者用于我口头讲授的素材。

”杂谈“就是中小学生作文。有的文章是有一些深意的,有的文章是随便写的,”趣文“里的就真的是写来玩的。

”经验分享“和”杂谈“一样,是原创性极强的作品,主要是我个人的见解。但提出系统性的个人见解非常困难,还需要保证不与客观事实或参考资料有出入,目前文章较少。”经验分享“这个名字也不是很恰当。说不定以后”经验分享“专门来放一点原创性强,但是不够有深度和完成度,随便写的一些经验分享文章。专门开一个”我的理论“来放最具原创性和深度的文章。

”记录“里包含了专门对我完成的某件事做描述的文章。这里有些东西是为了好玩而写,有些东西是为了丰富个人简历,专门写给别人看的。

分类只能给所有文章从性质这一个维度上进行一个大概的分类,但我感觉用标签检索文章更加合适。标签比分类更加灵活,可以像分类一样描述文章性质(日记),也可以描述文章涉及的内容(数学),还可以标识一类专题(未来可能出现的”博士毕业论文“)。目前标签我是想到什么放什么。

用标签的时候会有一个问题:理论上标签越多越好,但是如果某一天突然想出一个新标签,但以前有些文章可以套入这个标签,却还没有加,我该怎么给以前的文章加标签呢?或者说我想出了一个新标签,却忘了以前想出了类似的标签,取了个不同的名字,这样标签该如何对齐呢?感觉标签使用起来非常麻烦。一个简单的方法是怠惰处理,以前的内容不管了,只管现在和未来的标签是正确的。

写这篇学习笔记的感想

确切来说,要分成对”学习笔记“的感想和对写这篇文章的感想。

我之前一直不肯写学习笔记。一个人真要学会一个东西,不一定要像”学霸“一样记下花花绿绿的笔记,只需要在关键处进行顿悟式的理解,再在脑中建立知识框架即可。在学一个东西的时候(尤其是学习需逻辑思考而非记忆事实的知识),很可能什么都不用记,或者只是对关键知识进行了演算或者分析,留下一些草稿。记录笔记,其实应该是一个向他人表达知识的过程,应该把这个过程用于巩固知识的理解。在这一过程中,把问题讲清楚一般是十分困难的,因为我们的大脑此时都用于如何让脑中的知识变通顺,而无暇顾及他人能否理解我们在讲什么。只有完全学懂了,才可能写出漂亮的笔记或教程;若是对知识的理解更高一层,才可以写教材。我之前一直认为我写的学习笔记没用,因为这些学习笔记属于我个人学习的副产品——正如我们呼出的二氧化碳一样。要把它们转换成能给人看的东西,需要花很多心血。我自己学东西的时候,经常去网上查资料,总能查到这样的一些学习笔记:这些学习笔记缺乏逻辑性,完全不能用来进行自学,看它们就是在浪费时间。我不希望自己的发出来的学习笔记干扰他人的学习。但最近我开始愿意发出自己写的学习笔记了。

这里再次强调一遍学习笔记所属的性质。我之前”知识“(未来将改成”知识分享“)中的文章,是以现有教材为素材,记录我个人分析与总结的文章;而学习笔记,则应该算是自己写出来的学习素材,我加上了一些描述以使得它们勉强可读。这两类文章本质上来说都是我自学的时候用的。

现在开始讲我愿意发学习笔记的原因。首先是因为最近我有分享知识的需要,制造了一些用于讲授的学习素材。这些素材只要加工一下就能发出来让别人看了。有了积累,不发表出来,实在太亏了。我是不愿亏的人,很想有了东西就发表出来。

发学习笔记的最大问题是需要加入一些描述性的文字。写这篇学习笔记之前,我的想法是随便写点文字描述一下就得了。但是,写着写着,我发现不多写点字是不可能把抽象的知识描述清楚的。最后,我只好在文章质量上进行妥协。文字优美与否、通顺与否我已经关心不了了,我只能尽可能让文章可读,并且赶快把文章写完。赶快做出了一个能用的东西,比憋半天什么都做不出来要好。

我之前不想发学习笔记的另一个原因是,我把学习笔记和教材搞混了。教材需要对知识进行面面俱到而精准无误的描述。这样的工作量的巨大的。现在我想通了:学习笔记就是参考资料,我也强烈建议读者不要把学习笔记当成自学的资料来用。学了一会儿,或者知识掌握得已经差不多后,再来以批判的眼光看学习笔记,哪里写得好,哪里有疏漏。这样看待学习笔记才是对的。

再吐槽一下写这篇文章的感想。

我讲这几页ppt的时候感觉十分轻松。我感觉随便写点内容就能把ppt串起来了。但实际写文章的时候却不是这样的,我感觉ppt缺斤少两,逻辑混乱,得加大量的文字才能把话说清楚。最后,我花了比预计多得多的时间才把这篇博文完成。

可见,基于语音的授课的教学效果还是很好的。加上答疑机制的存在,理想情况下教师能够把要讲的知识完全传授给学生。只要学生稍微会学习,老师有强大的表达能力,就能把知识通过上课这种方法传授出去。可惜,大部分人不会教学,逼得学生通过阅读的方式自学。阅读式学习对教授者和学生的要求都更高。真的要感谢那些写出优秀教程/教材的人。

再对我自己和读者强调一句:凡是以实践为目标的技术,一定要在实践中学习,不然学不进去。我们从小到大写那么多作业,就是为了利用实践来加强对知识的理解。对于一种编程技术,学习并验证学习情况的最好方法就是把这个技术用出去。

写这篇学习笔记太累了。如果还要保持产出,我只能进一步降低学习笔记的文章质量了。

星期五的下午

星期五的下午。

教室里的气氛逐渐热闹了起来,老师也放慢了语速。

下课铃一响,就像刚煮开的水一样,教室里顿时充满了吵闹声、桌椅的碰撞声。

几个同学笑嘻嘻地朝我冲了过来。

“去你家玩电脑吧!”

“可是,我爸爸说上周来的人太多了,还骂了我。”

“没事,今天我们不会那么吵的。”

“好吧,那你们可要早点回去啊。”

尽管带着一丝畏惧,我还是急不可耐地带着同学回到了家里。


星期五的下午。

虽然老师不在,教室里依然鸦雀无声,连下课铃也没有打破这份沉静。

我慢悠悠地收拾着卷子,一位好友前来搭话。

“今天你考得怎么样?”

“还好吧,后面大题也错了不少。”

“唉,明天又要考一天的理综。”

“是啊。”

寒暄几句后,好友先行离去。桌面收拾干净后,我一边想着晚自习和周末的计划,一边拖着脚步离开了教室。


星期五的下午。

吃过午饭,宿舍里的四个人都懒洋洋地躺坐在椅子上。

“你们论文写得怎么样了?”

我发起了午后的闲聊。

“马上就要交了,我的导师都不理我,很烦。”

”我还在写。“

“我的论文快写完了。对了,晚上继续打lol吧?”

“额……好吧。”

稍作思考后,我还是勉强答应了下来。


回过神来,现在是星期五的下午。

开完冗长的周会后,楼道里地响起了接连不断的脚步声。

“周五办公室里的气氛都欢快了不少啊!”

“是啊。”

只听一位同事在向旁边的人吐槽着。

“明天就是周末了,今天加班的心情肯定是最差的了。大家都想着早点回去啊……”

未听完他们的谈话,我就关掉电脑,背起书包,急匆匆地离开了办公室。骑上山地车后,我飞快地蹬着踏板,追过了一辆又一辆电动车,赶回了家里。

桌上不是装着XP系统,内存只有1G的老台式机,而是一台崭新的PS5。

今天的班上完了,再也不用想着如何准备考试了。想到这里,我轻快地打开了游戏机。

下个月也没有什么毕业论文要交。下周一别人吩咐什么,我做什么就是了。这个周末是属于我的。我满怀期待地畅想起周末的娱乐计划。

多好啊!没有人会担心我的视力,不让我玩游戏。

多好啊!没有令人压抑的考试,没有做不完的试卷。

多好啊!没有迷茫而焦虑的每一天,没有为远离压力而强作欢笑的逃避。

我过着之前梦寐以求的生活。平时高效率地工作、学习,周末无拘无束地玩耍。我发自内心地享受着现在的时光。

我可以像儿时一样,把全部时间投入到游戏里。

我可以像儿时一样,创造并沉浸于自己的内心世界。

我可以像儿时一样,不去担心明天的到来。

——可惜我不是小孩子了。

写博文的感想

用简练的文字把意思表达清楚,这是写文章必要而又需要花时间练习的事。熟练之后,文章简练了,写文章的时间也会缩短。恰好我最近常常有很多感想,却又担心时间不够,不敢下笔,我有着锻炼写短文的需要。正逢今天时间有多,我可以快速地写一篇小短文,抒发一下心里的感想,练习一下写作。写博客又不是什么特别的任务,没必要非得长篇大论。我争取尽快习惯简明扼要地表达思想,多多记录一些所见所闻、所思所想。

文章很简短,我却边想边写,写了很久才写完。恐怕是因为文章中融入了不少回忆与感情吧。蕴含在文字中的微妙的感悟,只有有经历的人才能看得出来吧。

Pytorch安装教程(包含对齐cuda、cudnn版本,VSCode中Anaconda的设置)

安装一个编程环境/编程库的过程是无比烦人的。安装环境时不可避免地涉及一些和该环境有关的知识,而配环境的人多半是新手,面对未知的知识时总会碰到许多麻烦。比如第一次配和C++有关的库的时候,新手就不知道.dll应该加入环境变量,.h应该加入include。而在写教程的时候,也一般都是新手在写教程,老手们对配环境这一“简单”的事情不屑一顾。因此,我们一般只能在网上看到新手写的配环境教程,上面都是按部就班地介绍一步一步的操作,讲不出每一步操作为什么要这样做,那些操作可以更改或者跳过,碰到了问题又怎么样。教程的不详细同样是配编程环境令人感到烦人的原因。

基于上述情况,配编程环境考察的是人利用搜索引擎的能力。在配环境时,应该多参考几篇文章,有英文阅读能力的应该去参考官方给的配置教程。出了问题把问题的出错信息放到搜索引擎上去查。一般多踩几次坑,多花点时间,环境总能配好。

也正是基于这些原因,我觉得写一篇环境配置的文章很没有意思。没有技术性和原创性、繁琐而无趣。但恰逢我第三次配置pytorch环境,一切都轻车熟路了。我准备在等待文件下载安装之余截几张图,水一篇文章。

准备

去搜索引擎搜索pytorch安装 你的操作系统。比如我这次是在win10上安装,就选择输入”pytorch 安装 win10”.当然,一般会用到Anaconda来安装python上的一些库。在搜索中加入”anaconda”关键字可以搜到更多的教程。

当然,官方网站上也已经给出了不少信息了:https://pytorch.org/get-started/locally/

我的博客是随手写的,看这篇文章可能解决不了所有问题。正如前言中所说,应该多参考几篇教程。

安装Anaconda

Anaconda可以让用户更好地管理python包,配置pytorch需要先安装Anaconda。我说不出它的优点,反正大家都在用,我也一直在用。

https://www.anaconda.com/products/individual#Downloads 这里可以下载Anaconda

如果使用的是Windows,安装以后,点击任务栏中的搜索框,搜索Anaconda,打开Anaconda Powershell Prompt (Anaconda)或者Anaconda Prompt (Anaconda)。Ubuntu貌似进入命令行进入了Anaconda。

在conda命令行中输入conda create --name env_name python=3.7

env_name是虚拟环境的名字。装Python库,就好像在一个新房子里放家具一样,时间久了东西越来越乱。Anaconda给了你无限创造新房子的机会。你可以在一个完全没有“家具”,甚至连Python都没有的虚拟环境里,重新配置库文件。env_name就是虚拟环境的名字,我一般命名为pt,这样输入起来很快。后面的python=3.7是可选的,python版本可选,这句话加不加也可选。没加的话晚点安装python也行。

创建完环境之后,输入conda activate pt就可以进入新的虚拟环境。前面的(base)应该会变为(pt)

搞成上图那样就算配得差不多了。

CPU版本的Pytorch

Pytorch等深度学习框架分CPU版和GPU版。GPU版速度快,但装起来有点复杂。如果只想稍微学习一下编程框架,以后用GPU服务器跑正式代码,可以只装CPU版。

这个时候,为了避免GPU版教程的干扰,应该在搜索引擎中搜索Pytorch CPU 你的操作系统

一般输入conda install pytorch-cpu torchvision-cpu -c pytorch就可以安装好了。但这个时候,一般有一个坑会碰到:下载速度奇慢无比。

这个时候,应该去网上搜索conda 下载慢类似的关键字。网上一般会给出以下几个办法:换源、直接下载安装包、用pip下载。源就是下载的来源网站,在国内的话最好切换到国内的下载网站比较快。我选择换conda源的方法下载。明确了方法后,要继续换搜索的关键字,应搜索conda 换源。我搜索到的办法是:输入conda config --set show_channel_urls yes。之后在用户根目录(比如C:\Users\Yifan Zhou)下编辑.condarc,加入以下内容:

1
2
3
4
5
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
ssl_verify: true

我发现换了源还是下载得很慢,于是直接挂了个VPN再下载(哈哈哈)

比较好的方式开始用换了源的pip

下好之后稍微验证以下。比如安装之后,继续在Anaconda的虚拟环境中输入以下内容

1
2
3
python
import torch
print(torch.__verion__)

GPU版本的Pytorch

确认显卡驱动

在安装GPU版本Pytorch之前,还要保证电脑中有版本正确的cuda和cudnn。cuda是一套GPU上的编程库,cudnn是基于cuda的深度学习库。Pytorch依赖这两个库,而cudnn版本依赖cuda版本。而由于cuda貌似更新比Pytorch快,出于向下兼容的考虑,应该先在电脑支持的CUDA版本和Pytorch支持的CUDA版本中选择一个较小者,再下载该版本的CUDA和CUDNN。

但是,在安装这些东西之前,还可能碰到一个坑——显卡没装驱动。这里默认电脑使用的是N卡。在控制台中输入nvidia-smi,如果出现了类似下面这种信息:

就说明驱动已经安装好了。如果没有,请搜索显卡驱动,适当加入”Nvidia Cuda Cudnn pytorch tensorflow python”等关键词,多看几篇教程总能把驱动装好。

输出信息中的CUDA Version就是电脑显卡最高支持的CUDA版本。到网上下CUDA也应该不超过这个版本。

CUDA

记录下nvidia-smi命令输出的CUDA版本(比如我的是11.1),再在 https://pytorch.org/get-started/previous-versions/ 查Pytorch是否支持该CUDA版本。如果不支持,就选一个网站上有,且版本小于命令输出的CUDA版本的。之后去 https://developer.nvidia.com/cuda-toolkit-archive 找到合适的CUDA版本,选择版本后选择自己对应的操作系统。下载了可执行文件后直接运行安装。

CUDNN

打开 https://developer.nvidia.com/rdp/cudnn-archive 这个网站。注册账号并登录。根据CUDA版本,找到合适版本在合适操作系统下的CUDNN。(注意是下载cuDNN Library,比如[cuDNN Library for Windows10 (x86)]

正如前面所描述的,CUDNN是个库,不需要安装,只需要把其文件复制到CUDA文件夹下即可使用。要把CUDNN中的bin,include,lib都复制到CUDA的对应目录下。

注意,CUDA的bin文件夹应该被添加进环境变量。用默认设置安装CUDA时一般该文件夹会自动被加入环境变量。

Pytorch

https://pytorch.org/get-started/locally/ 中,选择合适的操作系统和CUDA版本。参考CPU版本的Pytorch这一小节的内容,用conda一键下好pytorch。如果网速慢,请利用搜索引擎解决问题。

一切都下载完后,在环境中输入以下内容,看到True就是胜利。

1
2
3
4
python
import torch
import torchvision
torch.cuda.is_available()

风雨夜行记 ~ Adventure in a Rainy Night

初到上海,老天爷就隆重地请来嘉宾”烟花“迎接我的到来。一场突如其来的台风席卷了城市,大雨倾盆而下,把人们关在了家中,连多家知名餐馆都停止了外卖服务。傍晚,我在生活用品尚不齐全的新房间里,摸着空空如也的肚子暗自叹息。怎么办?是吃点零食,全身脏兮兮地回床上避难?还是一往无前,出门购买食物和所需的生活用品?向来喜欢追求成果上限的我自然是选择后者。

出门之前,我先在脑子里进行了任务计划。我的主要目标是吃饭,次要目标是购买生活物品。既然出了门,就要吃得好一点,并且去大超市买东西。我的住处附近恰好有一个大商场,附近必然有不错的餐馆。我在地图上看好了路线,背上用于运货的书包,带上心爱的遮阳挡雨两用自动伞,就头也不回地出门了。

刚一出门,我就意识到了今晚行动的困难性。屋外风雨交加,骤雨把漆黑的天空和昏暗的街道融为一体,雨点落地声甚至盖过了地铁启动时的轰鸣。今天晚上,我的行动恐怕和在RPG里做主线任务一样充满挑战吧。

果不其然,我很快就碰到了第一道关卡。在我的住处和大马路之间,有一条必经的小道。小道没什么人维护,平日里看起来幽雅宁静,下雨时还因积水形成了一条小溪,真多亏了它糟糕的排水系统。我把第一个场景命名为”积水巷道“。在积水巷道上,电动车驾驶员都得小心翼翼地行驶着,生怕把水溅到身体上,我一个撑着伞的行人又该怎么通过呢?我倒是不慌,想着:凡是游戏里的关卡,必然设置了通关的方法。很幸运,我发现路对面有一条较窄的人行道,上面没有积水,可以安稳地通过这条小道。想来这条路的建设者并不是没有注意到路面会有积水的现象,还非常贴心地建了一条下雨专用人行道。看得出这个建设者以前应该是个程序员,碰到解决不了的BUG,就给用户另一个更复杂的操作步骤来绕过BUG。凭借着细心的观察和对程序员的理解,我顺利利用人行道离开了积水巷道关卡。

离开了小道,来到大马路上,我立刻见识到了台风的威力。本来几阵夹杂细雨的微风就让我撑伞撑得十分吃力了,忽然的一阵狂风让雨伞飞舞起来,整个伞面都翻转了过去。不仅是我,街上其他撑伞的行人都受到了不小的影响。只见几个行人万般无奈地收起了伞,在雨点的敲打下叹息着。我碰到了新的挑战:“狂风事件”。狂风事件会在行动时随机发生,令行人失去撑伞能力,被迫淋雨,降低行动能力与士气。如果不是有不得不去做的事情,一般人遇到狂风事件都会退缩,立马跑回家去了。然而,我却十分冷静地面对着突然刮起的大风,使用我独创的“相对论遮风挡雨法”消除了狂风事件对我的影响。

什么是“相对论遮风挡雨法”呢?这里就要介绍一下背景信息了。之前出去旅游的时候,一向不喜欢撑伞的我,被太阳晒得没办法,买了现在这把遮阳挡雨两用自动伞。我发现遮阳的时候如果和遮雨一样正着撑伞,有的时候遮阳效果并不好,因为太阳的光往往是斜着照过来的。然而,不管你人朝着哪个方向走路,都把伞正对着太阳,就能起到非常好的遮阳效果。因此,我独创了一种“相对论遮阳法”,根据太阳的方位,在走路的时候固定手和伞的朝向,而不管自己朝着哪个方向走。今天碰到了台风后,我瞬间领悟了“相对论遮风挡雨法”,以应对狂风事件。这种撑伞法相比之下更加复杂,需要分两个步骤进行。在第一步中,需要用手无力地把伞举起,通过伞的运动方向感受风的方向;在第二步中,用类似相对论遮阳法的手法,把撑伞朝向固定为风吹来的方向。凭借这种方法,无论风有多大,只要握紧伞把,伞就不会翻转,还能把雨滴全部挡下来。使用相对论遮风挡雨法后,我自由自在地在风雨中走着。

由于我肚子实在太饿,我决定改变计划,立刻吃饭。马路对面有几家店还开着,我满怀期待地过了马路,希望能找到一家合适的餐馆。结果这边还在开门的只有几家装修平庸、看上去就不靠谱的餐馆,剩下还在开门的店就只有日式便利店、药店,还有一家写着“内有被褥”的杂货便利店。这些店都不能解决我的饮食问题。我有些低落地向前走了几步,突然眼前一亮,看到一家装修精美的餐厅。原来是一家看起来质量还不错的咖啡馆。但是这种店又过于正式了一些,不适合一个人随便解决一餐。一个人吃顿饭还是有些难啊,这样的店就适合几个人一起去,尤其是情侣。情侣?哼!这种店就是为了提供这样的氛围才装修得这么好的,太不为单身的人考虑了。一想到这,我就气饱了,也不管肚子饿不饿了,义愤填膺地从店门口晃了过去。

又走了一段时间,我发现店面越来越少,路也越来越窄,最后竟被一棵吹倒的大树拦住了去路。这感觉不对啊,是不是走错了路?我破天荒地打开手机看了下地图,反复确认了我走的路是正确的。这棵树是怎么回事?我很快给了自己一个合理的答案:RPG游戏里经常会出现第一次能走通的路在游戏后期被拦住的情况,玩家需要进入一个新的场景,通过更难的关卡,来绕过障碍物。想到这里,我就摩拳擦掌,对即将面临的新事件期待起来:我是不是要自己找一条路出来?结果,我又看了一眼地图,发现地图导航提示我在此处应下台阶。我这才发现,这条路本来就是死路,我应该走地下通道绕过这里。我刚刚提起的兴致一下就被浇灭了。

终于,商场的大楼近在眼前了,我只需要过一条比较宽的马路就行了。可是,我又碰到了新挑战:马路上有不浅的积水,穿凉鞋倒是可以不管不顾地走过去,可我穿了运动鞋出来。看来我不得不面对这“无伤通过积水公路”的挑战了。细心的我发现斑马线是有一定厚度的,踩着斑马线走几乎不会沾到水。绿灯一亮,我就使出”轻功水上漂”绝技,大踏步地踩着斑马线走。最后一条斑马线离人行道还有一段距离,这之间还有不少积水。为了保证自己是“无伤通关”,我一扭头,令积水恰好能反射路灯的灯光。这样,我就掌握了所有的危险地带和安全地带的位置。踏过几个较干的路面,我成功抵达了马路对面。

地图上显示商场的关门是十点,而现在是八点多,时间还算充裕。我看商场对面开着的店铺很多,决定先找个地方吃饭。有好几家店看起来都不错,该去哪一家呢?正当我准备开始分析时,突然发现一个外卖员从一家面馆走了出来。能做外卖,这个点还有人点餐,说明这家店应该还不错。特别是我发现这家店里还有一个正在用餐的人,这让我对这家店的质量更加放心了。进店之后,我直接点了最贵的红烧牛肉面。面端上来用了七、八分钟,这对饥肠辘辘的我来说就像45分钟的语文课一样漫长。加几滴醋,用筷子微微搅拌,捞出一大把筋道的面条,配上大块牛肉,我享受这绝妙的用餐体验。一想到吃一辈子红烧牛肉方便面也吃不到这么多牛肉,我就吃得更香了。我吃得过于投入,以至于身上的雨水渐渐变成了汗水。吃完面条,我没有休息,立刻走出店门,吹了下风才发现身上出汗了。

马上,我的旅途就要抵达终点了。在明亮的商场里挑选商品,而不必四处躲雨,这就是我即将获得的通关奖励。买完东西之后,我还要打出租车回家,结束这冒险之旅。一边想着这些幸福的事情,我很快来走到了商场门口。商场里面倒确实是十分明亮,可大门却是锁着的。十点没到,商场怎么关门了呢?看来今天台风的影响确实很大,出于人道主义的考虑,商场的工作人员都早早下班避雨了。这么大的雨,也没人来买东西,商场也赚不到钱啊。想到商场关门的种种原因,我顿时觉得自己十分草率,竟然出门之前不去从商场的角度考虑,忽视了商场有提早关门的可能。但也不亏,我的主要任务——吃饭已经完成,买生活用品的支线任务就放一边吧。站在商场前的路灯下,我偶然抬头一望,针状的雨在光线下清晰可见,猛烈地扎在我伞上。看见无色的雨本身算是一件有趣的事,现在的我却只能感叹今天雨真大。

忽然,我发现自己似乎错过了什么东西。购买生活用品这一任务还不能宣告失败!我又再次充满了动力,沿回家的路走去。

回程时,我走在马路的另一侧。非常烦人,我又碰到了新的挑战:马路这侧的人行道中间的路砖因修地铁而全部挖掉了,人行道外的马路又全是积水,马路上时不时有汽车经过,走马路中间也不太好。我唯一的选择,就是走人行道外侧残留的石砖。石砖非常狭窄,仅能恰好放下我的鞋子。石砖的一边是积水的马路,一边是坑坑洼洼的泥土——还好不是掉下去就死的万丈深渊,起码给我留了一些容错率。于是,我开始挑战“平衡木”关卡了。虽然我天生缺乏运动细胞,但我使用了极佳的前进策略:我一只手使用相对论遮风挡雨法撑伞,为了平衡,另一手略微向外伸出。我出乎意料地顺利通过了平衡木挑战,虽然中间有几次失去平衡踩到了泥土上。

路过“倾倒之树“景点,我再次感叹起了今天行程的不易。仔细想来,今天好像遇到了不少有趣的挑战。于是,我一边走路,一边构思起了这篇文章。

走到了”积水巷道“的入口,我没有进去,而是又过了一次马路,走到了那一排仅有少数亮光的店面前。原来,在发现大商场关门后,我的潜意识一直没有停止思考,一直寻找着购买生活物品的方法。那时,我忽然想起这里有一家便利店写着”内有被褥“。为什么一家便利店要在牌子写这些东西?是真的提示顾客里面卖被子吗?不是这样的,真相只有一个!其实”内有被褥“的意思是,这家店不仅是一个卖饮料零食的普通便利店,还是一个卖生活用品的杂货店!!虽然我没有进店确认,但我利用心理学思考推理出了这一结论。有了这一发现,我才满怀希望地踏上了回程的路,觉得宣告任务失败还为时尚早。

那么结果如何呢?我走进杂货便利店一看,果然,在被子旁边,还有洗衣液、碗筷、垃圾桶这些生活用品,甚至还有电饭锅。我的推理完全正确!我最近一直在看柯南,感觉学到的推理能力一直没有用武之地。但非常巧,今天恰好有一个舞台,让我把推理能力淋漓尽致地展现了出来。不仅是看柯南学到的推理能力,我在之前参与的很多项目、经历中已经掌握了极强的逻辑思考和求解问题的推理能力,并且在玩LOL时锻炼了从对手的角度反向思考的”千层饼“心理分析能力。今天我把这些能力都用了出来,实在值得吹嘘一番。

考虑到台风可能一时半会儿不会走,我不仅把日常要用的清洁用品买了,还买了个电饭锅准备回去自己做东西吃,买了一大堆东西。最后,我一只手撑伞和拎锅,另一只手抱着刚买的装得满满当当的垃圾桶,吃力地走出了杂货店。虽然拎这么多东西很麻烦,但我看着这些”战利品“,感到十分充实与开心。

雨势渐小,积水巷道里的水却依然没有消退。和出来的时候不同,我熟练地走上了人行道,回忆起了今天的奇遇。今天我的行动称不上旅行,用”冒险“来形容恐怕更恰当一些。正如我以前写道的,旅行的意义在于旅行的体验。其实今天吃饭、买东西的任务都在其次,最令我难忘的是一路的见闻、经历。虽说老天不是很给面子,让台风来迎接我的到来,但也多亏了这风雨交加的夜晚,给了我这独一无二的体验。这换成其他任何人,或者其他任何时候,都很难有这样的情况出现吧。再往大了想,人生的快乐也不是那么奢侈的事情。都说”偷得浮生半日闲“,再平淡的生活,亦或是再艰苦的生活,也是能通过一些方法找到乐趣的吧。

满载着战利品,我回到了家中。今天采取了这么多应对下雨的策略,应该取得了不错的效果。结果我一坐下,屁股一凉,才发现我的短袖裤子和短袖T恤都湿了,鞋子也湿了个透心凉。不能说我的撑伞法、过街法不好,只能说雨下得太大,要挑战的难度太大。今天我的主要任务和次要任务都完成了,虽然没有做到无伤,但也是不小的成就了。今天过得非常好,希望以后我在自我挑战中能够再接再厉。