« September 2007 | Main | November 2007 »

October 28, 2007

设计了个扑克玩法

周末公司组织活动,爬山,去农家喝茶。我们一堆人聚在一起聊天打牌。桥牌的人凑不起,大多数人不会打。无聊之中自己来设计新玩法。

以下是我设计的一个。其基本规则起源于“吹牛”,或是从酒巴里摇骰子的玩法。不过经过我们一天不断的细则改良后,发现了不少玩点 :D

道具用一副扑克,去掉大小王的 52 张。四个人参于游戏,每人随机发放 13 张牌。对家为搭档,游戏中要求对家相互配合,争取胜出——任何一人出完手中的牌就算胜利,结束当局游戏。

扑克中,A 到 10 为普通牌,J Q K 花牌一共 12 张为白搭(万用牌,可以充当任何一张普通牌)。但是,替代相同牌点的多张,需要用相同的花牌。例如两张 J 可以替代两张 3 或是两张 4 ,但是一张 J 一张 Q 则不能一起使用。

游戏时,领打人可以随意出牌,出牌时将牌背面朝上放在牌桌上,宣称自己出的牌点。比如说“两张 3”,此刻他可以使用真的两张 3 (或是花牌)也可以用假的别的牌的替代。

下家可以对上家的出牌声明做出猜测,如果认为是假的,可以自行翻开牌检查(不能让其他人看见,只能自己查看)。若的确是假,前个出牌人将桌上所有牌收起,然后由翻牌人做下一轮的领打;如果检查后,发现确如上家所言,则由翻牌人将桌上所有牌收起,上家领打下一轮。

如果下家不愿意翻上家出的牌,他只能选择向牌桌上加牌。所家之牌必须是同一牌点。例如此轮打 3 那么在这一轮中所有人都必须加 3 。所加之牌的数量,至少 1 张,至多 8 张(因为同一牌点的牌加上花牌,一次最多出现 8 张)。当然,每次出牌之人可以加假牌,是否能蒙混过关,取决于他的下家是否翻牌揭穿他。(很多时候由于战术需要,即使能肯定加的是假牌也会放过)

每一轮牌就这样按固定次序(顺时针或逆时针,看大家习惯)每个人依次向牌桌加牌,直到有一人的谎言被戳穿,或是对讲真话的人没有给予信任而结束。

当某个人手上的牌少于等于五张时,需要主动报警提醒大家。一旦手上的牌出完,就获得游戏胜利结束游戏。游戏过程中,任何人都有权利询问其他人的手牌张数,如果手牌张数大于五张,则允许回答还有很多。

搭档之间不准以任何规则之外的方式交换信息。在选择检查上家的加牌时,不得将牌面信息泄露给其他人看,使搭档获得额外的信息。

在这套规则下的游戏,进行节奏很快,大约 3~5 分钟就可以结束一局。搭档培养出默契后,可以玩出很多战术策略。游戏过程往往大起大落,手上的牌可以一下打光,而在接近胜利时又突然多了起来。对心理判断和记忆力都有一定的要求,理解规则和上手玩都还算简单。


我在设计规则时,边玩边进行了许多调整。

一开始我们是四人乱战,发现因为相互提防,玩的时候没有太多好发挥的余地。后来改成了两两组队,就有趣了很多。

起初我们用的 54 张牌,只有大小王是白搭。然后发现这两张牌过于珍贵,不到游戏肯定结束的进程时,都不会使用。而且 13 种牌对记忆力的要求过高,很多记住搭档和对手手上牌的分布。大家熟悉了规则有了一定经验后,一局游戏很难结束。

把 12 张花牌进行分类,禁止不同种类的牌一次出出去也是后来做的小修订。旨在削弱其威力,并增加变化。

在调整小规则时,曾经加入一些东西,比如在某些情况下,出牌次序倒转,以此增加变化。后来证明这样只是徒增规则复杂度,并不能解决我们发现的一些平衡性问题。随后取消。

目前我们几个同事还是觉得玩起来颇有意思的。暂时还不知道是否存在一种最优策略可以最大可能的赢得游戏(比如一个同事提出的,尽量说真话原则,使得胜率较高)。毕竟这个游戏可以产生的牌局状态复杂度不够,比不得那些成熟的牌戏。

