【编者按】:网学网Java类作品为您提供JAVA俄罗斯方块游戏系统的设计与实现|java小游戏制作(原创)参考,解决您在JAVA俄罗斯方块游戏系统的设计与实现|java小游戏制作(原创)学习中工作中的难题,参考学习。
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
第三章 俄罗斯方块游戏介绍 3.1 游戏简介 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。“俄罗斯方块”由莫斯科科学学院程序员Alexei Pajitnov所设计。显然,人们一开始并没预料到它将会有如此广泛的吸引力。实际上,在游戏发明后的数年间,“俄罗斯方块”成了无数场专利官司和法律纠纷的目标,而许多公司也不遗余力地上阵厮杀,想要将游戏的创意据为己有。一个最初的版本是Spectrum Holobyte为IBM兼容机开发的游戏。1988年,“俄罗斯方块”在街机上也变得非常流行,这都要归功于Atari,因为他们发布了一个能让两名玩家同时游戏的版本[7]。 在1988年,Tengen为任天堂娱乐系统发布了“俄罗斯方块”的一个优秀版本,但它很快便从货架上撤掉了,因为任天堂指控Tengen公司侵犯版权。后来,任天堂把那个版本的“俄罗斯方块”换成了自己的版本,可是新版本却缺乏Tengen版的双人对打模式和出色的音乐。到了1989年,任天堂着手将一个移动版本的“俄罗斯方块”与当时崭新的GBA (GAMEBOY ADVANCE新一代掌上游戏机)系统捆绑出售。这个后来成为有史以来销售成绩最佳的游戏系统,对此,“俄罗斯方块”作出了不小的贡献。 本游戏就是在图3.1所示的四种图形从屏幕上方掉下来时,巧妙地安排布置和变形,达到充分利用屏幕空间的目的。每当屏幕的一整行被方块积木排满时,作为奖赏,该行从屏幕上消失,剩余的积木依次往下降一行。当积木堆达到屏幕顶端的时候,游戏结束。 图3.1 俄罗斯方块 游戏的概念十分简单,如今已经成为一种公认的规则:屏幕顶部以随机顺序落下形状各异的碎块,你要试图用它们拼成没有空隙的行列。你没法打赢“俄罗斯方块”,因为你坚持得时间越长,游戏速度也就变得越来越快,而游戏的吸引力就在于使你顶住碎块的进攻,支撑的时间比上一次更长。“俄罗斯方块”举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似“俄罗斯方块”触动了某些内在的感官。 3.2 游戏需求 随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置三关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。游戏功能要求如下: ①游戏界面需求:良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,用一种颜色作为背景,宽度适中,要实现美感。 ②游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。 ③键盘处理事件:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),空格(加速)、向左、向右移动。 ④显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定的分数时过关。设置十关,每关方块下落的速度不同。 第四章 详细设计 4.1 方法介绍 ⑴方法名:Main(),作用:定义窗口 ⑵方法名:Init(),作用:创建变量 ⑶方法名:start(),作用:打开线程 ⑷方法名:paint(),作用:游戏界面初始化和游戏开始开关 ⑸方法名:run(),作用:控制游戏速度 ⑹方法名:gameinit(),作用:游戏变量初始化 ⑺方法名:begin(),作用:装载图形 ⑻方法名:save(),作用:保存上一个图形的坐标 ⑼方法名:xian(),作用:屏幕显示 ⑽方法名:reach(),作用:处理到达后的图形,进行加分,满行判断及消行处理等 ⑾方法名:keyDown(),作用:控制按键信息 ⑿方法名:change(),作用:控制图形变化 ⒀方法名:destroy(),作用:游戏结束 4.2 屏幕信息初始化 paint()方法是绘制游戏地图的方法,先指明是什么颜色,再定义颜色范围,本游戏是先用红色画了一个大的实心矩形框,再在红色中画一个比红色小一点的黑色实心矩形框,这样黑色的框便会把原来红色的部分遮掉,让人看起来就是黑色的框周围围了一圈红色。黑色矩形框为后面的游戏方块活动的范围。该方法中还设置了一把锁,是游戏是否开始的锁,如果还没开始则会在黑色框中提示游戏开始的方法。如果游戏锁解开,会调用gameinit()方法。Paint()方法还可在前面加re,即repaint(),该方法可以将整个屏幕清屏,再重新画一个游戏界面。 也由于如此,如果在方块向下运动中,每运动一行都要掉用一次repaint()方法的话,屏幕便会闪烁的很快,这样就游戏的可观性来说很不好。所以我另外定义了一个制作图形变量(Graphics gg),这个变量只要被激活(gg = getGraphics()),就可以拥有绘图的所有功能。同时也定义了另外一个绘图的方法(xian()),这样就减少重新绘图而造成的屏幕闪烁问题。有关xian()方法的使用,将在后面的显示控制中提到。 gameinit()方法是游戏初始化,用双重循环把定义游戏地图的二维数组screen[][]赋为false,即清空游戏地图中的所有方块。也把每行方块数初始化,分数初始化,打开游戏地图清屏开关,再调用装载游戏方块begin()方法。 4.3 方块的装载 定义一个随机变量,然后调用随机函数(rand=(int)(Math.random()*7)+1), 所取得的随机数在1到7之间,用这7个数字表示7中常见的方块,并从7种方块中随机抽取图形。每一种方块都是由两个一维数组(x,y)表示的,其中一个用来保存方块所在行,另一个数组用来保存方块所在列,这样有利于方块在屏幕上准确而有活动的定位。所有7种图形都是在三行三列的地图中研究后给出的坐标,给出的坐标也是方块在游戏地图中靠最顶行的坐标。这就好象方块存在于一个三行三列大小的图形中而够成的一张图片。图片的运动也就是方块的运动,这样,要实现方块的变形,就要在三行三列的图形中定义一个最左上角的基点,方块运动,基点也跟着运动。基点坐标在加载方块是加载,基点的存储空间在加载每个方块数组的最后定义。这样使得方块在游戏地图中的每一个地方都可以变形。也不会因为变形而方块在游戏地图中的变动很厉害,出现瞬移的现象。图形坐标装载完后,先判断在方块的下一行是否已有方块,如果有则说明方块以到达游戏地图的顶端,游戏将结束。没有则先把方块坐标保存,这是为了在方块向下移动的时候在它的后面不会有虚假的方块,因为方块向下运动,记录的是新一行的方块坐标,但旧一行的没有消掉,所以要先旧方块的坐标保存起来,搽掉旧方块再显示方块。这样也会减少屏幕的闪烁问题。 4.4 处理键盘事件 keyDown()是处理按键的事件,刚开始运行程序时,游戏还没有开始,这时除S键(解键盘锁的键)是有用外,其他的键都给锁住,这样可以避免键盘过早的控制游戏。在判断是否在S键的语句中还加了对游戏锁取反并判断是否为真的语句,两个语句同时成立时,才会解开游戏锁,程序开始时,游戏还没有开始,游戏锁是关的,但是取反后它就是真的,所以只要按下S键后,两个语句都成立。这样做是为了在游戏开始时再按下S键,游戏不会重新开始,即游戏开始后,S键就没有用了。按下S键后,游戏锁才被解开,键盘也被解开。每当有按键,也就是方块要产生变化时,先保存方块的坐标,便于清理旧方块,显示新方块。当方块要进行上(变形)、下、左、右变化时,先对方块将要移动到的位置进行判断,判断是否有障碍,有则保持原来的位置不变,没有则根据所按的键执行相关的操作。再把方块的位置显示在屏幕上。方块的移动其实也只是对行或列坐标的增减而己。 4.5 控制游戏速度与自动下降 为了使每一关中每个方块的下降速度的一致性,Thread.sleep(1200-pass*300)是一个固定的数字,每次循环时都会根据关数(pass)的级别决定所增加的数字大小。可以说控制游戏的关数,也就是控制速度,也可以说是对休眠时间长短的控制,休眠时间越短则游戏关数越高,游戏速度就越快。因为这个数字就是控制方块在每行的休眠时间,不会受游戏者按键的影响。 Thread.sleep()是游戏休眠,括号中的数字将决定休眠的时间,也是方 块在此行停留的时间。Run()是当游戏没有任何操作,就会返回它进行循环运行。如果游戏还没开始那么在这里下降功能将被锁定,因为游戏都没有开始,在这里处理自动下降有点说不过去。如果游戏开始这个功能马上会被开启,正因为有自动向下运行的功能,那么也少不了障碍物的判断和是否到达底行的判断,只要符全其中之一,就可以调用到达事件(reach())来处理。否则就为了清除旧图而保存方块当前坐标,然后方块再向下移动一行。方块向下运动时,先保存旧方块的坐标,记录新的方块坐标,然后用黑色把旧方块覆盖,再画出新方块的图形,由于电脑处理速度快,在视觉效果上就像方块向下运动了一行一样。 4.6 处理到达事件 reach()事件是在方块自动下降或是按键下降时,当方块新坐标遇到障碍或是到达底部时调用此事件。到达事件是将方块所在位置上的点,用一个屏幕数组记录下来,成为以后的障碍物。 在这里还有一点要做详细的解说,屏幕是如何实现,为什么方块能够堆积之类的问题: 屏幕采用的是一个二维的逻辑数组,主要描述第几行第几列上是否存在方块,如果存在则这个逻辑变量的值将会为真,否则为假。这个数组也能描述哪行哪列上存在着小方块,能描述方块在屏幕上的准确位置。但在屏幕上显示方块, 是通过这个数组和显示里面的控制得到屏幕上的显示信息。 到达事件一触动就证明了方块到达目的地,那么就将方块进行堆积。 循环是因为每个方块都是有四个小方块组合而成的,之前有过说明。 screen[x[j]][y[j]]=true只是将每个小方块所在位置记录下来,使方块能够堆积在一起。row[y[j]]++统计小方块所在行的数目,给下一节的判断满行提供条件。可能会问到方块下降时会不会把这些己经堆积在屏幕上的图形清除,关于这方面我在方块发生任何运动之前都会做一次障碍物判断,也就是判断它即将要到达的那一点是否有小方块的存在(那一点的坐标是否为真),存在则不移动,不存在才会移动。所以它不会清除己存在于屏幕上的任何图形。 统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变 量的值决定分数的多少,程序统计分数是:消一行得10分,同时消4行得40分,没有定义因为同时消多行而得多分数的情况。如果总分数达到过关条件就过关,改变游戏速度,游戏初始化,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。 4.7 判断满行及消行 满行判断及消行是到达事件中的一部分,是方块堆积,并对每个小方块所在行个数统计后,利用循环语句从屏幕最底行依次向上对有方块的每一行进行判断,判断是不是空行,如果那一行是空行则证明它以上的所有行都将不会有方块,也就不必要向上查找了。不是则判断当前行是否满行的,如果满行则看有个连续几个满行的在一起。然后再判断是否有行满的情况,否的话就继续检查上一行。不然就进行消行处理及方块下移。最后再向上查找满行情况直到本行为空时为止。 消行及方块下移:当有行满时,则说明需要消行,有消行那么所有方块则要下移。当本行满时,则以间隔为1向上查找,当遇到所查找的行也是满行,那么它的间隔自增1,然后继续向上查找,直到那一行不是满行的情况,则将此行所有数据信息移到本行,以后本行以上的每行都会以这个间隔去判断它将获得的那行数据,可以则继承,不然和上述一样操作。如果将获得的那行数据为空行,则只须对本行的数据清空即可,那么方块下移也就完成。 4.8 显示控制
|
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |