Hello everyone, Happy New Year!
我国现出土文物中,最早的剑出现在殷周时期。
·在西周初期的车战组合中,剑的地位并不重要,主要用于自卫或肉搏。据《释名》记载:“剑,检也, 所以防检非常也。”当时剑的全长在17—27厘米之间,而有效使用的剑锋约12—18厘米。
·春秋之后,因为步兵的兴起,剑作为一种武器开始受到重视,长度在28—40厘米之间。尤其是在吴越地区,因水道纵横,车行不便,而使剑的步兵却能发挥出很大威力,所以铸剑水平远高于中原诸国。当时有名的铸剑大师欧治子和干将莫邪夫妇即生活在吴越地区。
·在湖北江陵出土的越王勾践剑代表了春秋时期铸剑的最高水平。这把剑也反映了当时剑的外形特征:剑锋不是直的,而是呈拉长而削尖的花生果形,这种形式有利于直刺而不利于劈砍,证明了当时剑武器的战术使 用方法。(有趣的是,强调速度的法拉利跑车的俯视图也呈拉长的花生果形。)
·《晏子春秋》记载崔杼杀了齐庄公以后用武力逼诸将军大夫盟于大宫,谓“有敢不盟者,戟拘其颈,剑刺其心”,从另一个侧面证明了戟和剑这两种武器的战士使用方法。
·越灭吴,楚灭越,于是越国的铸剑优势转移到了楚国。
·战国时,随着车战的式微,剑作为一种步兵武器受到更大的重视,为适应战争的需要,提高了剑的威力, 战国晚期,剑的总长从早期的50厘米达到了81—91.3厘米。
·当时铜剑制造的高技术:
*剑脊和剑锋的含锡量不同,一般背部10%,刃部20%。这样铸成的剑刃口硬而脆,而脊部柔而坚。*为避免表面锈蚀,采用铬盐处理。
·由于铜剑已不能满足战争的需要,铁剑自春秋晚期开始出现。当时楚燕两国的铁剑制造技术最好。因为铁比铜强度更好,所以最长的可达到140厘米。
·当时铁剑制造的高技术:
*用纯铁渗碳后对折,多层叠打。
*剑锋淬火而剑脊不淬火。
·到了楚汉相争的时期,铁剑的样子发生了变化,原有两度弧曲的刃部伸成平直,更加锋利,剑锋的夹角则逐渐加大,说明剑的功能已由平行向前推转为主要用刃部劈砍。
·战国末年骑兵已作为一种独立的兵种出现,在秦始皇陵中就能发现一些骑兵方队。西汉时期的骑兵已经成为战争的主力。由于马速度快,推刺功能已经没有多大的意义,而劈砍功能十分适用,于是在西汉时期,出现了环柄的长刀。此类武器只有一面刃口,而另一面是厚实的脊,所以便于劈砍,又不易折断。《释名》中称:“刀,到也。以斩伐到其所乃击也。”
·西汉时期的刀呈长方形或梯形,直脊直刃,现在看来样子很酷。刀柄和刀身之间没有明显的区分,一般没有格。刀柄首端制成扁圆的环状,称“环柄刀”或“环首刀”,注意,与所谓的“大环刀”不同。
·到三国时期,军队中大量装备的短柄兵器,就只有刀了。当时斜谷造刀最有名,例如诸葛亮让蒲元铸造的刀就是斜谷造的。
·自东汉之后,剑在战场上被淘汰已成定局,但佩带宝剑的风气未变,另外剑也作为法器或象征物而存在。
·北宋时期,刀的形制有所改进,改成前锐后斜的形状,有护手,并且去掉了扁圆的大环和鸟兽类饰物。
·明代出现一种腰刀,这是当时部队刀器的主要种类。戚继光在《军器解》中清楚地指出,马步兵兼用的兵器即有腰刀。他还指出:“腰刀造法,铁要多炼,刃用纯钢,自背起用平铲平削,至刃平磨无肩,乃利,妙尤在尖。近时匠役将刃打厚,不肯用工平磨,止用侧锉,将刃横出其芒,两下有肩,砍人不深,刀芒一秃,即为顽铁矣,此当辨之。”可见当时也有假冒伪劣之害。
·自明之后,冷兵器逐渐式微,而剑则退出了历史舞台。
玄幻小说阅读指导
1.转世或来到异时空,异世界的:
魔师再现,中华再起,卑鄙天尊,北斗第八星,转世传说,觉者的传说,黑鸦之舞,旅人之歌,明,飘渺之旅,圣门风云,时空风云录,现代魔法奇谭,异人傲世录,异时空--长城,变革,不会魔法的魔法师,转世魔龙,大富翁之异时代风云,大圣者,大宋日月记,风流才子,浮云游梦,革命,横刀立马,红尘摆渡,洪荒,开神记,科学和魔法,雷神传奇,楼兰,乱世倾情,梦幻王朝,东方传说,明日帝国,末世血皇,时空旅行者,时空风云,太古的盟约,天风剑圣,现代情侠录,笑傲前尘,邪樱,星空的守护者,妖狐歪传,异时空-涌流,异乡的勇士,异域人生,英雄问天记,月落,越空三国志,再生,战魂之海临天空,真实与虚幻之间,征服,重生,纵横异界,魑魅人间道,飞天纵情,混迹三国,降临者,魔法世纪,年轻老头,三国游侠传,实验皇帝,太阳传奇,天才的历程,邪道极限,虚空航程,异时空—皇帝的新装,异世帝王行,真假人生,龙翔九天外传—梦回甲午,异界强者传—神魔之王篇,运动超人,铁血帝国,唯心什照,天界传奇。
其中,现代人回到古代的有:铁血帝国,旅人之歌,明,异时空--长城,变革,大宋日月记,风流才子,革命,楼兰,梦幻王朝,中华再起,时空风云,笑傲前尘,异时空-涌流,异域人生,越空三国志,明日帝国,混迹三国,实验皇帝,异时空—皇帝的新装,龙翔九天外传—梦回甲午,天界传奇。
古代人到现代的:雷神传奇,现代情侠录。
转世后保留记忆的:北斗第八星,转世传说,觉者的传说,圣门风云,时空风云录,异人傲世录,转世魔龙,大圣者,浮云游梦,梦幻王朝,洪荒,再生,实验皇帝,天才的历程,唯心什照。
东方人到西方的:横刀立马,东方传说,异乡的勇士,月落。
2.战争场面较多的:
昆仑,星际王者传说,中华再起,紫川,暗黑之路,大风歌,孤独战神,猛虎王朝,裸兰,天变,铁骑旋风,仙人传奇,小兵传奇,现代军人启事录,异人傲世录,异时空--长城,印海残阳·红莲烈火,原始印记,苍老的少年,苍茫故事,大帝传,大宋日月记,东方传说,风山云海,风之暗黑传,风神传说,风姿物语,革命,乱世激流,楼兰,追忆莽荒岁月,明日帝国,涅槃传说,天河记事,铁血帝国,唯美主义魔法师,笑傲前尘,异时空-涌流,异乡的勇士,月落,越空三国志,召唤之王,真实与虚幻之间,征战天下,东方,费路西的传奇,混迹三国,将星,三国游侠传,时空风云,龙翔九天外传—梦回甲午,银河畅想曲。
3.主角开始就很强的:
江山如此多娇,大唐行镖,乱世猎人,魔师再现,天庐风云,天鹏纵横,紫川,北斗第八星,大风歌,毒侠孟雪歌,红尘飞星,京风秘雨,圣门风云,无能神魔,仙人传奇,现代魔法奇谭,血夜凤凰,银针生死判,自由的风,最强.我的名,暗夜絮语,不败的勇士,大圣者,东方传说,都市龙舞,佛门嫁衣郎,浮云游梦,红尘摆渡,红尘冥剑录,洪荒,禁忌之恋永恒篇,雷神传奇,乱世激流,乱世英雄传,魔法师日记,魔门第一人,涅槃传说,人间,人间兵器,时空道标,神祗之眼,太古的盟约,天风剑圣,我欲成魔,五胡战史,现代情侠录,星空的守护者,修罗刀,玄门传人,妖狐歪传,一个人的战争,异乡的勇士,月落,侦探大作战,真实与虚幻之间,指点江湖,重生,逐鹿天下,纵马江湖,77号当铺,丑汉,费路西的传奇,风雨神州之纵横天下,还没想好名字的故事,你死我活,如天传说,死神传说,太阳传奇,亡灵之眼,我是大魔鬼,邪道极限,银鹰传,大风流,无道魔贼传,异界强者传—神魔之王篇,觉者的传说,弱者日记,侠狂与梦想之舞曲,远方星辰下。
其中强得变态,主角永远没有危险的:天鹏纵横,北斗第八星,圣门风云,无能神魔,银针生死判,暗夜絮语,大圣者,都市龙舞,红尘摆渡,红尘冥剑录,洪荒,魔门第一人,太古的盟约,天风剑圣,星空的守护者,玄门传人,77号当铺,丑汉,亡灵之眼,觉者的传说,人间,弱者日记,侠狂与梦想之舞曲,远方星辰下。
4.主角非人类的:
北斗第八星,红尘摆渡,洪荒,时空旅行者,太古的盟约,星空的守护者,妖狐歪传,战魂之海临天空,都市妖奇谈,天鹏纵横,暗夜絮语,变形虫战记,红尘冥剑录,卡卡,骷髅闯世传说,弱者日记,神祗之眼,神魔变,人间兵器,使徒行列,吸血獠,77号当铺,骷髅传奇,亡灵之眼。
5.传统武侠:
大唐行镖,洪荒天子,江山如此多娇,昆仑,乱世猎人,杯雪,大风歌,毒侠孟雪歌,红尘飞星,京风秘雨,飘零传奇系列,谁主沉浮,鹰刀传说,自由的风,傲剑狂刀记,霸王解甲,蝉翼剑,长刀无痕,转世魔龙,叱吒风云录,翠仗玉球,花溪沉铃录,烈日东升,龙小宝,乱世激流,水龙吟,天河记事,修罗刀,一啸风云动,英雄问天记,悠悠帝王梦.翩翩美人影,指点江湖,纵马江湖,将星,金庸群侠传,蟒迹宋图,睡狮,小龙传,长河一剑,鸳鸯梦,落日风雷。
6.现代都市生活:
都市妖奇谈,天鹏纵横,四面墙:哥们儿的狱中生活,现代军人启事录,现代魔法奇谭,冬之无名,都市龙舞,都市游侠,光辉系列,红尘摆渡,红尘冥剑录,坏蛋是怎样炼成的,雷神传奇,流血的银河,民族魂,人间兵器,人间无限,守护者之初露峥嵘,太古的盟约,天兵传奇,天降横财,天网,吸血獠,现代情侠录,现代神医奇侠传,古惑仔之笑看风云,邪樱,心灵黑客,星空之子,妖狐歪传,永不放弃之混在黑社会,再生,战魂之海临天空,战魂—足球篇,侦探大作战,征服,足球风云录,77号当铺,阿赖耶识,不测之棋,魑魅人间道,风雨神州之纵横天下,荒唐传说,基因传奇,君子之道,流氓老师,命妖—玲珑玉体,普天情侠之我是谁,太阳传奇,天才的历程,天界传奇,我踢球你在意吗,现代侠客行,小子传奇,足球神话,穿墙记,东方强者,混混与女警,金融帝国,控天,天生我材必有用,运动超人。
7.基本没有特殊武功魔法的:
我就是流氓,星际王者传说,中华再起,明,四面墙:哥们儿的狱中生活,现代军人启事录,异时空--长城,印海残阳·红莲烈火,苍茫故事,大富翁之异时代风云,坏蛋是怎样炼成的,梦幻王朝,民族魂,人间无限,天降横财,现代情侠录,现代神医奇侠传,古惑仔之笑看风云,心灵黑客,星际,星空之子,血雨黑渊绿夕阳,寻找人类,异时空-涌流,异域人生,永不放弃之混在黑社会,悠悠帝王梦.翩翩美人影,再生,战魂—足球篇,侦探大作战,足球风云录,不测之棋,铁血帝国,黄族英雄传,流氓老师,命妖—玲珑玉体,天才的历程,天界传奇,我踢球你在意吗,足球神话,穿墙记,回到今天,混混与女警,金融帝国,控天,龙翔九天外传—梦回甲午,铁血帝国缔造史,变革,风流才子,革命,笑傲前尘,明日帝国,越空三国志,实验皇帝,异时空—皇帝的新装,寻找回来的世界。
其中完全没有的:星际王者传说,中华再起,明,四面墙:哥们儿的狱中生活,现代军人启事录,异时空--长城,苍茫故事,坏蛋是怎样炼成的,民族魂,天降横财,心灵黑客,星际,星空之子,血雨黑渊绿夕阳,寻找人类,永不放弃之混在黑社会,战魂—足球篇,足球风云录,不测之棋,铁血帝国,流氓老师,命妖—玲珑玉体,我踢球你在意吗,足球神话,穿墙记,回到今天,混混与女警,龙翔九天外传—梦回甲午,变革,风流才子,革命,笑傲前尘,明日帝国,寻找回来的世界。
8.关于吸血鬼的:
流血的银河,吸血鬼日志,吸血狂想曲。
9.关于骷髅及亡灵巫师的:
骷髅闯世传说,限,骷髅传奇,亡灵之眼。
10.关于黑社会的:
我就是流氓,十六少年兄之山猫,坏蛋是怎样炼成的,永不放弃之混在黑社会,流氓老师,古惑仔之笑看风云。
11.主角如韦小宝般无赖并在武侠世界始终很弱的:
鱼龙变,无魔大陆,蝉翼剑。
12.关于未来星际战争的:
星际王者传说,星战英雄,无能神魔,小兵传奇,苍茫故事,风之谷,大帝国,末世血皇,时空旅行者,猩红荣耀,银河畅想曲2,银翼新世纪,银河幻世录,征服,众神故事,罪恶,雕龙诀,太阳传奇,心魔战将,星际通缉犯,星煞,星际。
13.平凡的主角得到外星人或他人记忆的:
魔法学徒,我就是流氓,梦幻纪元,暗黑的旋律,大铸剑师,道.道.道,光辉系列,人间无限,天网,吸血獠,心灵黑客,星空之子,年轻老头,天界传奇,心劫,大树,金融帝国,控天,异界强者传—神魔之王篇,基因传奇,运动超人。
14.幽默感较强的:
鱼龙变,英雄志,紫川,京风秘雨,天变。
15.豪气冲天的:
大唐行镖,英雄志,紫川,长刀无痕,杯雪。
16.有些叛逆或干脆是魔,妖的主角:
江山如此多娇,昆仑,魔师再现,都市妖奇谈,天鹏纵横,天魔神谭,我就是流氓,鱼龙变,暗黑之路,黑鸦之舞,魔盗,十六少年兄之山猫,时空风云录,死灵法师,血夜凤凰,最强.我的名,暗夜絮语,长刀无痕,道.道.道,恶障消长传,光闇之歌,红尘摆渡,红尘冥剑录,坏蛋是怎样炼成的,古惑仔之笑看风云,修罗刀,永不放弃之混在黑社会,变态者之镇魂歌,流氓老师,亡灵之眼,邪道极限.
17.发人深思的:
天行健,寻找人类,罪恶,被上苍诅咒的天才,五胡战史,飘零传奇系列
总体构想:
当前游戏的总体发展趋势是利用硬件提供的一切可能性来提升游戏的仿真性,而且似乎这是唯一吸引人的追求;因为当人们有了高配置的计算机以后,倾向于认为如果运行不能占用全部资源的游戏就是一种浪费,既然那些更加复杂、更加占用资源的游戏可以做到更好的仿真性,那么不用到这种计算机的处理能力似乎本身就代表了不好。这是广泛存在的思维误区。虽然我们并不能扭转用户的这种心理,而要善意地去理解;但是我们不能忽视这样一个现实,那就是编制技术复杂的、充分耗用CPU及其他计算机资源而达到极高仿真度的游戏是非常困难的,对一个缺乏经验和天才的游戏制作公司来说,尤其如此,象尚洋公司和他们编制的《血狮》就是这样一个典型的例子。
并不是所有的用户都有机器的迷信,仍然有相当多的玩家更加注意游戏的可玩性,而可玩性并不多取决于游戏的仿真度,而是取决于游戏的内涵。虽然这是老生常谈的问题,但是真正注意到的公司并不多。那么什么是游戏的内涵呢?说法与解答都很多。我认为游戏的内涵就是虚拟世界和用户的梦的结合,而且用户的梦是两者的重心所在。不关心当前的人们在想些什么,不做这样的调查,是不可能知道用户想要什么样的游戏的。
中国社会正处在转型期,人们的心理状态异常复杂。社会大众对纯文学的疏远并不表明当前的人不需要一种心灵的抚慰,而是恰恰相反,这方面的供求缺口非常之大。如果有一类游戏能反映当今的社会现实,回应人们的内心诉求,提供一种严肃的思考过程,那么它在商业上的成功是可以期待的。
这一类游戏的重心将放在人性的刻画上,主要通过文字和情节取胜,不需要太高的编程技术和机器配置,如果在剧本的编写上能做到精益求精、尽善尽美,相信可以在市场中占有相当的份额。
游戏名称:在钢筋丛林中
游戏类型:单人/经营类
游戏行进方式:强制剧情+即时+回合
游戏主题:大城市中的个人奋斗
游戏角色:可选六人中之一人进行游戏。
角色1林强男24岁原在一家制鞋厂做行政助理,工资少得可怜,所学非所用,单位人际关系复杂,心情苦闷。此时从大学起就相爱的恋人提出分手,绝望的主人公决定背水一战,离开原来的环境,到外面的世界去闯荡一番。目标是实现自我价值,找到真爱。
(特殊失败条件:回原单位、到42岁还未完成目标、)
角色2李兰女23岁在某个广告公司工作,本来工作很令人满意,但其上司不断对她进行性骚扰,且这个上司在城市广告界有绝对的威势,李兰被迫离开这个公司之后,她无法在其他广告公司找到职位,只能转行。目标是真正摆脱她讨厌的上司的纠缠并且找到真爱。
(特殊失败条件:离开这个城市、到32岁还未实现目标)
角色3姚奉男37岁某纸箱厂下岗职工,学历很低,没有积蓄,上有病弱的老父,下有还在读书的14岁的女儿。为了一家老小的生活,不得不自谋出路,开始自我创业。目标是存款达到20万。
(特殊失败条件:无)
角色4陈小勇男18岁某商贸中专毕业生,在学校没有学到任何实用技能,只知道吃喝玩乐。喜欢同班的白杨,但白杨一点儿也看不上他。受此刺激,他决心好好地干出一番事业来。目标是成为千万富翁,并且娶到白杨。
(特殊失败条件:到21岁时,听闻白杨已经嫁人)
角色5张娜若女19岁美丽的乡下妹,随在建筑工队打工的男友到城市,为一户人家做保姆。进了城以后,她的观念有了很大的变化。她不满男友杨火对她提出的性要求,以及以后婚后自己可能的处境,与他分手。虽然如此,她还是爱着他,期待着能在城市里以另一种方式与他重逢。
(特殊失败条件:答应杨火的要求,道德指数低于20)
角色6顾芸女22岁相貌一般,在电脑公司工作。她在网上认识一个男友,开始了网恋。两人都是真心相爱,但又恐惧着网恋的破灭,一再推迟见面的时候。对顾芸来说,能和男友现实地相爱下去,是最关键的事情。目标是美梦成真。
(特殊失败条件:男友不再爱她)
共同失败条件
生命值为0、信心为0
游戏模式
每个角色在游戏开始后都将进行一段强制剧情模式。强制剧情模式中含有少量的分支选项,玩家不同的选择对应着最终不同的结局。完成剧情模式以后,每个角色以一定的身份,一定量的资金在城市中为了达到自己的目标,开始自己的奋斗。这时游戏的模式改变为象《卧龙传》那样的即时模式。角色将进行各种各样的经营活动,自我培养。当角色的某些数值达到剧情设定的时候,会再穿插剧情模式。这是一般经营活动和养成而言,角色要完成最终目标,还必须要达成相当数量的特定目标。游戏将采用回合制的方式,让玩家就某个特定的目标和电脑在某个划定区域里进行周旋。这也是这个游戏唯一需要编制机器AI的地方。
虚拟的城市
本游戏设定在某一个城市内部进行。游戏将展现完整而细致的城市环境,包括建筑、机构、人。
建筑
斜45度的假3D造型,比如象《模拟城市2000》的场景,但比例应该更大,由手工绘制,能够看出建筑物类型。在操作上,如果能用鼠标点选建筑的方式进行一般移动,将会很方便玩家。
机构
政府行政机构、商业组织、金融机构、服务行业。完全模拟一个大城市的这些情况是完全不可能的,但数量上应该尽量多,主要是提供给玩家选择不同的奋斗道路。
人
剧情相关人物、一般人物。预计有姓名者总共300人以上。
角色的数值体系
角色的数值体系对经营类和养成类游戏的成功非常关键。本游戏角色的数值包括:
一类:现金、存款、票证
二类:信誉、生命、信心、运气、道德
三类:各种技能经验等级
多结局
在强制剧情模式里,玩家不同的选择,在即时模式里的成果,以及在回合制模式里的胜败将会有多种不同的结局。
仿真性
本游戏的仿真性不在游戏画面上,而在于各种数值的真实性与行进手段的真实性上,同时还必须注意它的游戏性。如何把三者有机地统一在一起,将是这个游戏成功的关键。
结语
本游戏应该注意剧本编写中的人性刻画、情节曲折;数值设定上的平衡合理;美工上的特色风格;操作界面的友好。
严格地说这个游戏策划并不是一个mud,但是我认为要改成mud也是很好的,期待能打动你。
经典游戏制作教程
peng
1.游戏制作的主要流程
-------------------------------------------------------------------------------
电脑游戏开发小组中的任何一个人(这个角色通常有策划担任),只要有了一个新的想法 或念头,就孕育着一个新游戏的诞生。在这个创意被充分讨论之后,再加上对其操作过程的趣味性及市场销售的可行性的预测等因素的准确判断,一个完整的策划方案才可能产生。在经过充分的讨论后,策划人员必须将讨论的重点写成文字,也就是提出完整的策划方案,经决策者同意认可后,才能进下一步的工作。这份策划方案就像一部电影的剧本,它必须完整地涵盖整个游戏的故事、流程、内容、方式、游戏画面、角色造型、 场景规划、人工智能、硬件配备、市场评估等。对整个游戏过程的详细描述及实施规划都应 记录在案。 当进入创作过程之后,策划还必须随时和美术设计师和程序设计员保持联系,以免游戏程序的编写失控。策划应能对游戏设置的内容与精神了如指掌,与各个小组及时沟通,并且控制整个游戏制作的进程。
2.游戏设计基本论
-------------------------------------------------------------------------------
要设计一个游戏,首先你必须要确定几个重要方针,第一是你要设计的游戏是属於那一种类型,第二是时代背景,第三是模式,第四是程式技术,第五是表现手法,第六是市场定位,第七是研发时间,在掌握上述七个方针之後,你就可以再做详细的规划内容及调配资源,那麽何谓是七项方针呢? 笔者以范例来说明之!
一、类型:
所谓的类型是指这个游戏所着眼的一个游戏方式,通过这个方式来使玩者达到娱乐的目的,这个游戏方式有专有名词来各别予以命名,兹如下述:
(1) RGP角色扮演:
这个类型的游戏以通过故事剧情牵引来使玩家能溶入主角所存在的一个世界,这类型态的游戏多半透过战斗升级系统及人物对话的方式来一步步完成设计者所布下的剧情路线,最具代表的作品有日本史克威尔所设计的 "太空战士系列" 及国内大宇资讯所设计的"仙剑奇侠传",当然还有很多部作品例如"神奇传说"等也是此中的佼佼者。
在RGP的类型中,在近几年来又分支了几个类似的型态,例如说Blizzard的"暗黑破坏神"Dirblo"被定位为"动作RPG",因其动作成分相当高所至,而"神奇传说"、"超时空英雄传说"则被定位尽"战略RPG",只因战略成分比重较高所以又有别於传统RPG。
(2) SLG战略:
谈起战略游戏,大家最耳熟能详的应是日本光荣公司所出品的"三个系列",KOEI的三国志风靡东亚,从一代进化到现阶段的六代皆为玩家们所津津乐道,而所谓的战略游戏则是透过经营→战争→扩大领土三个手段来蠃得游戏最终目标,一般而言动态成分少,最较偏重於花费脑力的游戏,但从WestWood的新型态战略游戏"沙丘魔堡"问世之後,战略游戏也有了重大的分野,一是以KOEI代表的三国志系列被称为回合制战略游戏,一是以WestWood代表的C&C及Blizzard所代表的魔兽争霸被称为即时制战略游戏,和回合制所不同的是,即时制拥有较多可由玩家与电脑互动的机会,比较不花费脑力,所进行的 方式是建设→生产→攻击→歼灭,在业界有句俏皮话是这样说的:「玩回合制游戏像是自己当了个大将军(元首),运筹帷幄决胜千里之外,而玩即时制游戏则像是个士官长(部队指挥官),只能一味的打打杀杀」由此你可以了解到这两个型态的异同的了。
(3) ACT动作:
所谓的动作游戏其实就完全靠玩家的反应来做过关的条件,较有名的像DOOM、古墓奇兵、QUAKEⅡ 等,在动作游戏中也分支了相当多的类型,例如快打旋风、铁拳Ⅲ等被定位为格斗型态,主要游戏方式就是二人到四人互相对打一直到分出胜负为止,而DOOM、古墓奇兵则被定位为3D动作冒险游戏,主要目的为杀敌闯关,再来像阿比逃亡记、黑暗之心被定位为横向卷轴游戏,游戏方式就是以攻击跳跃等动作来走过一连串的关卡,表现方式多为2D卷动画面的方式在进行,再如飞龙骑士、极上疯狂大射击则被定为动作射击游戏,游戏方式就是闪躲射击冲过火网进而歼灭守关魔王为止,这些分支型态有共 通特点却又那样的不同,这也是动作游戏吸引人的重要原因。
(4) PZL益智:
这类型的游戏以趣味性的思考为游戏的主轴,内容可以包罗万,思维模式也可朝物理性及逻辑性方向着眼,具代表性的是大宇资讯的"台湾十六张麻将"、"大富翁"、"仓库番"等,而棋盘式的思考方式着名的有"决战中国象棋"及光谱资讯的"五子棋大师"等,这些游戏入手容易且不分男女老少皆喜欢的特性,使得益智型态的开发较有市场,成本也较低。
(5) ADV冒险:
冒险游戏的内涵多半脱离不了解谜的成分,是的!这类型的游戏让玩家抽丝剖茧的找出设在游戏背後暗藏的谜底,以顺利完成游戏,具代表作有恶灵古堡、异星搜奇、幽魂等,这类型的游戏年龄层较高,比较不适合国内厂商来研发。
当你在构思一个新的游戏企划时即应预先想的所属意的类型,然後才进行下一步的计划,一般而言国内市场接受度最高的莫过於 RPG角色扮演类型,这也是为何国内厂商会如此的大力研发RPG型态的游戏。
二、时代背景:
对於游戏美术来说是一个很重要的方针,因为决定一个时代背景所意味的是资料的搜寻工作方便与否,与美术人员在制定造形时需依据的范例;以国内市场来说多半能接受中国古代时代背景,基本上时代背景有好几种,例如说WestWood的红色警戒架构在公元2000年左右的未来,而魔兽争霸则定在虚幻的欧洲中古世纪中,三国志定位在汉朝末年,星海争霸架构在外太空世界,轩辕剑则定在春秋战国时代等。
时代背景绝对是企划人员在第一阶段规划整个游戏时已先决定好了,如此美术人员才能放心的去搜集资料。
三、模式:
当决定好类型及时代背景之後,再来就开始要去构思游戏中所要呈现的模式,如假设你的背景订在古代中国,而类型是定为即时战略,这时你必去思考出游戏内容的进行方式,可能你的游戏需要生产的因素,这个因素是什麽? 可以是粮食、矿产及木材,也可以是火山能源、石油、太阳能或天然气等,随着你故事情节上的需要而去制定项目,在作战方式上你所设计的模式可能会去考虑到地形因素、天候因素及资源因素,而且会大量运用到各种战术及攻击方法等,因为如此所以同一种类型的游戏虽多,但模式上却各有特色各有偏重的游戏路线,也各自聚集了拥护者,这就是模式设定的一个重要性,切记千万不可去抄袭他人所定的模式,因为这样一来,当你所设计的游戏完成之後,眼尖的玩家们会把你的产品以过时抄袭为由而弃如敝履,这在这剧烈竞争的国内市场而言是无法存活太久的。
四、程式技术:
无论你对一个游戏想得多好,架构设计多庞大,如果程式人员本身的技术无法配合的话,那其实一切还是流於空谈,所以在设计一个游戏之前必要先去徵询程式人员的意见,在现在这个环境中不仅程式人员要会Windows98及Wi-ndows NT相关技术,一个完整的系统分析及系统规划是不可缺少的,如此可以避免掉在程式中不可预期的错误出现,而且在一个游戏设计中最好有二个程式人员在运作,一个负责内部程式 (游戏核心引擎) ,一个负责外部程式(介面程式),这样方可发挥完整的战力。
五、表现手法:
在这个环节中,企划人员、程式人员、美术人员要做完善的沟通及讨论,一般我们知道大部份的电脑游戏是256 色的系统,在这些游戏中对於色盘的控制有相当严苛的要求,为了达到最好的视觉效果,美术人员通常会向程式人员要求多重色盘的资源,而程式人员则会考量到切换时的状况及记忆体配置是否能完全充份,在系统上的问题确定之後,企划人员会提出呈现效果的建议,例如说爆炸效果的表现方式,由内而外扩张到消失的火焰激烈型或包容大量烟雾的燃烧型,这要由企划人员依故事内容来给予定义,同时以物理性逻辑给予美术人员一个建议,再由美术人员前去绘制。
还有一个例子,以"C&C之红色警戒"与"AGO Empir世纪帝国"的海岸来说明,在"AGO Empir 世纪帝国"的海岸表现是静止的,海水不会流动,最多只有鱼在海中央跳跃,而"C&C"之红色警戒"的海岸表现手法是会流动的,但海中没有任何的特异之处,这两种表现手法各有各的好处及考量,但以笔者而言仍较偏爱"C&C之红色警戒"。
游戏内容的表现手法通常伴随着同类型游戏间的相异处而有不同的评价及支持者,而不光是美术效果的表现手法,企划人员构思的游戏玩法及程式人员的程式表现都有密切的关系。
六、市场定位:
不论你所设计的游戏构想如何的好,如果你没有去清楚的定位出你的市场走向,那麽到时制作完成的游戏软体可能会面临到销售不佳的窘状,所以在设计游戏之前你得知道你所定位的族群在那里,从下表中你可作一个市场定位的叁考:
年龄层 教育程度适合的类型内容
7~12岁 国小动作、益智较多趣味性、教学性
13~18岁 国中、高中动作、益智、 较多思考性质、图形精美化同 角色扮演、战略时又较多反射
19岁以上 低知识水平益智、动作较暴力及冒险、趣味性质,操 作简单
19~30岁 大专、大学以上角色扮演、战略富含多重思维性,可以影射周 、冒险、模拟、 遭事物,解谜及创造性运动
七、研发时间:
这是企划人员在初步规划中的最後一个项目,针对上述的制作方针你必须对美术人员及程式人员安排一个完整的SCHEDULE,从这个SCHEDULE中去研判律发时间,从企划的角度来说,为了不使良好的点子被其他游戏公司抢先推出,同时也要避免推出後模式已落伍,一个游戏的研发最好在一年内,最多不可超过18个月,以成本控制的角度来说比较符合获利标准。
假设你规划这个游戏需要一年的时间,那麽你就要去区分出美术制作时间 (第一线)及程式制作时(第二线)间的差异,并考量推出DEMO 版及游戏完成的时间,在适当时机打出游戏知名度,为游戏销售上打下一记商机。
制作流程
一个游戏的制作如果不能充份控制整个作业程序,那即有delay 的危险,大家都知道游戏软体delay对於销售上的影响会有多大,所以如何尽量避免de-lay是每个游戏设计者应极力去避免的,而要去避免游戏开发作业上delay的情况最重要的是严密控管作业流程及计划表。
那麽究竟游戏制作流程是一个什麽样的情形呢? 首先企划人员在执行制作的前一个月即要定出企划大纲及搜集可用资源,并经程式人员及美术人员确认後开始执行,我们以一个即时战略的游戏来说明,在制作分期程式人员即投入地图编辑器的撰写,而地图编辑器的逻辑设定要由企划人员先期规划,然後程式人员才根据企划人员的规划而进行程式写作。
在此同一时期美术人员即开始分工合作,一般一个游戏工作小组会有四位美术人员,他们分别负责造形、人物动作、介面、地图四个部分来制作,但这只粗分法,国内游戏公司较常使用这样的组合,在国外美术人员分为造形、人物动作、介面、地图、片头、过场、後制分镜、场景等九大部份,每个部份皆可能都有二人以上在作业,并有一名监制在执行风格及水准的品质控管,这些人统一由後制人员来与程式人员做交图及配合修图等沟通上的交流,所以说後制作美术人员的成败实关系到整个游戏品质的高低。
由於程式人员在设计地图编辑器时需要利用到一些图素来做测试,所以地图图素设计人员要先一步绘制出程式人员所需要的图素,
在程式人员测试通过之後方可进入大量生产的阶段,由於地图编辑器的设计者多半直接负责游戏引擎的制作,所以在初期企划人员便开始着手人工智慧AI的逻辑判断作详细的叙述,以期在程式人员撰写地图编辑器之後能立即作人工智慧AI的撰写,而在此同时负责撰写介面的程式人员亦与负责介面设计的美术人员作密切的配合,开始着手制作各个介面,因为介面不仅在游戏中是一个主司控制整个游戏的操作盘,同时也是一个游戏的外观,一个拥有优良创意的介面是很受 玩家喜欢的。 在测试地图编辑器时,程式人员亦需要利用移动物件(人)来测试地图上的障碍物判断及最短路径搜寻法,所以设计人物动作的美术人员在此时要先去做出一组人物动作供程式人员作测试,待程式人员把地图编辑器制作出来之後,人物动作设计的美术人员则只要不断的做并不断的把图给程式人员即可。
3.游戏设计十诫律
-------------------------------------------------------------------------------
Travis S. Casey
1. 编写你所喜爱的游戏
不要人云亦云。只要你和你的朋友喜爱就可以了。 同样道理,不要编写某个游戏主题仅仅因为它当前流行而已。编写你所喜欢的题材, 这样才能激发你的热情。
2. 经验是最好的老师
学习游戏编程最好的方法就是阅读大量的游戏程序。玩和分析这些游戏,然后设计 你自己的游戏或扩展游戏。我最主要的经验都是角色扮演类游戏,我的许多游戏范 例也来自它们,但思路却适用于所有类型的游戏。 我阅读过大量的RPG类游戏,粗略算算大约有七十多个。其中大部份我都玩过,精 通四十多个。不但玩和精通这些游戏,我还分析它们。是什么使得这些游戏好或者 不好?我如何修改它?哪些部份表现的出色?哪些部份不尽人意?为什么? 玩和分析过其它游戏后,我把这些知识用于我自己的游戏。比如在“超级英雄”类 游戏中,“斗士”和“英雄”在使用了“指数特性的换算法”取得较好的效果。如 果我想设计“超级英雄”类游戏时,我就知道“指数换算法”很可取。这样的分析 能给你许多被验证过的思想用于你的工作中。
3. 测试、测试、再测试
测试你的游戏,尽可能多次的玩。最好当你不在场的情况下,让别人来玩,过后再 告诉他们。(让别人当你不在的时候玩游戏称为:“盲测”) 还有,推敲你的规则。考虑假设情况,解决概率复杂性。比如,如果你正在设计一 个RPG,试着找出平均人们用弓箭从一米、五米、十米、五十米和百米范围内射中 人形大小目标的百分机率。对于二战游戏,检测你的监视器和解决一个小步兵摧毁 一辆坦克的机率。反复计算在不同的条件下,如:不同的地形、夜间等等。这将有 助于你找到在数学中出错的地方或建立了一个不好的假设。
4.学习背景知识
如果你想编一个中世纪的神奇游戏,就要去读中世纪的文学和历史。读有关魔法的 书及现有的中世纪传奇游戏。对其它类型的游戏也是如此,如果你想做一个越南战 争的游戏,就应去读有关战争的正史及野史,特别是战略、战术的分析。 所有的背景知识可以用于几种途径:首先,能帮助你创造出逼真的角色。另外它能 减少你在术语及背景知识方面,出现重大错误的可能性。当然,资料应该本身就很 有趣。如果对于所要学的都不感兴趣,那为什么还要编写这方面的游戏呢?
5. 正规教育
选一门介绍概率和统计的课。试着读一些游戏方面的数学理论。你可能觉得那没什 么用,但它能帮助透视算法的掌握。斟酌你的英语(或其它你发表游戏所用的语言) 当游戏描写得好的时侯,就更容易学,至少不能有大量的语法错误。 如果你想制作电脑游戏而没上过任何编程课时,不妨学几门。你可能学不到什么编 程序的具体东西,但一门好的课程可以教会你如何组织程序使之更容易维护和发现 错误。 建立一个“参考文献库”,它是一系列和你所制作游戏工程相关的游戏、书籍资料。 当你清晨三点突发灵感而图书馆却已关门的时侯,它将是非常有用的。
6. 抽取些时间
一个游戏就像孩子,当它刚出生时,它的父母总认为它是完美的。从你的游戏中抽 出些时间去得到一些新的观点,避免都耗在上面。一遍遍的重复这一过程。
7. 保留记录
确定你有一份以上的游戏拷贝。如果你是在电脑上输入的,就各保持一份硬盘和软 盘拷贝,另外再打印出一份清楚的最近版本(如每月打印一份,如果你干得快的话每 星期打印一份)。你不会觉得拷贝太多,因为你的好朋友们会来向你借或者想拥有拷 贝。而且这些拷贝能够减少你因为硬盘瘫痪或丢失笔记本等原因造成的丢失机会。 同样道理,保留旧版本的拷贝是有好处的。如果你在游戏测试时发现新的办法还不 如旧的好,而你却已将旧版本的扔掉了,这该怎么办?至少保留一份最后版本之前 的拷贝,同你当前版本的拷贝放在一起。
8. 其它注意事项
优秀的规划和书写是好的,但精美的视觉化说明对你的销售大有益处。如果你要自 己动手,就学一些桌面出版,或找一些现成的插图(比如:剪辑艺术或政府出版物) 或找别人帮你画些插图。 找个从事印刷业的人,和他探讨一些尽可能廉价的方法。低价格可以有助于销售, 低成本则有利于你的收益。
9. 记住这只是个游戏
不要因为制作游戏而忽略你的现实生活。如果有人不喜欢你的游戏,别介意。不用 担心别人窃取你的创意。记住第一条诫律,从你的所做中得到乐趣就行了。
10.没有第十条了 :-)
另外,这里有一些来自汤姆(“棱镜游戏”的主持者)的额外忠告,感谢汤姆!:
1.不断的创新是非常好的。如果你游戏中的所有东西都令人似曾相识,就好像是 偷来的。如果所有东西都与众不同又会让人感到陌生。常见题材单一独到的构思是 好的,但会使得你的游戏看来像个“变体”,而两个熟悉题材精明的创意则会使游 戏有新鲜感同时容易上手。因此不要试图彻底从新发明某样东西,而应把当前所拥 有的主意清晰化、简洁化的用于扩展关键观念的创新和趣味方面上。
2. 修正和雕琢你的游戏创意。测试不仅仅为了清除游戏和规则介绍中的错误,而 且就像一个讨论会,对照他们已经取得的东西,游戏设计师能够发现什么是真正所 要表达的。如果你将测试留到最后,这一发现将对你没有什么好处。如果你进行早 期的测试和经常从眼前试着发现这一游戏真正要表达的,你就能常常很大的改进这 一游戏。 “ Alpha”测试就像在问:“是否真有这个游戏?”“我得到它了吗?”“ Beta ” 测试看来在问:“是否用了最好的方法达到这一效果?”,“这是游戏的精炼吗? 或者它是否能被简化或删除?”“是否所有主要的游戏系统协同工作,给予了我所 期待的游戏体验?”“ Gamma ”测试又像在问“如何才能改善游戏的收支平衡 和介绍呢?”许多设计师停留在Alpha(生产一个吸引人但却是次品的游戏)之后或 者从Alpha直接到Gamma,跳过了Beta(生产一个好的但还不够完美的游戏)。 通常有必要靠你的亲密朋友/游戏小组及早的进行足够的批评性分析,帮助你发现如 何才能改进一个已经相当不错的游戏。
我的一些其它建议:
在我制作游戏过程中,从没有清晰明显的测试“阶段”。我倾向于每个阶段都做一 点。我修改一些系统,抛弃或替换一部分,改善其它的收支平衡和介绍,差不多是 在同时做的。这些部分来自于我所从事的主要游戏类型的设计-宇宙类RPG,你必须 在一个时间内干一个部分的事情。 关键在于去寻求达到你最好的作品。用不同的方法尝试,直到找到适合你的方法, 然后用它钻研下去。
4.游戏的剧情
-------------------------------------------------------------------------------
游戏剧情的重要是不言而喻的,特别是RPG游戏,相信广大玩家对"仙剑奇侠传" 熟得不能再熟了,这个游戏以剧情取胜(他的音乐也相当不错),各大媒体对他的 评价也都是以剧情为主,这个我就不多说了.
我也曾看过许多文章提到剧情的重要,这些文章说的相当好,相当有价值,但基 本上讲述的是剧情的要点及注意事项.而我将从另一个方面去分析游戏的剧情.
游戏的剧情是游戏的灵魂(当然除少数不需要剧情的游戏,如体育类,赛车等), 游戏通过各种各样的方法让玩家融入到设定的剧情上以打动玩家,但如果游戏 的剧情不吸引人,那么无论游戏的表现手法有多好也不能达到目的,但是怎样 的剧情才吸引人呢.
事实上中国与外国玩家有着很大的文化差异,这一点可以从各地所出产的游戏 上看得出来,欧美的游戏大多重视人物与场景的直实性,看上去就像电影,而东 方的游戏普遍追求漫画式的效果.但这两种风格哪种适合我们呢?答案是两种 都适合.不要忘记我们的玩家基本上是青年一代,对新事物的接受是相当快的, 对欧美的游戏我们的玩家接受得很快,从这可以看出国外的游戏制作是相当出 色的,就拿我自己举个例子,前两天我得到一款"生化危机2"的游戏,游戏开始 的动画可以说是扣人心弦,并且很好的衬托出了主题.而第二种风格的代表作 品就是"仙剑"了.
游戏所要表现的内容必须能够被玩家接受,而且还要有创新,这样的剧情才说 得过去.现在我们有一个很好的观察点,那就是电影,外国的制作精良的大片 挤进中国后给我们的冲击多么大,而中国传统题材的作品也给我们留下难忘 的印象.
我们不得不承认,在技术上我们与国外的游戏制作公司相比还差了一截,这 使得许多很好的题材我们不敢用,因为以现有的技术还不能很好的将他表现 出来,如果勉强还可能会起反作用(这是有例子的).
在这里我只是起一个开头的作用,什么样的剧情适合大家也不是一下能说清 楚,希望广大游戏爱好者能积极讨论这个问题,这也是我们中国游戏业现阶断 的一个重要的有待解决的问题.
5.角色扮演游戏的升级系统研究
-------------------------------------------------------------------------------
在一般的角色扮演游戏中,人物的成长是一件相当重要的事,无论是角色扮演游戏或是目前热门的策略型角色
扮演游戏(简称RSLG),这些升级系统都是游戏的一个重要部份。不过在一般的角色扮演游戏中,人物的升级
以及成长却有着很多种的处理方式。在本文中,笔者将为各位介绍各种角色扮演游戏中常用的升级方式,并且
分析各种作法的优缺点。
在一般的角色扮演游戏中,最常用的升级方式就是乱数式的成长方式。在这种模式中,当一名角色获得升级的
时候,程式会使用乱数来决定升级的各项指数,也就是说所有的升级数值都不是在控制中,而是依据一个乱数
表来决定提升的数值。这种升级的方式是如何处理的呢?
当人物到达升级的标准时,就会进入处理升级的副程式中,在这个副程式中程式会依设计者所定出的一个乱数
范围,来计算出这名角色所得到的升级指数,然後将这个数值加到需要增加的属性上。
在这种乱数决定升级的情况下,玩者所能够获得的升级数值,完全是由设计者订定的范围中求出,无论是升级
的上限或是下限都是在这个范围内,绝对不会有意外的情况发生,就算是设计者如何提高上限与下限,都不会
改变这些。这种作法虽然可以让设计者很轻松的订出升级的上下限,但是却不能控制升级时的不利因素,那就
是乱数的成份实在是太高了。若是有一名角色因为运气不好一直只有获得下限的升级数值,那麽它可能会比一
个一次就获得上限升级数值的角色要弱。举例来说,当这个乱数的范围是一到五的时候,若是角色甲和角色乙
分别获得上限和下限的升级数值,那麽会发生以下的状况:
┏ ┳ ┳ ┓
角色甲 角色乙
┣ ╋ ╋ ┫
LV1 10 10
LV2 15 11
LV3 20 12
LV4 25 13
LV5 30 14
LV6 35 15
┗ ┻ ┻ ┛
各位看看上表,是不是可以看到角色甲在第二级时的数值就已经和角色乙第六级的数值是相同了。由於乱数式
的升级方式会有这种不公平的情况发生,因此常会使得玩者的努力需要有一些运气的成份在里面;若是运气不
好,可能原本的努力都无法发挥所要的功效。
由於乱数式的升级方式有这样的缺点,因此有两种不同的改进办法,首先就是百分比制的升级方式。在这一种
办法里,角色在升级的时候还是使用乱数来进行,不过在每一个数字的出现比例上却做了一些调整。例如同样
的升级的范围还是从一到五,但是每一个数字的出现比例调整如下:
┏ ┳ ┓
数值 出现比例
┣ ╋ ┫
1 10%
2 20%
3 40%
4 20%
5 10%
┗ ┻ ┛
各位从上表中可以看到,在这一种处理方式上,每一个数字出现的比例做了一些调整。原本的乱数式中,每一
个数字的出现比例都是相同的,就以上面的例子来说,每个数字出现比例是百分之二时,因此上限和下限的数
值比较容易出现,发生不幸的情况比较多;但是在这样子调整後,上限和下限的数值出现的机会就减低了不少
,会发生不幸的情况就降低了。
虽然这样的作法可以降低不幸的发生机会,但是还是无法完全的克服所有的状况,因为还是有可能会发生相同
的状况,使得玩者陷入属性不佳的情况中。因此另外一种改良的方式~修正值升级方式就这麽出现了。
其实修正值的升级方式和原本的乱数处理法在计算的时候是完全相同的,只不过是它在升级到一个程度的时候
,会来做一次计算并且取出一个修正值,以免玩者因为运气不好无法达到升级的功效。
在这种作法上,上半部和乱数式的做法完全相同,唯一的不同是下半部的副程式。而这个副程式的作用就是在
帮一些升级时运气比较不好的玩者取得一点修正值。
我们就以前面所说的升级的数值是从一到五来做个例子,让玩者每升五级时就可以取得一点修正值。因此若是
一名角色在五次升级中都只有获得一点的升级值,那麽目前它的数值就是:
10 + 1 + 1 + 1 + 1 + 1 = 15
不过在我们的升级表内中等的数值是三,因此当角色升了五级之後,应该可以获得以下的数值:
10 + 3 + 3 + 3 + 3 + 3 = 25
这麽说来这名角色因为前五级的升级运气不好,因此少获得了十点的升级指数,所以我们就在这一次把这个缺
少的数值以修正值的方式补足,从修正值的计算式中可以得出:
25 - 15 = 10
就将这个数值加到角色的属性中,让角色不会因为运气太差而有不利的情况。若是角色在升级中都获得比较高
的数值,那麽修正值就是负的,也就表示不需要有修正值的存在了。
这种作法完全是为了不让玩者因为升级时运气不好使得属性太低,因此只能算是修正部份数值的作法,虽然不
能完全解决乱数式的问题,但是可以将不利的因素降低,因此在某些游戏里的确有采用这样的作法。
除了乱数式的作法外,还有一种是表列式的升级方式。在这种升级方式中,每一名角色的升级数值都是设计者
已经订好的,完全不会有任何的变动。它的好处是设计者可以完全掌控所有的升级状况,但是相对的这样子的
表格需要占掉较多的程式空间。
举例来说,某个游戏若是采用这种升级方式,那麽在它的记忆体中就需要有这样子的升级表格。若是游戏中有
七项属性会获得升级,等级共有一百级的变化,那麽基本上它就需要有七百个不同的数值表放在程式中。若是
一个数值用了两个位元(BYTE),那麽就需要用到1K左右的记忆体。如果说游戏中有四名角色,它们升级情况
又都是不同,那麽占掉的记忆体就将近有5K了。这麽算起来各位可能觉得不会很多,但是当这种资料越来越多
的时候,记忆体的消耗也就越来越多,使得程式的空间也越来越小了。
由於表列式的作法会使得升级的情况比较单调,因此大多数的游戏并不愿意采用这种作法,再加上这一类的作
法对於记忆体的占用空间也比较高,因此如果不是必要,大多数都不会用这种作法。
除了以上这些作法之外,还有一种就是指数型的升级方式。这种作法其实就是表列式的改良,因为它将升级的
表格简化成一个叁数,在升级的时候就依这个叁数来计算能够获得的升级值。现在我就举一个例子来示范。目
前有一名角色的属性以及升级指数如下:
o 生命:10 生命指数:10
o 法力:10 法力指数:10
o 力量: 3 力量指数: 2
o 智慧: 2 智慧指数: 2
o 反应: 2 反应指数: 2
o 体能: 4 体能指数: 2
o 运气: 1 运气指数: 3
那麽当他获得升级的时候,程式就会依这个升级指数来计算升到下一级时的各项属性值。因此在升了一级之後
,各项属性的数值就是以下的数字:
o 生命:20
o 法力:20
o 力量: 5
o 智慧: 4
o 反应: 4
o 体能: 6
o 运气: 4
用这种作法,在程式内不需要复杂的升级属性表,只需要几个简单的叁数就可以,若是能将各项叁数之间的关
系加以变化,并作一些运算,那麽可以使升级时的变化更多。举例来说生命的增加和体能有关,或是法力的增
加和智慧有关,那麽在计算起来时会有比较多的变化,使得整个升级的表现不会太单纯。
以上这些作法大部份的变化程度都不会很多,没有办法表现出一个人的成长情况。就像我们有时候会形容一个
人「大器晚成」或是说他「小时了了」这样子的情况都不能表现出来。因此後来又有一种成长曲线的升级方式
。在这种升级方式中,我们首先要订出几种不同的升级情况。像是:
A. 平衡成长
B. 大器晚成
C. 小时了了
要达成这种效果,我们需要将升级的总等级数分成几个阶段。我们以一个可以升到一百级的游戏来说,将每十
级分成一个区块,就可以订出这三种成长情况各要给它多少的数值。
其实这种曲线式的升级方式,在处理上和指数式的作法差不多,只不过指数式的作法一个人物每一种属性只会
有一个数值,这个数值是不会改变的。但是在曲线式的作法中,会依不同阶段有不同的升级指数,才可以造出
不同的成长情况。我们就以一名「大器晚成」的角色来说,这一类的角色在开始成长的比较慢,但是当人物成
长到一个阶段後,成长的速度就会加快,因此我们可能在前两个阶段只给他们一点的升级指数,後面几个阶段
再给他们较高的升级指数,使这名角色会在游戏後期升得比较快。
反过来说,若是要设计一名「小时了了」的角色,那麽我们在初期可以给他较高的升级指数,但是到了後期就
要给它较低的指数,如此一来就可以表现出这样的情况。
事实上,在游乐器中的「光明与黑暗续战篇」就曾经用过这一种作法,使得游戏中的每个角色都有各自不同的
特色。特别是有些属於大器晚成的角色,曾经因为初期成长的速度太慢而被玩者抛弃,但是後来知道这名角色
的特性之後,再回过头来训练的这种情况,正是这种曲线式升级的特色。这种作法使得角色除了单纯的数字属
性之外,还增加了一些隐藏的特性,会让游戏更有味道。
如果以笔者个人的喜好来说,我是比较欣赏曲线式的升级方式,因为这种方式比较可以隐藏角色的特色,也不
会因为数字的变化太过单调而让玩者觉得过死板。比起乱数式的不定性和升级指数式的单纯来说,这一种作法
可以说是兼具了两种的特色,同时还有全新的表现,是一种不错的升级方式。只惜目前国内的游戏很少使用这
种作法,大多还是采用乱数式的作法,对於国内玩游戏的玩者来说,实在是有些可惜,因为大家没有办法体会
到这种作法的优点。
6.游戏中的智能系统处理
-------------------------------------------------------------------------------
游戏中的智能对手
AI在游戏中最普通的形式是创建计算机控制的对手。因为大多数游戏是单人游戏,所以要设计游戏者在游戏中必须战胜对手。为了达到这个目的,你可以使用某种类似A*搜索的简单AI算法,以帮助对手穿过迷宫向游戏者发起进行。你也可以使用简单的算法预测游戏者的反应。
但是,记住没有必要创建世界上最强大的对手。你的对手只要能给游戏者提供足够的挑战性就可以了。还有,要注意游戏的内容。例如:一个战棋式RPG游戏中策略占的是主要地位;而在纯RPG中故事情节和角色开发就更重要一些。千万不要因为计算机对手太强大而让游戏者们陷入失败的泥沼。
游戏中的非智能对手
通常,在游戏开发中AI技术是与计算机对手紧紧联系在一起的。这是因为早期的大部分类似角棋的游戏是一对一的。但是,任何好的探险游戏或RPG 游戏开发者都知道,AI同样可以用于非对手角色。例如:如果你正在建立一个RPG游戏并且你想让你的世界活起来,这就是说,让城市里的人以智能的方式活动,那么你可以使用某种算法确定在一天中的某个时候,角色应该在那里。你可以使用类似于AI算法如A*来辅助你将一个对象从一处移动到另一处并绕过障碍物。
游戏中的智能系统
游戏中的AI在本质上是最具有模仿性的,但它们基本上是依赖一些AI要素。 你可以将所有具有决策功能的对象在一个游戏中融合为一个整体。例如:在一个战争游戏中,你的各个部分可以依据各自所处的具体环境来作出各自的AI决策。
使用这种方法,你得把精力集中于怎样在各个独立的决策个体之间建立联系,以及这些联系怎样才能使游戏成为融会贯通的整体。是用一个高级决策影 响其它决策,还是各个决策个体之间平等地互相影响呢?举个战争游戏来说, 你有十辆坦克,它们的思维模式基本相同。所以它们都决定去攻击敌人阵营中 HP值最低的一辆坦克。但是这时其中一辆坦克说:“这个敌人归我了!”那么 剩下的九辆坦克就应该依据这条信息各自调整下一步的攻击目标。当你建立智能个体时,要考虑在一个智能系统整体环境下,它应该如何行动。
7.电脑游戏中的人工智能制作
-------------------------------------------------------------------------------
电脑游戏随着硬件执行效率与显示解析度等大幅提升,以往很多不可能或非常难以实现的电脑游戏如此都得以顺利完成。虽然电脑游戏的呈现是那么地多样化,然而却与我们今日所要探讨的主题,人工智能几乎都有着密不可分的关系。
在角色扮演游戏中,程序员与企划人员需要精确地在电脑上将一个个所谓的“怪物”在战门过程中栩栩如生地制作出来;所以半兽人受了重伤懂得逃跑,法师懂得施展攻性法术。
目前能让人立刻想到与人工智能有密切关系的游戏有两种:
一是所谓的战棋/策略模拟游戏,二则是棋弈游戏。人工智能的比重与深浅度,在不同的游戏类型中各有不一。有的电脑游戏非标榜着高人工智能不可,不然没有人买;有的则是几乎渺茫到让玩家无法感觉有任何人工智能的存在。
导向式思考
AI最容易制作的的方式,同时也是早期游戏AI发展的主要方向就是规则导向或称之为假设导向。在一些比较简单的电脑游戏中,程序员可以好不困难地将游戏中的规则与设定转化成一条条的规则,然后将它们写成电脑程序。让我们以角色扮演游戏为例。决大多数的企画在设定所谓电脑怪物时,所设定的属性通常有以下几种:
生命值 攻击力 防御力 法力 属性
最后一个“属性”是我在设定时喜欢增加的项目之一。透过这项属性的设定,我可以把怪物设定成“贪生怕死的”,也可以把战士设定为“视死如归”。以目前我们所掌握的资料,在战门系统中的大纲如是诞生了:
规则一
if (生命值< 10) // 边临死亡了吗
{ if (属性== 贪生怕死)
结果 = 试图逃跑
if (有任何恢复生命值的物品或法术可用)
结果 = 使用或施展相关物品或法术
}
规则二
if (可施攻击性法术 && 有足够法力)
{
结果 = 施展攻攻击性法术
}
由以上一连串的“如果--就--”规则设定,建立了最基本的AI。说这样的制方式只能建立基本AI其实并不当然正确。只要建立足够及精确的规则,这样的方式仍然有一定水准的表现。
规则导向的最大优点就是易学易用。在没有深奥的理论概念的前提下,仍有广大的使用群。所以很多老道的玩家常常没两下就摸清楚敌人的攻击策略,移动方式等等。
推论式思考
相信曾经接触过电脑语言课程,或是自习过相关书籍的朋友们,都曾曾经听过一个著名的程序,那就是井字游戏。用井字游戏作为讨论AI的入门教材,我个人觉得是最适当的例子。或许有人还不知道井字游戏怎么玩。只要任何一方在三乘三的方格中先先成一线便胜利了。我们在前面谈过的规则导向,在这里也可以派得上用场。
if任何一线已有我方两子&&另外一格仍空//我方即将成一线吗
结果 = 该空格
if任何一线已有敌方两子&&另外一格仍空//防止敌方作成一线
结果 = 该空格
if任何一线已有我方一子&&另外两格仍空//作成两子
结果 = 该空格
有一次我在某本电脑书上,同样地也看到某些以井字游戏为介绍的范例。不同的是,我几乎看不到任何规则导向的影子。但在仔细分析该程序码后,我得到了极大的启发,原来AI是可以不用这么多规则来制作的。它用的方法正是在电脑AI课程中重要的概念:极大极小法。我在这里只说明这法则的概念。继续以井字游戏为例,电脑先在某处下子,接着会以假设的方式,替对方下子,当然,必须假设对方下的是最佳位置,否则一切则毫无意义。在假设对方下子的过程中,自然又需要假设我方的下一步回应,如此一来一往,直到下完整局游戏为止。 底下是节录书中的程序片段:
bestMove(int p, int*v)
{ int i;
int lastTie;
int lastMove;
int subV;
/*First, check for a tie*/
if (isTie()) {
*v=0;
return(0);
};
/*If not a tie, try each potential move*/
for (*v=-1, lastTie=lastMove=-1,i=0;i<9;i++)
{
/*If this isn't a possible, skip it*/
if (board[i]!=0) continue;
/* Make the move. */
lastMove=i;
board[i]=p;
/* Did it win? */
if (hasWon(p)) *v=1;
else{
/*If not, find out how good the other side can do*/
bestMove(-p,&subV);
/* If they can only lose, this is still a win.*/
if (subV==-1) *v=1;
/* Or, if it's a tie, remember it. */
else if (subV==0){
*v=0;
lastTie=i;
};
};
/* Take back the move. */
board[i]=0;
/*If we found a win, return immediately
(can't do any better than that)*/
if (*v==1) return(i);
/*If we didn't find any wins, return a tie move.*/
if (*v==0) return(lastTie);
/*If there weren't even any ties, return a loosing move.*/
else return(lastMove);
};
国外的一些论坛曾举行过256字节的游戏设计比赛。作品非常多,其中有一件作品正巧也是井字游戏。作者用区区两百多行就写了与上述程序演算方式完全相同的作品,可见功力确实了的。另外,我也很希望类似的活动能在国内推展起来。对了,在这样的比赛条件限制下,除了汇编语言外,几乎没有其它的选择了。 .386c
code segment byte public use16
assume cs:code, ds:code
org 100h
tictac proc far
start:
push cs
pop ds
mov ax,0B800h ; 清除屏幕
mov es,ax ;
xor di,di ;
mov cx,7D0h ;
mov ax,0F20h ;
rep stosw ;
xor cx,cx ;
mov dl,5
loc_1:
call printBoard
loc_2:
mov ah,8 ; 等待按键
int 21h
movzx bx,al
sub bl,31h ; 如果不是1..9
jc loc_2 ; 则重新输入
cmp bl,8
ja loc_2
cmp data_1[bx],al
jne loc_2
mov byte ptr data_1[bx],'x'
dec dl
jz short loc_3
mov al,'o'
call bestMove
mov [si],al
call isWin ; 判断是否已取得胜利
jnc loc_1
loc_3:
call printBoard
mov ax,4C00h
int 21h
data_1 db '12'
data_2 db '3456789'
data_3 db 0
tictac endp
printBoard proc near
mov si,offset data_1
mov di,548h
mov cl,3
locloop_4:
movsb
add di,5
movsb
add di,5
movsb
add di,133h
loop locloop_4
retn
printBoard endp
isWin proc near
mov bx,1
mov bp,3
call sub_3 ; 检查横向是否完成
inc bx
inc bx
dec bp
dec bp
call sub_3 ; 检查纵向是否完成
call sub_4 ; 检查斜向是否完成
clc
retn
isWin endp
loc_5:
stc
retn
sub_3 proc near
mov ah,3
mov si,offset data_1
loc_6:
mov di,si
call sub_5
add si,bp
dec ah
jnz loc_6
retn
sub_3 endp
sub_4 proc near
mov di,offset data_1
inc bx
call sub_5
mov di,offset data_2
dec bx
dec bx
call sub_5
retn
sub_4 endp
sub_5 proc near
mov cl,3
locloop_7:
cmp [di],al
jne short loc_ret_8
add di,bx
loop locloop_7
add sp,4
jmp short loc_5
loc_ret_8:
retn
sub_5 endp
bestMove proc near
mov bx,31FEh
mov cl,9
mov di,offset data_1
locloop_9:
cmp [di],bh ; #empty?
jne short loc_12 ; #no, skip
mov [di],al
pusha
call isWin ; #CY: Win
popa ;
jnc short loc_10 ;
mov bl,1
回想起当年我玩各种网络游戏的时候,一进游戏,什么都没有,眼前看着一堆穿着金光闪闪的漂亮装备的人跑来跑去,看到有人在不停的刷屏叫买叫卖的打着各种广告,有一种和现实社会截然不同的感觉,实打实的觉得自己在这个虚拟社会里面是个新手。虽然游戏都设置有密语等功能,但是这些对于新手来说,几乎是多余的,一开始总是一个人在孤单的打低级的怪物,这个时候的同伴只可能有两种人,一种是和你一样的新手,另外一种,则是练小号的人。(练小号这种现象非常有趣,在以后会详细讨论。)新手的生活是郁闷的,经常会被怪兽欺负,或者是被了解游戏比自己多一点的人所瞧不起(实际上等自己有机会接触到了解游戏比自己还少的人的时候,也会瞧不起别人)。有数据证明,在这个时期的玩家最容易退出游戏。
而另外有些玩家,运气比较好,碰上了一些对游戏了解得比较多的,又不会瞧不起他的玩家,然后会获得物质上的(装备,金钱)和文化上的(初等社交圈子)的一些帮助,慢慢的开始有了自己的社会关系(Social Relationship)。到了这个时候,玩家才会比较努力的开始练级,因为有了自己的社交圈子(Social Group & Organization),会想成为这个社交圈子中被大家公认的强者,最简单有效的方法,就是练级。但是从Feminist的角度来看,对于男性玩家,一般会比较喜欢成为某个社交圈子中的强者,要成为强者,就要摆脱其他的竞争者的威胁,这是男性一些天生的特性。而对于女性玩家,一般不太会喜欢这种激烈的直接竞争,而会选择一些间接的竞争,比如说装备,对好的装备的追求,因为这种追求并不会影响到社会圈子中其他的人。
慢慢的对游戏了解得越来越多,认识的人越来越多,基本上就脱离了新手这个范畴,然后才真正开始体验游戏本身提供的各种活动,即使游戏设计的是单人完成的活动,你也经常会喊上朋友来看你完成。总之,从现在开始,你的一举一动都属于Social Interaction了,就好像连现实生活中的“走路”这种行为都被定义为Social Interaction,因为这种行为都是受到社会的影响而造成的。而你,则在不停的努力保持和提高你的社会地位,一般的游戏中,用来衡量社会地位的东西一般是级别,而在某些设计得比较好的游戏中,级别不一定是最主要的衡量社会地位的东西。别的游戏我不太了解,说个我玩过的,《骑士Online》这个游戏,虽然目前状态并不理想,但是其中的形成的虚拟社会却是一个比较健康的社会。在这个游戏里面,用来衡量你的社会地位的东西,是一种叫国家贡献值的东西,实际上就是PK的杀人数和被杀死数的一个比例值。因为对于比较好的用来衡量的东西,一定要是大家都可以接触得到的,你的级别再高,在外表上体现不出来,或者大家不知道的话,就基本上没什么意义了。再说说《传奇》,其中也有个设计得很好的地方,就是大家都可以互相看到别人的级别和装备,如此一来,级别和装备就成了衡量社会地位的主要因素,因为大家都可以很便利的互相了解到这项参数。同样在现实社会中,在学校这个社会群体中,每个人都有GPA,每个班都有Top Student,成绩就成了大家都最容易access的参数。
当你成了老玩家了,再回过头来看看那些刚刚接触游戏的新手,他们就像自己当年一样,什么都不懂(这里提个概念,Power的定义就是对社会资源掌握的程度),对游戏,对游戏中的社会群体,什么都不了解。然后偶尔你也会心血来潮去帮助他们,就好像某人当年帮助自己一样。就像在现实社会中一样,看到路边的乞丐,偶尔也会帮助一把,但是,自己也会想,这么多乞丐,一个人怎么帮助得过来呢。实际上,这个问题在社会学里面是这样来看待的:这里要提出一个名词:Altruism。越是程度越高的社会阶级,Altruism这种现象就出现得越频繁。如果一个游戏的处于社会层次顶级的人越少,那么这个游戏的帮助新人的现象之会越少,不管你如何用其他的机制来激励玩家帮助新手,就如同有一些网络游戏,采取奖励帮助新手的人的政策,如果这个游戏处于社会顶层级别的人还是很少的话,同样是没有效果的。因为这种帮助人,是基于有目的性的,目的不是在于帮助新手,而是在于获取奖励,不但没有好效果,还会造成玩家利用这套系统的漏洞,作弊之类的后果。要让大家都喜欢帮助新手,就是让游戏在社会层次(Social Hierarchy)在高层的用户比较多一些,这样自然就会有很多Altruism的现象了。同样在现实社会中,有数据表明,相比较发展中国家,发达社会的人更喜欢帮助他人一些。
下面谈谈Bureaucracy和Government在网络游戏中的一些事实,Max Weber说过官僚系统分为理想的和现实两种情况,在理想的情况下,官僚系统是可以做到绝对公平的,而实际上经常因为个人的性格不同之类的因素,常常会造成不好的,甚至是负面的影响。这点在国内的网络游戏运营中体现的尤其突出,其实这个问题在现实中也是不可避免的问题,唯一比较好的处理方法,就是相信群众的眼睛的雪亮的,而提供各种投票和选举机制,并且鼓励玩家对一些事件或者改动的投票和选举。
接下来是Deviance 和Discrimination,这两个现象虽然是大家都不想谈起的,但是确实是网络游戏中或者是现实社会中比较严峻的问题。在网络游戏中,这两者造成的最严重的问题就是会导致某些玩家离开这个游戏(社会)。刚刚翻了翻书,找到一个Strain Theory,里面主要的意思就是讲玩家在得知自己肯定达不到某个目标的时候会感觉到Strain,比如说玩游戏玩了半年了,发现自己天生的属性没有选对,然后后天无法更改,导致自己比别人低一等之类的。这一点好像每个网络游戏都做得还不错(洗点?)。另外一个是叫“机会理论”(Opportunity Theory),这个很简单,实际上就是指当你发现你可以用非法的途径获取到合法途径获取不到的东西的情况下,你会铤而走险。这个在网络游戏中最典型的例子就是黑客,骗子,盗号之类的。还有最后一条理论,就是叫“控制理论”(Control Theory),这个在网络游戏中体现得最明显的就是引怪害人之类的人,他们的行为的产生的原因,是因为他们无法被一般的社会机构所接受,就好象一个玩家,玩了2,3个月游戏了,对游戏也了解得比较熟了,但是由于在游戏中大家都不愿意理他,就会造成他的Deviance的倾向。当然,这种人绝对不在少数,为什么其他人不会违反规则呢?因为有一些人找到一些能够收容,并能提供给他们一些成就感的场所。这就是为什么国家政府一直没有明着反对网络游戏的原因,有明摆着的数据证明,自从很多人接触网络游戏之后,社会治安好了很多。同样,在网络游戏中也需要这样的场所,要不然违法规则的人只会越来越多。
再谈谈前面谈到过的练小号的现象。练小号的人有两种,一种是由于游戏设计得不合理,导致高级别,或者越到后来之后,获取游戏资源的难度会比刚刚开始还要麻烦。所以就会有一批玩家来利用这个漏洞来比较快的获取资源。另外一种人,就是完全想创造一个新的自我,在游戏中扮演不同的角色。我这个学期的论文就是关于互连网络和社会学,所以对这个的资料了解得多一点。其主要的原因就是因为大到整个互连网络,小到一个网络游戏,最吸引人的地方之一,就是可以很随便的修改自己的Social Identity。可以完全按照自己的意愿来创造一个自己想象中的人物,而且可以随时完全重新来过。第二种练小号的人,就属于对自己在当前虚拟社会中的程度不太满意,进而想从新创造一个新的角色的那一类人。
场景管理之消息发送
好久没有写东西出来和大家共同揣摩,真是对不住大家了。现在终于腾了一些时间来继续和大家研究网络游戏制作技术,在这一节中,我就要向大家介绍网络游戏服务器中World场景划分和场景中消息分发问题。
在前面我基本向大家讲述的都是一些基本的技术问题,从某种意义上讲。属于纯技术范畴的东西,但现在要向大家讲的,应该是属于服务器功能设计范畴的。在这里,我未必讲的很好,有遗漏之处就请大家谅解和指正。
对于有一定游戏服务器开发基础的朋友而言,应该都明白一个网络游戏服务器和客户端之间的一个基本关系: 玩家客户端是游戏服务器一个局部COPY表现。这个说法听起来可能有一些绕口,简单的解释下也就是说:客户端所具备的区域信息也就是游戏服务器相同区域数据的一份COPY,而表现的意思,也就是说,CLIENT端将这样的数据信息图形化,并且通过屏幕来进行显示,从而来呈现出一个多姿多彩的游戏世界。这样说大家应该能够听懂了吧?再不懂的话,就自己琢磨了。
说了上面那么多,大家一定要问“SERVER和CLIENT这种关系和我们的消息发送又有什么关系呢?”。其实,我们要讨论的问题点也就在这里。但现在我还不说场景消息到底该如何进行分发。我们还是再来研究一个问题:什么能够使我们的游戏世界变的内容丰富?
大家先不要看我所说的,先自己想想。
大家应该都思考过了,我就来说一下我的个人想法和理解,可能和大家不一样(我想到的你没有想到的你补上,反之,我补上)。
在我们的MMOPRG游戏世界中,造成游戏世界变的丰富多彩一般无外乎两个大方面:NPC动作、玩家动作。呵呵,看起来就只有简单的两个方面,但具体分析这些动作起来,可就会让各位包括我都会头大的。先我们来说NPC动作吧,NPC动作通过AI逻辑进行控制,一般情况可以分为一下几个动作:待机、移动、物理攻击、技能攻击、魔法攻击、死亡等,而游戏中玩家动作的产生是由现实中玩家进行操控的,动作类型基本上也不外乎以上几种。既然在服务器游戏世界中存在这样的一些动作,那是如何进行获取的呢?其实就只有两个字:消息(Message)。而消息的产生方又分为两种:Client消息,Server消息。既然有消息产生,我们就将涉及到另外一个问题:如何将产生的消息分发出去呢?
下面通过我自己的实现经验来简单介绍场景消息的分发原理(详细介绍写的太多,有点懒!!),应该不是最佳的,我只是提一个开头,更好的处理实现方式还是需要大家来共同研究。有好的想法也希望告诉我下,我也从中学习些新的东西。
先看场景示范图(我画的,比较土,只是表明一个意思。呵呵)
通过上面设计示范图,我来具体介绍:关于场景消息分发,我的设计和分析过程:
第一步:将场景网络化,也就是说将我们的游戏服务器大场景进行逻辑上的区域划分,每个单独区域所占的面积可以考虑比屏幕区域稍微大点。同时为每一个单独的区域创建Player标志信息(SOCKET或者其他)列表。
第二步:将单独区域四分化,也就是说对于每一个小区域,再次划分为四个更加小的区域,同时为每一个小的区域建立一个包含三个对象的整数数组。数组的作用是为了保存此小区域的亲缘区域。例如: 小区域1的亲缘区域就是: A、B、H,小区域2的亲缘区域就是:B、C、D等。
第三步:在上面两步基础上,就是实际处理消息分发了。如果Player/NPC在区域中进行消息动作,我们通过Player/NPC的当前位置就可以首先确定Player/NPC所在大地图中的具体区域。在我们确定好了具体的区域后,我们要继续确定在那个具体的小区域。在这些小区域都确定后,我们就可以将我们的动作消息发送到亲缘区域中的Player(玩家)。
第四步:对于第三步的改变优化,用CPU处理量来换取消息数量,具体做法也就是,在亲缘区域中继续区域化。也就是说消息不是发送到亲缘区域中的所有Player(玩家),而是有选择的发送到自身一定区域的玩家。这种优化改革从某种意义上讲,可以减少服务器总消息数量,但增大CPU处理量,而对于具体实现,就需要大家去权衡了。
以上也就是这个分析和处理过程了。同时关于这个场景处理的.h文件,我也就简单的写下,大家参考了。
Class GmapRegion
{
public:
GmapRegion();
~ GmapRegion();
void GetBoardCastMsgList(POINT current_pos,LIST *); //获取当前位置广播消息的Player列表。
……..
private:
void Init();
voud Release();
bool InitMapRegion(int map_wis,int map_hei); //地图区域化
protected:
}
线程同步和服务器数据保护
最近因为自己主持的项目出现些问题,太忙了,所以好久都没有继续写东西和大家进行探讨制作开发部分了。在这一节中就要向大家介绍另外一个重要的部分,并且也是最头疼的部分:线程同步和数据保护。
关于线程的概念我在前面的章节中已经介绍过了,也就在这里不累赘—“重复再重复”了。有一定线程基础的人都知道,线程只要创建后就如同脱缰的野马,对于这样的一匹野马我们怎么来进行控制和处理呢?简单的说,我们没有办法进行控制。因为我们更本就没有办法知道CPU什么时候来执行他们,执行他们的次序又是什么?
有人要问没有办法控制那我们如何是好呢?这个问题也正是我这里要向大家进行解释和说明的,虽然我们不能够控制他们的运行,但我们可以做一些手脚来达到我们自己的意志。
这里我们的做手脚也就是对线程进行同步,关于同步的概念大家在《操作系统》中应该都看过吧!不了解的话,我简单说说:读和写的关系(我读书的时候,请你不要在书上乱写,否则我就没有办法继续阅读了。)
处理有两种:用户方式和内核方式。
用户方式的线程同步由于有好几种:原子访问,关键代码段等。
在这里主要向大家介绍关键代码段的处理(我个人用的比较多,简单实用)。先介绍一下它的一些函数,随后提供关键代码段的处理类供大家参考(比较小,我就直接贴上来了)
VOID InitializeCriticalSection( //初始化互斥体
LPCRITICAL_SECTION lpCriticalSection // critical section
);
VOID DeleteCriticalSection( //清除互斥体
LPCRITICAL_SECTION lpCriticalSection // critical section
);
VOID EnterCriticalSection( //进入等待
LPCRITICAL_SECTION lpCriticalSection // critical section
);
VOID LeaveCriticalSection( //释放离开
LPCRITICAL_SECTION lpCriticalSection // critical section
);
以上就是关于关键代码段的基本API了。介绍就不必了(MSDN)。而我的处理类只是将这几个函数进行了组织,也就是让大家能够更加理解关键代码端
.h
class CCriticalSection //共享变量区类
{
public:
CCriticalSection();
virtual ~CCriticalSection();
void Enter(); //进入互斥体
void Leave(); //离开互斥体释放资源
private:
CRITICAL_SECTION g_CritSect;
};
.cpp
CCriticalSection::CCriticalSection()
{
InitializeCriticalSection(&g_CritSect);
}
CCriticalSection::~CCriticalSection()
{
DeleteCriticalSection(&g_CritSect);
}
void CCriticalSection::Enter()
{
EnterCriticalSection(&g_CritSect);
}
void CCriticalSection::Leave()
{
LeaveCriticalSection(&g_CritSect);
}
由于篇幅有限关键代码段就说到这里,接下来向大家简单介绍一下内核方式下的同步处理。
哎呀!这下可就惨了,这可是要说好多的哦!书上的罗罗嗦嗦我就不说了,我就说一些我平时的运用吧。首先内核对象和一般的我们使用的对象是不一样的,这样的一些对象我们可以简单理解为特殊对象。而我们内核方式的同步就是利用这样的一些特殊对象进行处理我们的同步,其中包括:事件对象,互斥对象,信号量等。对于这些内核对象我只向大家说明两点:
1.内核对象的创建和销毁
2.内核对象的等待处理和等待副作用
第一:内核对象的创建方式基本上而言都没有什么太大的差别,例如:创建事件就用HANDLE CreateEvent(…..),创建互斥对象 HANDLE CreateMutex(…….)。而大家注意的也是这三个内核对象在创建的过程中是有一定的差异的。对于事件对象我们必须明确指明对象是人工对象还是自动对象,而这种对象的等待处理方式是完全不同的。什么不同下面说(呵呵)。互斥对象比较简单没什么说的,信号量我们创建必须注意我们要定义的最大使用数量和初始化量。最大数量>初始化量。再有如果我们为我们的内核对象起名字,我们就可以在整个进程中共用,也可以被其他进程使用,只需要OPEN就可以了。也就不多说了。
第二:内核对象的等待一般情况下我们使用两个API:
DWORD WaitForSingleObject( //单个内核对象的等待
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);
DWORD WaitForMultipleObjects( //多个内核对象的等待
DWORD nCount, // number of handles in array
CONST HANDLE *lpHandles, // object-handle array
BOOL fWaitAll, // wait option
DWORD dwMilliseconds // time-out interval
);
具体怎么用查MSDN了。
具体我们来说等待副作用,主要说事件对象。首先事件对象是分两种的:人工的,自动的。人工的等待是没有什么副作用的(也就是说等待成功后,要和其他的对象一样要进行手动释放)。而自动的就不一样,但激发事件后,返回后自动设置为未激发状态。这样造成的等待结果也不一样,如果有多个线程在进行等待事件的话,如果是人工事件,被激活后所有等待线程成执行状态,而自动事件只能有其中一个线程可以返回继续执行。所以说在使用这些内核对象的时候,要充分分析我们的使用目的,再来设定我们创建时候的初始化。简单的同步我就说到这里了。下面我就将将我们一般情况下处理游戏服务器处理过程中的数据保护问题分析:
首先向大家说说服务器方面的数据保护的重要性,图例如下:
用户列表
用户删除
用户数据修改
使用数据
加入队列
对于上面的图例大家应该也能够看出在我们的游戏服务器之中,我们要对于我们用户的操作是多么的频繁。如此频繁的操作我们如果不进行处理的话,后果将是悲惨和可怕的,举例:如果我们在一个线程删除用户的一瞬间,有线程在使用,那么我们的错误将是不可难以预料的。我们将用到了错误的数据,可能会导致服务器崩溃。再者我们多个线程在修改用户数据我们用户数据将是没有办法保持正确性的。等等情况都可能发生。怎么样杜绝这样的一些情况的发生呢?我们就必须要进行服务器数据的保护。而我们如何正确的保护好数据,才能够保持服务器的稳定运行呢?下面说一下一些实际处理中的一些经验之谈。
1.我们必须充分的判断和估计我们服务器中有那些数据要进行数据保护,这些就需要设计者和规划者要根据自己的经验进行合理的分析。例如:在线用户信息列表,在线用户数据信息,消息列表等。。。。。
2.正确和十分小心的保护数据和正确的分析要保护的数据。大家知道我们要在很多地方实现我们的保护措施,也就是说我们必须非常小心谨慎的来书写我们的保护,不正确的保护会造成系统死锁,服务器将无法进行下去(我在处理的过程中就曾经遇到过,头都大了)。正确的分析要保护的数据,也就是说,我们必须要估计到我们要保护的部分的处理能够比较快的结束。否则我们必须要想办法解决这个问题:例如:
DATA_STRUCT g_data;
CRITICAL_SECTION g_cs;
EnterCriticalSection(&g_cs);
SendMessage(hWnd,WM_ONEMSG,&g_data,0);
LeaveCriticalSection(&g_cs);
以上处理就有问题了,因为我们不知道SendMessage()什么时候完成,可能是1/1000豪秒,也可能是1000年,那我们其他的线程也就不用活了。所以我们必须改正这种情况。
DATA_STRUCT g_data;
CRITICAL_SECTION g_cs;
EnterCriticalSection(&g_cs);
PostMessage(hWnd,WM_ONEMSG,&g_data,0);
LeaveCriticalSection(&g_cs);
或者 DATA_STRUCT temp_data;
EnterCriticalSection(&g_cs);
temp_data = g_cs;
LeaveCriticalSection(&g_cs);
SendMessage(hWnd,WM_ONEMSG,& temp_data,0);
3.最好不要复合保护用户数据,这样可能会出现一些潜在的死锁。
简而言之,服务器的用户数据是一定需要进行保护,但我们在保护的过程中就一定需要万分的小心和谨慎。这篇我就说到这里了,具体的还是需要从实践中来进行学习,下节想和大家讲讲服务器的场景处理部分。先做事去了。呵呵!!有好的想法和建议的和我交流探讨,先谢谢了。
服务器程序设计部分
续上在这里我将要向大家简单介绍一下游戏服务器中必须要处理另外一项主要技术:
内存分配处理技术也可以称为内存池处理技术(这个比较洋气,前面通俗的好,呵呵)
开始向大家介绍一般情况下我们对于内存的一些基本操作。简单而言,内存操作就只有三个步骤:申请、使用、销毁。而对于这些操作我们在C和C++中的处理方式略有不同:
在C中我们一般用malloc(….)函数来进行申请,而对应销毁已经申请的内存使用free(…)函数。
在C++我们一般使用new操作符和delete操作符进行处理申请和销毁。
大家一定要问了,我们一般都是这样处理的呀!!没有什么可以说的哦!!呵呵,我感觉就有还是有一些东东和大家聊的哦。先聊简单几条吧!!
1.Malloc(…..)和free(….), new ….和 delete …必须成对出现不可以混杂哦,混杂的话,后果就不可以想了哦!!(也没有什么,就是内存被泄漏了,呵呵)
2.在我们使用new …和delete ….一定要注意一些细节,否则后果同上哦!!什么细节呢?下面看一个简单的例子:
char *block_memory = NULL;
block_memory = new char[1024];
delete block_memory;
block_memory = NULL;
大家沉思一会。。。。。。。。。
大家看有错吗?没有错吧!!
如果说没有错的,就要好好补补课了,是有错的,上面实际申请的内存是没有完全被释放的,为什么呢?因为大家没有注意第一条的完全匹配原则哦,在new 的时候有[ ],我们在delete 怎么就没有看见[ ] 的影子呢? 这就造成了大错有1023个字节没有被释放。正确的是 : delete []block_memory;
关于内存基本操作的我是说这两条,其他要注意还是有的,基本就源于此了。
了解了上面那些接下来就想大家说说服务器内存处理技术了。上面都没有弄清楚了,就算了。呵呵。
大家都知道,我们的服务器要频繁的响应客户端的消息同时要将消息发送到客户端,并且还要处理服务器后台游戏World的运行。这样我们就必须要大量的使用内存,并且要进行大量的内存操作(申请和销毁)。而在这样的操作中,我们还必须要保证我们的绝对正确无误,否则就会造成内存的泄漏,而内存泄漏对于服务器而言是非常可怕的,也可能就是我们服务器设计失败的毒药。而我们如何进行服务器内存的正确和合理的管理呢?那就是我们
必须建立一套适合我们自己的内存管理技术。现在就向大家说一说我在内存管理方面的一些做法。
基本原理先用图形表示一下:
回收内存块
超大块内存
现在要申请的内存块
上面的意思是:我们在服务器启动过程中就为自己申请一块比较大的内存块,而我们在服务器运行过程中需要使用内存我们就到这样一块比较大已经申请好的内存块中去取。而使用完后要进行回收。原理就是这么简单。而最重要的是我们如何管理这个大的内存块呢?
(非常复杂也比较难,呵呵)
首先 就内存块操作而言就只有申请(类似 new)和回收(类似 delete)。
其次 我们必须要清楚那些内存我们在使用中,那些是可以申请的。
关于上面我简单将这样的一些数据结构和class定义在下面供大家参考使用。
typedef struct MemoryBlock //内存块结构
{
void *buffer; //内存块指针
int b_Size; //内存块尺寸
} MemoryBlock;
class CMemoryList //列表对象类(相当于数组管理类)
{
public:
CMemoryList();
virtual ~ CMemoryList();
void InitList(int data_size,int data_num);//初始化列表数据结构尺寸和数量
void AddToList(void *data); //加入列表中
void DeleteItem(int index); //删除指定索引元素
……………..
private:
void Init();
void Release();
private:
void *memory;
int total_size;
int total_num;
protected:
};
classs CMemoryPool //内存池处理类
{
public:
CMemoryPool();
virtual ~ CMemoryPool();
bool InitMemoryPool(int size); //初始化内存池
void * ApplicationMemory(int size); //申请指定size内存
void CallBackMemory(void *,int size); //回收指定size内存
private:
void Init();
void Release():
MemoryBlock *UniteMemory(MemoryBlock *block_a,MemoryBlock * block_b); //合并内存
private:
MemoryBlock memoryPool_Block; //内存池块
CMemoryList *callBackMemory_List; //回收内存列表
CMemoryList *usingMemory_List; //使用中内存列表
CMemoryList *spacingMemory_List; //空白内存列表
protected:
};
以上就是这个内存管理类的一些基本操作和数据定义,class CMemoryList 在这里不是重点暂且就不说了,有空再聊。而具体的内存池处理方法简单叙述如下:
函数InitMemoryPool(): 初始化申请一块超大内存。
函数ApplicationMemory():申请指定尺寸,申请内存成功后,要将成功申请的内存及其尺寸标示到usingMemory_List列表,同时要将spacingMemory_List列表进行重新分配。以便于正确管理。
函数CallBackMemory():回收指定尺寸内存,成功回收后,要修改spacingMemory_List列表,同时如果有相邻的内存块就要合并成一个大的内存块。usingMemory_List修改使用列表,要在使用列表中的这一项删除。
以上就是一些简单处理说明,更加详细的就需要大家自己琢磨和处理了。我就不细说了。呵呵。不足之处就请大家进行指正,以便让我们大家都提高。先谢谢了。
线程池处理部分
续上在这里我将要向大家简单介绍一下游戏服务器中必须要处理另外一项主要技术:
线程池技术
开始 我来向大家简单来介绍一下线程池的概念,先简单了解下线程先,线程可以理解为一个function , 是一个为了进行某一项任务或者处理某一项具体事务的函数。例如:
UINT WINAPI FunctionCtrl(void *) //线程处理函数
{
进行某一项任务或者处理某一项具体事务
………….
return EXITFUNCTION_CODE; //退出码
}
而我们的线程池自身可以理解为是很多线程的一个管理者也可以说是一个很多线程的统筹者。因为我们的线程池具有生成线程功能也具有撤消线程的权利。这就是简单的线程池的概念(我的理解,呵呵!!)接下来就来具体介绍线程池了!!
首先 介绍我们为什么要使用线程池技术呢?大家都知道我们的游戏服务器端要处理大量的用户请求,,同时需要发送大量的游戏数据到客户端,从而来驱动客户端程序的执行和维持游戏的进行。那我们的服务器端是如何进行处理的呢?其实在这里我们就充分用到了线程池技术。
那么用这种技术有什么好处和优点呢?以下就来简述这些,有不足之处和不当之处希望有心人指正,呵呵!!
大家都了解在我们服务器整个运行过程中,我们将整个运行时间分成很多个时间片。而对于这些已经分成的各个微小的时间片而言,在各个不同时间片中要处理的用户请求和需要发送到用户端的游戏数据量也将是不一样的。而处理用户的请求和发送数据到客户端的工作都是由一系列的线程来执行的。
鉴于上面,这样我们就可以感性的设想下服务器运行中的两种情况:
第一种在我们服务器运行到某个时间片需要处理大量的用户请求和发送大量数据,有这样繁重的工作任务,我们就需要有很多的工作者线程来处理完成这样的任务,以此来满足我们的工作需要。这样说我们就必须拥有很多工作者线程。
第二种在我们服务器运行到某个时间片需要处理的用户请求和发送数据工作量比较小,由于任务比较少,我们用来处理任务的工作者线程也就不需要很多。也就是说我们只要有少量的工作者线程就可以达到我们的工作要求了。
对于上面的两种情况,我们可以说明这样的一个事实,也就是说我们服务器在运行过程中运行状态是动态改变的,呼忙呼闲,时急时慢的。服务器的这样的行为动作和性质可以做一个如下比喻:服务器就是一个企业,在企业业务非常忙的时候,公司的员工数量就必须要增多来满足业务的需要。而在企业不景气的时候,接的业务也就比较少,那么来说就会有很多员工比较闲。那我们该怎么办呢?为了不浪费公司资源和员工自身资源,我们就必须要裁减员工,从而来配合公司的运行。而做这样工作的可能是公司的人力资源部或者其他部分。现在就认为是人力资源部了。呵呵。
对于上面的比喻我们来抓几个关键词和列举关键词和我们主题对象进行对照,以此来帮大家来简单理解服务器运行和线程池。
企业 : 游戏服务器
人力资源部 : 线程池
职员 : 工作者线程
在说了这么多的废话后,就具体的将线程池模型 ThreadPool.h文件提供以供大家参考:
class GThreadPoolModel
{
friend static UINT WINAPI PoolManagerProc(void* pThread); //线程池管理线程
friend static UINT WINAPI WorkerProc (void* pThread); //工作者线程
enum SThreadStatus //线程池状态
{
BUSY,
NORMAL,
IDLE
};
enum SReturnvalue //线程返回值
{
MANAGERPROC_RETURN_value = 10001,
WORKERPROC_RETURN_value = 10002,
…………….
};
public:
GThreadPoolModel ();
virtual ~ GThreadPoolModel ();
virtual bool StartUp(WORD static_num,WORD max_num)=0; //启动线程驰
virtual bool Stop(void )=0; //停止线程池
virtual bool ProcessJob(void *)=0; //提出工作处理要求
protected:
virtual bool AddNewThread(void )=0; //增加新线程
virtual bool DeleteIdleThread(void)=0; //删除空闲线程
static UINT WINAPI PoolManagerProc (void* pThread); //线程池管理线程
static UINT WINAPI WorkerProc (void* pThread); //工作者线程
GThreadPoolModel::SThreadStatus GetThreadPoolStatus( void ); //获取线程池当前工作状态
private:
void Init();
void Release();
protected:
………………………..
private:
};
以上是线程池模型的一个简单class,而对于具体的工作处理线程池,可以由此模型进行继承。以此来满足具体的需要。到这里就简单的向大家介绍了线程池的处理方式。有不对之处望指正。同时欢迎大家和我交流。
消息打包处理部分
续上在上面我简单的说了一下服务器完成端口处理部分,接下来我想大家介绍一下关于如何建立服务器和客户端的联系规则,也就是服务器和客户端的游戏协议部分。有不足之处希望大家和我进行交流。
首先解释一下这里协议的概念,协议大家都了解是一种通信规则,例如:TCP/IP,UDP等等,这些是我们在网络通信过程中所处理使用的协议。而我们这里的协议是我们的游戏服务器和客户端的通信规则。简而言之,也就是客户端发送到服务器的数据包和服务器发送的数据包双方解释规则。下面就通过几个部分来具体介绍这种协议的建立和处理。
消息头定义
如果我们能够解释双方的数据包的意义,我们就必须为双方数据包定义一个统一规则的消息头,我是这么定义消息头的。服务器数据包和客户端数据包分别定义不同的消息头。以下就是双方消息头的简单定义。
struct ServerMsg_Head //服务器消息头
{
WORD s_version; //版本信息
BYTE s_flages; //消息标志
BYTE s_who; //消息驱动者
BYTE s_sort; //消息类别
BYTE s_value; //消息值
WORD s_len; //消息长度
} ;
struct ClientMsg_Head //客户端消息头
{
WORD c_version; //版本信息
WORD c_flages //消息标志
WORD c_sort; //消息类别
WORD c_value; //消息值
WORD c_scene; //场景信息
WORD c_len; //消息长度
};
以上是我个人简单定义的消息头,具体的各个参数意义,就是需要规划设计的人来定了。这些我就不多说了。
在我们处理完我们的消息头后,我们就可以将我们的具体游戏数据进行打包。关于数据打包,我们必须要处理两件事情:数据打包,数据加密。为此我就建立相应的class来处理这样的一些操作。DataCtrl.h处理如下:
class Ppackage类可以拆解为两个单独处理类,打包类和解包类。而此处我就用下面一个类来进行处理。只是给大家开个头,要设计的更好还是靠大家共同来进行斟酌呀!!
class PPackage //游戏数据包处理类
{
public:
PPackage(BYTE msg_type); //设置所打包消息类型
virtual ~PPackage();
//消息数据打包部分
void SetMsgHead(void *); //设置消息头
void AddByte(BYTE data); //加入一字节
void AddWord(WORD data); //加入二字节
void AddDword(DWORD data); //加入四字节
void AddPoint(POINT data); //加入八字节
void AddBuf(char * data ,int data_len); //加入多个字节
//消息内容获取
void FinishPack(); //完成打包
char *GetPackage(); //获取数据包
int GetPacketLen(); //获取数据包长度
//消息数据解包部分
void SetMsgPackage(char *buf,int _Len); //将获取消息进行录入
void *GetMsgHead(); //获取消息头数据
BYTE GetByte(); //获取一字节
WORD GetWord(); //获取二字节
DWORD GetDword(); //获取三字节
POINT * GetPoint(); //获取四字节
char * GetBuf(int buf_len); //获取多字节
bool IfFinishGet(); //是否完成解包
private:
void Init();
void Release();
void StartBindPakage(); //开始打包
void StartUndoPackage(); //开始解包
bool MessageEncrypt(); //消息加密
bool MessageUndo(); //消息解密
private:
private:
BYTE msg_type; / /{1-SERVER_PACKAGE=1,2-CLIENT_PACKAGE=2}
char * msg_buffer;
char * buffer; //后备缓冲区
int msg_len;
//消息内容长度
Server_Msg_Head msg_Head; //消息头
int buf_Len;
int current_pos; //指针的当前位置
protected:
};
以上就是关于服务器和消息打包类的一些建立和解释,这些方面知识其实也没有什么,主要是“仁者见仁,智者见智”了。而对于网络游戏的制作最重要的还是在于Game World的规划和设计,同时这个方面也是最难和最不好处理的。随后将和大家进行探讨。。