ps. 我个人不太喜欢用增加道具数量来提升复杂度的游戏规则。比如随便就动用三四副扑克的玩法。

October 23, 2007

想找一个老的 DOS 游戏

这两天想找一个很古老的游戏,想不起名字来了。搜了很多关键词能没能找到。

那是一个我在 DOS 时代玩过的,关于控制很多机器人盖摩天大厦的游戏。玩家不能直接控制单个机器人,我们需要做的是对单类机器人编写代码(一种不太复杂的脚本)。系统也提供了一些预先编好的程序可以选用。

每个机器人都可以背一些砖块往上爬,另需要配置一些协调工作的机器人。为了把楼砌高,还需要先修一些楼梯什么的。

这个游戏有繁体中文版,台湾某公司发行。但是从脚本语言中的英文注释来看,似乎是一个汉化作品而不是原创。

不知道谁记得游戏名字,提醒我一下 :D 我想我家里那些放游戏的五寸软盘已经找不到设备去读了。

ps. 我这里翻出两张光盘,存有 80 年代初期到 95 年间的很多 DOS 游戏 :D 比如创世纪系列(也就是后来的 UO 的前身),魔法门系列(不是英雄无敌)的早期版本,simcity 的第一版,沙丘的第一版(不是 Dune II ,是一个 RPG 而不是 RTS)等等。不知道还有没有收藏价值 :D

October 18, 2007

在 Lua 中管理 C 对象

今天同事在设计引擎的脚本接口时遇到一个问题:需要把 C 对象指针放到 Lua 中,允许 Lua 保存这个指针,并传递给其它模块。

这是给 Lua 写 C 扩展时常见的问题,撇开如何如何将对象的方法导入 Lua 这个更复杂的问题不谈,我主要想说说 C 对象的生命期管理的问题。

一开始的设计是把对象的销毁方法也导入 Lua ,由脚本程序员手工管理。这是很明显的 C 程序员的思路:谁构造谁释放。但在这里是不合适的,不符合带 gc 机制语言的习惯。

我们当然希望脚本更为健壮,不需要考虑对象释放的问题。所以晚上我想了一下,修改了一下这部分的实现。

从效率方面着手,这个问题分两种情况:

第一种情况很简单,C 对象可以被传入 Lua 状态机后,逻辑上可以确保它的指针一定一直有效,程序直到 Lua 状态机本身关闭后,才会删除对象。这种情况我们只需要把 C 对象指针以 lightuserdata 的形式压入堆栈即可。

第二种情况就是,C 对象由脚本创建或获得。在没有地方对其引用之后,对象则应该被删除以释放其占用的资源。这种情况,我们应该使用 fulluserdata ,为其注册 gc 元方法。

不过问题复杂在,引用 C 对象的可以是脚本也可以在 C 代码中。脚本中对 userdata 的引用 lua 状态机会自行解决,但 lua 的 gc 过程并不能直接知道 C 中是否对对象还有引用,这就是我们需要做的工作了。

python 的 C 接口提供了相关的函数,可以在 C 界面上对 PyObject 加减引用。但是 lua 的 gc 是基于根扫描的,状态机中并没有引用计数。很自然的,lua 就没有类似的 C 接口了。

我的解决方法是,在 lua 注册表中创建一个弱表(value 是弱的,而 key 是强的),把 C 对象指针和对应的 fulluserdata 以及它在 C 中的引用数量记入这个表里。然后提供一对 API 对引用计数增减。当引用计数为 0 时,清除关于计数的表项。最终可利用 gc 回收掉已无引用的 C 对象。

详细的程序可以参考我的 wiki 上贴的代码

这里补充几点说明:

所有对象的 gc 元方法是共享的,而不是每次创建 fulluserdata 创建一个新的元表。这是一个简单的优化,可以节省不少的内存。方便起见,这个元表也放在那个弱表内。注意:在 Lua 中,每次压入一个 CFucntion 都会重新分配内存创建一个新对象。所以应该尽可能的共用。

