《Cities: Skylines》——城市建造新神作?

《Cities: Skylines》是由Colossal Order工作室(之后简称CO)开发,由Paradox Interactive(俗称的P社)在2015年3月发行的模拟类游戏。

city view

这是我之前的某一个城市,由于道路安排失败,之前封印了好久。(上reddit看到许多网友都将自己的城市命名为shitvale,这份心情真是感同身受)

CO是一个成立于2009年的芬兰工作室。其之前也只有《Cities in Motion》(之后简称《CIM》)一个系列的作品,同样由P社发行。

《Cities: Skylines》(之后简称《C:S》)的中文名翻译作《都市:天际线》,从本作的命名风格来说,和《特大城市》系列有些像,都是从名字就透露出了游戏的终极目的:打造宏伟的钢筋森林。对比其他的游戏来说,比如说近期的《纪元》系列、《模拟城市》系列、《放逐》等等,游戏的目的还是比较明确的。

Cities: Skylines is a modern take on the classic city simulation. The game introduces new game play elements to realize the thrill and hardships of creating and maintaining a real city whilst expanding on some well-established tropes of the city building experience. From the makers of the Cities in Motion franchise, the game boasts a fully realized transport system.

——摘自游戏主页上的说明;游戏会引入新的元素,并有完善的游戏体验。当然介绍的最后一句也注明了游戏的制作者是《CIM》系列的制作者,所以运输系统会是游戏的一个主要部分。

事实上,游戏预售的时候,我有些怀疑这个游戏的质量。如果将城市建设游戏的主要内容分作两块的话,我觉得可以分作『区划』——城区组成的规划、公共设施的建设和预算的维持,以及『交通』——区划之间的位置关系、道路和公共交通的规划。

『区划』的设计

从『区划』部分的来看,我认为一个比较复杂而有趣的游戏是《纪元1404》(以下简称《1404》)。本科的时候,一个偶然的机会从学校的PT论坛上下载到了这个游戏,然后不久之后就开始乐此不疲的和朋友联机玩这个游戏。

《1404》中的『区划』是比较复杂的,其其不同于《C:S》继承于《模拟城市》系列的住宅区、商业区、工业区三大块,只有居住区和工业区两大块。

然而《1404》中的工业区和住宅区并不是简单的进行面积的分配就可以了。《1404》中强调了供应链和产业的概念,住宅区升级需要供应不同种类的产品;生产不同的产品就需要安排不同的生产部门和供应链。而且奇葩的是游戏中实行供给制,税金由住宅区提供,工业是消耗税金的部门。同时游戏中又存在东西方两种建筑类型,分别分布于不同的岛屿上;玩家还要抵抗其他玩家通过海战夺岛等对供应的干扰。仔细想想的话,其实《1404》的内容设置有些类似于卡坦岛的思路,其中的供应链安排其实是十分复杂的。

capitalism 2 lab

事实上还有这样一款模拟经营类『软件』——Capitalism 2 Lab,其目的便是建造自己的企业帝国;其中不仅产业分门别类的十分详细,而且可以买卖股份,兼并公司。我认为这个已经超出了游戏的范畴了。

对比之下,在《模拟城市》中则没有怎么强调供应链的概念,只需要进行城区面积的合理分配即可。工业区中什么都有,不再需要事无巨细的安排。

《C:S》则巧妙的在『区划』的游戏内容安排上走了中间道路,其中和了《模拟城市》系列的『傻瓜』和《1404》的『繁琐』。于是《C:S》中保留了大部分《模拟城市》系列中的公共服务设施——警局、消防局、医院、水电垃圾服务等;同时简化了《1404》中的供应链,只剩下了油、铁、稻、林四种自然资源及其附属工业,以及加工自然资源生产的普通工业区。这样既避免了玩家在划分区域时遇到过大的困难,从而心生厌烦;同时也避免了游戏设置过于简单,玩家容易玩腻的情况。

city_games_zoning

自己总结的三个游戏关于『区划』的游戏内容的不同;虽然《C:S》中还有一个办公区,不过由于其无输入也无输出,所以就不再列出了。

