C#设计报告-俄罗斯方块(共27页).doc

上传人:飞****2 文档编号:14405298 上传时间:2022-05-04 格式:DOC 页数:27 大小:179.50KB
返回 下载 相关 举报
C#设计报告-俄罗斯方块(共27页).doc_第1页
第1页 / 共27页
C#设计报告-俄罗斯方块(共27页).doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《C#设计报告-俄罗斯方块(共27页).doc》由会员分享,可在线阅读,更多相关《C#设计报告-俄罗斯方块(共27页).doc(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上项目实训报告书学生姓名 课程名称 C课程设计 题 目 俄罗斯方块 专业班级 指导教师 完成日期 目录一概述21.1背景21.2开发与运行环境.3二需求分析3三系统设计4四详细设计.54.1界面设计.54.2代码设计.7五结束语.25六参考文献.261. 概述1.1 背景俄罗斯方块由莫斯科科学学院程序员Alexei Pajitnov所设计。该游戏最初是作为自我消遣的电脑游戏而被制作出来的。此后,由于政治和经济等多方面的原因,该游戏曾经被多家公司代理过。经过多轮诉讼的争夺后,该游戏的代理权最终还是被任天堂获得。俄罗斯方块对于任天堂来说意义重大,因为将它与GB搭配在一起后,

2、产生了令人意想不到的效果,获得了巨大的成功。而对于中国玩家来说,俄罗斯方块可以说是第一次让国人认识到游戏是一种老少皆宜的娱乐方式,从某种程度上扭转了国人的游戏是小孩子的东西或游戏是毒害儿童的元凶等错误观念。一个最初的版本是Spectrum Holobyte为IBM兼容机开发的游戏。该游戏是一款休闲智力型,与通常的此类游戏相比,这款游戏新增了在模块样式上的多彩性。还抛掉了以前那种枯燥的背景音乐,可以让自己随心所欲的背景音乐。于此同时还可以让自己开动脑筋来设计模块。还可以凭自己的喜好。可以设置画布的大小。1.2 开发与运行环境系统的运行对于运行环境的要求是:l 硬件环境目前,我们所开发的系统主要应

3、用在中小规模的学校内部,因此,一般配置的计算机硬件就可以满足系统需求。考虑到学校规模的扩大和硬件价格的降低,为本系统配置在较优秀的服务器硬件上,可以充分发挥本系统的性能。l 处理器:Intel Pentium 4 3.06 GX 或更高l 内存:256M(推荐)l 硬盘空间:40GBl 显卡:SVGA显示适配器l 软件环境l 操作系统:Windows 2000/XPl 开发软件:Microsoft Visual Studio .NET 2003l 数据库:Microsoft SQL Server 20002. 课程设计的目的和意义俄罗斯方块游戏是一个经典的小游戏,由于它简单有趣,因而得到了广泛

4、的流行,男女老幼都适合。而俄罗斯方块游戏的设计工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系较大,包括界面的显示与更新、数据收集、音乐处理等,在设计的过程中,必将运用到各方面的知识,这对于C#设计者而言,是个很好的锻炼机会。2.1实验步骤:1)需求分析:设计一个用户可参与,有背景音乐,可由用户控制任意暂停,可计时,可计分的俄罗斯方块游戏;2) 概要设计:一个游戏运行界面,计分面板,开始按扭,暂停按扭3)详细设计:对整个设计进行总体分析如下: 1定义7种砖块的类型,用两个4*4的二维数组来表示。 2在屏幕上用一个10*20表示游戏区域 3上下左右的出界问题的考虑3砖块的变形

5、问题 4砖块的移动(向左向右向下)问题 5满一行后消掉砖块 6记分问题 7用开始按扭启动游戏 8暂停按扭暂停游戏 9界面的设定 10背景音乐的加入3系统功能设计玩游戏前先要设置参数,键盘的设置比如说:左键,右键,下键,快速向下键。顺时针旋转,逆时针旋转。环境的设置也非常重要,比如:水平格子数,垂直格子数。格子数。前景色等,再者就是砖块的设置,砖块是自己设计的,但是系统也有默认砖块,都是最常用的模块。还可以改变模块的颜色。本系统主要设计以下几种功能:1. 方块下落、变形功能在整个俄罗斯方块游戏中,方块的设计是核心。这里设计了一个方块类:Square( ),用来生成方块以及实现块的左移、右移、向下

6、、变形、重画、同步显示、初始化新块等。2自动升级功能当分数累积到一定大小时,系统将自动为玩家提高难度。这里设置了每消除10行方块,就增加一级难度。当难度增加的时候,方块会相应地改变颜色,以作为对玩家的提示。3游戏音乐功能游戏开始音乐就自动播放,游戏暂停与结束时音乐相应消除。总控模块输出模块处理模块输入模块图片另存为控制窗口图片处理屏幕抓图截图打开文件夹添加图1 系统功能模块结构图图3-8 系统功能模块结构图3. 以系统功能设计分析俄罗斯方块游戏根据功能的不同,设置了如下12个类:Square, Command, GameArea, GameSetting, GameOver, Help, Im

7、agePanel, JieMian, MyPanel, MyTimer, PlayMidi, WinListener,每个类的描述如下:1、Square,方块类。这个类中定义了生成方块的方法,用二维数组int pattern,存放7种方块的四种状态。在构造方法中以随机的形式生成方块,同时提供了以下几种方法:reset( ),leftTurn( ),leftMove( ),rightMove( ),fallDown( ),assertValid(int t,int s,int row,int col),dispBlock(int s)。分别实现方块的重画、翻转、左移、右移、下落、同步显示等功能。

8、2、Command,处理控制类。这是一个实现ActionListener接口的类,主要处理点击按钮事件。类中定义了三个int型变量:button_play,button_quit,button_pause,和一个boolean型的变量:pause_resume,并赋值。在GameArea类中通过事件响应,在按钮执行方法中调用其值,使用switch语句,根据不同按钮不同的值,来响应不同的事件。3、GameArea,游戏界面类。GameArea继承了JFrame,是俄罗斯方块的主要游戏界面。这个类定义了GameSetting类的gameScr对象和ImagePanel类的imagepanel对象作

9、为游戏区域面板和控制区域面板。在游戏区域,主要是根据相应格子的设置标志来显示相应的图形图片,这样就实现了俄罗斯方块的实时显示。4、GameSetting, 游戏画布类。这个类生成的对象将作为游戏界面的方块下落区域,画布的设置为15行10列,当中的方格边长为30,类中还定义了一个二维数组int scrArr作为屏幕数组,表示每一个方格。游戏区域中每一个方格是否存在游戏方块是由该方格的值来决定的,如果该方格的值为1,则表示该方格中存在游戏方块;如果该方格中的值为0,则表示该方格中不存在游戏方块,因此二维数组用于记录游戏区域中每个小方格的值。此外,类中还定义了画方块的方法,根据不同的难度画出不同颜色

10、的方块。单击Play按钮时,系统调用initScr( )方法,初始化屏幕,将屏幕数组清零。当满足满行删除的条件时,系统调用deleteFullLine( )方法,进行删行加分,而且每删除十行,难度自动增加一级,方块颜色改变,并在难度显示框中相应显示。5、GameOver,游戏结束弹出提示框类。当游戏结束时,系统弹出提示,包括玩家分数以及询问玩家要继续游戏还是退出。6、Help,帮助类。在游戏界面,按F1键,弹出提示窗口,获取帮助。7、ImagePanel,背景图片类。这个类继承了JPanel类,用来作为游戏界面中控制区域的容器,并添加图片。8、JieMian,主界面类。这个类继承了JPanel

11、类,作为游戏的第一个界面,也是难度选择界面。定义了9个单选按钮,当玩家未选任何难度就按Enter时,系统会弹出一个提示框,提示玩家先选难度再进入。9、MyPanel,重写MyPanel类,使Panel的四周留空间。10、MyTimer,定时线程类。类中定义了一个run()方法,用sleep()函数实现方块下落的快慢,即调节难度。11、PlayMidi,添加音乐类。在游戏过程中添加背景音乐。12、WinListener,关闭窗口类。4. 4.1 界面设计1、图片浏览器主界面如下图2: 图2. 软件主界面图2、参数设置如下图3: 图3 设置图3、图片调整界如图4:4.2 代码设计1.输入模块:1.