每次从 C 对象指针生成 fulluserdata 时,都会去检查以前是否生成过。这样才能使引用计数统一计算。

代码随手写的,并没有经过严格的测试,如果谁想拿去用可自便,但发现 bug 请通知我修改过来。 :D

October 15, 2007

让游戏用户安全的登陆

我曾多次在 Blog 上讨论过增强游戏客户端的登陆安全问题。这个问题仅靠软件手段之所以难以从根本上解决,是因为现在国内的网络安全环境实在是太差,我们无法确保用户的机器上没有木马。

游戏客户端面临的问题更加严重。受经济利益趋势,几乎所有的热门游戏都有无数针对性木马泛滥。用户很难保证他每天运行的游戏客户端有没有被恶意程序修改过。(修改不仅包括直接对硬盘上的客户端程序做永久性修改,还包括使用内存黑客程序动态修改运行时代码)

我们几乎做不到让 client 程序自检,确保自己没被动过手脚。

周末又一次想到这个问题时,突然想到,其实最不容易被伪造的 client 软件其实就是最容易被动手脚的浏览器。虽然像 IE 这样存在很多安全问题的浏览器,会被无缘无故的插上诸多恶意插件。但不可否认,木马想骗过浏览器截取到其中的特定传输内容还是颇不容易的:大多数恶意插件都会很快被检查出来。毕竟这个是现在反木马病毒软件全力去做的事情。而且想伪造一个浏览器上的登陆过程比伪造一个游戏 Client 的登陆过程技术上要困难的多。

如果我们让游戏登陆时,启动浏览器,用 https 协议连接登陆服务器去通过身份认证。然后用服务器返回的 session key 来启动游戏 client 进入游戏。这个登陆过程可能更加安全。(由于 SSL 的技术保障,这个过程也可以防止 ARP 欺骗导致的密码把监听)

为了增加安全性,我们还可以让用户先在服务器注册一个只有他自己知道的特征字符串。在登陆的时候让服务器回显,确保看到的页面的确是官方服务器。(这个看起来有点画蛇添足,因为 SSL 本身也可以保证这一点,不过还是一定程度的防止木马在本地浏览器上捣鬼)

另外,为了防止已通过身份认证后,从浏览器启动游戏 client 时,session key 被中途截获而用户不知情。浏览器登陆窗口应该由游戏 client 确信自己已经进入游戏后再自动关闭。一旦本地游戏 client 拿到 session key 却没有顺利进入游戏,则向用户报警。

自然,session key 中应该包含用户的 IP 地址和时间信息,尽量防止木马利用。

以上方案自然也不是万全之策,不过是一个值得考虑的方案。

October 10, 2007

微软鼠标也不咋地嘛

去年用坏了两个 DELL 鼠标 ,后来去买了个微软IE4.0(光学银光鲨)。这两天左键也出毛病了。单击老是失灵。

虽然我手指力道比较大,用鼠标比较狠(大拇指抓的地方表层已经被磨掉了),也不至于这样嘛。才用了大半年呢。网上 google 了一下,对这款鼠标抱怨的还真多。不知道过了保修期没有,不过我比较懒,不想跑电脑城。

今天实在受不了了。愤怒的把鼠标打开,本来想把平常不用的一个微动开关换到左键上去。结果没找到悍锡,只好作罢。考虑了一下,用小刀切开微动开关上的四个塑料螺丝,把开关的小盒子翘开看看。结果发现里面的金属弹片朝下的一面已经发黄了。估摸着可能是氧化了导电性下降。拿纸巾擦不掉,手头也没有酒精。想来想去,用铅笔涂了一下,这石墨应该是导电的吧。

装配回来颇费了点工夫,不过现在感觉左键好用多了,最好不是心理作用。 :D

October 07, 2007

网络游戏的技术基础

晚上已经回到办公室,飞机下降的时候天气不好,颠簸的很厉害,居然有点晕机的感觉。可能是这几天身体不是好的缘故吧。下了飞机大雨,直接打车到楼下的 KFC 吃垃圾食品,然后就坐到了熟悉的椅子上。

