连连看程序设计报告DOC.docx

上传人:b****6 文档编号:4812644 上传时间:2022-12-09 格式:DOCX 页数:19 大小:23.17KB
下载 相关 举报
连连看程序设计报告DOC.docx_第1页
第1页 / 共19页
连连看程序设计报告DOC.docx_第2页
第2页 / 共19页
连连看程序设计报告DOC.docx_第3页
第3页 / 共19页
连连看程序设计报告DOC.docx_第4页
第4页 / 共19页
连连看程序设计报告DOC.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

连连看程序设计报告DOC.docx

《连连看程序设计报告DOC.docx》由会员分享,可在线阅读,更多相关《连连看程序设计报告DOC.docx(19页珍藏版)》请在冰豆网上搜索。

连连看程序设计报告DOC.docx

连连看程序设计报告DOC

连连看程序设计报告(DOC)

 

《计算机应用基础与程序设计》

三级项目设计报告

 

项目名称:

连连看

班级:

2014级软件工程8班

学号:

140120010226

姓名:

郭鹏飞

日期:

2014年12月31日

说明:

报告内容可以根据自己的设计实践自行拟定和修改,内容尽量翔实,页数不够可以加页,内容过于单薄将影响得分。

建议写报告之前自己上网或在图书馆查阅相关资料进行报告书写方法的自学。

一、项目分析

项目分析简要说明项目主要用户需求、设计思路及模块划分。

1、用户需求分析

在当今社会,人们的生活压力越来越大,也没有太多时间去玩大型的游戏,所以需要一些简单的小游戏来缓解大家的工作和学习压力。

而连连看是一款简单,容易理解,大多数人都会玩的小游戏,耗费时间也不是太长,所以特意设计此款游戏来满足用户放松心情的需求。

2、系统设计思路

(1)必须先导入图片,当俩张图片一样时,便可以消除;

(2)窗体基本的菜单栏必须有;

(3)有时间轴控制时间,确定输赢;

(4)当时间到时,不能继续游戏;赢了的话,要保存游戏者姓名和判断胜负的时间;

(5)最好有历史记录,记录下来用户每一次的得分情况。

3、系统模块划分

板块一:

图片导入。

连连看应该有用来点击的图片,使用户避免因为只有数字而感到无聊。

板块二:

图片标记。

连连看需要点击俩次图片,所以必须记录第一次点击的图片是哪一个。

板块三:

图片连线。

该过程是整个游戏的核心过程,是最重要的一个过程,也是耗时最长的一个过程。

连线方式主要分为三种方式,即直线连接、一个折点连接、俩个折点连接。

如果用户前后点击的图片可以通过三种方式中的任意一种连接,并且图片完全一样,则达到消除图片的效果。

板块四:

判断成功。

通过判断图片是否完全消除,判断游戏是否胜利。

板块五:

判断失败。

如果时间到的话,用户失败,增加了游戏的竞争性。

板块六:

重新开始。

但用户游戏结束或想要重新开始时,可以重新开始新的游戏。

板块七:

游戏暂停。

通过游戏暂停,使用户有事时可以暂停游戏,之后可以继续游戏。

板块八:

游戏难度。

满足不同程度的用户的不同需求,共分为“简单”、“一般”、“复杂”三个难度,享受不同的挑战难度。

板块九:

历史记录。

将用户玩过的记录保存下来,同时可以使用户名和游戏时间都保存下来,并且和游戏难度一一对应。

板块十:

背景音乐。

为了使用户在游戏过程中更加享受,增加背景音乐和消除音乐,并且任何时候可以控制音乐的开始和结束。

二、项目设计

详细介绍项目各个子模块的设计方法及设计核心技术。

1、各个子模块的设计方法

板块一:

图片导入。

图片的导入有很多种方法,在该游戏中我采用了ImageList的方法。

添加一个ImageList控件,Name为ImageList1,在其Image的属性中添加图片,之后再将图片导入窗口。

同时,为了设计简单,我使用了二维Button来承载图片,在i,j的循环中添加代码,具体代码如下:

MyButton[i,j].Name=i.ToString();//为了判断图片是否相同

MyButton[i,j].ImageList=imageList1;

MyButton[i,j].ImageIndex=i-1;

板块二:

图片标记。

首先判断是否已有图片选中,如果有则判断是否满足条件;如果没有,则该图片被选中,同时做出标记,我的方法是使背景变为红色,所以在导入图片时没有使图片放大。

具体代码如下:

Buttonbutton=(Button)sender;

button.BackColor=Color.Red;

if(BeforeButton==null)

{

BeforeButton=button;

button=null;

}

else

{

if(button==BeforeButton)//如果前后选择图片为图一张,则取消选择

{

BeforeButton=null;

button.BackColor=this.BackColor;

}

else

//判断是否可以消除

板块三:

图片连线。

连线时游戏的核心代码。

首先判断直连,如果俩张相同的图片中间没有别的图片则满足条件可以消除。

此处通过网上查阅资料,用到了返回值。

具体代码如下:

//竖直方向的连线

boolY_line(intY1,intY2,intx)

{

if(Y1>Y2)//保证Y1

{

intt=Y1;

Y1=Y2;

Y2=t;

}

for(intm=Y1+1;m<=Y2;m++)

{

if(m==Y2)

break;

if(MyButton[x,m].Visible!

=false)

{

returnfalse;

}

}

returntrue;

}

//水平方向的连线

boolX_line(intX1,intX2,inty)

{

//保证X1

if(X1>X2)

{

intt=X1;X1=X2;X2=t;

}

for(intm=X1+1;m<=X2;m++)

{

if(m==X2)

break;

if(MyButton[m,y].Visible!

=false)

returnfalse;

}

returntrue;

}

然后是一个折点,需要判断被选中的俩个图片的相对位置,此处直接应用了直连的部分代码:

boolOneCorner(intX1,intY1,intX2,intY2)

{

if(Y1>Y2)

{

intt=Y1;Y1=Y2;Y2=t;

t=X1;X1=X2;X2=t;

}

if(Y1

{

if(X1

{

if(MyButton[X1,Y2].Visible==false)//左下

{

if(X_line(X1,X2,Y2)==true)

{

if(Y_line(Y1,Y2,X1)==true)

{

z1.X=MyButton[X1,Y2].Left+length/2;

z1.Y=MyButton[X1,Y2].Top+length/2;

returntrue;

}

}

}

if(MyButton[X2,Y1].Visible==false)//右上

{

if(X_line(X1,X2,Y1)==true)

{

if(Y_line(Y1,Y2,X2)==true)

{

z1.X=MyButton[X2,Y1].Left+length/2;

z1.Y=MyButton[X2,Y1].Top+length/2;

returntrue;

}

}

}

}

if(X1>X2)

{

if(MyButton[X1,Y2].Visible==false)//右下

{

if(X_line(X2,X1,Y2)==true)//经过直连后X1X2大小发生变化

{

if(Y_line(Y1,Y2,X1)==true)

{

z1.X=MyButton[X1,Y2].Left+length/2;

z1.Y=MyButton[X1,Y2].Top+length/2;

returntrue;

}

}

}

if(MyButton[X2,Y1].Visible==false)//左上

{

if(X_line(X2,X1,Y1)==true)

{

if(Y_line(Y1,Y2,X2)==true)

{

z1.X=MyButton[X2,Y1].Left+length/2;

z1.Y=MyButton[X2,Y1].Top+length/2;

returntrue;

}

}

}

}

}

returnfalse;

}

接着是俩个折点的代码,首先先通过上下左右四个方向分开论述,其代码如下:

//二折连——右

boolright(intX1,intX2,intY1,intY2)

{

for(intx=X1+1;x<=Horizontal+1;x++)

{

if(X_line(X1,x,Y1)==true&&MyButton[x,Y1].Visible==false)

{

if(OneCorner(x,Y1,X2,Y2)==true)

{

z1.X=MyButton[x,Y1].Left+length/2;

z1.Y=MyButton[x,Y1].Top+length/2;

z2.X=MyButton[x,Y2].Left+length/2;

z2.Y=MyButton[x,Y2].Top+length/2;

returntrue;

}

}

if(X_line(X1,Horizontal+1,Y1)==true)

{

if(X_line(X2,Horizontal+1,Y2)==true)

{

z1.X=MyButton[Horizontal+1,Y1].Left+length/2;

z1.Y=MyButton[Horizontal+1,Y1].Top+length/2;

z2.X=MyButton[Horizontal+1,Y2].Left+length/2;

z2.Y=MyButton[Horizontal+1,Y2].Top+length/2;

returntrue;

}

}

}

returnfalse;

}

//二折连——左

boolleft(intX1,intX2,intY1,intY2)

{

for(intx=X1-1;x>=0;x--)

{

if(X_line(X1,x,Y1)==true&&MyButton[x,Y1].Visible==false)

{

if(OneCorner(x,Y1,X2,Y2)==true)

{

z1.X=MyButton[x,Y1].Left+length/2;

z1.Y=MyButton[x,Y1].Top+length/2;

z2.X=MyButton[x,Y2].Left+length/2;

z2.Y=MyButton[x,Y2].Top+length/2;

returntrue;

}

}

}

if(X_line(X1,0,Y1)==true)

{

if(X_line(X2,0,Y2)==true)

{

z1.X=MyButton[0,Y1].Left+length/2;

z1.Y=MyButton[0,Y1].Top+length/2;

z2.X=MyButton[0,Y2].Left+length/2;

z2.Y=MyButton[0,Y2].Top+length/2;

returntrue;

}

}

returnfalse;

}

//二折连——上

boolup(intX1,intX2,intY1,intY2)

{

for(inty=Y1-1;y>=0;y--)

{

if(Y_line(Y1,y,X1)==true&&MyButton[X1,y].Visible==false)

{

if(OneCorner(X1,y,X2,Y2)==true)

{

z1.X=MyButton[X1,y].Left+length/2;

z1.Y=MyButton[X1,y].Top+length/2;

z2.X=MyButton[X2,y].Left+length/2;

z2.Y=MyButton[X2,y].Top+length/2;

returntrue;

}

}

}

if(Y_line(Y1,0,X1)==true)

{

if(Y_line(Y2,0,X2)==true)

{

z1.X=MyButton[X1,0].Left+length/2;

z1.Y=MyButton[X1,0].Top+length/2;

z2.X=MyButton[X2,0].Left+length/2;

z2.Y=MyButton[X2,0].Top+length/2;

returntrue;

}

}

returnfalse;

}

//二折连——下

booldown(intX1,intX2,intY1,intY2)

{

for(inty=Y1+1;y<=Upright+1;y++)

{

if(Y_line(y,Y1,X1)==true&&MyButton[X1,y].Visible==false)

{

if(OneCorner(X1,y,X2,Y2)==true)

{

z1.X=MyButton[X1,y].Left+length/2;

z1.Y=MyButton[X1,y].Top+length/2;

z2.X=MyButton[X2,y].Left+length/2;

z2.Y=MyButton[X2,y].Top+length/2;

returntrue;

}

}

}

if(Y_line(Y1,Upright+1,X1)==true)

{

if(Y_line(Y2,Upright+1,X2)==true)

{

z1.X=MyButton[X1,Upright+1].Left+length/2;

z1.Y=MyButton[X1,Upright+1].Top+length/2;

z2.X=MyButton[X2,Upright+1].Left+length/2;

z2.Y=MyButton[X2,Upright+1].Top+length/2;

returntrue;

}

}

returnfalse;

}

然后将二折连的四种分类综合在一起,代码如下:

boolTwoCorner(intX1,intX2,intY1,intY2)

{

if(right(X1,X2,Y1,Y2)==true)

returntrue;

if(left(X1,X2,Y1,Y2)==true)

returntrue;

if(up(X1,X2,Y1,Y2)==true)

returntrue;

if(down(X1,X2,Y1,Y2)==true)

returntrue;

else

returnfalse;

}

最后将直连、一折连、二折连的代码统统综合起来,代码如下:

boolPath()

{

if(X1==X2)

{

if(Y_line(Y1,Y2,X1)==true)

{

LinkWay=GamePath.line;

returntrue;

}

}

if(Y1==Y2)

{

if(X_line(X1,X2,Y1)==true)

{

LinkWay=GamePath.line;

returntrue;

}

}

if(OneCorner(X1,Y1,X2,Y2)==true)

{

LinkWay=GamePath.OneCorner;

returntrue;

}

if(TwoCorner(X1,X2,Y1,Y2)==true)

{

LinkWay=GamePath.TwoConcer;

returntrue;

}

else

returnfalse;

}

通过这些代码,该游戏连线的判定就解决了。

板块四:

判断成功。

当窗口中没有图片时,便可以弹出窗口通知用户已完成游戏,并记录游戏者姓名。

记录姓名在板块九会详细介绍,下面是判断是否完成游戏的代码:

privateboolWin()

{

for(i=1;i<=Horizontal;i++)

{

for(j=1;j<=Upright;j++)

{

if(MyButton[i,j].Visible==false)

continue;

else

returnfalse;

}

}

if(i==Horizontal+1)

returntrue;

else

returnfalse;

}

板块五:

判断失败。

该过程比较简单,当时间结束时游戏即失败,代码如下:

privateboolLose()

{

if(time<=0)

{

timer1.Enabled=false;

returntrue;

}

else

returnfalse;

}

该代码应该在时间空间Timer的Tick时间中执行。

板块六:

重新开始。

在窗口中添加“主菜单”按钮,用户可以通过返回主菜单重新开始游戏。

在该事件下加游戏初始化的代码,具体如下:

privatevoidinitialise()//初始化游戏

{

score=0;

//时间轴

time=60;

toolStripProgressBar1.Maximum=time;

toolStripProgressBar1.Minimum=0;

toolStripProgressBar1.Value=time;

//时间轴

toolStripStatusLabel1.Text="你的分数:

"+score.ToString();

toolStripStatusLabel2.Text="所剩时间:

"+time.ToString();

buttonMean.Visible=true;

buttonBegin.Enabled=true;

for(i=0;i<=Horizontal+1;i++)

{

for(j=0;j<=Upright+1;j++)

{

MyButton[i,j]=newButton();

MyButton[i,j].Size=newSize(length,length);

MyButton[i,j].Left=3*distance+(i-1)*length;

MyButton[i,j].Top=3*distance+(j-1)*length+menuStrip1.Height;

MyButton[i,j].Visible=false;

Controls.Add(MyButton[i,j]);

}

}

for(i=1;i<=Horizontal;i++)

{

for(j=1;j<=Upright;j++)

{

Buttonbutton=newButton();

button=MyButton[i,j];

button.Click+=newEventHandler(Mybt_Click);

MyButton[i,j].Name=i.ToString();//为了判断图片是否相同

MyButton[i,j].ImageList=imageList1;

MyButton[i,j].ImageIndex=i-1;

MyButton[i,j].Visible=true;

//导入图片

}

}

//调整各个控件窗体的位置

location();

}

板块七:

游戏暂停。

当游戏暂停时,该按钮应该显示“继续”,同时时间停止,用户不能看到游戏界面;继续游戏后,按钮显示“暂停”,同时时间开始继续减少。

时间停止与继续通过控制Timer的Enable属性。

为了遮盖游戏界面,用了PictureBox空间,通过控制该空间的Visibl属性控制游戏界面的可见性,同时可以在游戏开始时显示该图片,使界面更加美观。

板块八:

游戏难度。

该设计也比较简单,通过控制图片的多少来控制难度。

游戏难度可以在开始游戏之前选择,不再赘述。

板块九:

历史记录。

该过程主要应用了文件的读取和窗体之间变量的传递。

记录必须保存在当地的文件里,否则游戏关闭后记录将不再存在,都取时也必须从当地文件读取。

其中文件应分为简单游戏的姓名,分数,一般难度的姓名、分数和困难难度的姓名和分数构成,以简单游戏为例。

同时窗口间变量的传递可以将要传递的变量写在form后的括号中,然后承接的窗口要有接受的变量,类似于事件之间的传递。

接着是保存记录,当游戏胜利,弹出FormWin窗口,可以记录游戏者姓名和时间,代码如下:

{

FileStreamfs=newFileStream(@".\Files\easyName.txt",FileMode.Append);

StreamWritersw=newStreamWriter(fs,Encoding.UTF8);//解决乱码

FileStreamfsTime=newFileStream(@".\Files\easyTime.txt",FileMode.Append);

StreamWriterswTime=newStreamWriter(fsTime,Encoding.Default);

sw.WriteLine(textBox1.Te

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1