12、1 从文件夹中打开需要浏览的图片:openImage() private void openImage()/ 如果当前正显示幻灯片,先关闭定时器2this.timer1.Enabled = false;if(this.openFileDialog1.ShowDialog() = DialogResult.OK) if(this.pictureBox1 .Image !=null)this.pictureBox1 .Image.Dispose ();pictureBox1.Image = Image.FromFile(this.openFileDialog1.FileName);/设置全局变量e

13、ntireFilePath,用于保存文件名(在上一张、下一张、幻灯片显示时记录当前/图片的位置)this.entireFilePath = this.openFileDialog1.FileName.ToString();this.statusBarPanel2.Text = 图片大小:+this.pictureBox1.Image.Size.Width.ToString();this.statusBarPanel2.Text += * + this.pictureBox1.Image.Size.Height.ToString();/得到图片所在文件夹的路径string filePath =

14、;filePath = openFileDialog1.FileName.Substring(0,openFileDialog1.FileName.LastIndexOf();/打开目录,并将目录中所有.jpg.bmp.gif类型的图片放入FileInDir集合System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(filePath);System.IO.FileInfo fileInfo = dir.GetFiles();FileInDir.Clear();foreach(FileInfo fi in fileInfo)if(fi.

15、Extension = .JPG | fi.Extension = .jpg | fi.Extension = .jpeg | fi.Extension = .tif | fi.Extension = .png | fi.Extension = .bmp | fi.Extension = .BMP | fi.Extension = .gif | fi.Extension = .GIF )FileInDir.Add(fi.FullName.ToString();/得到当前打开图片在FileInDir中的索引(index为定义的全局变量)for(index = 0;index 1)/确定图片浏览的

16、上一张和下一张按钮的可用性this.toolBarButton7.Enabled = true;if(index = 0)/当索引值为第一章时上一张按钮不可用this.toolBarButton5.Enabled = false;this.toolBarButton6.Enabled = true;else if(index = FileInDir.Count-1)this.toolBarButton6.Enabled = false;this.toolBarButton5.Enabled = true;elsethis.toolBarButton5.Enabled = true;this.t

17、oolBarButton6.Enabled = true;this.statusBarPanel1.Text = this.openFileDialog1.FileName.ToString();/在状态栏显示浏览图片的路径FileInfo info =new FileInfo (this.openFileDialog1 .FileName .ToString ();this.statusBarPanel3 .Text =文件大小:+ info.Length.ToString () +B;/显示图片文件的大小从文件夹中拖进图片框:这里用到两个事件:_DragDrop和_DragEnter:pr

18、ivate void pictureBox1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)/图片拖进图片框if(e.Data.GetDataPresent(DataFormats.FileDrop) e.Effect = DragDropEffects.Link; else e.Effect = DragDropEffects.None;private void pictureBox1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e) / 拖

19、进后释放鼠标if (e.Data.GetDataPresent(DataFormats.FileDrop) string files = (string)e.Data.GetData(DataFormats.FileDrop); for ( int i = 0; i files.Length ;i+) test(filesi); 抓屏和截图:这里的代码用到了API函数,这是一段从网上找来的代码改的。在抓屏这个功能中关键代码如下;this.Visible = false ;IntPtr dc1 = CreateDC ( DISPLAY , null , null , ( IntPtr ) nul

20、l ) ;/获取屏幕句柄,即源显示设备句柄Graphics g1 = Graphics.FromHdc ( dc1 ) ;MyImage = new Bitmap ( Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Height , g1 ) ;/初始化Bitbmp实例Graphics g2 = Graphics.FromImage ( MyImage ) ;Visible = false ;dc1 = g1.GetHdc ( ) ;IntPtr dc2 = g2.GetHdc ( ) ;/获取Bitbmp实例对应

21、的句柄BitBlt ( dc2 , 0 , 0 , Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height , dc1 , 0 , 0 , ) ;/利用Bitblt函数,把当前屏幕拷贝到创建的Bitbmp实例中g1.ReleaseHdc ( dc1 ) ;g2.ReleaseHdc ( dc2 ) ;this.Visible = true ;this.SetBounds ( 0 , 0 ,pictureBox1 .Width ,this.pictureBox1 .Height) ;/this.Cursor =

22、Cursors.Cross ;this.pictureBox1 .Image =MyImage;截图功能代码如下:private void Form3_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)if(!isDoubleClick)begin = true;if ( StartedCrop = false ) DeltaX = 0 ;DeltaY = 0 ;StartedCrop = true ;StartPoint = new Point ( e.X , e.Y ) ;SelectRect.Width = 0

23、;SelectRect.Height = 0 ;SelectRect.X = e.X ;SelectRect.Y = e.Y ;Invalidate ( ) ;private void Form3_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)if(begin)Form thisform = ( Form ) sender ;if ( StartedCrop ) DeltaX = e.X - StartPoint.X ; if ( DeltaX 0 ) DeltaX = 0 ;DeltaY = e.Y - Star

24、tPoint.Y ; if ( DeltaY 0 ) DeltaY = 0 ;ControlPaint.DrawReversibleFrame ( thisform.RectangleToScreen ( SelectRect ) , Color.Black , FrameStyle.Dashed ) ;SelectRect.Width = e.X - SelectRect.X ;SelectRect.Height = e.Y - SelectRect.Y ;ControlPaint.DrawReversibleFrame ( thisform.RectangleToScreen ( Sele

25、ctRect ) , Color.Black , FrameStyle.Dashed ) ;private void Form3_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)StartedCrop = false ;SelectRect.X = e.X-StartPoint.X ;SelectRect.Y = e.Y-StartPoint.Y ;/鼠标截图的区域this.Cursor = Cursors.Cross ;isDoubleClick = true;private void Form3_KeyUp(obje

26、ct sender, System.Windows.Forms.KeyEventArgs e)/响应键盘按下Esc退出,按下Enter则截图switch(e.KeyCode )case Keys.Escape :this.Close();break;case Keys.Enter :Qscreen();break;private void Form3_Load(object sender, System.EventArgs e)/在抓屏后在对抓去的图片全屏并进行截图IntPtr dc1 = CreateDC ( DISPLAY , null , null , ( IntPtr ) null )

