五子连珠,在民间俗称”五子棋”,是一种流传很广的益智棋类游戏,游戏规则非常简单,适合各个年龄段的朋友玩,相信大家以前也一定玩过此游戏,传统的玩法是两玩家在围棋棋盘上进行比赛,这里玩家的对手将变成电脑,想不想和电脑过过招呢?下面我们就来学习使用Flash制作五子连珠这个游戏。
游戏的主界面如图1所示:
图1
游戏玩法:
五子连珠这个游戏需要由两位选手一起来完成,其中一位是电脑,电脑在游戏中使用黑棋比赛,您在游戏中使用白棋进行比赛,游戏的目的是尽量将自己的棋在棋盘上排列成五颗棋子连在一起的直线,水平方向,垂直方向或者斜向都可以,但是不能有拐点,必须是一条直线,哪一方先连好,则胜利。玩家在游戏中一方面要尽量将自己的棋子连起来,另一方面也需要阻碍对手进行连子,不让对手轻易的将棋子连起来,直到有一方先连好五颗棋子,则游戏结束。游戏中为了防止一方没有看清对方上一步的落子位置,在棋盘的右上角将显示上一步的落子位置,棋子的位置根据棋盘上的横纵标识来决定(横向为1-15,纵向为A-O)。
游戏制作思路:
本游戏制作起来有一定的难度,难度的关键在于玩家中有一方是电脑,如何合理的控制电脑走棋是最关键的部分。如果要实现电脑的自动计算棋局和决定落子位置,就需要用到一些Ai(人工智能)方面的知识,在游戏制作中会详细讲解。
棋类游戏一般都会在一个二维的棋盘上进行,所以自然的就会使用二维数组来记录棋子的位置和决定落子的位置,数组在棋类游戏中也是应用非常的广泛。
游戏制作步骤:
下面我们就来开始具体的游戏制作步骤:
游戏素材的准备:
1.棋子的准备:棋类游戏当然少不了棋子,本游戏中需要两类棋子,一种为黑色棋子,一种为白色棋子,默认情况下电脑使用黑色棋子,我们可以从外部导入两副棋子图片,也可以在Flash中进行手工绘制。本实例中我们就来自己制作两个棋子。
新建一个Graphic组件,并命名为blackgraphic,使用椭圆工具绘制一个圆形,并填充上黑色,这样一个简单的黑色棋子就做好了,如图2所示:
图2
因为我们需要在游戏中使用Action对棋子进行控制,所以需要将上面做好的Graphic组件转换为Movieclip类型的组件。所以新建一个movieclip组件,命名为black,将组件blackgraphic拖到组件black的编辑区即可。
按照同样的方法制作一个whitegraphic组件,并绘制一个白色的棋子,然后在建立相应的whitemovieclip组件,绘制好的白色棋子如图3所示:
图3
2.控制按钮的制作:游戏中需要使用鼠标将棋子落到棋盘上,所以需要使用按钮结合棋子的方法,因为游戏中我们看到的实际是棋子,但是控制的是按钮,所以这里我们只需要制作一个简单的隐形按钮即可,按钮大小和棋子大小相似,如图4所示:
图4
当游戏结束后还需要有一个Replay按钮允许玩家重玩游戏,所以可以建立一个简单的按钮,用来控制游戏的再次运行,Replay按钮如图5所示:
图5
3.控制游戏的MC:棋类游戏中少不了大量的Action程序控制,为了便于对游戏进行控制,一般将Action放在专门的Movieclip中,然后就可以在游戏的任何地方调用了。
A:新建一个Movieclip组件,命名为blk,进入组件编辑状态后,在第一关键桢添加如下AS:
stop();
functionmakelist(maker)
//自定义函数makelist,参数为maker,其作用是生成一个列表
{
if(maker=="white")
//如果传递进函数的参数是white
{
color=2;
color_bad=1;
//设置两变量值
}
else
//如果传递进函数的参数是black
{
color=1;
color_bad=2;
//设置两变量值
}
for(i=0;i<15;i++)
//外循环,循环变量为I,循环次数为15次
{
for(j=0;j<15;j++)
//外循环,循环变量为j,循环次数为15次,两次循环共15*15此,正好等于棋盘的大小,用来设//置棋盘
{
if(_root.table[i][j]<>0)
//table数组用来检查棋盘是否为空,为空,相应的值为1,否则为0
{
for(k=0;k<4;k++)
{
if(maker=="white")
{
_root.computer[i*15+j][k]=0;
}
else
{
_root.player[i*15+j][k]=0;
}
}//若前一步的落子为白棋,则后一步计算机落子,否则玩家落子
}else{
//如果棋盘为空
for(k=0;k<4;k++){
x=i;
y=j;
score=5;
while((_root.table[x+_root.dir[k][0]][y+_root.dir[k][1]]==color)and(x+_root.dir[k][0]<15)and(y+_root.dir[k][1]>=0)and(y+_root.dir[k][1]<15)and(x+_root.dir[k][0]>=0)){
x=x+_root.dir[k][0];
y=y+_root.dir[k][1];
score=score*2;
}
if((_root.table[x+_root.dir[k][0]][y+_root.dir[k][1]]==color_bad)and(x+_root.dir[k][0]<15)and(y+_root.dir[k][1]>=0)and(y+_root.dir[k][1]<15)and(x+_root.dir[k][0]>=0)){
score=score/2;
}
x=i;
y=j;
while((_root.table[x+_root.dir[k+4][0]][y+_root.dir[k+4][1]]==color)and(x+_root.dir[k+4][0]<15)and(y+_root.dir[k+4][1]>=0)and(y+_root.dir[k+4][1]<15)and(x+_root.dir[k+4][0]>=0)){
x=x+_root.dir[k+4][0];
y=y+_root.dir[k+4][1];
score=score*2;
}
if(score>30){
score=score*2;
}
if((_root.table[x+_root.dir[k+4][0]][y+_root.dir[k+4][1]]==color_bad)and(x+_root.dir[k+4][0]<15)and(y+_root.dir[k+4][1]>=0)and(y+_root.dir[k+4][1]<15)and(x+_root.dir[k+4][0]>=0)){
score=score/2;
}
if(maker=="white"){
_root.computer[i*15+j][k]=score;
}else{
_root.player[i*15+j][k]=score;
}
}//初始化棋盘,根据上一步落子的不同,来计算一下一步的落子
}
}
}
}
B:再新建一个Movieclip组件,命名为blk2,进入组件编辑状态后,在第一关键桢添加as:stop();
在第六桢插入一个关键桢,并添加如下AS:
if(_root.playnow=="computer"){
//如果先落子的为电脑,则初始化棋盘
_root.func.makelist("white");
_root.func.makelist("black");
//分别调用前面定义的自定义函数,且传递不同的参数
max_computer=0;
max_player=0;
k=0;
//定义三个变量
for(j=0;j<15;j++){
for(i=0;i<15;i++){
for(k=0;k<4;k++){
if(_root.computer[j*15+i][k]==max_computer){
rndnum=random(100)+1;
if(rndnum>50){
max_computer=_root.computer[j*15+i][k];
xc=i;
yc=j;
}
}
if(_root.computer[j*15+i][k]>max_computer){
max_computer=_root.computer[j*15+i][k];
xc=i;
yc=j;
}
if(_root.player[j*15+i][k]>max_player){
max_player=_root.player[j*15+i][k];
xp=i;
yp=j;
}
}
}
}
if(max_computer>max_player){
x=xc;
y=yc;
}else{
x=xp;
y=yp;
}
//绘制棋子
num=y*15+x;
removeMovieClip(_root.baddnum);
duplicateMovieClip(_root.white,"white"addnum,num+300);
setProperty(_root.whiteaddnum,_x,34.7+x*20);
setProperty(_root.whiteaddnum,_y,34.7+y*20);
_root.table[y][x]=2;