说完分区,再说一说游戏中的公共服务设施。其大致继承了《模拟城市》中的公共服务设施种类,就是上文中提到的警局、消防局、医院、水电垃圾服务等。不过由于《C:S》有着良好的mod扩展性(这好像也是P社游戏的一贯特征),游戏发售短短没有几天,steam workshop上就出现了大量mod。其中有不少便是新的公共服务设施。

举个例子来说,官方游戏中垃圾处理设施只有垃圾填埋场和垃圾焚烧站两种。而这两种设施都会产生污染,垃圾填埋场更是只能单纯的作为容器,而没有任何『消化』能力。于是玩家制作了《模拟城市4000》中的垃圾回收中心没有污染的小规模垃圾回收站。类似的这种mod很好的补充了游戏制作者对于公共服务设施的不重视。

『交通』的设计

本文一开始就提到了,《C:S》的制作公司CO工作室拿得出手的作品在本作之前只有《CIM》一作,游戏的内容就是交通运输。而在《C:S》的官方主页上,发行商更是将《CIM》作为卖点,强调《C:S》将会带来同《CIM》一样的设计交通的体验。

既然『区划』部分举了《1404》和《模拟城市》两个例子作为陪衬,那么『交通』部分也来举一个不错的陪衬。我认为『交通』设计的不错游戏是继承于《Transport Tycoon》的开源游戏《Open Transport Tycoon Deluxe 》(以下简称《OpenTTD》)。

《OpenTTD》的中文名字应当叫做《开源运输大亨》,其游戏内容没有任何城市建造成分,只有运输内容。玩家需要将各种资源运输于各个资源点之间,将旅客和邮件运输于各个城市之间。运输的主力又以铁路为主,所以这个游戏应当是吸引了不少TMRC成员一样的玩家。

Warraweah Transport, 2131-08-30

《OpenTTD》的内容除了运输便无其他,然而这种纯粹却也吸引了不少玩家。

然而《C:S》毕竟不像《OpenTTD》一样宏观,《OpenTTD》中甚至有欧洲的地图,《C:S》只是规划一个城市的交通而已。题材注定限制了《C:S》中『交通』的玩法比较微观,更注重于城市交通中常见的塞车问题。

不过值得庆幸的是,作为一款城市建设游戏,《C:S》十分可贵的将游戏地图扩展到了100平方千米的范围,玩家在这样大小的一幅地图中虽然无法像在《OpenTTD》的最大地图中一样『挥斥方遒』,却也依旧可以尝试着搭建起一个公路、轨道运输为主,水路、空运为辅的交通网。

游戏提供了多级的公路设置,道路的容量和速度分别上升,同时也像《模拟城市》一样,提供了单行道的选项。如何在有限的空间里,搭建一个合适的立体化的交通系统,是这个游戏的一个主要玩点。

是建设成北京一样的圆环套圆环公路结构,还是巴黎一样的放射状道路;如何引导车流不通过某些区域而高速的到达指定区域;怎样在有限的道路轨道资源中,通过更多的车辆。这些问题将伴随着整个游戏过程。

好在游戏的良好的mod扩展性为许多玩家解决了问题,道路建设苦手们可以在steam workshop上下载上万种的预设模型,高质量的交通浏览、控制类mod为玩家排忧解难。

2015-03-30_00001

还是之前的那个自己的shitvale。在下了一个mod,取消了高速箍口附近的交通灯之后,图中所示的拥堵迅速的就消失了。

 

一些缺点

夸了半天这个游戏,是时候说一说这个游戏的缺点了。

内容失衡这个缺点来自于CO工作室的年轻。CO工作室之前只开发过《CIM》系列一作,之后就上马了《C:S》这个游戏,这个工作室的年轻导致了其无法很好的驾驭这个类型。

直观来看,《C:S》最明显的问题就是『区划』部分的内容过于简单。如果玩家玩过《模拟城市》系列和《特大城市》系列的话,想必对于高昂的公共服务设施开销仍然记忆犹新。

所以一开始我玩《C:S》的时候,并不敢满地放公园之类的东西。然而随着我连续开了几个shitvale的存档之后,我发现这个游戏虽然披着《模拟城市》的皮,其却和《模拟城市》完全是两个游戏。

《模拟城市》中的主要难点是收支的平衡,如何用少量的税收,使城市高效的运转。

《C:S》中的税收是十分充足的,一个4万人口左右的城市,即使将支出最大化,收入剩个4万左右的结余是很正常的事情。玩家手头握许多闲钱,自然玩起来很轻松,完全没有感受到《模拟城市》和《民主制度》中作为政策制定者的那种顾此失彼的感觉。

游戏在『区划』方面没有任何难度,剩下的难度自然就要转移到『交通』方面了,而这又是CO工作室所擅长的。一方平淡无聊,一方却惊险刺激,《C:S》更像是添加一些内容、换了一张皮的《CIM》。

游戏没有黑夜模式这种每日的循环概念,全天是白天也算个小缺点。

同时游戏还有一些小小不严的BUG,比如policy页面经常调不出来啊,调出来了又经常花屏啊之类的。相信在不久的将来都可以通过补丁解决掉。

总结

对比于《模拟城市》当初的灵气,《C:S》更多的像是一款中规中矩的仿制作。网络上对其评价不错,主要还是因为近年来类似题材的作品实在是都太水了(说的就是《特大城市》你个大水货!),少有及格作。对比之下,《C:S》虽然算不上划时代,却也是一款朴实的优秀作品。

然而,就是这样一款普通的优秀作品,玩家们已经等待了太久太久,距离03年尖峰时刻发售,已经过去了整整12个年头,无数少年少女熬成了孩儿爸孩儿妈。

说实话,刚刚上手玩这款游戏的时候,这种久违的感觉真的让我有些想哭。

眼前的不是这款游戏,而是当初我每日面对着绿黄蓝地图的年少时光。

与此同时,《Cities: Skylines》推出当日销量就达到了25万,发售一周销量达到了50万,销量不可谓不可观。这样优秀的成绩,让我见识到了城市建设类游戏这个市场绝未萎缩消亡。无数玩家心中仍然有着一个『市长梦』。

作为一个模拟经营类游戏爱好者,我希望广大游戏开发商能够在这样的证明下,相信优秀的模拟经营游戏依旧可以获得优秀的销量。希望以后能见到更多更优秀的模拟经营类游戏,让这个游戏类型不像RTS一样逐渐消亡,而是能够长青不衰。

文章结尾做一下小广告。如果真的爱这款游戏的话,国区玩家可以去杉果买打了折的《Cities: Skylines》,只要¥79,比steam上买便宜许多。

images

引用一张youtube视频的封面。P社,CO,我顶你啊!

 

如何编译tslib

前些天用qt4.8做的界面的字体渲染特别难看,所以准备用qt5.4做界面。X宝上买的mini2440并不随机赠送编译好了的qt5.4,所以还得自己从头编译一份。

