Skip to content

游戏思想与制作 第6期

2004-1-24
老文章预警:该文写于作者17岁,里面提到的东西可能会过于幼稚或已经过时,请注意分辨。

写在开头

很久没有跟大家见面了,不知道大家还记得我这个老朋友吗?上一期杂志大概要追溯到前年的十月份了,当时我便许诺要在这期上刊登关于"武术系统"的文章,不知道是否吊了不少朋友的胃口,在这里我先向大家道个欠了,放心,这期我一定会把这个迟到的"超级酷点"奉献给大家。

很早以前,由于学业的缘故,不得不放弃了这个报刊,但今天我确是因为天晴数码举行的游戏制作比赛而决定再办一期的,我看了他的比赛要求,一点都不高(说实话,我觉得太低了,完全是看不起我国的游戏制作精英),这样也很好,可以使像我这样的菜鸟们得到一次锻炼,这真的是一次好机会,大家一定要抓住了,因此在本期里,我决定专门对有志于参加比赛得奖的朋友给予一定的帮助,也希望大家能取得好成绩。

官方网站:http://2004.91.com/

超级酷点——武术系统

不知道大家是否注意到,最近的网络游戏似乎都同时喜欢上"连招系统",就是将你现有的几种武功通过它的系统合成一次发出,并提高不少的攻击力,这就是现有的连招系统,感觉上不过是多了些华丽的色彩罢了,在游戏公司的介绍词里说的是增加了游戏的多样性,但对于看重"武功"的练功高人,会对那些没什么攻击力的武功感兴趣吗?一旦有了所谓的功略,一切又归为了平凡,每个人重复着和别人相同的道路,这就是我们需要的"多样性"吗?

现在我们来假设一个世界,这个世界中的人物和我们的形态一样,因此我们便可以制造一个人体模型来表示他们,这时,在游戏世界里,我们可以制造一个界面,用来让代表自己的那个人物学会武功,而这里的武功不像那些游戏中,可以通过"买书"、"加技能点数"或直接"升级"获得,这里我们通过键盘,控制屏幕中的"蒙皮骨架小人"运动,而这时的整个屏幕看起来更像格斗游戏,因为可以多个人同时"练功",所以玩家之间可以互相模仿,互相学习,互相切磋。然后可以将自己觉得满意的武功像录制宏一样,将他记录下来,设为快捷键,以备在将来使用。

在战斗的时候,每个人都有自己的默认的非条件反射,然后我们也可给自己的人物设计条件反射,这样的话,人物在接受别人的攻击的时候,会产生相应的躲避行为,躲避是否成功就看你的人物反映是否迅速,并且条件反射和非条件反射是否能正确的避开对方的攻击。而且我们应该使身体的每个部分都附上相应的敏捷、防御、力量和爆发值等,而且这些都应该是隐性的,不能让玩家看到,当相应部分受到伤害的时候,伤害程度就看防御,伤害后,相应的防御、力量、敏捷等就要降低,等等一系列附值工作。我想这样的话,游戏性会提高许多,当然竞技性会提高更多。

说了这么多,大家一定会认为这样一定会有许多问题等待解决吧?因为我们的技术还不够高,而且服务器为了容纳更多的人,也绝对不能使每个人占用过多的资源。下面我就具体的来解决一下这些已知的问题:

1、蒙皮骨架小人:其实这是一个在三维系统支持下的动作系统,键盘上可以设计一些键,分别控制这个小人的各个主要关节,相应的关节运动了,会带动他相连接的关节一起移动,这方面我不想多介绍了,因为这方面的专家不少,专著更多,大家如果感兴趣的话,欢迎在网上寻找一下,我要用好网络资源。

2、战斗系统:听起来是不是很复杂?还要应用什么条件反射之类的,我们想象一定是要应用三维运算系统,否则如何判断人物之间的接触情况,但是如果我们不是想将真实的世界表示出来,那么我们只需要一些相对于现在多复杂一点的系统而已。