27、 ;/获取屏幕句柄,即源显示设备句柄Graphics g1 = Graphics.FromHdc ( dc1 ) ;MyImage = new Bitmap ( Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Height , g1 ) ;/初始化Bitbmp实例Graphics g2 = Graphics.FromImage ( MyImage ) ;Visible = false ;dc1 = g1.GetHdc ( ) ;IntPtr dc2 = g2.GetHdc ( ) ;/获取Bitbmp实例对应的句柄

28、BitBlt ( dc2 , 0 , 0 , Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Height , dc1 , 0 , 0 , ) ;/利用Bitblt函数,把当前屏幕拷贝到创建的Bitbmp实例中g1.ReleaseHdc ( dc1 ) ;g2.ReleaseHdc ( dc2 ) ;/this.Visible = true ;this.SetBounds ( 0 , 0 , Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bound

29、s.Height ) ;this.Cursor = Cursors.Cross ;/鼠标为十字型鼠标private void Form3_Paint(object sender, System.Windows.Forms.PaintEventArgs e)if ( MyImage != null ) e.Graphics.DrawImage ( MyImage , ClientRectangle , 0 , 0 , MyImage.Width , MyImage.Height , GraphicsUnit.Pixel ) ;private void Form3_DoubleClick(obje

30、ct sender, System.EventArgs e)this.Left = 0 ;this.Top = 0 ;Bitmap theImage = new Bitmap ( DeltaX , DeltaY ) ;Graphics g = Graphics.FromImage ( theImage ) ;Rectangle destRect = new Rectangle ( 0 , 0 , DeltaX , DeltaY ) ;g.DrawImage ( MyImage , destRect , StartPoint.X , StartPoint.Y , theImage.Width ,

31、 theImage.Height , GraphicsUnit.Pixel ) ;/利用DrawImage方法实现对源图片的截取MyImage = ( Bitmap ) theImage.Clone ( ) ;this.SetBounds ( 0 , 0 , MyImage.Width , MyImage.Height ) ;/根据捕获的图片设定窗体的边界this.Cursor = Cursors.Cross ;Invalidate ( ) ;/MyImage.Save ( C:Captured.jpg ) ;/MessageBox.Show ( 已经保存为C:Captured.jpg! )

