请问如何用flash制作连连看游戏?需要具体的步骤。谢谢你
游戏过程中,如果玩家在一定时间内完成,会提示玩家获胜,进入下一关。如果画面在一定时间内没有完成,会提示玩家时间到了。每一级等等。
第一,所有的画面都是按照约定的类别数和同一区域的重复次数随机出现的,每张画面出现的次数都是偶数,所以时间会有限制,每张画面出现的次数或时间都不一样,增加了游戏的难度。
第二,在同一区域内,画面的类型和重复次数可以由玩家选择,时间由游戏约定。但玩家选择的类别和重复次数必须是偶数,游戏才能顺利完成,否则游戏虽然可以正常运行,但无法完成。
在一个方案中,由于出现的图像数量是软件根据类别和重复次数约定的,没有玩家自主选择的余地,但系统完成后,已经是设定好的游戏,什么都不能改变,从而在游戏过程中无意中降低了玩家的乐趣,最终导致玩家放弃游戏。我们参考网上的连连看游戏,考虑到游戏的娱乐性。于是我们放弃了第一种方案的设计思路,参考网络上流行的连连看游戏,设计了第二种方案。
3个主要问题
开始做游戏的时候,要解决的主要问题有:如何设置整个游戏的界面;如何控制连连看游戏中随机图片的生成,每张图片必须是偶数;游戏开始后,判断鼠标点击两次的图片是否可以删除,即图片是否相同,判断图片之间的路径;如何判断游戏是否结束以及输赢?
3.4技术要求
这款游戏软件可以在大部分电脑上运行,能够正确判断鼠标点击两次的图片是否可以删除,游戏是否结束。
4.系统设计:
针对以上需求分析,我们将整个软件分为两个模块:1,整体界面设计和随机图像生成;2.图像路径判断功能;
下面是系统结构图:
4.1基本思路
思考4.1.1游戏画面问题
屏幕,对于设计师来说,可以算是最简单的地方;但是对于玩家来说,这才是最重要的。一般玩家不关心你是怎么实现的。他在乎的是画面的美,是不是赏心悦目。
. 2获取图片位置的想法
通过数组从图片库中获取指定数量的图片,并随机分布在画布上。图片的数量必须是偶数。
4.1.3路径判断思路
连连看要求:
1:两个目标相同。
2:两个目标之间的连线不超过两个顶点。(连接线由X轴和Y轴上的平行线组成。)那么,通过分析连接情况,我们可以看到一般有三种情况。
1:直线连接2:一个拐点3:两个拐点;
可以发现,如果有拐点,则每个拐点必须至少有一个坐标(X或Y)与其中一个目标点相同,即拐点必须在两个目标点所在的X方向或Y方向的直线上。
所以设计思路是:
假设目标点p1,p2,如果在z1,z2分别有两个拐点,需要做的是
1:如果验证p1和p2连接成一条直线,则连接建立。
2.在p1,p2的X,Y方向的四条直线上搜索有限个点(可能两条直线会重合),一次取两个点为z1,z2,验证p1到z1/z1到z2/z2到p2是否可以连成一条直线。如果是,则连接建立。
4.1.4关于其他问题的想法
其他功能会在后面每个具体部分的设计过程中介绍。
4.2主界面设计
因为这个程序的界面不是很复杂,使用的控件也不多,主要的核心内容就是后台的代码设计。图片的随机生成主要是用一个random()函数给flag[]数组中的每个元素分配随机数,然后根据数组元素的值显示图片。
6.5438+0接口设计
1,色彩:总结人的视觉习惯和色彩对眼睛的保健作用,决定画布使用黑色背景,神秘大方;右边的控制区是天蓝色,左边是纯黑的背景,就像夜晚的蓝天,纯净又大方。
2.功能上,背景是表单,右侧是放置控件按钮的groupbox控件,底部是显示时间条的grogressbar控件。
4.2.2随机生成图片
实现这一功能有许多步骤:
1.程序运行时,加载游戏所需的N张图片。图片类型默认为18,重复次数为4(重复次数必须是偶数),可以选择是否重新排列。通过一个循环,加载并随机选择n张图片。加载图片的具体代码如下:
私有void int BMP(int maxnum)
{
g _ g =这个。creat phics();
for(int I = 0;我& lt地图宽度;i++)
for(int j = 0;j & ltWAPHEIGHTj++)
gamp[i,j]= 0;
IniteRandoMap(ref gamp,maxnum);
AI =新内核(ref gmap);
for(int I = 0;我& ltmaxnumi++)
{
resource manager RM = new resource manager(" LLK数据",Assembly,GetExecut ingAssembly());
img[i]=(Image)rm。GetObject(i.ToString( )+"。BMP”);
//img[i]=(Image)位图。FormFile("Images\\"+(i+1)。ToString( )+"。BMP”);
}
for(int I = 0;我& lt6;i++)
{
//bombimg[i]=(Image)位图。FromFile("Image\\B"+(i++)。ToString( )+"。BMP”);。
}
}
2.当游戏确认开始后,通过画图过程生成画面。绘图过程代码如下。
私有bool CheckWin(ref int[,]map)
{
Bool Win = true
for(int I = 0;i0)
{
for(int I = 0;我& lt多图片;i++)
{
int xrandom = r . Next(19);
Int yrandom=r,Next(11);
If(map[xrandom,yrandom]==0)
{
map[xrandom,yrandom]= num;
}
其他
I-;
}
num-;
}
}
私有void FreshMap(引用int[,]map)
{
Random r = new Random();
for(int I = 0;我& lt地图宽度;i++)
for(int j = 0;j & ltMAPHEIGHTj++)
{
if(gmap[i,j]!=0)
{
int x = r . Next(19);
int y = r . Next(11);
int temp=gmap[x,y];
gmap[x,y]=gmap[i,j]
gmap[i,j]= temp;
}
运输地图(参考gmap);
}
私有void TransportMap(引用int[,]map)
{
for(int I = 0;我& lt地图宽度;i++)
for(int j = 0;j & ltMAPHEIGHTj++)
{
艾。GiveMapValue(i,j,map[i,j]);
}
}
//在指定位置绘制指定地图。
私有void Draw(Graphics g,Image scrImg,int PicxX,int PicV)
{
g.DrawImage(scrImg,new Point(PicX,PicV));
}
私有void Forml_Paint(对象发送方,PaintEventArg e)
{
g_g .画线(新。钢笔(newSolidBrush(颜色。DeepSkyBlue),5),0,11*34+5,19*34
,11*34+5);
If(bStart)
{
for(int I = 0;i209)
{
MessageBox。Show("游戏区最多只有209个洞。您选择的数据过多!请重新选择!”);
文本框1。text = " 18 ";
文本框2。Text = " 4
返回;
}
inite BMP(picnum);
If(bStart)
{
MessageBox。Show("游戏已经在运行了!");
返回;
}
其他
{
bStart = true
这个。invalidate();
音乐。play(" Sounds \ \ BG-03 . mid ");
}
}
重新实现的代码如下:
私有void RefreshMap(引用int[,] map)
{
if(int I = 0;我& lt地图宽度;i++)
for(int j & lt;MAPHEIGHTj++)
{
If(gmap[I,j]!=0)
{
Draw(g_g,img[gmap[I,j]-1],i*PICWIDTH,j * PICHEIGHT);
}
}
}
私有void FreshMap(引用int[,] map)
{
Random r = new Random();
for(int I = 0;j & lt地图宽度;i++)
for(int j = 0;j & ltMAPHEIGHTj++)
{
if(gmap[I,j]!=0)
{
int x=r,Nex(19);
int y=r,Nex(11);
int temp=gmap[x,y];
gmap[x,y]=gmap[I,j];
gmap[I,j]= temp;
}
}
运输地图(参考gmap);
}
私有void button2_Click(对象发送方,EventArgs e)
{
刷新播放器。play();
fresh map(ref gmap);
这个。invalidate();
}
4.2.4分数设置
这款游戏一改前人的风格,采用了全新的评分方式,让人在寻找相同画面的同时也注意到了路径的选择,增加了游戏的趣味性。具体规则是:直连得10分,一个拐点得20分,两个拐点得40分。使用标签控件存储分数。
实施代码:
开关(转角[2]。x)
{
case 1;
得分+= 20;//一个拐点加20;
g_g.DrawLine(钢笔,新点(p1。X*31+15,p1。Y*34+17),新
点(角[0])。X*31+15,corner[0],Y*34+17)),;
g_g.DrawLine(钢笔,新点(p2。X*31+15,p2。Y*34+17),新
点(角[0])。X*31+15,corner[0],Y * 34+17);
线程。睡眠(100);
EraseBlock(g_g,p1,p2);
g_g.DrawLine(bkpen,新点(p1。X*31+15,p1。Y*34+17)新
点(角[0])。X*31+15,corner[0],Y * 34+17);
g_g.DrawLine(bkpen,新点(p1。X*31+15,p2。y * 34+170新
点(角[0])。X*31+15,corner[0],Y * 34+17);
打破;
案例二;
得分+= 40;
Point[ ]ps={new Point(p1。X*31+15,p1。Y*34+17),new & ltbr/>;点(角[1])。X*31+15,corner[1],Y*34+17),new & ltbr/>;点(角[0])。X*31+15,corner[0],Y*34+17),newPoint(p2。X*31+15,p2。y * 34+17));& ltbr/>;g_g.DrawLine(钢笔,PS);& ltbr/>;线程。睡眠(100);& ltbr/>;EraseBlock(g_g,p1,p2);& ltbr/>;//foreach(PS中的点MP)& lt;br/>;//{ & lt;br/>;//MessageBox。Box.Show("+mp。X.ToString( )+","+mp。y . ToString()+"));& ltbr/>;//}
打破;
案例0;
得分+= 10;
g_g.DrawLine(钢笔,PS);点(角[0])。X*31+15,corner[0],Y*34+17),newPoint(p2。X*31+15,p2。y * 34+17));
线程。睡眠(100);
EraseBlock(g_g,p1,p2);
g_g.DrawLine(钢笔,PS);点(角[0])。X*31+15,corner[0],Y*34+17),newPoint(p2。X*31+15,p2。y * 34+17));
打破;
默认:break
}
//RefreshMap(ref gmap)
Label5。文字=分数。ToString();
下面还有更多。