写一个游戏玩

我有几个缺点:
1、懒
2、嘴笨
3、脑子慢
4、不够聪明
5、常虎头蛇尾

但我有一个梦想:写一个游戏。

知己知彼,百战不殆。我知道自己的缺点,因此我有准备做好持久战。

虽然我一直是个游戏爱好者,但是制作游戏的念头,几乎一直没有。

其实也有。我写过一个DOS字符版的扫雷。。。写过手机版的俄罗斯方块。。。但那些都是玩票性质。

难道这次我就不是玩票吗?

字符版的扫雷,花了我2天。手机版的俄罗斯方块,花了我大概10天,大概花了一周时间做出来以后,发现自己的思路就不对,耦合性太强,调试困难,从头再写,花了3天。发现手机性能的问题以后,又花了点时间折腾,最后无功而返。

这些其实只是我的知识储备的问题。

我只是一个工匠,远不是能工巧匠,因此我需要站在巨人的肩膀上才能做成一点小成就。

现在我找到了一个开发框架Loon,还有好几个相当纯熟的手机游戏源码可供借鉴;这些就是我巨人的肩膀。

此外,我在Innovit的工作教会了我怎么用脚本语言,教会了我一点一点解析和构建一个巨大的系统;只要慢慢学习,足够坚持,蚂蚁可以啃掉一座山。

我现在的年龄也刚刚好,足够我实现自己的梦想,又不算太衰。。。没错,程序员30而衰,33岁,按理说,已经废掉了,但是在这里没有国内那么浮躁,也不需要那么多加班,似乎大家都能平静地接受大龄程序员。。。这给我一种感觉,似乎我还有能力和精力做一个自己的东西出来。另一方面,如果现在不去做,也许过了几年,自己就会给自己找各种借口了。

这事情的其他优势是,它可以一个人去做,它只和我的梦想有关,因此对成品没什么太大要求,好坏不需要旁人评判,它的目标不是为了钱,因此也没有急于求成的打算。它需要的时间和精力并不太多。

我对这个项目的信心是,我一贯有着慢慢完善的作风。看看我的博客,三年前,它还是一个很垃圾的东西,充斥着毫无意义的东西和到处转贴的东西,更新的频率也是两天打鱼三天晒网;那时候我根本不知道还有专业建站的工具比如WordPress;但是经过不断的磨合,至少我现在已经对自己的博客相当满意。

因此我的目标就是,让自己满意。我也曾经折腾了很多项目,比如夭折的手机版《炎龙骑士团》,放弃的时候,连个雏形都算不上,但是那次尝试让我思考了很多细节的问题。而看到人家相当成熟的手机源码的时候,我很吃惊于那些架构和算法。如今,我既有对细节的思考,有实践,有现成的站在巨人肩膀的架构和算法,相信至少对我而言,真的应该不会太难了。

博客,这个毫无技术含量的东西,依然花了我三年时间去适应:选择平台,购买主机,选择写什么内容,选择域名。对了,选择域名这件事情也有意思,我选择了glad2u.com,选择了wanbulei.com,每次取名也是绞尽脑汁,过了一年依然没啥感情,最后取了一个chenyi1976.com才产生归属感。

因此,对于这个项目,我也觉得我最好还是去复刻自己特别特别喜欢过的游戏,复刻,而不是从头构思一个。。。从头构思一个,到了最后只会失去兴趣,失去毅力,不知道自己想要什么;而复刻,则是所有的细节都已经烂熟于心,我说到底并不是一个特别能创造的人,倒是一个特别能怀旧的人。

那选择什么作为开始呢?

Loon框架里面并没有提供SLG的例子,而《炎龙骑士团》和《魔法门英雄无敌》无疑属于SLG。如果可以把《韦诺之战》的源码改造成Java就好了,但是我不觉得把C++转化成Java是容易的事情。

AVG我从来就没有特别喜欢的游戏。提到AVG,特别是Loon框架的那个实例,我最容易想到的是日本人早期做的OOXX游戏,有趣是有趣,但是我不想做不能拿出来展示的东西。《心跳回忆》也算AVG吧,蛮好玩的,不过还不至于好到复刻它的地步。其他的比如《美少女梦工厂》,我有一阵子生病的时候把他通关了,同样的,蛮有趣,但是还不够好到复刻它。其他还有《明星志愿》,也许是我玩的第一个AVG。其实这种游戏都类似于心理测验题,选了一堆选项以后(中途还可以看指标),重点在于最后的答案。它不像SLG,SLG的乐趣在于拍兵布阵的过程而不是最终的结果(反正肯定会赢),AVG的乐趣在于调整指标赢取结果,当然OOXX的AVG的乐趣就不在结果了,而是在于过程。

大部分构思良好的小说,如果想作为游戏脚本,都有一个致命的缺点,单线程单结局。

如果做成《Descent》那样倒是不错。但那是桌游,要求有一个界面,有旗子,有技能。

如果做成MUD类型的探索型游戏呢。打怪,捡取装备,升级,满地图乱转,击败魔王。那样就是一个全新的游戏了。

桌面游戏是我很喜欢的类型,问题是这一领域,没有特别爱不释手的,俄罗斯方块,大家来找茬,扫雷,推箱子,拼图,etc,都是很轻度不沉迷的游戏。。。也许我可以试试复刻《卡卡颂》,说实话,XBOXArcade版本的卡卡颂做得很让人失望,PC版其实还不错;但是我对这东西的兴趣也是一般(要说兴趣,我有兴趣做一个算法机器人出来,然后用它上X360联网对战,用电脑对抗人脑);顺便所收

我还得仔细想一想。或者再研究一下Loon,看看用它来做SLG的可能性。

当年我有着无穷的热情和时间去制作游戏,但是却没有能力没有技术。现在可能是我最好的时机,去尝试一个10年前不能完成的梦想。

也许可以试试复刻魔法门5的平面版?不过貌似要求太高了。其实复刻早期作品更好,因为更容易,系统更简单。比如《Heroes of Might and Magic》,1代只有4个种族,每个种族只有7种兵,建筑也少,地图更是小的可怜,战斗没有地形。(当年还有一款类似的跟风的作品,我也试玩了一把,怎么都觉得别扭,如果是现在的我,一定会总结出哪里失败了,哪里有进步;当年我只是简单地放弃了。现在回忆起来,只剩很模糊的印象了。)

其实,开发游戏只是程序员的一个分支而已。不管你喜欢不喜欢,玩过或者没有玩过俄罗斯方块,做为一个合格的程序员,你都能写出俄罗斯方块出来,这更像是一个四级上机考试题,而不是一个游戏开发。

换言之,能开发是一回事,想开发是另一回事,为了得到愿意付出多少是另外一回事。所谓的付出,是指时间,精力,甚至是经济上的付出。最慢的跑到最后。。。也许那些跑得最快的家伙早就意识到做程序员没前途。所以只剩下我,慢慢跑。跑到最后,还自我感觉良好,其实傻得要死,但是人家也说难得糊涂。

经过一天的时间的思索以后,我认识到这种事情难度太大,虎头蛇尾的可能性为80%,因为我干脆连虎头都不要了。

决定做一个卡卡颂的算法程序出来。我在联机XBOX Live的卡卡颂的时候,总是想,我要是自己搞一个程序出来,算法做得好,肯定玩得比我好,如果算法足够牛,胜率一定大得很。

这事情促使我上网找了一下有没有现成的项目,结果发现了3个Java的。

一个在GoogleCode上;一个在Java.net上;最后一个的完成度最高,也最牛B,可惜不是开源项目。

在玩了一把界面以后,我选择了最后一个,闭源不要紧,关键是作者没有加混淆器,所以用java.decompiler直接反编译。出来的代码经过我几个小时的修改(主要是1,Label有问题,2,Enum有问题,3,有些参数丢失或者出错),终于可以编译了,而且可读性还不错。放到了这里:http://chenyi1976.com/code/JCarcassonne.zip

今天花了点时间好好地读了一下,感觉稍微有点眉目了;顺便学了不少小东西。看下来的感觉就是写一个卡卡颂要比写一个俄罗斯方块难很多。

一个小但是很恼火的问题是,Socket连接不能成功。。。查了半天也不知道为什么。。。

JCarcassone使用了GridBagLayout和JLabel来实现界面的绘制,所以就避免了自己绘制界面的复杂性,但是也让界面很难看,扩展性也不好,有时间应该用Loon的框架重新写一遍界面绘制的部分。

法律上当然有问题啦。反编译人家的非开源的代码,很不道德。不过我也没有打算牟利。我打算继续完善它。唔。。。貌似这个理由也不对,劫富济贫也是劫。。。不管了。

最后,看别人的代码真的对提高自己的水平很有帮助。我不是那种自己能够发明创造的天才,所以拿来主义对我而言,更为重要;学习了,搬到自己的程序里。虽然起步晚,但是玩得蛮开心。现在想到大学没有报计算机专业真的是太失策了。

还是挺怀疑自己到底能做到什么样的程度。不过动手了就好。

角色扮演游戏脚本

找到一个超级棒的游戏开发引擎,Java做的,代码不难懂。。。作者的博客在这里

支持“推箱子”这种桌面游戏(当然逻辑要自己实现,比自己从头搞,工作量只低了一点点);支持对话加选项式的AVG(比如樱花大战、很多日本人做的OOXX游戏);支持RPG(还没有仔细看)

看了一圈,花了不少时间读懂代码,觉得这东西满有前途;代码结构很漂亮,有脚本解析,甚至还支持LUA脚本语言;开源意味着什么都可以定制,比如把Groovy和Jython弄进去应该也不难。

但是想一想,觉得自己写代码难度有点大,特别是自己虎头蛇尾得很。

为了不虎头蛇尾,不如只弄脚本和美工,不到迫不得已(比如要增加道具之类)不去修改代码。

脚本最容易了,也是最有变化的东西,如果写得好,完全可以比得上几千行代码,所以。。。贴一段作者自带的脚本。。。希望看到的同学能够出出点子,一起弄个好玩的脚本出来?

不知道这次会不会又一次虎头蛇尾。

/*
   这是一个随Java版AVG游戏开发入门示例发布的脚本文件,用于演示脚本引擎开发的基本原理及应用
*/

set bgImage = “image/avg/backgroud/hospital.jpg”
set heroName = “三石.圣光.丁”
set cg0Image = “image/avg/friend/ding/ding0.png”
set cg1Image = “image/avg/friend/ding/ding1.png”
set cg2Image = “image/avg/friend/ding/ding2.png”
set cg3Image = “image/avg/friend/ding/ding3.png”
set roleName = “那厮为金网瘾集中营女医师—上岛床子”
set ecg0Image = “image/avg/enemy/shang/shang0.png”
set ecg1Image = “image/avg/enemy/shang/shang1.png”
set ecg2Image = “image/avg/enemy/shang/shang2.png”
set ecg3Image = “image/avg/enemy/shang/shang3.png”
set content = “”
set mount = 0

gb print(bgImage)

    //显示三石.圣光.丁惊讶画面到画面x坐标200
    cg print(cg1Image) 200
mes {print(heroName)}你说我有网瘾?!但我已不摸电脑好多年,我,我现在只是个养猪的……

    //三石移动到30
    cg print(cg1Image) 30
    //上岛床子乱入……250位置
    cg print(ecg0Image) 250

mes {print(roleName)}哼哼哼哼哼,别狡辩了,根据我们伟大的[<o那厮为金网瘾集中营/>]<r文明用语/>的推断。你的,良民的不是,网瘾的,大大的有!

    //变更cg0为cg1
    cg print(cg1Image) to print(cg2Image)
mes  {print(heroName)}<o那厮为金网瘾集中营/>的<r文明用语/>?!是什么鬼东西?

    //变更ecg0为ecg1
    cg print(ecg0Image) to print(ecg1Image)

mes {print(roleName)}放肆!你竟敢说我们尊贵的<r文明用语/>是东西?!

    //变更cg2为cg1
    cg print(cg2Image) to print(cg1Image)

mes  {print(heroName)}难道<r文明用语/>还不是东西吗?!

    //变更ecg1为ecg2
    cg print(ecg1Image) to print(ecg2Image)

    //变更cg1为cg0
    cg print(cg1Image) to print(cg0Image)
mes {print(roleName)}真是傻孩子!<r文明用语/>怎么可能是东西,<r文明用语/>当然不是东西!更何况是我们营长这个<r文明用语/>,那就更加更加的不是东西!

      //变更cg0为cg1
    cg print(cg0Image) to print(cg1Image)
mes  {print(heroName)}营长?!你是说,你讲的<r文明用语/>是指你们的营长?!

mes {print(roleName)}蠢话!不是我们营长这样身份高贵的人,怎么可能用<r文明用语/>作为尊称呢?<r文明用语/>当然就是指我们杨营长!

    //变更cg1为cg3
    cg print(cg1Image) to print(cg3Image)
mes  {print(heroName)}姓杨?!我想起来了,莫非是传说中的杨~<r哔/>~<r哔/>~?!

mes {print(roleName)}孺子可教也,想不到你年纪轻轻竟也知道他这种身份的大人,要用[<r文明用语/>]、[<r哔/>]、[<r不雅词汇/>]这些[<o象征高贵的辞藻/>]来加以尊称。
    //变更cg3为cg2
    cg print(cg3Image) to print(cg2Image)
mes  {print(heroName)}你,你想怎么样?……(可恶,如果是战斗力媲美十大神兽的十二生肖兽之一——[<o羊叫兽/>]亲自介入,就算是我恐怕也劫数难逃了|||)

mes {print(roleName)}不想怎么样——毕竟我们也不都是虐待狂,如果我们的网瘾测试你能顺利通过,还是有免于被抓的机会的(哼哼,做梦)。

mes {print(heroName)}见鬼!好,谁怕谁啊,放马过来吧!

    //变更ecg2为ecg0
    cg print(ecg2Image) to print(ecg0Image)
mes {print(roleName)}接招吧!

cg del

cg print(ecg2Image) 20

//显示题目用函数(因为这仅是一个演示用的脚本引擎,故未做传参功能,请自行改进添加)
begin issue
    mes {print(roleName)}print(content)
    in
      A.完全没有
      B.很少
      C.偶尔
      D.经常
      E.总是
    out
end

//题目1
set content = “你多少次发现你在网上逗留的时间比你原来打算的时间要长?”
call issue
set mount = SELECT + mount + 1

//题目2
set content = “你有多少次忽视了你的家务而把更多时间花在网上?”
call issue
set mount = SELECT + mount + 1

//题目3
set content = “你有多少次更喜欢因特网的刺激而不是与你配偶之间的亲密?”
call issue
set mount = SELECT + mount + 1

//题目4
set content = “你有多少次与网友形成新的朋友关系?”
call issue
set mount = SELECT + mount + 1

//题目5
set content = “你生活中的其他人有多少次向你抱怨你在网上所花的时间太长?”
call issue
set mount = SELECT + mount + 1

//题目6
set content = “在你需要做其他事情之前,你有多少次去检查你的电子邮件?”
call issue
set mount = SELECT + mount + 1

//题目7
set content = “由于因特网的存在,你的工作表现或生产效率有多少次受到影响?”
call issue
set mount = SELECT + mount + 1

//题目8
set content = “你认为脱离互联网便无法正常工作吗?”
call issue
set mount = SELECT + mount + 1

//题目9
set content = “当有人问你在网上干些什么时,你有多少次变得好为自己辩护或者变得遮遮掩掩?”
call issue
set mount = SELECT + mount + 1

//题目10
set content = “你有多少次用因特网的安慰想象来排遣关于你生活的那些烦人考虑?”
call issue
set mount = SELECT + mount + 1

//题目11
set content = “你有多少次发现你自己期待着再一次上网的时间?”
call issue
set mount = SELECT + mount + 1

//题目12
set content = “你有多少次担心没有了因特网,生活将会变得烦闷,空虚和无趣?”
call issue
set mount = SELECT + mount + 1

