flash as3.0 五子棋的游戏制作

来源:互联网 发布:全球夜间灯光数据分析 编辑:程序博客网 时间:2024/05/01 11:03

主界面的截图
五子棋主界面
游戏玩法:
五子连珠这个游戏需要由两位选手一起来完成,其中一位是电脑,电脑在游戏中使用黑棋比赛,您在游戏中使用白棋进行比赛,游戏的目的是尽量将自己的棋在棋盘上排列成五颗棋子连在一起的直线,水平方向,垂直方向或者斜向都可以,但是不能有拐点,必须是一条直线,哪一方先连好,则胜利。玩家在游戏中一方面要尽量将自己的棋子连起来,另一方面也需要阻碍对手进行连子,不让对手轻易的将棋子连起来,直到有一方先连好五颗棋子,则游戏结束。游戏中为了防止一方没有看清对方上一步的落子位置,在棋盘的右上角将显示上一步的落子位置,棋子的位置根据棋盘上的横纵标识来决定(横向为1-15,纵向为1-15)。
游戏制作思路:
将五子棋的棋盘上在二维数组中进行记录,先在通过不同的位置的数字来记录棋子的类型。人工智能的解决思路,通过不同方向的分数记录和比较来确定棋子下落的位置。
游戏制作步骤:
1:素材的导入
依次导入所有的素材到flash的库中,依次将需要的素材设置为按钮、影片剪辑等元件。将元件添加到合适的位置(如主界面图所示)。
2:“开始”,“结束”按钮的制作
start_mc.addEventListener(MouseEvent.CLICK,start_mcclick);//开始游戏
function start_mcclick(e:MouseEvent)
{
start_mc.visible=false;
end_mc.visible=true;
blackground.visible=false;
var i,j:int;
for(i=0;i<15;i++){
for(j=0;j<15;j++){
chessborad1.chessman[i][j]=0;//将棋盘二维数组全部初始化为0
}
}
zhan_mc.visible=false;//将对战的影片剪辑不可视
blackwin_mc.visible=false;//将黑色赢的影片剪辑不可视
whitewin_mc.visible=false; //将白色赢的影片剪辑不可视
}
3:棋子的下落实现
代码:
var x1:int,y1:int,n:int;
x1=(event.stageX-65)/30;
y1=(event.stageY-75)/30;
if(chessborad1.chessman[x1][y1]==0)
{
var qia:MovieClip=new MovieClip;
if(chessborad1.nowchess==1)//黑色方走棋
{
qia=new black();
chessborad1.chessman[x1][y1]=1;
chessborad1.nowchess=2;
}
else//白色走棋
{
qia=new white();
chessborad1.chessman[x1][y1]=2;
chessborad1.nowchess=1;
}
qia.x=73+(30*(x1));
qia.y=85+(30*(y1));
aChessman.push(qia);
addChild(qia);
checkwinner(x1,y1,chessborad1.chessman[x1][y1]);
}
首先通过获取点击棋盘上的像素点,通过像素点的X,Y的值计算该点对应的棋盘的坐标值。
qia=new black();通过addChild(qia);绘制棋子到棋盘上。aChessman.push(qia);将棋子存到栈中方便接下来制作的悔棋和清盘的功能。
4:输赢的判断
输赢的判断我想到过两种方法,一种是直接全局遍历把棋盘的坐标依次遍历一遍,一种是先获取点击的坐标点,判断该点的横竖左斜右斜的四个方向是否存在五子连棋。
(00)(01)(02)(03)
(10)(11)(12)(13)
(20)(21)(22)(23)
(30)(31)(32)(33)
在思考后发现的规律,假设我点击了(21)点那么最左边的坐标为(20)最上边(01)左斜(10)右斜(30) 。可以想到在横竖方向的起始坐标都可以轻易的找到可是在在左斜的起始点就没有那么简单了。可是,仔细观察后可以发现左斜的方向又可以看成(X+Y,0)。
在找到初始的点后就可以遍历该直线上是否出现五子相连。
function checkwinner(xp:int,yp:int,side:int)//胜负检查函数
{
var i:int =0;
var j:int =0;
var n:int =0;
var c:int =0;
var winner:int = 0;
//x方向
for(i=0;i<15;i++)
{
if(chessborad1.chessman[i][yp]==side)
{
n++;
if(n==5){
winner=side;break;
}
}
else {n=0;}
}

//yfor(i=0;i<15;i++){    if(chessborad1.chessman[xp][i]==side)    {        n++;        if(n==5){            winner=side;break;        }    }    else {n=0;}}//斜方向n=0;for(c=9;c>=0;c--){    for(i=0,j=c;j<15;i++,j++)    {        if(chessborad1.chessman[i][j]==side)    {        n++;        if(n==5){            winner=side;            break;        }    }    else {n=0;}    }}n=0;for(c=9;c>0;c--){    for(i=c,j=0;i<15;i++,j++)    {        if(chessborad1.chessman[i][j]==side)        {            n++;            if(n==5){                winner=side;                break;                    }        }        else {n=0;}    }}//右斜上方向n=0;for(c=4;c<15;c++){    for(i=0,j=c;j>=0;i++,j--)    {        if(chessborad1.chessman[i][j]==side)    {        n++;        if(n==5){            winner=side;            break;        }    }    else {n=0;}    }}n=0;for(c=9;c>0;c--){    for(i=c,j=14;i<15;i++,j--)    {        if(chessborad1.chessman[i][j]==side)        {            n++;            if(n==5){                winner=side;                break;                    }        }        else {n=0;}    }}if(winner==1){trace("黑方胜利");blackwin_mc.visible=true;chessborad1.nowchess=0;blackground.visible=true;score1++;}if(winner==2){trace("白色胜利");whitewin_mc.visible=true;blackground.visible=true;chessborad1.nowchess=0;score2++;}

}
现在人人对战的五子棋基本上实现了,虽然中间的过程充满困难但总是能够完成的。依稀博主晚上做的梦还梦到了五子棋。第一次靠自己的能力去一步一步实现一个小游戏,满满的成就感。人机对战就在下一篇实现。

1 0
原创粉丝点击