在设计采用单机模式,当在规定的时间内消完全部的图片则当前关卡通过,若果在规定的时间内没能消完所有的图片则游戏结束,重新开始游戏。游戏规则是模仿普通的连连看游戏,主要是鼠标两次点击的图片是否消去的问题,当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理。在两张相同的图片用三根以内的直线连在一起,就可以消去;否则,不予处理。
游戏过程,如果玩家在一定的时间内消完则提示玩家胜利,并进入下一关。如果在一定的时间内图片没有消完则提示玩家时间到。每关以此类推。
一、 所有图片都是按约定好的种类数和在同一区域的重复次数随机出现,并且每张图片的出现次数为偶数,时间会有限制,每一关的图片数量或时间是不同的,这样就增加了游戏的难度。
二、 在同一区域中,图片出现的种类数和重复数是可以由玩家选择的,时间由游戏约定。不过玩家选择的种类数和重复次数必须是偶数才可以顺利完成游戏,否则游戏虽然可以正常运行,但无法完成游戏。
在一种方案中,由于出现的图像按种类数和重复数都由软件约定,这样就缺乏玩家自主选择的空间,只是在完系统已经是设定好的游戏,不能改变什么,这样就在无意中降低了玩家在游戏过程中的乐趣,最后致使玩家放弃继续玩下去。我们参考了网络上的连连看游戏,考虑到游戏的娱乐性。所以我们放弃第一种方案的设计思想,参考网络上流行的连连看游戏,设计第二种方案。
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[ ]数组中的每个元素,然后根据数组元素值,来显示图片。
4.2.1界面的设计
1、色彩上:总结人们的视觉习惯和色彩对眼睛的健康影响,决定对于画布采用黑色背景,神秘而大方;右边的控制区采用天蓝色,配合左边纯黑的背景,就像黑夜中的蓝天,纯洁而大方。
2、功能上:背景就是窗体,右侧是一个groupbox控件,用来放置控制按钮,下方是一个grogressbar控件,用来显示时间条。
4.2.2图片的随机生成
实现这个功能要分很多个步骤:
1. 程序运行时即载入游戏需要的N张图片,默认情况下图片种类是18,重复数是4(重复数必须是偶数),并且可以选择是否重列。通过一个循环,加载随机的选择N种图片。具体载入图片的代码如下:
private void InteBmp(int maxnum)
{
g_g=this.Creatphics();
for(int i=0;i<MAPWIDTH;i++)
for(int j=0;j<WAPHEIGHT;j++)
gamp[i,j]=0;
IniteRandoMap(ref gamp,maxnum);
AI=new Kernal(ref gmap);
for(int i=0;i<maxnum;i++)
{
ResourceManager rm=new ResourceManager(“LLK data”,Assembly,GetExecut ingAssembly() );
img[i]=(Image)rm.GetObject(i.ToString( )+”.bmp”);
//img[i]=(Image)Bitmap.FormFile(“Images\\”+(i+1). ToString( )+”.bmp”);
}
for(int i=0;i<6;i++)
{
//bombimg[i]=(Image)Bitmap.FromFile(“Image\\B”+(i++). ToString( )+”.bmp”);.
}
}
2. 当确认游戏开始时,通过画图过程完成图片生成,画图的过程代码如下
private bool CheckWin(ref int[,]map)
{
Bool Win=true;
for(int i=0;i0)
{
for(int i=0;i<multipic;i++)
{
Int xrandom=r.Next(19);
Int yrandom=r,Next(11);
If(map[xrandom,yrandom]==0)
{
map[xrandom,yrandom]=num;
}
else
i--;
}
num--;
}
}
private void FreshMap(ref int[,]map)
{
random r=new Random();
for (int i=0;i<MAPWIDTH;i++)
for(int j=0;j<MAPHEIGHT;j++)
{
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;
}
TransportMap(ref gmap);
}
private void TransportMap(ref int[,]map)
{
for (int i=0;i<MAPWIDTH;i++)
for(int j=0;j<MAPHEIGHT;j++)
{
AI.GiveMapValue(i,j,map[i,j]);
}
}
//在指定位置画指定图
private void Draw(Graphics g,Image scrImg,int PicxX,int PicV)
{
g.DrawImage(scrImg,new Point(PicX,PicV));
}
private void Forml_Paint(object sender,PaintEventArg e)
{
g_g.DrawLine(new.Pen(newSolidBrush(Color.DeepSkyBlue),5),0,11*34+5,19*34
,11*34+5);
If(bStart)
{
For(int i=0;i209)
{
MessageBox.Show(“游戏区域内最多只有209个孔,您选的数据太多!请重新选!”);
textBox1.Text=”18”;
textBox2.Text=”4”;
return;
}
IniteBmp(picnum);
If(bStart)
{
MessageBox.Show(“游戏已在运行!”);
return;
}
else
{
bStart=true;
this.Invalidate();
music.Play(“Sounds\\ bg-03.mid”);
}
}
重新实现代码如下:
Private void RefreshMap(ref int[,] map)
{
if ( int i=0;i<MAPWIDTH;i++)
for(int j<MAPHEIGHT;j++)
{
If(gmap[I,j]!=0)
{
Draw(g_g,img[gmap[I,j]-1],i*PICWIDTH,j*PICHEIGHT);
}
}
}
private void FreshMap(ref int[,] map)
{
Random r=new Random();
for(int i=0;j<MAPWIDTH;i++)
for(int j=0;j<MAPHEIGHT;j++)
{
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;
}
}
TransportMap(ref gmap);
}
Private void button2_Click(object sender,EventArgs e)
{
Refreshplayer.Play();
FreshMap(ref gmap);
This.Invalidate();
}
4.2.4得分设置
本游戏一改前人风格,采用全新计分方式,使人们在寻找相同图片的同时还注意路径的选择,更增加了游戏的趣味性,具体规则:直连得10分,一个拐点的20,两个拐点得40.用一个Label控件存储得分。
实现代码:
Switch(corner[2].X)
{
Case1;
Score+=20;//一个拐点加20;
g_g.DrawLine(pen,new Point(p1.X*31+15,p1.Y*34+17),new
Point(corner[0].X*31+15,corner[0],Y*34+17)),;
g_g.DrawLine(pen,new point(p2.X*31+15,p2.Y*34+17),new
Point(corner[0].X*31+15,corner[0],Y*34+17));
Thread.Sleep(100);
EraseBlock(g_g,p1,p2);
g_g.DrawLine(bkpen,new Point(p1.X*31+15,p1.Y*34+17)new
Point(corner[0].X*31+15,corner[0],Y*34+17);
g_g.DrawLine(bkpen,new Point(p1.X*31+15,p2.Y*34+170new
Point(corner[0].X*31+15,corner[0],Y*34+17);
break;
case 2;
score+=40;
Point[ ]ps={new Point(p1.X*31+15,p1.Y*34+17),new<br/> Point(corner[1].X*31+15,corner[1],Y*34+17),new<br/> Point(corner[0].X*31+15,corner[0],Y*34+17),newPoint(p2.X*31+15,p2.Y*34+17));<br/> g_g.DrawLine(pen,ps);<br/> Thread.Sleep(100);<br/> EraseBlock(g_g,p1,p2);<br/>//foreach(Point mp in ps)<br/>//{<br/> //MessageBox.Box.Show(“+mp.X.ToString( )+”,”+mp.Y.ToString( )+”)”));<br/>//}
break;
case 0;
score+=10;
g_g.DrawLine(pen,ps);Point(corner[0].X*31+15,corner[0],Y*34+17),newPoint(p2.X*31+15,p2.Y*34+17));
Thread.Sleep(100);
EraseBlock(g_g,p1,p2);
g_g.DrawLine(pen,ps);Point(corner[0].X*31+15,corner[0],Y*34+17),newPoint(p2.X*31+15,p2.Y*34+17));
break;
default:break;
}
//RefreshMap(ref gmap)
Label5.Text=score.ToString( );
下面还有
温馨提示:内容为网友见解,仅供参考