首页 > 范文大全 > 正文

基于FLASH的连连看游戏核心算法的研究

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于FLASH的连连看游戏核心算法的研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:连连看是一款深受大众所喜爱的小游戏,该文详细的介绍了在flash平台下,使用ActionScript3.0脚本语言实现“连连看游戏中最为关键的两个核心算法——随机地图和自动寻路。

关键词:连连看;FLASH;ActionScript3.0;随机地图;自动寻路

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)34-7877-03

随着社会的飞速发展,人们的生活的压力越来越大,玩游戏成为了人们放松和解压的一种方式,为了满足人们的需要,游戏事业在迅猛地发展,游戏开发的种类也越来越多,越来越新颖。“连连看”游戏是一款经典的小游戏,深受大众的喜爱。

FLASH是一款动画制作软件,它具有强大的绘图及动画功能,并能和面向对象的编程语言ActionScript3.0完美的结合, 制作小游戏使用FLASH比使用其他编程软件更加机动灵活。

1 关键问题

首先对“连连看”游戏有一个整体的认识,它是由若干对相同图片组成的,如果连续点击两张相同的图片,在这两张图片能够以最多允许两次的转弯线相连接,并且中间没有任何障碍物时就可以消除这对图片,在规定的时间内消掉所有的图片取得胜利,否则游戏失败。在游戏的设计过程中最为关键的问题是如何排列地图和连续点击两张图片是否能够清除。

2 游戏的随机地图

制作“连连看”游戏首先要考虑如何制作地图,根据游戏规则,制作地图要解决以下几个问题:一是地图有多大,有多少行,有多少列;二是每张图片允许出现多少次;三是排列的图片应是随机出现的,每次都不相同。

“连连看”是一个平面游戏,根据关数的不同图片的数量上也可以有所不同,可以由5行8列的组成,也可以由7行12列的等等,跟据地图的大小和难度的不同,同一张图片可以出现8次也可以出现6次或4次列组成,图片出现的次数越少,难度越大。现在我就以7行12列,每张图片出现6次为例,7×12共有84张图片,每张出现6次,一共有14张不同的图片组成。

平面游戏地图最为常见的是使用二维数组来完成,FLASH中的数组和其他许多编程语言有所不同,FLASH中数组的下标变量只有一种数据类型Object,而Object在ActionScript中是所有其他数据类型的基类,因此数组中的下标变量可以装载任何类型的数据,根据这一特点,FLASH可以更加方便的制作游戏地图。制作游戏地图主要包括二维数组取数、随机交换数据、制作图片类和布地图四个步骤。

2.1 二维数组取数

制作7×12的地图每张图片出现6张,为了编程的方便,最外圈下标变量全部给0,因此定义一个9×14的二维数组,中间取数为1至14,每个数出现6次,程序如下:

var arr:Array=new Array();

var k:int = 0;

for (var i:int=0; i

arr[i]=new Array();

for (var j:int=0; j

if (i == 0 || i == 8 || j == 0 || j == 13) arr[i][j] = 0;

else { arr[i][j] = int(k / 6) + 1;

k++;

} } }

2.2 随机交换数组数据

以上数组是有规律的数据,那如何将这个有规律的数组变成杂乱无章的呢?可以对数组进行循环遍历,每个下标变量都和数组中随机的另一个下标变量交换数据,当循环完毕后,数组也成为了一个随机数组,数据是没有规律出现的。程序代码如下:

var t:Object;

var ki,kj:int;

for (i=1; i

for (j=1; j

k = int(Math.random() * 12 * 7);

ki = int(k / 12)+1; kj = int(k % 12)+1; //随机获取一个下标变量的行列坐标

t = arr[i][j]; arr[i][j] = arr[ki][kj]; arr[ki][kj] = t; //当前下标变量与随机下标变量交换数据

} }

2.3 制作图片对象

FLASH是个面向对象的编程软件,可以非常方便的类绑定将影片剪辑上,因此可以用影片剪辑做前台的图片,用类来实现对象的布局。首先用PhotoShop将做出几十张一样大小的图片,如40×50像素。新建一个影片剪辑,插入图片,并从第一个关键帧开始将图片布在每一个关键帧中。在影片剪辑上绑定map类,制作map类完成图片对象自动定位和显示相应图片的功能,map类代码如下:

package {

import flash.display.MovieClip;

public class map extends MovieClip {

public var i:int; //记录对象的行

public var j:int; //记录对象的列

public var number:int; //记录图片的编号

public function map(i,j,number) {

this.i=i; this.j=j; this.number=number;

init(); //调用图片初始化方法

}

public function init():void //图片自动定位,并显示number编号相应的图片

{ this.x=j*40; this.y=i*50; this.gotoAndStop(number); }

} }

4、根据数据布置地图

利用FLASH的数组的下标变量的数据类型是Object的特点,将数组中所有不是0的下标变量都用图片元件替换并将元件的number属性设为原小标变量的值,并在舞台上增加元件,代码如下:

for (var i:int=0; i

for (var j:int=0; j

if (arr[i][j] != 0) {

arr[i][j]=new map(i,j,arr[i][j]) //生成图片对象

addChild(arr[i][j]); //将图片元件添加到舞台上

}

3 游戏的核心算法——自动寻路测试

在游戏中最为关键的问题是连续点击两张相同的图片,要判断两张图片是否能够清除。根据游戏规则,用户连续点击的两张不同位置相同的图片最多只允许有两个转弯点,并且中间没有任何障碍图片才可以清除,那么如何自动找到能通路呢?寻路的方法有三种情况,一是两张图片在一条线上没有转弯点;二是两张图片不在一条线上有一个转弯点;三是有两个转弯点,只有将三种情况逐一测试,只要中间一种情况满足,图片即可清除。

1)两张图片在一条线上没有转弯点。这种情况只要测试两张图片中间的每一个下标变量的值都是0就行了,可以做两个方法来测试,一个是在同一列上,只用测试行;另一个是在同一行上,只用测试列,分别制作testi() 和testj()两个方法进行测试,测试行的方法testi()的代码如下:

function testi(i1,j1,i2,j2):Boolean{

var m,t:Number;

if (j1=j2 &&i1!=i2)

{ if (i1>i2) {t=i1;i1=i2;i2=t;} //如果i1>i2 则两数交换,确保i2>i1

for (m=i1+1;m

if (arr[m][j1]!=0) return false; //如果中间的下标变量有一个不是0则下满足条件

return true;

}else return false;}

2)两张图片不在一条线上有一个转弯点,有了上面的方法,这种情况相对简单,只用测试两条直线和一个转弯点上的所有下标变量是否为0就行了,这种情况可制作两个方法,一种是先测试行再测试列,另一种是先测试列再测试行的,分别为testij()和testji(), 方法testij()的代码如下:

function testij(i1,j1,i2,j2):Boolean

{return testi(i1,j1,i2,j1) && testj(i2,j1,i2,j2) && arr[i2][j1]==0;}

3)如果前面两种情况都测试不通过的话,就要测试第三种情况,连线允许有两个转弯点,这种情况相对复杂些,这种情况也可以制作两个方法,一个是先行测试再列测试最后再行测试,另一个是先列测试再行测试最后再列测试,分别为testiji()和testjij()。testiji()的方法可以任意从一个对象所在位置开始上下自动寻路,如往上寻路,先判断该点上的下标变量是否为0,如果不为0则终止寻路,再进行下寻路;如果为0则使用方法testji()对另一对象进行寻路测试,通了则寻路成功,不通则再往上继续寻路。方法代码如下:

function testiji(i1,j1,i2,j2):Boolean {

var k:int;

for (k=i1-1;k>=0 && arr[k][j]==0 ;k—)

{ if (testji(k,j1,i2,j2)) return true; }

for (k=i1+1;k

{ if (testji(k,j1,i2,j2)) return true; }

Return false; }

至此解决了游戏中关键的两个问题:随机地图和自动寻路,并且可以将这两个算法制作出相应的方法,如将地图的整个程序做成一个方法,将行数、列数、和每张图片出现的次数作为参数,就可以在游戏中自动生成大小不同,难度不同的随机地图,以满足游戏每关不同的要求,增加游戏的可玩性。

参考文献:

[1] 王愉,李文博.交互程序设计书 FLASH ActionScript3.0[M].北京:清华大出版社, 2010(6).

[2] 肖刚.FLASH游戏编程教程[M].北京:清华大出版社,2009.