//题目13
set content = “如果有人在你上网时打扰你,你有多少次厉声说话,叫喊或者表示愤怒?”
call issue
set mount = SELECT + mount + 1

//题目14
set content = “你有多少次因为深夜上网而睡眠不足?”
call issue
set mount = SELECT + mount + 1

//题目15
set content = “你有多少次在下网时为因特网而出神,或者幻想自己在网上?”
call issue
set mount = SELECT + mount + 1

//题目16
set content = “当你在网上时,你有多少次发现你自己在说’就再玩几分钟’?”
call issue
set mount = SELECT + mount + 1

//题目17
set content = “你有多少次试图减少你花在网上的时间但却失败了?”
call issue
set mount = SELECT + mount + 1

//题目18
set content = “你有多少次试图隐瞒你在网上所花的时间?”
call issue
set mount = SELECT + mount + 1

//题目19
set content = “你有多少次选择把更多的时间花在网上而不是和其他人一起外出?”
call issue
set mount = SELECT + mount + 1

//题目20
set content = “当下网时,你感到沮丧,忧郁或者神经质,而这些情绪一旦回到网上就会无影无踪?”
call issue
set mount = SELECT + mount + 1

if mount<40
     mes 你有时候可能会在网上花较长的时间”冲浪”,但尚能控制你对网络的使用,因此你属于[<l轻度网瘾患者/>](切,才仅仅这样嘛,不过不要紧,等我来慢慢玩弄他(=‵′=))。
    else if mount<70
     mes 由于因特网的存在,你正越来越频繁地遇到各种各样的问题,你应当认真考虑它们对你生活的全部影响,因此你属于[<y中度网瘾患者/>](真遗憾,只能使用抑郁性药物,过两天才能电刑……)。
    else if mount<100
     cg print(ecg2Image) to print(ecg3Image)
     mes 你的因特网使用正在给你的生活造成许多严重的问题,你需要现在就去解决它们,因此你属于[<r重度网瘾患者/>]!(哈哈哈哈,能电了,能电了,我要玩死这小子!)。
    else if mount==100
     cg print(ecg2Image) to print(ecg3Image)
     mes 来人啊!快把我的整套SM道具……不,是整套抢救用具拿来!我要立刻[<r挽救/>]这个可爱的小家伙!!!
endif

flash 255, cardiology 255,255

    mes  {print(roleName)}你是我的了!
    shake 20
    cg del
    cg print(cg1Image)
    mes  {print(heroName)}救命啊!<r不要啊/>!!!!

flash 241,26,26

cg del
mes  {路人H}由于这是一个示例,并没有真正完成这个游戏,暂时到此为止。想继续请自己动手丰衣足食……想添加过场特校、按钮、物品栏等组件可以给我blog留言,偶可以抽空帮忙,其余的自己解决……

run title

不折腾

最近又蠢蠢欲动了。看了太多的论坛帖子。

所以对自己明确一下:

1、坚决不自己做生意,动手容易收摊难,不折腾。

2、坚决不自己买地建房,动手容易收摊难,不折腾。

3、不买新车,车子太烧钱。

此禁令有效期五年。

有时间折腾,不如多花点时间读书、编程、Game、找朋友吃喝玩乐、陪伴家人。

追加一条:如果闲得发慌,去淘宝购物,特别是买书海运过来,这个最省钱。

大餐、事故、修车、看车、Live点卡、读库

这个周末发生了很多事情。

周五,玩了一下Fable2,完成了两个成就。这游戏有很多有趣的设定,但是这些特性一旦深入就发现其实只是一个半成品,至于吃食物能够改变善恶这种设定,绝对是实用主义而不是美式RPG的做法,不喜欢。

周六,去Campsie买菜,DF请吃饭,吃了一顿螃蟹面条,想起了很久以前的同样的一套菜。还是很好吃,不过比较一下,还是记忆中的那道菜很香。不知道是当时比较饥饿,或者是因为惊喜,或者只是记忆欺骗了自己。顺便从DF那里学习了一些E63的知识,要记得搞一搞。