32、;this.pictureBox1 .Image =MyImage;this.Close ();2.处理模块: 2.1图片文件管理:报考对图片的打开,保存,另存为,和软件的退出。代码如下:private void menuItem3_Click(object sender, System.EventArgs e)/保存图片在C盘且图片文件名为Captured.jpgif(this.pictureBox1.Image !=null)this.pictureBox1 .Image.Save(C:Captured.jpg ) ;/FileInDirindex.ToString();MessageBo

33、x.Show ( 已经保存为C:Captured.jpg!) ;/+FileInDirindex.ToString();/elseMessageBox.Show (没有要保存的图片!);private void menuItem4_Click(object sender, System.EventArgs e) /图片另存为if(this.pictureBox1 .Image !=null)this.saveFileDialog1.Filter=图像文件(*.JPG)|*.JPG|图像文件(*.BMP)|*.BMP|图像文件(*.GIF)|*.GIF|图像文件(*.PNG)|*.PNG|所有文

34、件(*.*)|*.*;this.saveFileDialog1.ShowDialog();string StrFileName=this.saveFileDialog1.FileName;/if (saveFileDialog1.ShowDialog() = DialogResult.OK) / 文件名if(StrFileName.Trim()=)return;this.pictureBox1.Image .Save (StrFileName);elseMessageBox.Show (没有要保存的图片!); 2.2对图片浏览并进行放大缩小,关键代码如下:private void viewIm

35、age(bool mark)/如果图片框中当前有显示图片时才可进行该方法if(this.pictureBox1.Image != null)/如是mark值为-1,则向前显示if(!mark)if(index = 0)MessageBox.Show(这是第一张了);/index = FileInDir.Count-1;elsethis.pictureBox1.Image = Image.FromFile(FileInDir-index.ToString();/图片框中加载按索引显示图片 /VbycView();/rad(); shiheView();/如果为1,则向后显示elseif(inde

36、x = FileInDir.Count-1)MessageBox.Show(这是最后一张);/index=0; elsethis.pictureBox1.Image = Image.FromFile(FileInDir+index.ToString();/rad(); /VbycView();shiheView();/按合适的显示方式显示在图片框中entireFilePath2 = FileInDirindex.ToString();this.statusBarPanel1 .Text = FileInDirindex.ToString();FileInfo info =new FileInf

37、o (this.statusBarPanel1 .Text );this.statusBarPanel3 .Text =文件大小:+ info.Length.ToString ()+B ;/显示滚动图片的文件大小elseMessageBox.Show(请先打开图片);private void preView()/上一张图片this.pictureBox1 .Image .Dispose ();/释放图片框占用的资源viewImage(false);private void nextView()/下一张图片this.pictureBox1 .Image .Dispose ();viewImage

38、(true);private void max() /放大图片 int w=pictureBox1 .Image .Width ;/图片的宽 int h=pictureBox1 .Image .Height ;/图片的高 / int b=w/h;w=w+25;h=h+20;NewBitmap=new Bitmap(this.pictureBox1 .Image,w,h);/(int)this.numericUpDown1.Value,(int)this.numericUpDown2.Value);新建位图并显示在图片框中this.pictureBox1.Image=NewBitmap;priv

39、ate void min() /缩小图片 int w=pictureBox1 .Image .Width ; int h=pictureBox1 .Image .Height ; /int b=w/h;w=w-25;h=h-20;NewBitmap=new Bitmap(this.pictureBox1.Image,w,h);this.pictureBox1.Image=NewBitmap;/将改变后的位图显示在图片框中2.3对图片进行幻灯片播放:此关键功能包括对图片的动态显示,背景音乐播放,和自动浏览,关键代码如下:动态效果的函数:private void rad() /随机出现动态显示string aa=1,2,3,4,5,6,7;Random rr = new Random();string bb = aarr.Next(0,aa.Length);switch(bb)/建立一个随机数组,并随机运行图片动态显示的函数 case 1: utdView(); break; case 2: rtlView();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com