连连看程序设计报告.doc_第1页
连连看程序设计报告.doc_第2页
连连看程序设计报告.doc_第3页
连连看程序设计报告.doc_第4页
连连看程序设计报告.doc_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机应用基础与程序设计三级项目设计报告项目名称:连连看班 级:2014级软件工程8班学 号:140120010226姓 名:郭鹏飞日 期:2014年12月31日说明:报告内容可以根据自己的设计实践自行拟定和修改,内容尽量翔实,页数不够可以加页,内容过于单薄将影响得分。建议写报告之前自己上网或在图书馆查阅相关资料进行报告书写方法的自学。一、项目分析 项目分析简要说明项目主要用户需求、设计思路及模块划分。1、 用户需求分析 在当今社会,人们的生活压力越来越大,也没有太多时间去玩大型的游戏,所以需要一些简单的小游戏来缓解大家的工作和学习压力。而连连看是一款简单,容易理解,大多数人都会玩的小游戏,耗费时间也不是太长,所以特意设计此款游戏来满足用户放松心情的需求。2、 系统设计思路(1)必须先导入图片,当俩张图片一样时,便可以消除;(2)窗体基本的菜单栏必须有;(3)有时间轴控制时间,确定输赢;(4)当时间到时,不能继续游戏;赢了的话,要保存游戏者姓名和判断胜负的时间;(5)最好有历史记录,记录下来用户每一次的得分情况。3、系统模块划分板块一:图片导入。连连看应该有用来点击的图片,使用户避免因为只有数字而感到无聊。板块二:图片标记。连连看需要点击俩次图片,所以必须记录第一次点击的图片是哪一个。板块三:图片连线。该过程是整个游戏的核心过程,是最重要的一个过程,也是耗时最长的一个过程。连线方式主要分为三种方式,即直线连接、一个折点连接、俩个折点连接。如果用户前后点击的图片可以通过三种方式中的任意一种连接,并且图片完全一样,则达到消除图片的效果。板块四:判断成功。通过判断图片是否完全消除,判断游戏是否胜利。板块五:判断失败。如果时间到的话,用户失败,增加了游戏的竞争性。板块六:重新开始。但用户游戏结束或想要重新开始时,可以重新开始新的游戏。板块七:游戏暂停。通过游戏暂停,使用户有事时可以暂停游戏,之后可以继续游戏。板块八:游戏难度。满足不同程度的用户的不同需求,共分为“简单”、“一般”、“复杂”三个难度,享受不同的挑战难度。板块九:历史记录。将用户玩过的记录保存下来,同时可以使用户名和游戏时间都保存下来,并且和游戏难度一一对应。板块十:背景音乐。为了使用户在游戏过程中更加享受,增加背景音乐和消除音乐,并且任何时候可以控制音乐的开始和结束。二、项目设计 详细介绍项目各个子模块的设计方法及设计核心技术。1、 各个子模块的设计方法板块一:图片导入。图片的导入有很多种方法,在该游戏中我采用了ImageList的方法。添加一个ImageList控件,Name为ImageList1,在其Image的属性中添加图片,之后再将图片导入窗口。同时,为了设计简单,我使用了二维Button来承载图片,在i,j的循环中添加代码,具体代码如下: MyButtoni, j.Name = i.ToString();/为了判断图片是否相同 MyButtoni, j.ImageList = imageList1; MyButtoni, j.ImageIndex = i - 1;板块二:图片标记。首先判断是否已有图片选中,如果有则判断是否满足条件;如果没有,则该图片被选中,同时做出标记,我的方法是使背景变为红色,所以在导入图片时没有使图片放大。具体代码如下: Button button = (Button)sender; button.BackColor = Color.Red; if (BeforeButton = null) BeforeButton = button; button = null; else if (button = BeforeButton)/如果前后选择图片为图一张,则取消选择 BeforeButton = null; button.BackColor = this.BackColor; else /判断是否可以消除板块三:图片连线。连线时游戏的核心代码。首先判断直连,如果俩张相同的图片中间没有别的图片则满足条件可以消除。此处通过网上查阅资料,用到了返回值。具体代码如下: /竖直方向的连线 bool Y_line(int Y1, int Y2,int x) if (Y1 Y2)/保证Y1Y2 int t = Y1; Y1 = Y2; Y2 = t; for (int m = Y1 + 1; m = Y2; m+) if (m = Y2) break; if (MyButtonx, m.Visible !=false) return false; return true; /水平方向的连线 bool X_line(int X1, int X2, int y) /保证X1 X2) int t = X1; X1 = X2; X2 = t; for (int m = X1 + 1; m Y2) int t = Y1; Y1 = Y2; Y2 = t; t = X1; X1 = X2; X2 = t; if (Y1 Y2) if (X1 X2) if (MyButtonX1, Y2.Visible = false)/右下 if (X_line(X2, X1, Y2) = true)/经过直连后 X1 X2大小发生变化 if (Y_line(Y1, Y2, X1) = true) z1.X = MyButtonX1, Y2.Left + length / 2; z1.Y = MyButtonX1, Y2.Top + length / 2; return true; if (MyButtonX2, Y1.Visible = false)/左上 if (X_line(X2, X1, Y1) = true) if (Y_line(Y1, Y2, X2) = true) z1.X = MyButtonX2, Y1.Left + length / 2; z1.Y = MyButtonX2, Y1.Top + length / 2; return true; return false; 接着是俩个折点的代码,首先先通过上下左右四个方向分开论述,其代码如下: /二折连右 bool right(int X1, int X2, int Y1, int Y2) for (int x = X1 + 1; x = 0; x-) if (X_line(X1, x, Y1) = true & MyButtonx, Y1.Visible = false) if (OneCorner(x, Y1, X2, Y2) = true) z1.X = MyButtonx, Y1.Left + length / 2; z1.Y = MyButtonx, Y1.Top + length / 2; z2.X = MyButtonx, Y2.Left + length / 2; z2.Y = MyButtonx, Y2.Top + length / 2; return true; if (X_line(X1, 0, Y1) = true) if (X_line(X2, 0, Y2) = true) z1.X = MyButton0, Y1.Left + length / 2; z1.Y = MyButton0, Y1.Top + length / 2; z2.X = MyButton0, Y2.Left + length / 2; z2.Y = MyButton0, Y2.Top + length / 2; return true; return false; /二折连上 bool up(int X1, int X2, int Y1, int Y2) for (int y = Y1 - 1; y = 0; y-) if (Y_line(Y1, y, X1) = true & MyButtonX1, y.Visible = false) if (OneCorner(X1, y, X2, Y2) = true) z1.X = MyButtonX1, y.Left + length / 2; z1.Y = MyButtonX1, y.Top + length / 2; z2.X = MyButtonX2, y.Left + length / 2; z2.Y = MyButtonX2, y.Top + length / 2; return true; if (Y_line(Y1, 0, X1) = true) if (Y_line(Y2, 0, X2) = true) z1.X = MyButtonX1, 0.Left + length / 2; z1.Y = MyButtonX1, 0.Top + length / 2; z2.X = MyButtonX2, 0.Left + length / 2; z2.Y = MyButtonX2, 0.Top + length / 2; return true; return false; /二折连下 bool down(int X1, int X2, int Y1, int Y2) for (int y = Y1 + 1; y = Upright+1; y+) if (Y_line(y, Y1, X1) = true & MyButtonX1, y.Visible = false) if (OneCorner(X1, y, X2, Y2) = true) z1.X = MyButtonX1, y.Left + length / 2; z1.Y = MyButtonX1, y.Top + length / 2; z2.X = MyButtonX2, y.Left + length / 2; z2.Y = MyButtonX2, y.Top + length / 2; return true; if (Y_line(Y1, Upright + 1, X1) = true) if (Y_line(Y2, Upright + 1, X2) = true) z1.X = MyButtonX1, Upright + 1.Left + length / 2; z1.Y = MyButtonX1, Upright + 1.Top + length / 2; z2.X = MyButtonX2, Upright + 1.Left + length / 2; z2.Y = MyButtonX2, Upright + 1.Top + length / 2; return true; return false; 然后将二折连的四种分类综合在一起,代码如下: bool TwoCorner(int X1, int X2, int Y1, int Y2) if (right(X1, X2, Y1, Y2) = true) return true; if (left(X1, X2, Y1, Y2) = true) return true; if (up(X1, X2, Y1, Y2) = true) return true; if (down(X1, X2, Y1, Y2) = true) return true; else return false; 最后将直连、一折连、二折连的代码统统综合起来,代码如下: bool Path() if (X1 = X2) if (Y_line(Y1, Y2, X1) = true) LinkWay = GamePath.line; return true; if (Y1 = Y2) if (X_line(X1, X2, Y1) = true) LinkWay = GamePath.line; return true; if (OneCorner(X1, Y1, X2, Y2) = true) LinkWay = GamePath.OneCorner; return true; if (TwoCorner(X1, X2, Y1, Y2) = true) LinkWay = GamePath.TwoConcer; return true; else return false; 通过这些代码,该游戏连线的判定就解决了。板块四:判断成功。当窗口中没有图片时,便可以弹出窗口通知用户已完成游戏,并记录游戏者姓名。记录姓名在板块九会详细介绍,下面是判断是否完成游戏的代码: private bool Win() for (i = 1; i = Horizontal; i+) for (j = 1; j = Upright; j+) if (MyButtoni, j.Visible = false) continue; else return false; if (i = Horizontal+1) return true; else return false; 板块五:判断失败。该过程比较简单,当时间结束时游戏即失败,代码如下: private bool Lose() if (time = 0) timer1.Enabled = false; return true; else return false; 该代码应该在时间空间Timer的Tick时间中执行。板块六:重新开始。在窗口中添加“主菜单”按钮,用户可以通过返回主菜单重新开始游戏。在该事件下加游戏初始化的代码,具体如下: private void initialise()/初始化游戏 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+) MyButtoni, j = new Button(); MyButtoni, j.Size = new Size(length, length); MyButtoni, j.Left = 3 * distance + (i - 1) * length; MyButtoni, j.Top = 3 * distance + (j - 1) * length + menuStrip1.Height; MyButtoni, j.Visible = false; Controls.Add(MyButtoni, j); for (i = 1; i = Horizontal; i+) for (j = 1; j = Upright; j+) Button button = new Button(); button = MyButtoni, j; button.Click += new EventHandler(Mybt_Click); MyButtoni, j.Name = i.ToString();/为了判断图片是否相同 MyButtoni, j.ImageList = imageList1; MyButtoni, j.ImageIndex = i - 1; MyButtoni, j.Visible = true; /导入图片 /调整各个控件 窗体的位置 location(); 板块七:游戏暂停。当游戏暂停时,该按钮应该显示“继续”,同时时间停止,用户不能看到游戏界面;继续游戏后,按钮显示“暂停”,同时时间开始继续减少。时间停止与继续通过控制Timer的Enable属性。为了遮盖游戏界面,用了PictureBox空间,通过控制该空间的Visibl属性控制游戏界面的可见性,同时可以在游戏开始时显示该图片,使界面更加美观。板块八:游戏难度。该设计也比较简单,通过控制图片的多少来控制难度。游戏难度可以在开始游戏之前选择,不再赘述。板块九:历史记录。该过程主要应用了文件的读取和窗体之间变量的传递。记录必须保存在当地的文件里,否则游戏关闭后记录将不再存在,都取时也必须从当地文件读取。其中文件应分为简单游戏的姓名,分数,一般难度的姓名、分数和困难难度的姓名和分数构成,以简单游戏为例。同时窗口间变量的传递可以将要传递的变量写在form后的括号中,然后承接的窗口要有接受的变量,类似于事件之间的传递。接着是保存记录,当游戏胜利,弹出FormWin窗口,可以记录游戏者姓名和时间,代码如下: FileStream fs = new FileStream(.FileseasyName.txt, FileMode.Append); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);/解决乱码 FileStream fsTime = new FileStream(.FileseasyTime.txt, FileMode.Append); StreamWriter swTime = new StreamWriter(fsTime, Encoding.Default); sw.WriteLine(textBox1.Text); swTime.WriteLine(time.ToString(); sw.Close(); fs.Close(); swTime.Close(); fsTime.Close();这样便可以把记录存到当地的文件夹里。然后是点击排行榜是需要读取文件,还是以简单模式为例,弹出新的窗口FormTop,代码如下: StreamReader sr = new StreamReader(.FileseasyName.txt, false); StreamReader srTime = new StreamReader(.FileseasyTime.txt, false); MyName = sr.ReadToEnd();/读取全部 time = srTime.ReadToEnd(); sr.Close(); srTime.Close(); label1.Text += nn + MyName; label2.Text += nn + time;板块十:游戏音乐。游戏音乐分为背景音乐和消除音乐。消除音乐内存比较小,可以直接用WAV格式,代码也比较简单,当消除成功时执行如下代码: SoundPlayer SP = new SoundPlayer(); SP.SoundLocation = .SoundClear.Wav; SP.Play();然后北京音乐如果用WAV格式的话内存太大,为减小游戏内存,所以将北京音乐换为WMA格式,同时上面的代码不可用,所以我通过百度找到一些代码,虽然不是太懂,但为了游戏的完整性,还是使用了。首先要声明空间,即:using System.Runtime.InteropServices;using System.Media;/播放音乐用的空间接着,在class FormMain中添加如下代码: public static uint SND_ASYNC = 0x0001; / play asynchronously public static uint SND_FILENAME = 0x00020000; / name is file name DllImport(winmm.dll) public static extern uint mciSendString(string lpstrCommand, string lpstrReturnString, uint uReturnLength, uint hWndCallback); /播放音乐 /没看懂。最后在你想要播放音乐的位置添加如下代码: mciSendString(close temp_alias, null, 0, 0); mciSendString(open .SoundBackMusic.wma alias temp_alias, null, 0, 0); mciSendString(play temp_alias repeat, null, 0, 0);(其中.SoundBackMusic.wma为文件位置)我在FormMain中添加了一段,实现了北京音乐的播放,为了实现音乐的暂停,当用户关闭背景音乐时,执行相似代码,将文件换为空白文件即可实现。2、 设计核心技术 核心技术主要是连线的实现,上面已经阐述,同时为了美观,添加了一些基本功能。(1) GDI+画图 当连线条件满足时,画出俩个图片之间的连线方式,首先需要找出图片的中心,如果是直连,可以直接连接,一折连和二折连需要找出他们的折点然后连线,之后停顿几秒后连线要消失。连线的代码如下: private void DrawLine(int X1, int X2, int Y1, int Y2,Color myColor,GamePath LinkWay) Graphics g = this.CreateGraphics(); Pen myPen = new Pen(myColor, 2); int x1 = MyButtonX1, Y1.Left + length / 2; int y1 = MyButtonX1, Y1.Top + length / 2; int x2 = MyButtonX2, Y2.Left + length / 2; int y2 = MyButtonX2, Y2.Top + length / 2;/调整连线的点为Button的中点 switch (LinkWay) case GamePath.line: g.DrawLine(myPen, x1, y1, x2, y2); break; case GamePath.OneCorner: g.DrawLine(myPen, x1, y1, z1.X, z1.Y); g.DrawLine(myPen, z1.X, z1.Y,x2, y2); break; case GamePath.TwoConcer: g.DrawLine(myPen, x1, y1, z1.X, z1.Y); g.DrawLine(myPen, z1.X, z1.Y, z2.X, z2.Y); g.DrawLine(myPen, z2.X, z2.Y, x2, y2); break; 如果消除条件满足,执行该事件。(2) 用到了枚举类型,将游戏的难易程度分开,以便统计,具体代码如下: public enum style easy, common, hard ; public enum Rank easy,common,hard ;(3) 应用了进度条来显示时间的多少,进度条的Max

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论