真还别说,环境不同,心境就不同。一坐上办公桌前的椅子上,就有做事情的感觉。沾着家里的椅子就是放松休息了。

刚才发现了透明的一篇文章:从游戏看货币,大约是对我前段时间写的一篇东西的评论。

正好这两天在家没事也在想这个问题,想着想着就不由自主多写几句了。

我以前对网络游戏是没有兴趣的,对任何人,包括老板都不掩饰这一点。在不同场合我表达过我的意思,我拿着现在的一份工资,会把手头上的事情做好。但仅限于技术底层,我不会去担纲做一款网络游戏,因为我对这种形式的游戏没有兴趣。当然,这是几年前的想法了。

现在,我依然期待有一天可以把游戏当作一种思想表达去做一个作品出来,有如别人写书、拍电影来表达思想一样。我依然认为在目前的网游中实现这个很难,至少要做的话,比做一款纯粹的单机游戏要繁琐的多,我不会择其繁而避简。

但是,网络游戏在这两年却引起了我的兴趣。主要在于虚拟世界的社会性。这是另一个有趣的领域,同样很精彩。


“云风坚持自己的技术派路线”,透明语。没错,前面的文章主要都是谈的技术路线。但并非我不了解制度方面的重要性。虚拟世界再虚拟,它也是现实世界的一部分。可以说是一体的,我们不能妄想从现实世界中把它隔离出去,用程序指令创造出一个完美世界。

现实世界在微观结构上是量子的,这与现在计算机的工作原理有极大的不同。我对在现今的计算机系统结构中创造一个 Matrix 不报任何期望。所以在今天,我们创作虚拟世界,一定要有更高层次的抽象,也很可能迥异于现实社会的规则。

一切,我们都还在尝试阶段。技术上能做的,也是首先要做的,是建立一些可以被实现且简洁的基本规则出来。它的首要目标不是对现实模拟的拟真度,而是可实现性。这些技术上的基础设施搭好前,谈论对虚拟社会的研究是奢侈的。

之前,我老在谈虚拟货币以及虚拟货币的控制。这是因为,我觉得虚拟货币是虚拟世界经济系统的一个窗口,也是一个容易被监控的量,方便做研究工作。但做这些工作之前,我们需要解决一些技术问题,主要是实现问题,让一组程序可以为上十万甚至上百万用户服务,而虚拟货币可以得到控制。

话说另一方面,目前几乎所有的网络游戏开发商,至少从投资人角度看,都是以从中获取现实世界中的利润为开发指导的。故而有许多人研究所谓不同的收费模式。而从我的角度来看,如果从这方面考虑就有些本末倒置了。

天地不仁,以万物为刍狗。神创造这个世界,绝对不是为了从人类这里拿到什么好处。

我们创造网络游戏世界,让大家可以享受这个世界。人和人可以通过另一种途径进行交流,用符合游戏世界的规则。游戏世界中如果良性运转,就会自然生成一个经济体。运营商可向玩家收取服务时间的费用,这是过往的赢利形式。现在运营商们发现,他们可能漏掉了更大的利润空间。

所以,运营商纷纷介入这个经济体中,获得现实的利润。这无可厚非。我不反对这种做法,因为我们有能力身在其中让它工作的更好。但自己发行货币,售卖虚拟道具这些形式不一定是好的途径。我谨慎的反对这一点,这并非出于道德上的原因,而是感觉这样不利于建立一个技术上的基本规则。

另一方面,作为运营商还需要重点做的是:为用户提供更高安全级别的虚拟财产保护。这一点,假期里跟同事讨论时也说过了。这除了在现实世界中是一个尚待解决的法律问题外,对于游戏实现也是一个技术问题。我指的实现不单单指程序上如何提高安全级别,避免物品复制,以及被盗号后的虚拟物品恢复等等;还包括了我们在游戏设计上怎么确立一些基本规则来给予一定的保护(比如魔兽世界中的灵魂绑定)。

唉,我们要做的事情还有太多太多。

假期

国庆七天的假期,明天就要结束了。

独身一人的游子,最自然的选择度假方式就是回家。跟往年的不同,我提前一周订好了往返的机票。去年这个时候回程机票的紧张让我记忆犹新。