也许我提到的这种有很多问题,欢迎大家与我讨论。

超级酷点——栏目说明

这已经是这个栏目开办的第三期了,讲了一些我自己的想法,不知大家的看法是什么?不知是否说到了大家想听的内容了。我想这是一个有特色的栏目,我会坚持将这个栏目办下去的,同时也希望大家能支持我,将自己的想法看法告诉我。

基础游戏设计指导——栏目介绍

这个栏目主要是针对天晴数码举办的游戏制作大赛,希望能带领那些还对这方面不太清楚的朋友顺利的进入状态,在这部分我只会点拨点皮毛,将一些稍微技术点的东西提出来介绍一下,其他的如果有什么不懂的,也欢迎大家来信讨论。

基础游戏设计指导——俄罗斯方块

俄罗斯方块是非常经典的游戏,游戏过程我想就不用我介绍了,而且具体游戏规则,主办单位已经给的很清楚了(开始我看到俄罗斯方块这题目,真把我吓了一大跳,以为他要我们开发出一个人工智能,能得最多的分),我们只需要将基本的框架构造出来,并向里面添砖加瓦就行了。

1、首先是要分析游戏过程,整个游戏的过程可以表示成:

cpp
Initialize () //初始化
{
    初始化游戏界面;
    随机算出将要下落的方块并存入缓存;
    进入主循环;
}

MainLoop () //主循环程序
{
    从缓存中取出当前下落的方块;
    while (方块尚未落定)
    {
        接受用户键盘事件并进行处理; //可以设计一个界面用来设置自定义键盘
        根据难度等计算下落的等待时间;
        if (达到下落时间) 
        {
            使方块下落一格;
            if (不能再下落) //说明已经到达不能下落的位置了
                退出循环;
        }
    }
    if (方块超出了可用区域) //表明该用户已经输了
        退出主程序;
    监测方块影响的横列有几个达到满行的状态; //可以用特殊的数据结构来简化这步
    加分、删除满行的横列并将上方的横列向下移动; //根据消除的行数不同而加不同的分数
    随机计算出下一次下落的方块; //根据用户的选择确定是否显示出来
}
Initialize () //初始化
{
    初始化游戏界面;
    随机算出将要下落的方块并存入缓存;
    进入主循环;
}

MainLoop () //主循环程序
{
    从缓存中取出当前下落的方块;
    while (方块尚未落定)
    {
        接受用户键盘事件并进行处理; //可以设计一个界面用来设置自定义键盘
        根据难度等计算下落的等待时间;
        if (达到下落时间) 
        {
            使方块下落一格;
            if (不能再下落) //说明已经到达不能下落的位置了
                退出循环;
        }
    }
    if (方块超出了可用区域) //表明该用户已经输了
        退出主程序;
    监测方块影响的横列有几个达到满行的状态; //可以用特殊的数据结构来简化这步
    加分、删除满行的横列并将上方的横列向下移动; //根据消除的行数不同而加不同的分数
    随机计算出下一次下落的方块; //根据用户的选择确定是否显示出来
}

2、我们来看看我先提到的简单的数据结构表示方法,由于要求是10X20的格子,而且是横着只有十格,因此2^10=1024远远小于integer的范围,而判断满行的条件就是这一行的表示数等于1024。其实这个优化并没有好大的用,因为原本的数据规模极小。另外需要说明的是,还未放稳的方块不应该放入主数组,那样不易操作,其中的理由一想就可以明白的,我就不详细叙述了。

3、最后我们来看看该游戏的网络部分,我们只需要在原程序的基础上加一点代码就行了,表示成:

cpp
Initialize () //初始化
{
    初始化游戏界面;
    随机算出将要下落的方块并存入缓存;
    连接入网络准备对战;
    进入主循环;
}

