面向对象程序设计实训(吃金豆游戏设计与实现)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

面向对象程序设计实训(吃金豆游戏设计与实现)常熟理工学院计算机学院在VisualStudio2005环境下用C#编写GUI代码达到如下功能:(1)游戏基本功能:游戏屏幕是一个NxN的网格,其中某些格子是固定的墙壁,其他网格是可以通行的,开始的时候放满了金豆。游戏开始后,玩家通过键盘的方向键控制游戏主角PACMAN移动,经过的地方,金豆被吃掉,同时加分。游戏屏幕上还有一个怪物,它会随机地移动。PACMAN如果碰到怪物,游戏失败。如果吃掉了全部金豆,则游戏成功。(2)游戏场景(即墙壁和金豆的位置,PACMAN与怪物的初始位置等信息)是从文件scene.txt中读到的。格式如下:pr,pc,mr,mc//(pr,pc)为Pacman初始行列,(mr,mc)为Monster初始行列11111111//第一行,N列,其中1表示墙;0表示金豆10010..//第2-N行....(3)附加功能,完成以上内容的同学选做:①游戏主菜单开始游戏、查看成绩排行榜、退出游戏等项目。②每次游戏成功结束,要求输入用户名,并记录成绩到文件score.txt。如果已有同名用户,且本次得分更高,则替代之。在显示排行榜时,按得分高低排序。③使用不同的关卡,即使用多个场景文件scene(0-n).txt,在开始游戏时选择。④加入声音效果,吃到金豆时,Win/Lost时显示不同的声音。3、基础部分训练内容(1)C#面向对象程序设计,VisualStuio2005开发环境;(2)C#GUI编程;(3)游戏及动画实现;(4)游戏相关功能(键盘处理,图形移动,随机数,数学函数等)。4、指导教师:宋东兴、殷旭东1.代理和事件一、代理(delegate)1、代理概念是一种将方法作为对象封装起来的引用数据类型,一个代理变量可以指向一个方法。(1)定义一个名为OpHandler的代理类型。delegatedoubleOpHandler(doublex,doubley);(2)创建一个代理变量h1;classCalc{publicstaticdoubleAdd(doublex,doubley){returnx+y;}publicdoubleSub(doublex,doubley){returnx-y;}}OpHandlerh1=Calc.Add;//h1指向Add方法(3)通过代理变量h1调用它指向的方法doubleresult;result=h1(3,4);//调用Add方法h1=newCalc().Sub;result=h1(3,4);//调用Sub方法2、代理作为方法的参数classMathOp{privatedoubleleft;privatedoubleright;publicMathOp(doubleleft,doubleright){this.left=left;this.right=right;}publicdoubleGetResult(OpHandlerop){returnop(left,right);}}classApp{publicstaticvoidMain(){MathOpm1=newMathOp(3,4);doubleresult=m1.GetResult(Calc.Add);Console.WtriteLine(“result={0}”,result);}}3、代理变量作为类的一个数据成员classMathOp{publicOpHandlerop;//op是代理变量privatedoublefirst;privatedoublesecond;publicMathOp(doublefirst,doublesecond){this.first=first;this.second=second;op=null;}publicdoubleInvoke(){if(op==null)//如果有方法注册委托变量opthrownewException();returnop(first,second);//通过委托来调用方法}}classApp{publicstaticvoidMain(){MathOpm1=newMathOp(3,4);代理作为参数m1.op=Calc.Add;doubleresult=m1.Invoke();Console.WtriteLine(“result={0}”,result);}}4、多播代理在C#中,代理是“多播”的,这表示它可同时指向一个以上的方法。多播代理将维护一个方法列表。当调用该代理时,将会按FIFO顺序调用列表中的所有方法。publicdelegatevoidGreetingDelegate(stringname);classGreetingManager{publicGreetingDelegatesay;publicvoidGreetPeople(stringname){if(say!=null)say(name);}}classApp{publicstaticvoidEnglishGreeting(stringname){Console.WriteLine(Morning,+name);//英文问候}publicstaticvoidChineseGreeting(stringname){Console.WriteLine(早上好,+name);//中文问候}publicstaticvoidMain(){GreetingManagergm=newGreetingManager();gm.say=EnglishGreeting;gm.say+=ChineseGreeting;//用+=合并两个代理gm.GreetPeople(“Marry”);//也可以直接gm.say(“Marry”)调用委托}}注:同样用-=可以删除一个代理。二、事件(event)将代理封装起来就成了事件,事件对外是公开的,而它所对应的代理是私有的。事件可以看作是受限的代理。因此事件也可以绑定(注册)一个方法,但不能通过=,只能通过+=进行。事件最常见的用途是用于窗体编程,当发生像点击按钮、移动鼠标等事件时,对应的方法执行,以响应该事件。例1:将上例的GreetingDelegate代理封装成MakeGreet的事件,代码如下:publicdelegatevoidGreetingDelegate(stringname);classGreetingManager{/*将代理GreetingDelegate封装成事件MakeGreet*/publiceventGreetingDelegateMakeGreet;publicvoidGreetPeople(stringname){if(MakeGreet!=null)MakeGreet(name);//调用事件}}classApp{publicstaticvoidEnglishGreeting(stringname){Console.WriteLine(Morning,+name);//英文问候}publicstaticvoidChineseGreeting(stringname){Console.WriteLine(早上好,+name);//中文问候}publicstaticvoidMain(){GreetingManagergm=newGreetingManager();gm.MakeGreet=EnglishGreeting;//编译错误,不允许用=注册方法gm.MakeGreet+=ChineseGreeting;gm.GreetPeople(“Marry”);/*不可以直接gm.MakeGreet(“Marry”)调用事件,只能在定义MakeGreet的类中调用事件。*/}}例2:类Button在GUI中代表按钮,在Button类中定义了一个Click事件,它是对代理EventHandler的封装。(1)EventHandler代理的定义如下:delegatevoidEventHandler(objectsender,EventArgse);(2)Click事件定义如下:eventEventHandlerClick;ButtonbtnOK=newButton();//实例化一个名btnOk的按钮btnOK.Click+=ClickProcess;//为它的Click事件注册ClickProcess方法。则当单击btnOK按钮时,ClickProcess方法被调用以响应该单击事件。2.窗体和按钮一、窗体(Form类)1、Form类是所有高级窗口的基类。2、设置Form属性如:(Text,Location,Size,Name)(FormBorderStyle,BackColor,StartPosition)(MaximunBox,MinimunBox,ControlBox)等。二、按钮控件(Button类)1、属性:(Text,Name,Enabled,…)2、方法:Show(),Hide(),Focus(),Invalidate()…3、事件:ClickGUI应用程序的例子:1)生成并显示一个标题为Hello的空白窗体:classMyForm:Form{publicMyForm(){this.Text=“Hello”;}}classWinApp{publicstaticvoidMain(){Application.Run(newMyForm());}}2)在窗体中增加一个按钮,按钮标题为OK,修改MyForm类:classMyForm:Form{privateButtonbtnOK;publicMyForm(){btnOK=newButton();btnOK.Text=“OK”;this.Text=“Hello”;this.Controls.Add(btnOK);}}运行程序,单击OK按钮,看看有没有什么发生?3)为OK按钮注册Click事件,当单击OK时,按钮的背景色变红。修改MyForm类:classMyForm:Form{privateButtonbtnOK;publicMyForm(){btnOK=newButton();btnOK.Text=“OK”;btnOK.Click+=ClickProcess;//注册click事件this.Text=“Hello”;this.Controls.Add(btnOK);}publicvoidClickProcess(objectsender,EventArgse){btnOK.BackColor=Color.Red;}}运行程序,单击OK按钮,看看发生了什么?3.GDI编程GDI(GraphicsDeviceInterface)为开发者提供了一组实现与各种设备进行交互的类库,它在开发人员与设备之间起到了一个重要的中介作用。GDI包括三个部分:二维矢量图形绘制图像处理文字显示一、Graphics类该类封装了GDI的绘图表面,Windows窗体中所有的绘图操作都必须通过Graphics类进行。1、创建或获取Graphics对象法一:Graphicsg=控件.CreateGraphics();法二:通过窗体或控件的Paint事件来获取。以窗体为例:paint事件在窗体的任何部分需要重绘时发生。引发paint事件的情况有:(1)窗体首次运行时(2)覆盖窗体的其他窗体移开时(3)窗体本身移动,或大小改变时PrivatevoidForm1_Paint(objectsender,PaintEventArgse){Graphicsg=e.Graphics;g.DrawLine(…);…}2、用Graphics类提供的各种方法:绘图显示文本操作和显示图像DrawLine(…)DrawEllipse(…)DrawRectangle(…)DrawImage(…)DrawString(…)FillEllipse(…)…二、创建画笔和画刷应用程序GDI显示器(设备)x0y0height(x,y)width(0,0)1、Pen类创建指定颜色和线宽画

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功