在家待了五天了,无所事事的上网、打游戏、看电视、陪父母聊天、还有看书。大多数事情我平常都不会去做,也没什么机会做。

自从两年多前出来独立带团队,我对“事业”这个词就有了新的感受。虽然它依旧是个游戏,但是个不同的游戏。不知该如何形容这种感受。或许我想说的是“责任”,但又觉得不应该用这么个略感沉重的词;把这个词换成“梦想”,又显得虚无飘渺,有点儿戏;谈到“压力”,一定是自欺欺人了,像我这样骨子里玩世不恭的人,谈压力是可笑的。

可是,我却不能不无时无刻的想着正在做的事,如何把路走下去,直达终点。假期这种无所事事的状态,总是让我觉得正在过于奢侈的挥洒时间。

父亲刚动过胆摘除手术,恢复的很不错。不过他老人家退休在家只是种种花养养草,平时没啥运动。我想买台 Wii 放家里做健身器材,不走运的是,整个假期,武汉所有卖游戏机的店居然都没有现货,很让我郁闷了一阵。

武汉的数字电视不错,尤其是电影台,让我补习了好多近两年的大片。另外还陪父母看了两部电视剧,除了假期,大半年我都没看过电视了。

从书柜里翻出一些我前几年买的书,一本讲春秋时期齐鲁兵家的,一本讲商周文化的异同。读读这些,一则我对先秦文化有点兴趣。二则每每在觉得自己虚度光阴时,总不由自主的拿点书充充电。书到用时方恨少嘛,没事灌点东西到脑子里总没坏处。虽然如今 google 检索知识已经足够快了,可毕竟没人脑方便。有些时候也替代不了大脑。

闲书也看了半本,大仲马的《三个火枪手》。小时候总听大人说,应该读读一些世界名著,这本也算。可那个时候我读金庸兴趣更大一些 :D 买这本小说纯属无聊,想看看西洋人的武侠是个什么样子。一开始觉得有文化隔阂,我对法国历史没啥感情,所以显然不如金大侠的书好看嘛。不过看着看着觉得还有点意思了。

网上还碰到些难得一见的人。或许他们时常是上 IM 的,但是我不注意罢了。几年没主动在网上找人聊天了,这次捉到了就聊上几句。都是五年以上的网友,见过面。虽然不是同行,可网下也有交情。清点下 IM 上的好友名单,那些见过面的朋友,几乎没有新近几年认识的。看来互联网真的成了生活的一部分,成了人感知的延伸。只在网上联络的那些朋友们,只在屏幕上表现为一个符号,我们只在乎网上沟通搭出来的形象,已无所谓现实中那是谁。

最后,我还认真的再次考虑了一次虚拟游戏社会中的经济和虚拟物品的价值问题。以及虚拟经济系统跟运营商收费模式的关系。

我们公司绝大部分的游戏产品按用户游戏时间来收费,极少介入虚拟物品在现实世界中的交易。为什么公司有不少人坚持按时间收费,我们坚持的到底是什么?我相信,因为经济利益的驱动,以及对新模式的试探,我们也会有新产品去做虚拟物品的售卖。那么,所谓道具收费模式到底又意味着什么?

很多业内人士都在分析所谓有时间的玩家和有钱的玩家的需求;分析收费模式对公平性的影响等等。我总是觉得这样的研究很肤浅,总在问题的表面打转。

如果我们抛开运营商如何获得更多收益这一点。研究虚拟社会的建立、完善,虚拟物品的价值的呈现,等等这些问题可能更接近根本。或许我们可以更多的了解网络游戏怎样(在社会性方面)更好玩。

哦,我的意思是说,运营商的收益拓展问题跟游戏更丰富的玩点两个问题应该正交分解。这样,就不应该直接去考虑怎么更多的延长玩家的每日在线时间,或是怎么向玩家推销更多的收费虚拟道具。

让玩家机械性的沉迷网络游戏,投入超过他能接受的金钱与精力到游戏里,绝对不应是游戏设计者的目标。

……

我的假期,就在这胡思乱想中度过了。