MainLoop () //主循环程序
{
    从缓存中取出当前下落的方块;
    while (方块尚未落定)
    {
        接受用户键盘事件并进行处理; //可以设计一个界面用来设置自定义键盘
        根据难度等计算下落的等待时间;
        if (达到下落时间) 
        {
            使方块下落一格;
            if (不能再下落) //说明已经到达不能下落的位置了
                退出循环;
        }
    }
    if (方块超出了可用区域) //表明该用户已经输了
    {
        退出主程序;
        告诉对方用户该用户已经输了;
    }
    监测方块影响的横列有几个达到满行的状态; //可以用特殊的数据结构来简化这步
    if (满行的行数>1)
        通过网络协议传出当前满行的行数;
    加分、删除满行的横列并将上方的横列向下移动; //根据消除的行数不同而加不同的分数
    随机计算出下一次下落的方块; //根据用户的选择确定是否显示出来
}

Connection_DataArrival (数据) //接收到网络传输过来的信息的事件
{
    分析得到的数据; //主要是判断数据的类型
    if (数据是行数)
        根据分析出的行数从自己的区域底部增加随机形状的新行;
    else
        告诉该用户赢了并结束程序;
}
Initialize () //初始化
{
    初始化游戏界面;
    随机算出将要下落的方块并存入缓存;
    连接入网络准备对战;
    进入主循环;
}

MainLoop () //主循环程序
{
    从缓存中取出当前下落的方块;
    while (方块尚未落定)
    {
        接受用户键盘事件并进行处理; //可以设计一个界面用来设置自定义键盘
        根据难度等计算下落的等待时间;
        if (达到下落时间) 
        {
            使方块下落一格;
            if (不能再下落) //说明已经到达不能下落的位置了
                退出循环;
        }
    }
    if (方块超出了可用区域) //表明该用户已经输了
    {
        退出主程序;
        告诉对方用户该用户已经输了;
    }
    监测方块影响的横列有几个达到满行的状态; //可以用特殊的数据结构来简化这步
    if (满行的行数>1)
        通过网络协议传出当前满行的行数;
    加分、删除满行的横列并将上方的横列向下移动; //根据消除的行数不同而加不同的分数
    随机计算出下一次下落的方块; //根据用户的选择确定是否显示出来
}

Connection_DataArrival (数据) //接收到网络传输过来的信息的事件
{
    分析得到的数据; //主要是判断数据的类型
    if (数据是行数)
        根据分析出的行数从自己的区域底部增加随机形状的新行;
    else
        告诉该用户赢了并结束程序;
}

4、我想我已经说得很清楚了吧?当然最后为了能得到大奖当然要不遗余力的窘自己的程序好好的装饰一番了,这也许涉及到彩色方块的问题,不过这都是数据结构的问题,我就不用多说了。大家快快动手吧,如果大家觉得有空,可以看看我以前写的一个新型俄罗斯方块的策划案节选,也许会有些启发。

基础游戏设计指导——小蜜蜂

真是的,为什么要把别人小蜜蜂形容成坏蜜蜂,不知道蜜蜂这么勤勤恳恳的冒犯了谁了,得了这样的恶名,哎,它也是不得已,如果不是我们程序员,他们会攻击我们的飞船吗?但是如果不是策划要求的话,我们的蜜蜂还是会很乖的。哎,说了这么多废话,总之一点,程序员是非常关键的,掌握着世界客观规律。^o^

小蜜蜂这个游戏,相信大家在童年时代一定打了不少,(什么?没打过?那快到模拟游戏下载点去当下来玩玩)所以具体过程我还是不用叙述了,主办单位给得太详细了,好像只比以前玩的多一个"吸收"功能,我们只需要将基本的框架构造出来,并向里面添砖加瓦就行了。

1、首先是要分析游戏过程,整个游戏的过程可以表示成:

cpp
Initialize () //初始化
{
    载入蜜蜂组;
    将飞船设为暂时无敌;
    将飞船位置初始化;
}