先记录下编译tslib的过程吧。(具体原理完全不懂啊...

编译器使用了随机赠送的arm-linux-gcc-4.4.3,这里有的下

when-theory-met-practice

下面一段中的一堆变量我也不知道为什么这样定义,不过这样能够成功。其抄袭于这篇博客

$mkdir ~/tmp
$cd ~/tmp
$git clone https://github.com/kergoth/tslib.git tslib
$cd tslib
$export PATH=编译器的路径/bin:$PATH
$export CROSS_COMPILE=arm-none-linux-gnueabi-
$export CC=${CROSS_COMPILE}gcc
$export CFLAGS="-march=armv4t -mtune=arm920t"
$export CXX=${CROSS_COMPILE}"g++"
$export AR=${CROSS_COMPILE}"ar"
$export AS=${CROSS_COMPILE}"as"
$export RANLIB=${CROSS_COMPILE}"ranlib"
$export LD=${CROSS_COMPILE}"ld"
$export STRIP=${CROSS_COMPILE}"strip"
$export ac_cv_func_malloc_0_nonnull=yes
#./autogen.sh
#./configure --host=arm-linux --prefix=你要的安装路径 --enable-shared=yes --enable-static=yes
#make
#make install

另外关于$CFLAGS的设置,可以参考这里

简单来说这样就可以安装成功了,不过还是会碰见一些问题。以下将记录下我碰见的几个简单问题。

1. configure的时候,终端中会显示

checking for arm-linux-gcc… arm-none-linux-gnueabi-gcc
checking whether the C compiler works… no
configure: error: in `/usr/local/tslib':
configure: error: C compiler cannot create executables
See `config.log’ for more details

这个应该需要具体问题具体分析。看config.log文件中的输出信息应该能摸到头绪,我是因为有些依赖没有安装。

#apt-get install lib32stdc++6

安装完之后就没有问题了。

2.undefined macro错误

错误的提示信息是

configure.ac:25: error: possibly undefined macro: AC_DISABLE_STATIC
If this token and others are legitimate, please use m4_pattern_allow.
See the Autoconf documentation.
configure.ac:26: error: possibly undefined macro: AC_ENABLE_SHARED
configure.ac:27: error: possibly undefined macro: AC_LIBTOOL_DLOPEN
configure.ac:28: error: possibly undefined macro: AC_PROG_LIBTOOL

安装libtool即可

#apt-get install libtool

《荒野大镖客:救赎》——侠与江湖的终结

趁着开学事情不多的第一周周末,用两天的时间打通了这款《荒野大镖客:救赎》。

red-dead-2

本作的主人公——John Marston,一个迷途知返的浪子。

游戏系列的中译名叫做《荒野大镖客》,玩过游戏比较多的玩家可能会想起来上世纪80年代由Capcom制作的那款经典的纵轴射击游戏——《Gun. Smoke》(即《枪·烟》。我觉得此处的『烟』应当是一个双关,即又是指牛仔们平时抽的烟,也指开枪之后,枪口所冒出的烟)。由于那个年代大陆玩家普遍英文水平不高,所以根据游戏背景和内容,套用了著名电影的名字,意译为《荒野大镖客》。

老玩家们看着应该会很眼熟。

老玩家们看着应该会很眼熟。

本篇所介绍的游戏《Red Dead: Redemption》虽然由美国游戏公司Rockstar制作,却和20多年前的那款游戏有着千丝万缕的关系。本作所隶属的《Red Dead》系列第一部作品《Red Dead: Revolver》本是由《Gun. Smoke》的开发公司Capcom开发,其自然也借鉴了《Gun. Smoke》中的一些元素。然而由于某些原因,Capcom在2003年取消了《Red Dead: Revolver》的制作,游戏也被Rockstar买下,并于2004年制作完成和发行。

本作《Red Dead: Redemption》(之后简称RDR)是《Red Dead: Revolver》的精神续作,在现在这个年代,算得上是为数不多的西部题材的精品了。

故事背景并非典型的西部片的感觉,故事围绕着John被警探Edger Ross要求杀死旧时的犯罪团伙同伴Bill Williamson、Javier Escuella和团伙首领Dutch这一线索展开。本作是沙盒类型的游戏,地图横跨美国和墨西哥两个国家,地图是GTA4的4到5倍大小,涉及到了上百个NPC,以及前后30年左右的事件。

the-west-detailed-map-small

本作宏大的地图,跨越了2个国家、3个州。

可以说游戏的规模是非常宏大的。然而对比下同为R星制作的游戏GTA5的话,会发现游戏的内容还是有些单薄。

从游戏内容的总量来看,GTA5我清完所有的主线支线大概花了30多个小时,而RDR只花了16个小时就完成了所有的主线任务和陌生人任务。这只是一个直观的数字,能够说明游戏内容的多少。

如果看游戏的内容的话,RDR的任务多集中在『骑马枪战』、『街头决斗』、『抢劫火车』、『保护运输』等具有强烈西部色彩的内容中。玩家时而抢劫别人,时而防备别人抢劫,刚开始玩的话还是有些新鲜感;不过随着故事进行,这样的内容玩的多了,还是很容易审美疲劳。对比GTA5的话,由于载具的多样性和现代的时代背景,游戏内容上天入海、飚车抢钱,显得比RDR丰富了很多。

另外我觉得两作中都有的一个毛病就是地图的利用率太低。RDR的背景是西部荒野,所以地图中的绝大部分都是一片荒芜之地。玩家骑着马在野外到处赶任务的时候,其实地图的利用率是很低的。加上游戏在野外的背景音乐为了烘托荒凉寂寥的感觉,几乎『寡淡』的感觉不到。所以玩家在跑地图的时候会觉得很无聊。这点GTA5由于其游戏故事背景,先天就比RDR好了很多,比如开车的时候可以听听收音机里的新闻,是怎么评价玩家所犯下的『罪行』的。

值得表扬的是,游戏开发者还是预料到了RDR中在野外跑路的无聊程度。游戏中不仅准备了类似于GTA系列中的出租车系统——城镇中的马车(虽然花费相对于收入确实很高,前期几乎属于奢侈消费),玩家还可以在远离道路、水域、城镇、居住点的空地上生一把柴火,在营地里就可以直接移动到目的地或是城镇,不再需要苦苦跑路了。

另外,游戏开发者还在地图中加入了一些偶然发生的小任务,比如帮店家夺回被抢的钱财、救下被匪徒袭击的妇女等等。GTA5地图中的小蓝点和小红点的随机任务应当是从这里借鉴来的,不过并没有RDR中的任务安排的精巧。毕竟GTA5中的三个主角都是匪徒,而RDR中的主角好歹还算得上是一个侠客。

游戏的细节处理的也很好。玩家在城镇中吹口哨召唤自己的马的时候,如果旁边有狗在闲逛,它们就会跑到玩家的脚旁边,乖乖的坐下;枪战击中头部的敌人也不仅仅是出现一片血雾就倒地死亡,而会像真实的子弹击中头部一样形成一个绽开的大洞。

本作和GTA4系列以及GTA5使用了同一个引擎,不过游戏的操作手感更像是GTA4系列。尤其是在角色转身的时候,会感觉对准方向很困难。这在打开箱子的时候制造了不小的困难。算是一个小瑕疵吧。

不过游戏的射击手感还是很好的,辅助瞄准很好用。而且不是像《战地4》一样,必须当敌人在视野中时才能自动瞄准,当玩家躲在掩体后面的时候就不能自动瞄准了。敌人跑动的话,准星也会自动跟随地人移动。这在骑马枪战的时候,减小了不少的难度。

游戏故事虽然以1900年左右开垦西部的美国移民为社会背景,却没有像许多西部片中那样,将主要的笔墨都放在描写垦荒人民的英雄气概上。

游戏中的人物带有着强烈的R星作品的特征(毕竟剧本是Dan Houser写的),人物不是很像传统西部片中的人物——或是侠肝义胆,或是狡诈多端——那样好坏分明;人物更多的是想GTA系列中的人物,多多少少的有些荒诞的神经质。其中一个比较明显的例子是『Flowers for a lady』的那个任务中的老大爷,他给我的感觉和GTA5中的『疯子追星族』大爷大妈很像,荒诞的不像是这个世界中的人。

Rdr_john_marston

Clint Eastwood在镖客三部曲中的形象实在是太经典了,本作中John Marston的形象应当是有所借鉴。

主角John Marston虽然长得很像电影镖客三部曲中的Clint Eastwood,不过却只能给人留下一个『老实』的硬汉的印象,并不能算是一个『英明』的硬汉形象。

从故事开始John Marston被警探Edger Ross要求追杀Bill Williamson匪帮开始,John就被各种人利用,显示被Armadillo的Marshal利用,然后被『科学骗子』Dickens和『寻宝疯子』Seth利用,到了墨西哥之后又被当地的当权军阀Allende和反叛势力Reyes来回利用,甚至险些命丧墨西哥;在肃清了Bill Williamson、Javier Escuella之后,又被Edger Ross以妻儿安全威胁,继续肃清Dutch;甚至Dutch在死前警告John,警察为了薪水,迟早有一天会肃清John之后,John依旧天真的以为自己可以顺利洗白,过上平静的牧场生活。

John作为一个亡命徒,却并没有亡命徒的觉悟。相对比之下,带他入行的Dutch却对自己的天命有着清晰的认识。在John将他逼到悬崖边的时候,Dutch清晰的认识到了,自己纵横多年的江湖早已经不存在了,自己也不再是自己当时那个劫富济贫的侠客了。完美主义者Dutch看着这个与现代社会格格不入的自己,只能选择背身跌下悬崖自我了结。

如果我们同时把眼光转向墨西哥,会发现旧军阀Allende死了之后,原先的革命者、现在的新军阀Reyes并没有把墨西哥变得更好。在主角转换成Jack之后,如果买一期报纸,在编号为213的报纸的最右侧会发现一篇题为《PRESIDENT REYES DENIES HE IS A TYRANT, DESPITE MASSACRE》的文章。文章内容大概是Reyes命令部队射杀了对政府和平示威的上千人。从文章内容中我们也可以知道Reyes在推翻了上任军阀的统治之后,自己也变成了上任军阀的样子,修建了华丽的总统府,并准备修建音乐厅等建筑物。然而事实上,墨西哥依旧处于无政府的江湖状态,自命不凡的侠客们依旧在行走四方,普通的百姓依旧生活贫苦。

如果拿Reyes和Dutch对比的话,会发现两者之间多少有些相似,一开始都是充满热忱的理想主义者(或者说只有热忱?),成为一方豪强获得权力之后理想变质;不一样的是Reyes成功的上位了,而Dutch因为联邦政府的干预在权倾一方之前就被肃清了。

总的来说,历史总是在进步的,以豪强Allende、Reyes和侠客Dutch Gang的一伙们为代表的江湖社会总会被历史的车轮所碾碎,个人所被赋予的权力会被逐渐分散,逐渐进化成一个现代社会的样子。

red-dead-redemption-14422-1920x1200-red-dead-redemption-2-would-you-want-it-as-rockstar-s-2015-surprise-game

John叔拿着枪行走江湖几十年,却终无法逆历史潮流而行,无法像终结敌人一样,用枪终结自己被诅咒的命运。

短文末尾,推荐一下RDR的OST,为西部荒凉气氛增色不少。

算法学习笔记(3):插入排序、归并排序与逆序数

前些天在挨个做hackerrank上的题目的时候,碰到了这么一道题

题目的完成率并不高,只有百分之三十六点多,我估计了下难度,自己应该是做不出来的,最后果然没做出来。不过在Discussion下面还是看到了些有用的帮助,有人说用mergesort能做出来。于是又仔细的想了想,还是花了些力气做出来了...

题目的内容是计算插入排序一个序列的移动元素的总次数。实际上是计算的序列的逆序数

逆序数的定义上面那个wiki的链接里说的挺清楚的了,数的就是反序排列的数字对数。

比如[1,3,2]的逆序数是1,在插入排序的时候,2会向左移动一次,整个序列变成了[1,2,3]。

[2,3,1]的逆序数是2,在插入排序的时候,1会向左移动两次,整个序列变成[1,2,3]。

hackerrank在排序这一章前面也有一道题是计算插入排序移动次数的,当时按照题目的提示,使用的直接在插入排序的时候,移动一次,加一次,最后依次数出来移动的次数。当然这个的时间复杂度就是,在序列比较长的情况下很容易超时。这种比较『暴力』的方法,显然不适合本题。

mergesort是一种比较简单的方法。可以很容易的想象出,在merge过程中,如果『小序列』非空,每当『大序列』的最小元素被选出来,就意味着逆序数需要自增目前『小序列』中元素个数那么多,因为这个时候『小序列』中的所有元素都比位于他们之后的『大序列』中挑出的最小元素大。

而且mergesort的时间复杂度是,已经是比较排序的最优了,所以也理应在本题中不会超时。

知道这个关键点,代码实现就很容易了,就是增添个自增的语句而已,代码如下所示。

def merge(a,b):
    global answer
    a_flag = 0
    b_flag = 0
    result = []
    while a_flag<len(a) and b_flag<len(b):
        if a[a_flag]>b[b_flag]:
            result.append(b[b_flag])
            answer+=(len(a)-a_flag)
            b_flag+=1
        else:
            result.append(a[a_flag])
            a_flag+=1
    if a_flag==len(a):
        result.extend(b[b_flag:])
    else:
        result.extend(a[a_flag:])
    return result

def mergesort(l):
    if len(l)>1:
        mid = len(l)/2
        a = l[:mid]
        b = l[mid:]
        a = mergesort(a)
        b = mergesort(b)
        return merge(a,b)
    else:
        return l

n = input()
for iterate in range( n ):
    x = input()
    a = [ int( i ) for i in raw_input().strip().split() ]
    answer = 0
    mergesort(a)
    print answer