下午回到家,HY和LDJ跟我们说他们的车被撞了,我还不信。结果真的被撞了,挺倒霉的。变道的时候,被一辆大块头的救护车追上来撞在侧面,驾驶座的门被撞得打不开。顺带连累了旁边的一辆现代。万幸的是,人一点事情没有。车估计是报废了,也就是传说中的WriteOff。

因为没有信用卡,第三者人身险没法支付,拖到这周末才让LDJ帮忙付了,下一年的年检算是搞定了。顺便查了一下自己的第三者财产险。发现NRMA的网站做得还真不友好。

周日下午开车去看一辆1500的车,结果破得一塌糊涂,1990年的Corrola,看来以后超过1994年之前的车都不用去看了。。。15年,可能是二手车的上限。这车子送给我我都要考虑一下会不会坏在路上,居然好意思拿出来卖。唉。

回来的路上第一次走了隧道,在封闭的空间里面开车,真的很压抑。可能还没有习惯吧。错过了Rockdale的出口,最后从KingsGrove穿出来。用了LDJ的GPS导航,有时候GPS很傻,比如在一个大转盘让我饶了一个U型的路线,不过在隧道里面能够提前提示换车道这个功能还是很爽。

下午在阳光下把汽车洗了一把,把刮伤的地方补漆。拖了一年一直没有处理的两个地方,车顶掉漆生锈和左后方车门的掉漆生锈都被搞定了。感觉超好。关键是不生锈就行。有点遗憾的是,油漆的颜色不怎么和原来的颜色一致(买的时候没有找到对应编号的配色,因此还引发了以后买什么颜色的车的讨论)。把车子的脏东西好好地扫了一下。

晚上居然又看了一辆Carmy,98年的,改了液化气,省油,卖家居然在晚上8点开过来,就在麦当劳里面看了一下,感觉一切都好。开价五千,LDJ居然还到四千,如果车子没问题就拣大便宜了。不过到手以后就要去换TimingBelt,又要大概四五百开销。

晚上55人民币买了7000点Live点数,买了几个Arcade,想买GOW2的地图未成功。

还下了单子,买了2006-2008年度的三年的读库。

早上来发现CyberArticle的试用期过了,不过它的处理比MyBase的过期好多了(MyBase的做法是挟持数据);即使过期了,也可以打开数据库,甚至进行拷贝,只是不能保存而已。准备买这个软件的注册码。

LIVE点数

发现国内的黑卡已经泛滥到要命的地步,首先是无耻的盗用,然后演变为价格竞争。。。两个特性,都是很奇特的市场环境下的奇观。

不管怎么用,花了55人民币买了7000点点数。。。

买了一个《Shadow Complex》,《Lode Runner》,《Braid》

不知道买什么好,想买GOW2的地图,结果区域限制。。。本以为只有中国才是特殊的,没想到澳洲IP也会中招。

剩下的候选的,想了一下《百战天虫2》?《Peggle》《PuzzleQuest》《猴岛小英雄》,或者随便找一些方块类游戏?

也想过买一些Fallout3的DLC,迟早要买的,不过原始版都没有入手,这想法未免离谱了一点,而且在原始版没有通关之前就购买DLC并不是好想法,Fable2的两个DLC根本打不动。。。

总之很犹豫。有人推荐一下不?

20091021:买了《PuzzleQuest》和《百战天虫2》。

另,Braid玩起来并不特别难,前几关咔嚓咔嚓飞速过关了。。。后面的创意似乎也不难,没有那种拍脑瓜才能想出来的惊喜。

LodeRunner比想象中难,作为8位游戏的《淘金者》的爱好者,感觉还是不错,不过用两者的手感的实在差得太远了,有点不适应。。。

百战天虫2和一代的毛病一模一样,某些小细节还不如一代,虽然增加了很多东西,但是都很无趣;最失望的是回放模式被取消了。。。

最大的惊喜是PuzzleQuest,方块类游戏和RPG的混合体,以前试玩的时候没有发现它,是因为没有搞清楚它的规则(它有教学模式,可惜又臭又长,让人没耐心看完)。

剩下的1800点,可能会选择GTA4的资料片1600点(刚刚入手GTA4的典藏版)。