MainLoop () //主循环程序
{
    处理键盘事件(即根据键盘事件使飞船做动作);//可根据内存中的数据计算出改变的程度
    if (飞船子弹已发出)
        计算飞船子弹的下一个位置;
    for (i=1;i<蜜蜂个数;i++) //对每个蜜蜂进行计算
    {
        获取一个随机数并确定该蜜蜂下一步动作; //根据蜜蜂的种类不同出现的动作种类也不同
        if (动作不为吸收)
            根据动作指示进行动作;
        else if (该蜜蜂的吸收范围与飞船重合)and(飞船不是无敌状态或躲闪状态)
        {
            减去飞船一个;
            if (飞船个数<0) 
                游戏结束;
            将飞船设为暂时无敌;
            将飞船位置初始化;
        } 
        if (飞船子弹与该蜜蜂重合)
        {
            减少该蜜蜂的HP;
            if (HP<=0)
            {
                if (该蜜蜂拥有飞船)
                {
                    删除该飞船;
                    使飞船拥有副机;
                }
                删除该蜜蜂;
            }
            将飞船子弹初始化;
        }
        if (该蜜蜂与飞船重合) //相撞的情况
        {
            if (飞船不是躲闪状态)
                减少该蜜蜂HP;
            if (飞船不是无敌状态)or(飞船是躲闪状态)
            {
                减去飞船一个;
                if (飞船个数<0) 
                    游戏结束;
                将飞船设为暂时无敌;
                将飞船位置初始化;
            }
        }
    }
    for (i=1;i<发出子弹个数;i++) //计算每个蜜蜂所发出的子弹
    {
        计算出子弹的下一个位置;
        if (子弹与飞船重合)and(飞船不是无敌状态) //关于副机的计算与主机一样
        {
            删除该子弹;
            减去飞船一个;
            if (飞船个数<0) 
                游戏结束;
            将飞船设为暂时无敌;
            将飞船位置初始化;
        }
        else if (子弹飞出边界)
            删除该子弹;
        else
            将子弹移动到下一位置;
    }
    if (没有道具掉下) //计算关于道具的
        随机掉下道具;
    else if (道具与飞船重合)
        根据道具的效果改变状态;
    将屏幕状态显示出来;
}
Initialize () //初始化
{
    载入蜜蜂组;
    将飞船设为暂时无敌;
    将飞船位置初始化;
}

MainLoop () //主循环程序
{
    处理键盘事件(即根据键盘事件使飞船做动作);//可根据内存中的数据计算出改变的程度
    if (飞船子弹已发出)
        计算飞船子弹的下一个位置;
    for (i=1;i<蜜蜂个数;i++) //对每个蜜蜂进行计算
    {
        获取一个随机数并确定该蜜蜂下一步动作; //根据蜜蜂的种类不同出现的动作种类也不同
        if (动作不为吸收)
            根据动作指示进行动作;
        else if (该蜜蜂的吸收范围与飞船重合)and(飞船不是无敌状态或躲闪状态)
        {
            减去飞船一个;
            if (飞船个数<0) 
                游戏结束;
            将飞船设为暂时无敌;
            将飞船位置初始化;
        } 
        if (飞船子弹与该蜜蜂重合)
        {
            减少该蜜蜂的HP;
            if (HP<=0)
            {
                if (该蜜蜂拥有飞船)
                {
                    删除该飞船;
                    使飞船拥有副机;
                }
                删除该蜜蜂;
            }
            将飞船子弹初始化;
        }
        if (该蜜蜂与飞船重合) //相撞的情况
        {
            if (飞船不是躲闪状态)
                减少该蜜蜂HP;
            if (飞船不是无敌状态)or(飞船是躲闪状态)
            {
                减去飞船一个;
                if (飞船个数<0) 
                    游戏结束;
                将飞船设为暂时无敌;
                将飞船位置初始化;
            }
        }
    }
    for (i=1;i<发出子弹个数;i++) //计算每个蜜蜂所发出的子弹
    {
        计算出子弹的下一个位置;
        if (子弹与飞船重合)and(飞船不是无敌状态) //关于副机的计算与主机一样
        {
            删除该子弹;
            减去飞船一个;
            if (飞船个数<0) 
                游戏结束;
            将飞船设为暂时无敌;
            将飞船位置初始化;
        }
        else if (子弹飞出边界)
            删除该子弹;
        else
            将子弹移动到下一位置;
    }
    if (没有道具掉下) //计算关于道具的
        随机掉下道具;
    else if (道具与飞船重合)
        根据道具的效果改变状态;
    将屏幕状态显示出来;
}

2、我想我不用再说什么了吧?我认为这个说得已经非常清楚了,也许有些细节部分没写出来,我想那些绝对不是结构上的难点。

游戏策划案选登——新式俄罗斯方块

《随心所欲超级俄罗斯方块》开发文档

简介:该游戏支持网络对战,有多种对战方式,也可单机作战,同样可以有多种作战方式,可自己编辑地图,可出现的图块等多种信息,网络对战使用IP地址使计算机对连。

全面的随心所欲:

  1. 可编辑游戏开始时已在游戏区的初始图案
  2. 可编辑和设计自己独有的下落图块的样式及特性
  3. 编辑游戏区的样式
  4. 可自己设计游戏规则

游戏规则设定细则

  1. 该规则下可出现的图块及图块的出现机率设定
  2. 该规则下游戏区的样式及背景
  3. 每隔规定时间或发生指定事件时,符合一定规则的图块执行一定规则

每种图块拥有自己的属性

  1. 可穿透性(可设定可穿透的层次)
  2. 炸弹(可设定炸弹的力量)
  3. 定时炸弹性,当刚刚搭好时,不会发生反应,但隔了一段时间后,就像炸弹一样炸掉,还可以设定为当有图块在上面挤压时便爆炸。
  4. 穿心式,可以"一箭穿心",将在他以下的全部清除。

*注:这是很小的时候写的,因此只能算记录自己想法的文章,也许还能对大家有些作用

优秀游戏介绍——栏目说明

我曾经听说过这么一个故事,那就是在上个世纪九十年代,中国政府曾召集中国的一百多位计算机方面的专家,一同研制了一个完全自己知识产权的操作系统,而且从技术上说,是远远的超过了当时的Windows,但是由于政府并没有大力的推广这个系统,以至于最后这个优秀的操作系统只用作在军事部门,失去了与Windows抗衡的能力,这也许是他们在市场方面的失误,但是我们不能因为它的市场方面的失误而否定他,而出现这种情况的优秀作品是不少的,我想我们应该挖掘出这类作品,好好的向他们学习。

我想这也许又是一个需要大家一同努力的栏目,欢迎大家介绍自己认为优秀的游戏吧。

优秀游戏介绍——上帝也疯狂

《上帝也疯狂》是我接触的最早的游戏,而且一直对他是情有独钟,97年的作品,完全的纯3D,可想而知,当时已经是非常华丽的了,害得我当时那块集成的显卡使我的机子死了不知道多少次,不过对它的喜爱,远远超过了对死机的恐惧了。

对世界的设定,球型地图的设计,使环境更真实而容易理解,完全的3D地表设计,需要考虑的因素更多,随时可改变的地形,出乎意料的作战方式,海陆空三方作战,再现了真实的战术设计,小人们的人工智能使玩家的操作更加称心,当完成了玩家给与的命令后,他们会干自己的事,比如帮助周围的人修房子、搬木头等,然后如果没事,他们就会三五成群的围在一起聊起天来,悠闲自在得很。如果哪个小人不幸被遗弃在一个无法出来的地方,他会在一段时间后没被救出就会自杀,不会再占你的人数限制。有时你会倾你所有的兵力去攻打别人,约两百人一起出动,你绝对不会看到交通堵塞,他们会很顺利的通过,而且不会出现人重人的现象,他们绝对会是分开的独立的人,非常顺利的通过即使是很狭窄的地方。

