C#开发俄罗斯方块小游戏

所需积分/C币:50 2015-03-24 20:14:53 5.41MB PDF
收藏 收藏
举报

3天学会基于C#开发俄罗斯方块小游戏(来自小花朵)
2.绘制图形 下面用个小示例来说明如何在应用程序的窗冂中绘图(文章所有的示例都在 Visual studio2005中 建立为C#的 Windows应用程序)。启动vs2005,创建一个 windows应用程序的项目,语言是C#,名字为 Tetris(俄罗斯方块),然后切换到代码视图,在构造函数的最下面追加如下代码: Hev Project 区 Project types: Templates VisuaL D操 Visual studio installed templates Windows + Smart Device o Windows Application Class Library Database Windows Control Library e Console Application Starter Kit peb cRystal Reports Application Device Application +Other languages EASP. NET Web Applicat 感心sP.ET置 eb service App1ica +Other Project t ■yTe■ plates Search Online Templates. A project for ci g an application with a Windows user inter face name etrIs Location E:{C# e 070 amd T±t了is CReate directory for solution □ Add to subversion OK Ca Foralcst Form1. cs [Design]* Tetris. Forml FOrmio 1旧 using System 2 using System. Collections.Generic 3i using System. Comp onentModel: System. Dat 5: using System. Drawing: 6 using System. Text: TLusing System Windows Forms 9E namespace Tetris 11g public partial class Form1:Form 3 public Form1 0 InitializeComponent O Graphics g= this. CreateGraphi cs0:/获取 Graphics对象 18 Pen blueFin= new Pen(C1ox.B1ne,3)://定义一个画笔,颜色为Bue,宽度为3 19 DrawRectang1a(b1 lePer,0,0,50,50);//画矩形 20 Pen redKen= new Pen(1or.Red,2)://定义一个画笔,颜色为红丝,宽度为2 21 22 gnxa11 ipse GredPen,0,50,80,60)://画椭圆 23 241 魔行程序,我们期待的结果是在窗体上出现个蓝色的矩形和个红色的椭圆,但是实际运行结果 什么都没有显示,这是什么原因呢?原因就是在构造函数里执行画图代码的时候,窗口还没有显示 出来,也就是说,还没有可以提供绘图的地方,所以,我们要看到期待中的蓝色矩形和红色椭圆,就必 须在窗∏显示出来以后再执行才能看到效果。 E Fool 知道了原因我们也就知道解决方案,回到设计视图,添加 Form shown事件,通过下面的提示我们知 道这个事件发生在窗口第一次显示的时候。然后我们把代码移动到 Form shown亭件中,再次运行一下程 序,接下了就是见证奇迹的时刻了。 De工t1e雪 For■1 Syst em.冒 indows.Form5.Form 圃 For盈1 回凶 Resizebezin Resizeend Ri ghtToLeftChanged Ri ghtToLeftlayoutCha Scroll For■1 Shorn Sizechanged Stylechanzed SystemColorsChanged ExchAnge Validated ShoT皿 Occurs whenever the form is first shown 期待中的蓝色矩形和红色椭圆如期出现了,矩形的坐标(0,0),大小(50,50)。椭圆的坐标(0,50),大 小⑧80,50)。需要提陧一下的是如果是椭圆,则是外接矩形的坐标。这里坐标(x,y)表小从窗口的客户区 域左上角开始向右的x个像素,向下y个像素—这些是现实出米的图形的左上角的坐标。 外面注意到椭圆的顶部和矩形的下边有轻度的重叠,这与代码中给出的坐标有点不同,这是因为 windows在重叠的区域放置了巨星和椭圆的线条。在默认情况下, windows视图把图形边框所在的线条放 到中心位置——但这并不是总能做到的,因为线条是以像素为单位来绘制的,但每个图形的边框理论上 位于两个像素之间。结果1个像素宽的线条就会正好位于图形顶边和左边的立面,而在右边和底边的外 面。这样,从严格意义上讲,相邻的边框就会有1个像素的重叠。由于我们制定的线条宽度比较大,因此 重叠区城也就比铰大了。一般来说,可以设定Pen. Alignment属性来改变默认的操作方式,但这里使用默 认的操作就足够了。 按下了我们会发现一个问题,如果把这个窗口的绘图部分用别的窗体遮住,或者移动到屏幕的外边或者 最小化,再恢复它,会发现绘制好的图形就不见了或者部分不见了。 Forl 这是怎么回事?这个就要从 windo;s处理屏幕数据的方式米说起了。如果窗凵的一部分被隐藏了 wi ndows通常会立刻删除与其中显示的内容相关的所有信息。这是必须的,否则存储屏幕数据的内存量就 会是个天文数字。按照1024x768像泰,唑位彩色模式,屏幕上的每个点像素)就会占据3个字节 byte),整个屏幕需要2.25B的显存来存储这些数据。下面考虑种最糟糕的情况:屏幕上有20个窗 口,都是最大化状态, windows就需要45的显存来存储,如果是32位的彩色模式,或者分辨率更大 点,则消耗更多的显存,很显然, windows不能这样管理用户界面。 在窗口的某一部分消失时,那些像素也就丢失了。因为 windows释放了保存这些像素的显存。但荽注 意,窗口的一部分被隐藏了,当它检测到窗口不再被隐戴时,就请求拥有该窗口的应用程序重新绘制该 部分的内容。这个规则有一些例夕——窗口的一部分被挡住的时间比较短(如,菜单的拉出,临时挡住了 下面的窗口)。但一般情况下,如果窗口的一部分被挡住,应用程序就需要在以后童新绘制那部分。换句 话说, windows只需要花费一个屏幕的显存就可以处理N多个窗口同时打开的情况,这是我的理解。 这就可以解释我们的程序为什么出问题了。我们的代码只是在第一次显示的时候才执行,并且只执 行一次,不能在以后需要的时候自动重新绘制图形。 备注: windows的标准控件非常专业,能够在 windows需要的吋候自动重新绘制他们自己。所以这就是在 使用时不需耍担心实际绘图过程的原因之 3.使用 OnPaint0绘制图形 上面的解释可以让你觉得挺复杂的,但实际上并非如此,要让应用程序在需要的时候绘制自身是非 常简单的。 windows会利用Pain事件通知应用程序完成一些重新绘制的请求。有趣的是,For类已经执行了这 个事件的处理,因此不需耍再添加处理代码了。 我们添加 OnPaint○事件,根据注释,我们知道这个事件会在控件需要重新绘制的时候发生。然后我 们把代码再移动到这个事件里。 rPe工t1e 冈 Fornl System. Windows, Forms Form ↓幻三 Mouseleave MouseD矿e onset Move Paddingthanged Foral paint ParentChanged Previ ewkeyDown queryAccessibilityhe queryLontinueDrag R严 ionChanpAd Paint Occurs when a control needs repainting /Forel es Form1. cs [Design] 你 Tetris. Form1 FForm1 P I Busing System: 2 using System. Collections. Generic 3iusingsyStem.componentmodel 4: using System. Data 5i using System. Drawing 6 using System.Text T Using System. Windows Forms 9 namespace Tetris o 114 public partial class Forml:Form 123 13 public Form1 O 14 InitializeComponent O 17 18 private void Form1 Shown (object sender, EventArgs private void Form1 Paint Cobject sender, PaintEventArgs e) 24 raphics g=e. raphics:/获取 Graphic对象 Pen bluePen= new Pen〔a1orue,3)://定义一个画笔,颜色为nue,宽度为3 26 g. DrawRect ana1e0b1 uePen,0,050,50):/矩形 27 Pen reoPen=ne"PenC01ox.Bed2):定义一个画笔,颜色为红丝,宽度为 Iaw11 ipse redDen,0,50,80,60);/画椭圆 29 U 31 注意,我们修改了∫获取 Graphics的方式, Painleyenlargs里包含一个 Graphics实例,所以我们就不 需要再调用 reateGraphics(米创建了。运行一下看看结果,发现bug消失了,我们已经成功的实现是在 窗口上绘制我们需要的图形了,有了这些基础,我们就可以正式开工了 备注:这部分主妥捎抄自εC#高缴编程(第四版),第25章第节》 第二部分:详细设计 1.实现原理 了解了基础知识以后我们就可以思考游戏的实现了,其实这个游戏实现的原理卡常简单,就是不断 的在窗口上画砖块,清砖块。注意这里的清砖块其实就是用背景颜色把某个区城给填充而已,本质还是 绘制。 具体的设计思路如下: ●通过ti皿er定时执行某个操作米改变活动砖块的坐标,并更新窗凵的绘图; ●通过键盘事件改变活动砖块的坐标以及形状,并更新窗口的绘图 ●每次更新都要检测是否有填满的行,或者是否游戏结束等等; 针对消除的行数更新游戏得分,等级等信息 2.油象建模 了解了基础知识以后就可以动手设计我们的俄罗斯方块的现实了,根据面向对象的设计思想,我们 第一时间想到的就是抽象建模,提取的最明显的类,模块。既然如此我们就开始吧。 我们知逍游戏的规则是把一个一个不规则的砖块尽可能的填满到槽里,我们就从这些不规则的砖块 入手吧 砖块的样式很多,但是梫据我们对游戏的了解,最长(宽)的砖块也不找过5个,根据这个限制,我们 定义个5x5大小的个容器来行储各个砖块的样式。标准的俄罗期方块的砖块包括下面7中样式。 当然,将来如果我们游戏设计的好,可以自己定义很多样式。到这里,我们就已经提取出了一个 砖块的类了,我们新建一个类,类名为 Brick 接下来,由于如何才能控制产生这些砖块呢?首先要知道总共有多少种砖块信息(档式,颜色),基 丁这个需耍,我们再抽象出个砖块模板类,用丁描述个砖块的样式,颜色等信总,这类就叫做 BrickTemplate吧。 然后为了能够统一管理这些 BrickTemplaτe信息,我们需要设计一个类,用来缉护这些砖块模板,以 方便我们将来随时増加或者获取某个砖块模板,我们就定义一个 TemplateArray类吧。然后呢,还差一个 用来产生砖块的工厂,所以再定义一个 Brickfactory类,用于生产砖块。 到这里,我们对砖块的处理流程已基本清晰了,规整一下如表2-1下: 表2-1 类 说明 BrickTemplate 砖块的信息描述类,相当于一个模其,用来饲作 Brick Template/rray 管理砖块信息的管理类,用于雏 Bricktemnla:e BrickFactory)根据 f Brick Template产生个实际的助 Brick 砖块实体类,用于描述一个实际砖崁 最后,我们还需要设计个游戏画布类,负贵实现游戏的展示以及逻辑处理。这个类是整个游戏的 核心,就起名叫做 Gamepalette 至此,整个类级别的设计就基本结束,还有需要的等到时候用时再实现,方便期间,我们把这些逻 辑模块放到一个文件夹中,解决方案的物理结构如下 Solution Explorer- Tetris 员 司 Solution‘ Tetris (1 project) 日回【tris Fl Properties 由- References 日 Logic Brick BrickFactory.cs ckTemplate.c: l GamePalette cs TemplateArray. cs 国 Resources Forml. cs Formain. cs Progran.c: 3.逻辑实现 接下了我们逐步讲解各个类的具体实现,先从 Brick关入手,上面一节我们说过了,这个类是一个具 体的砖块类,这个类应具有以下属性和方法。 这里详细介绍一下我们的设计思路,我们以一个小砖块元素为单位,母个砖块有5x5=25个坐标,其 中只有一部分是有数据的,也就是有效的,这些有效的坐标也就形成了砖块的样式 比如,下图这个砖块样式的标数组就应该为{(1,2),(1,3),(2,2),(2,3)}。 但是这个砖块有多大呢,由于我们是以一个小砖块元素为单位,所以,每个小砖块元素的坐标点对应为 画布上个知形区域,也就是说每个坐标点的是个 RectRix大小的块。 Is- RectRix -= F-Reot Pix -y (z.2 e-RetPⅸ-2 21) ③1) (1-1) 22) 0,① 23) 考虑到砖块是活动的,所以砖块的实际坐标得加上在画布上的偏移,也就是说某个点的坐标(x,y) 在画有上的实际坐标为(X+x,Y+y)。但是这样计算起来比较麻烦,所以我们采用坐标系平移的方法,把坐 标中心放冒在砖块的中心,即x轴向上,y轴向左偏移2个单位,这样就变成了上图所示,这样做的目的 是为了方使计货。 接下米,我们开始具体讲解每个函数的实现: 7 summ ary>. class Brick 10 private Point[] m Points;//砖块坐标数組 12 private int m://砖块中心点在主画布上的坐标 private int m_I:/砖块中心点在主画布上的Y坐标 private Color m C1or;//砖块颜色 private Color m Becold://背景颜色 16 private int m B1 ochIta;//单元格像素 private SolidBrush m_ Brush://画笔 19 单点放大成矩形 20轴 rivate Rectangle pointtoRect〔 oint p)□ 28 29 ammar y 30 构造砖块 31 15/ < summary> 32 ≤a")砖块样式( p ar an 33 /< p. am na.e="c1r“砖块颜色 par an) 34 ④ param name=“bc010x“)砖块背景√/ par am pnan="siz"砖块单位大小(paan> 36 public Brick(Point[] sa, Colorcolor, Color bgColor, int size). 4T 48 /获取砖块样式坐标 49 //< /// param name"index">/param> 51 <returnsXreturns> 52 public Point[] Points. <summary)> /砖块中心点在主画布上的坐标 9: summar public int X 65 /// <summary> BTE //砖块中心点在主画布上的Y坐标 88 1/ summar 9 public int Y 74 75 ummary 76 /砖块颜色 77 r/ summary) 78 public Color Color. 82: 83 S: <summary> 84 逆时针旋转90度 1/ds ummah public void Contr aRotate O. 66890 顺时针旋转9度 1/ Summary) public void DeasilRotate OP. 10 /J/<summary> 12 /画砖块到画布 // summary) 61/ param name="ap">param> public void PaintGGraphies gp). 4 unary /擦除画布上的砖块 36 /// summary) 37 pa an ngne- g par an public void Erase (Graphics ap) 59 构造函数 summan 3 012 /构造砖块 < ar a nene- sa )砖块样式《 par an aram name="c10“砖块颜色√para 34 lar sm nane=“bgc01ox“)砖块青景《 per am ④ aram naA=“sixe“)砖块单位大小(paxm public Brick (oint[] sa, Color color, Color bgColor, int size) 8g0 m Color color. m Bgcolor bec m BlockSize sire Points = sa m Brush= new SolidBrush(m Color) =2 dc 唯一需要说明一下的是初始偏移我们设定为(2,2),这样就可以完整显示整个砖块了 ●顺时针旋转 J// (summary) /顶时针旋转9度 summary E0f24 public void DeasilRotateO int t for (int i=0:i<m Points. Length: i++) temp=m_Points[i].K: 5B7Bg m Points[i].x=-m Points[i]Y m_ Pointslil Y temp: 结合下图可以更灯的理解转换规则,同样适用于逆时针旋转 Is- Rect Fix-> RectPix-? 0)(11 0,D 100,0 (1) .1 画砖块到画布

...展开详情
试读 33P C#开发俄罗斯方块小游戏
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    抢沙发
    一个资源只可评论一次,评论内容不能少于5个字
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    C#开发俄罗斯方块小游戏 50积分/C币 立即下载
    1/33
    C#开发俄罗斯方块小游戏第1页
    C#开发俄罗斯方块小游戏第2页
    C#开发俄罗斯方块小游戏第3页
    C#开发俄罗斯方块小游戏第4页
    C#开发俄罗斯方块小游戏第5页
    C#开发俄罗斯方块小游戏第6页
    C#开发俄罗斯方块小游戏第7页
    C#开发俄罗斯方块小游戏第8页
    C#开发俄罗斯方块小游戏第9页
    C#开发俄罗斯方块小游戏第10页

    试读已结束,剩余23页未读...

    50积分/C币 立即下载 >