超级俄罗斯方块的设计.docx
《超级俄罗斯方块的设计.docx》由会员分享,可在线阅读,更多相关《超级俄罗斯方块的设计.docx(42页珍藏版)》请在冰豆网上搜索。
![超级俄罗斯方块的设计.docx](https://file1.bdocx.com/fileroot1/2023-1/2/972162d5-8383-44fa-b8e0-b042c1a6f226/972162d5-8383-44fa-b8e0-b042c1a6f2261.gif)
超级俄罗斯方块的设计
超级俄罗斯方块的设计
摘要
俄罗斯方块最早由俄罗斯人AlexPajitnov制作,其规则非常简单:
即让玩家控制自动下落的数种形状不同的方块,若在游戏区堆满一行或者数行,则消除,并得分。
当游戏区不能再堆积新的方块时,则判定玩家失败,游戏结束。
本文介绍的俄罗斯方块,拥有数个级别,随着分数的提高,级别会自动上升,级别越高游戏难度则越高。
本文讨论的是如何以JASS脚本语言编写俄罗斯方块的整体思路及方法,通过脚本语言捕捉玩家键盘输入,将其反馈至程序中,自动计算出逻辑结果,并属于显示与屏幕之上。
本文中,我采用了矩阵方式记录方块数据及游戏区方块坐标数据,采用对单位格图片的颜色更改及显示与否,来实现显示方块的移动,碰撞和消除,通过一系列算法来获得碰撞关系及逻辑结果并将其显示在屏幕之上。
关键词:
俄罗斯方块;JASS;消除;矩阵
TetrisDesign
ItiscreatedbyarussiancalledAlexPajitnov,anditsruleissimple:
Lettheplayercontrolablockfallingwithsomedifferentforms.Ifoneline/morelinesisfilledwithblocks,theplayerwillgetpointwithclearingtheblocks;otherwise,thegamewouldbeoverwhenthereisnospacetoputanewblock.
TheTetrisintroducedinthisarticlehassomelevelwhichwouldlevelupalongwiththegrowingpoint,andmakethegameharder.
ThisarticlediscusseshowtoJASSscriptinglanguageTetrisoverallconceptandmethodoftheplayerthroughascriptinglanguagetocapturekeyboardinput,tofeedbacktotheprocess,automaticallycalculatesthelogicaloutcome,andaredisplayedonthescreen.
Thisarticle,Iusethematrixmethodofdatarecordingbox,andgameareaboxcoordinatedataoftheunitcellwiththecolorchangeanddisplayimagesornot,toachievethedisplaybox,move,collisionsandeliminate,throughaseriesofalgorithmsrelationsandlogicalaccesstocrashanddisplaytheresultsonthescreen.
Keywords:
Tetris;JASS;Clear;matrix
超级俄罗斯方块的设计
前言
俄罗斯方块原本是前苏联科学家阿列克谢·帕基特诺夫所开发的教育用软件,之后开始提供授权给各个游戏公司,造成各平台上软件大量发行的现象。
由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。
目前,俄罗斯方块由于大受欢迎,因而除了原有的版本之外,还衍生出了其他大量版本,例如台湾交通大学大一学生蔡祈岩与王功华制作并于1990年由台湾的智冠科技(当时叫软体世界)出版的“决战俄罗斯(FacetoFace)”,立体方块(3D版本的俄罗斯方块),脸谱方块(将脸谱分割为5个部分,需要组成正确的脸谱才能过关)等等。
本文介绍的设计是通过由JASS编写的代码来实现俄罗斯方块游戏的设计。
该设计是通过平台获取玩家操作,对玩家的操作进行分析后,移动屏幕上正在掉落的方块,对其碰撞/接触进行计算,并实时检测是否满足消除得分条件或者游戏结束条件,并将结果反馈至屏幕上,同时显示下一个方块,游戏难度及玩家得分情况。
可以看出涉及到的部分有:
按键检测及判断、方块碰撞/接触处理、条件检测、数据显示等几个部分。
可以用下图简单表达:
按键检测及判断
继续下落
游戏结束
检测碰撞情况
是否满足条件
无
产生新的下落方块,等待玩家输入
无可用区域
碰撞有
某一行/多行已被填满
消除满足条件的行,并增加玩家分数
图1程序模块流程图
该设计主要是对按键检测判断后的数据进行处理计算,对方块的移动,碰撞,各类条件的判断等编写一个可以运行的程序,并且在运行平台上进行测试,达到预期的效果。
在这次设计中,通过初始化函数描绘整个游戏界面,并初始化相关数据,在玩家输入指定字符串后,开始游戏,并在屏幕上输出目前游戏动态。
通过检测获取玩家输入的指令及目前的游戏数据,实时计算处理后,得出相关结果。
并刷新屏幕上显示的当前状态。
若玩家满足升级情况,则提升游戏难度等级;若玩家满足得分情况,则提升玩家积分;若满足游戏结束要求,则提示GAMEOVER;若不满足以上所有条件,则执行下一个检测。
本文通过具体介绍设计过程中的操作步骤来说明设计相关的知识。
详细的介绍设计的过程,使得更加容易理解这次的设计内容。
第1章电子游戏的分类及其现状
1.1电子游戏及其分类
电子游戏,即是运行在家用电脑、家用电子游戏机或者是掌上游戏机以及街机上的电子游戏程序。
是一种结合剧情故事、美术、音乐、动画、程序等众多技术于一身的互动型娱乐软件。
从电子游戏的分类来看,有着很多种分类方式。
传统的游戏分类是按照游戏的类型,将其分为即时战略游戏、第一人称射击游戏、角色扮演游戏、策略型游戏等几大类别。
根据游戏运行平台的不同,又可将电子游戏分为游戏机游戏、单机版PC游戏、互动电视游戏、在线游戏和手机游戏等。
韩国将电子游戏业分为家用游戏机游戏、单机版PC游戏、网络游戏和街机游戏四大类。
“网络游戏”,即人们一般所指的“在线游戏”,是指一种通过互联网进行的电脑游戏,通过人与人之间的互动达到交流、娱乐和休闲的目的。
在互联网/局域网的技术出现之前,电子游戏一般都归于单机版游戏,也就是“人机对战”游戏,或者是至多双人对战的游戏。
伴随着互联网技术的出现,通过网络连接游戏服务器,上百、上千、乃至上万的游戏玩家能够同时连线娱乐成为了可能,这就大大的提高了游戏的互动性、真实性,从而丰富了电子游戏的内涵。
从网络游戏的分类来看,目前在业界还没有一个比较统一规范的分类。
随着计算机设备以及网络技术的发展,电子游戏在全球范围内得到了迅猛的发展,已经取得了巨大的成功,同时也成为当今世界上不可缺少的精神粮食。
1.2电子游戏发展及现状(以下数据及资料来源于网络)
1.2.1电子游戏在国外的发展现状
电子游戏最初诞生于美国,在1971年,一位还在MIT就读的学生设计了世界上第一个业务用游戏机,这个街机游戏的名字被称为《电脑空间》。
时至今日,电子游戏仍然是外国的天下。
美国至今依然是世界第一大游戏市场,其遵循的是以发行商为主的产业开发链模式,根据美国市场调查公司NPDGroup的调查统计,美国在2004年游戏总销售金额(包括家用、掌上型主机及软件)为99亿美元,占据了全球游戏市场的45%。
其中游戏软件销售的具体数字为:
视频游戏软件销售额达到52亿美元(1.6亿套),PC游戏软件销售额达到11亿美元(4500万套),掌机游戏销售额达到10亿美元(4230万套)。
2004年一共大约有2.48亿套游戏售出。
据估计,美国每个家庭平均购买过2部游戏。
日本近20年来疯狂赚取电子游戏的钱。
从上世纪60年代初的街机,到六七十年代之间的家用游戏机,再到八九十年代的掌上游戏机,日本经过长达30多年的耕耘,终于把电子游戏这棵“摇钱树”,培育成为了第一时尚娱乐产业,垄断全球业界长达10余年之久。
对于日本来说,电玩业已然成为了国家经济的重要支柱之一,在GDP中占有1/5的举足轻重地位。
日本游戏业在最辉煌的1998年时,曾经占领全球电子游戏市场硬件90%以上,软件50%以上。
韩国号称目前世界上网络游戏产业最发达国家之一。
迄今为止,国内网络游戏市场有超过60%的产品来自于韩国游戏软件开发商,韩国网络游戏使国内很多游戏运营公司在游戏营销市场或股票资本市场上都获得了巨大的成功。
韩国游戏市场的发展不是偶然的,韩国政府不仅给游戏产业以正确的定位以及引导,更是将其和本国经济发展紧密地联系在一起,做了很多市场培育方面的工作。
韩国政府深刻地认识到,靠重型工业来支撑全国经济的做法是片面的,于是便将IT、娱乐产业作为新的经济增长点,开始大力扶持。
从那时起,科技含量极高而能源消耗极低的游戏制作及相关产业便担负起了“富国兴邦”的重担。
由文化观光部出面组建韩国游戏支援中心,向韩国游戏产业提供从资金到技术上多方面的支援;成立游戏投资联盟,韩国政府每年向游戏产业投入的资金高达500亿韩元,并为游戏企业提供长期低息贷款;设立信息化基金和文化产业基金,为游戏产业提供服务;对指定的风险企业实行各种税制优惠政策,以减少甚至免除游戏企业的税务负担;建立游戏产业基地以扶持中小游戏企业的发展;对从事游戏产业的高科技人才免除两年兵役。
在韩国,从制作到运营,一个网络游戏公司的起步门槛较低,主要得益于政府所实行的援助计划。
此外,在有利的政策形势的环境之下,韩国出现了众多大大小小的游戏院校,一些原本不涉足此领域的大学也开始开设游戏相关专业课程,以大力培养游戏专业人才,从而为游戏生产提供基础保障。
1.2.2电子游戏在国内的发展现状
与电子游戏发达的国家相比,我国在电子游戏方面还存在着比较大的差距。
就目前而言,我国的游戏市场正处于发展阶段,虽然市场上的游戏软件主要来自与日本、美国、韩国等国家,但是由本土游戏制作人开发创作的游戏正在高速增加,国产原创的游戏即将成为游戏的主流。
中国的游戏产业经过80年代初期台湾厂商的探索到90年代,开始自己的研发、发行的历程,直至如今网络游戏的风行,中国的网络游戏开始有了飞速的发展。
1983年,智冠科技有限公司于中国台湾成立,称为了全球第一家签订授权重制中文版产品代理销售合约的公司,2000年智冠在台湾股票上市,2002年其控股的中华网龙在台湾上市。
1996年末,UBISOFT上海分公司暨上海育碧电脑软件有限公司成立。
同年,全球游戏软件的领军企业EA在中国上海成立了办事处。
1997年,由尚洋公司制作的游戏《血狮》正式上市。
1997年,北京新天地互动多媒体技术有限公司宣布成立,该公司引进了《古墓丽影III》(TombRaiderIII)、《盟军敢死队》等众多著名欧美游戏,并于1999年在中国率先掀起了“游戏软件价格革命”,全面推行50元价格体系,从此正版游戏价格逐渐开始贴近大众消费者。
1999年,游戏业内估算中国电脑游戏市场(正版)约1.5亿元人民币。
2000年,大陆华彩软件代理发行的第一款中文MMORPG《万王之王》正式推出,该游戏于1999年在台湾发行,由台湾雷爵资讯(Lager)开发。
在2000年,继《万王之王》、《石器时代》、《网络三国》等游戏在台湾上市之后,游戏桔子推出了《天堂》,游戏桔子成立于1995年,1999年以《便利店》在台湾奠定了地位。
《天堂》这款由韩国著名游戏公司Ncsoft研发的网络游戏不但在本国大获成功,同时也在台湾再次夺冠。
2001年年初,北京华义在中国大陆地区正式推出了回合制网络游戏《石器时代》,华义国际股份有限公司1993年于台北成立,2001年在台湾股票上市。
《石器时代》成为当时大陆最流行的网络游戏。
2001年,天人互动软件技术有限公司在北京成立。
当年与SEGA结成PC游戏业务的战略合作关系,发行了《樱花大战Ⅱ》《文明Ⅲ》《无冬之夜》等经典游戏,2002年,引进在欧美网络游戏《魔剑》(ShadowBane),这是首款在中国测试的欧美网络游戏。
2001年5月,“联众世界”经过3年多的迅速成长,以同时在线17万人、注册用户约1800万的规模,成为当时世界用户数量第一的在线游戏网站。
2005年1月21日,中央电视台报道:
我国的网络游戏产业当年增加了50%,今后几年都将以50%以上的速度持续增长;第一届中国网络游戏年会报道称:
中国国内网络游戏2004年的规模将达到24.7亿元,2009年的规模将达到109.6亿元。
第2章相关技术及处理方法的介绍
在编写俄罗斯方块的过程中,会使用到不少的技术及数据处理方法,在接下去的文章中,将对这些技术进行一一介绍,使得读者能够更好的理解本文。
2.1哈希算法
哈希算法,英文名称为:
“Hash”,一般翻译为“散列”,也可以直接音译为“哈希”,就是把任意长度的输入(或者叫做预印射,即Pre-Image),通过映射算法,使其变换成固定长度的输出,得到的既是散列值。
这种转换实际是一种压缩映射,即,散列值的空间一般来说远远小于输入的空间,不同的输入有可能散列成为相同的输出结果,因而不可能从散列值来获得一个唯一的确定的输入值。
简单来说,哈希就是将一个任意长度的消息压缩成为某一个固定长度的消息摘要的函数。
2.1.1常用的构造哈希函数的方法
1.直接寻址法:
选取关键字或者关键字的某个线性函数值做为散列地址。
即H(k)=k或者H(k)=a*k+b(其中a和b通常为常数)
2.数字分析法
3.平方取中法
4.折叠法
5.随机数法
6.除留余数法:
选取关键字被某个不大于哈希表表长m的数p除后所得的余数做为散列地址。
即H(k)=kModp,p<=m。
不仅可以对关键字直接取模,也可以在折叠,平方取中等运算之后再取模。
p的选择十分重要,通常为素数或者m,若选择的不好,很可能产生同义词。
2.1.2处理冲突的方法
当产生冲突时,一般采用以下方法进行处理:
1.开放寻址法:
Hi=(H(k)+di)Modm,i=1,2,3,……k(k<=m-1),其中H(k)为散列函数,m为哈希表长,di为增量序列,di一般有下述三种取法:
1.1线性探测再散列:
di=1,2,3,……m-1
1.2二次探测再散列:
di=1^2,(-1)^2,2^2,(-2)^2,3^2,……,(±k)^2(k<=m/2)
1.3伪随机探测再散列:
di=伪随机数序列
2.再散列法:
Hi=RHi(k),i=1,2,……,kRHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列地址,直到冲突不再发生为止,这种方法不容易产生“聚集”,但是会增加计算时间。
3.链地址法:
即拉链法
4.建立一个公共溢出区
2.1.3常见的哈希算法
1.MD4
MD4(RFC1320)是MIT的RonaldL.Rivest在1990年设计的,MD是MessageDigest的缩写。
适用于在32位处理器上用高速软件――它是基于32位操作数的位操作来实现的。
2.MD5
MD5(RFC1321)是Rivest于1991年对MD4的改进版本。
它对输入仍以512位分组,其输出是4个32位字的级联,与MD4相同。
MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。
3.SHA-1及其他
SHA1是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。
SHA-1设计时基于和MD4相同原理,并且模仿了该算法。
2.1.4哈希函数的性质
基本特性:
若某两个基于同一函数的散列值不相同,则其原始输入也必然不相同。
这个特性使得哈希函数具有确定性的结果。
但是,哈希函数的输出和输入并不是一一对应的关系,若两个输出值相同,则两个输入值可能相同,也可能不相同。
2.1.5哈希函数的应用
1.文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验这两种,但是它们并没有抗数据篡改的能力,只是能够在一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据本身的恶意破坏。
MD5哈希算法的"数字指纹"特性,使其成为目前应用最广泛的一种文件完整性校验和Checksum算法,目前不少Unix系统有提供计算md5checksum的命令。
2.数字签名
哈希算法也是现代密码体系中的一个重要组成部分。
由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个十分重要的角色。
对哈希值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。
3.鉴权协议
2.2二维数组及矩阵
2.2.1二维数组
二维数组A[m][n],每个元素的长度为t个字节,设a[p][q]为A的第一个元素,即二维数组的行下标从p到m,列下标从q到n。
存放这样的一个数组至少需要的单元数为(m-p+1)*(n-q+1)*t个字节。
二维数组也可以称为矩阵,行列数相等的矩阵称变方阵。
2.2.2矩阵
英文名为Matrix(SAMND矩阵)。
在数学中,矩阵用于表示统计数据等方面各种有关联的数据。
这种定义很好地解释了Matrix代码制造世界的数学逻辑基础。
在数学上,矩阵用在解线性方程组上既方便又直观。
例如:
对于方程组。
a1x+b1y+c1z=d1
a2x+b2y+c2z=d2
a3x+b3y+c3z=d3
我们可以构成一个矩阵:
|a1b1c1|
|a2b2c2|
|a3b3c3|
因为这些数字是有规则地排列,状如矩形,故而数学家们称之为矩阵。
通过矩阵的变化,我们就可以得出方程组的解。
矩阵具体概念是由19世纪英国数学家凯利首先提出并形成矩阵代数这一系统理论的。
在数学上,一个m*n矩阵是一个m行n列的矩形阵列。
矩阵由数组成,或由某环中的元素组成。
矩阵通常见于线性代数、线性规划、统计分析,以及组合数学等。
2.3脚本语言
计算机语言是为了各种目的和任务而开发的,其中一个常见任务就是把各种不同的已有组件连接起来以完成相关任务。
而大多数脚本语言的共性则是:
良好的快速开发,高效率的执行,解释而非编译执行,强大的与其它语言编写的程序组件之间通信功能。
许多脚本语言都是用来执行一次性任务,特别是系统管理方面。
它们可以把服务组件粘合起来,因此被广泛的用于GUI(GraphicalUserInterface,图形用户接口)创建或者命令行,操作系统通常都会提供一些默认的脚本语言,也就是通常所谓shell脚本语言。
脚本通常以文本(如ASCII)保存,只在被调用时进行解释或编译。
有些脚本仅仅是为了特定领域设计的,但是通常脚本都可以用来写更通用的脚本。
在大型项目中通常把脚本和其它低级编程语言一起使用,使其各自发挥优势来解决特定问题。
脚本也经常用于设计互动通信,其有许多可以单独执行的命令,可以用来做更高级的操作。
其所提供的这些高级命令简化了代码编写过程。
诸如内存自动管理和溢出检查等性能问题可以不必考虑。
在那些更低级或非脚本语言中,内存及变量管理和数据结构等行为需要耗费大量人工,为解决一个给定的问题需要编写大量代码,尽管这样能够获得更为细致的控制和优化。
当然,脚本缺少优化程序用以提速或者降低内存的伸缩性。
综上所述,脚本的编程速度更快,并且脚本文件明显要小于如同类C程序文件。
当然,这种灵活性是以降低执行效率为代价的。
脚本一般是解释执行的,因此速度可能很慢,并且运行时更消耗内存。
在很多的案例中,例如编写一些数十行的小脚本,其所带来的编写优势要远远的超过运行时的劣势,特别是在如今程序员工资趋高和硬件成本趋低的时候。
第3章JASS脚本语言的介绍
3.1JASS的相关概述
JASS(正确地说是JASS2)是魔兽争霸3的程序语言,被用于控制游戏和地图的进行,也是整个魔兽游戏和地图的基础。
地图编辑器中摆放的单位(Unit),区域(Region),触发器(Trigger)等等,最终都会被转译成为JASS语言存放于地图文件中的war3map.j文件中,使其在游戏时被使用。
JASS脚本语言在语法结构上相对比较接近Basic,同时其也引用了许多C的东西。
3.2本文中利用到的JASS中的数据类型
3.2.1整型integer
整型是设计中利用到最多的一种数据类型,其没有小数部分。
若两个整型相除,则会舍弃小数部分,例如4/3,在JASS得到的结果为1.
在JASS中,整型的取值范围为:
[-268435455,268435455]
3.2.2实型real
实型是设计中同样利用到非常多的一种数据类型,其有小数部分。
在实型和整型同时存在的运算过程中,会将结果自动转换成实型。
例如:
5/2.=2.5,5./2=2.5,5./2.=2.5,5/2=2。
在JASS中,实型的取值范围为:
(-268435456.0,268435456.0)
3.2.3布尔值boolean
布尔值只有两种值:
true,false。
即真,假。
在本设计中,布尔值被用于表示是否满足某些条件,以及某些开关是否打开。
3.2.4布尔表达式boolexpr/booleanexpression
布尔表达式是一段代码声明函数,其最终返回值只能是true或false。
在本设计中,通常用于做为触发器的条件判断。
3.2.5触发器条件函数变量conditionfunc
其本身是一组布尔表达式数据,实际上是布尔表达式的子类型。
3.2.6code变量
这个词本身很难解释,可以理解为指向某个无参量无返回值函数的指针变量。
3.2.7触发器动作函数变量actionfunc
当触发器事件被响应并且满足触发器条件函数时,即会运行触发器动作函数中所包含的code。
3.2.8触发器变量trigger
触发器是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
例如玩家按下键盘指定键等等。
一个完整的触发器通常由触发器变量,触发器条件函数变量及一个触发器动作函数变量。
如下图:
触发器
触发器动作函数变量
触发器条件函数变量
触发器变量
Code变量
布尔表达式
图2触发器完整结构图
3.2.9哈希表变量hashtable
指向某个建立的哈希表的变量
3.2.10计时器变量timer
计时器通常用于在一段事件内反复运行某段函数,或者延时运行某段函数。
一个完整的计时器包含:
计时器变量,间隔,是否循环,Code变量等四个部分。
计时器工作流程如下图:
不循环
需要循环
运行指定函数
计时器运行结束
计时器运行
经过间隔时间
图3计时器运行流程图
3.2.11图像变量image
用于显示游戏背景,方块,分数,难度等等所有可见图形。
3.2.12音效变量sound
用于播放游戏中音效,包括游戏开始,加速下落,难度升级,行消除等。
3.2.13句柄变量handle
一个父变量类型,以上所提到的布尔表达式boolexpr,,触发器条件函数变量conditionfunc,触发器动作函数变量actionfunc,触发器变量trigger,哈希表变量hashtable,计时器变量timer,图像变量image,音效变量sound等皆属于handle