最后来谈谈最使我兴奋的魔法部分,整个游戏约有二十几种魔法,算是非常丰富的了,而且有不少奇特的效果,对扭转战局可是起决定性作用的,因此攻打对方的祭司,永远是游戏的重点,而魔法是有滞后效应的,所以估计魔法的攻打位置也算是一个技巧了吧。而且玩家绝对不能因为自己被山包围着而高兴,因为这是使用火山爆发术最有利的地形,一个就足以使整个族一蹶不振,而且说不定一会儿原来的盆地就变成了一马平川了,再一会儿说不定就是一望无际的海洋了。

八种建筑物,六个兵种(包括祭司),两种交通工具(船只和热气球),略显小气了一点,但感觉兵种很精,他们各司一职,使战争充满了悬念,祭司虽然厉害,但是武士或是火武士,只需要给他三下,他就升天了。武士虽然能以一挑十,但是一遇到传教士,几十个武士都会被吸引住,然后只能眼睁睁的看着自己的武士变成对方的武士。

游戏中很值得一提的是它的音效处理,同一主旋律五种风格的音乐循环播放,让你感受不到音乐的重复,而且在战斗时,加入激情的鼓点,不但使玩家的情绪得到起伏变化,还使我们得到了一种前所未有的听觉冲击。

再提一点,它的读写存档速度极快,几乎都是瞬间完成,是我见到的及时战略游戏中最快的,很适合那些喜欢SL打法的玩家。

最后还是不得不提一下他的缺点,当初他不能像星际之类流行起来的原因,最关键的就是不能与电脑对战,而且任务版中的电脑过于简单了,而且有不少人觉得它的兵种太少了,而且每个兵种几乎只能干一件事,不能有其他的什么作用,因此觉得他的战术太简单了。整个游戏太注重魔法了,对不喜欢魔法的玩家也是一种拒绝。

曾经我一直期盼能出《上帝也疯狂4》,但是后来知道这不可能,因为后来听说他们公司中由于高层人才之间的一点矛盾激化,公司解散了,听说后觉得真的有点可惜。直到现在感觉好多了,因为我自认为自己已经拥有了他们当时的游戏制造技术了,只差一点时间来设计制造了,不知道大家是否有兴趣去了解一下这个游戏,欢迎大家亲身体验后和我讨论。

写在末尾

终于将这期杂志做完了,心也释然了,因为这期完全是我的心血,所有的文章均是我一手写出来的,虽然最后看来,真正我只写了五篇文章,不知道大家是否还满意,只要能对大家有一丝启发都好。以后我已经不可能有这么多的时间再来办这个杂志了,因为学习毕竟是第一的,我不得不为我美好的未来冲刺,经过这一年的时间,我觉得我改变了不少,已经对程序不再那么感兴趣了,因为那些所谓的"专家"只懂得欣赏表面,如果大家看过我的那篇"不是日记的日记",那么你就知道我指的是什么了。我依旧喜欢编那些能够让人为之疯狂的,而"专家"却嗤之以鼻的小软件,也许我的本性便是试验新奇的技术。

感谢大家看了我这么多废话,也许我会寻找是否有新的朋友愿意一起办杂志,或者和其他的杂志合并,或者就是让这个杂志从此消失,我也不知道哪一样会是最好的选择,但有一点很确定,我一定不会有很多时间来干这件事了。希望大家能为本报的发展投投票~~

版权说明

本期所有内容的版权均为冰河魔法师所有,如要转载,请带上作者姓名。

让您的朋友也加入我们

本报的发展,光靠我的精神动力是远远不够的!我需要大家的支持、大家的鼓励、大家的意见、大家的批评……对本报有什么看法,请到我的论坛上尽情的发表。

如果您觉得本报不错,请将本报介绍给您的朋友!