打气球课设报告 .docx
精品名师归纳总结课程设计报告1. 设计内容程序设计题目为 “打气球 ”嬉戏设计与实现,主要实现以下功能:2,翱翔的气球怎么飞 .随机飞 ,随机速度又怎么表现 .该如何记时 .>3,打气球 怎么算打中 .打中后 ,气球爆炸怎么表现 .声音了 .>4,给我个计数器 运算打中的 ,飞走的 ,甚至击中概率 >5,成与败 怎么算成功 .怎么算失败 .如何表现 >6,完善结尾>1> 使用面对对象的方法,设计并实现 “打气球 ”嬉戏。2> 气球由的平线随机产生,并向上运动。3> 用户使用鼠标点击气球,点中气球,气球消逝,分数增加100分。4> 嬉戏时间为 60秒,时间采纳倒计时方式显示,嬉戏时间为0时,提示用户是否重新开头。5> “开头/暂停”按钮。当点击 “开头”按钮,嬉戏开头,按钮文字变为“暂定”。点击“暂停”按钮,嬉戏处于暂停状态,按钮文字变为“开头”。6> “退出”按钮。点击 “退出”按钮,提示是否退出信息,如确定退出,关闭程序。如取消,就回到软件运行界面。2. 设计思想和实现方法<1)绘制嬉戏界面。综合考虑绘图和控件功能的实现,使用AppWizard 建立一个基于对话窗口的MFC 应用程序框架,并通过控件工具栏选取绘图区域,创建“暂停/开头”按钮、“退出”按钮以及分别显示时间和分数的两个编辑框。<2)绘制气球及的平线。在 OnPaint>函数下添加代码,创建黑色画笔和红色画刷,分别用来勾画椭圆< 气球)、直线 <绳子)和填充气球。通过 ExcludeClipRect>函数擦除四边,从而规定了图形显示区域。绘图时,以椭圆中心坐标作为参考,用Ellipse>函数绘制气球,用 MoveTo> 、LineTo>函数画绳子和的平线。<3)实现“退出”功能。可编辑资料 - - - 欢迎下载精品名师归纳总结当点击“退出”按钮时弹出确认退出对话框,点“是”就调用OnOK> 退出程序。<4)实现“暂停 /开头”功能。第一定义一个 bool 型变量并初始化为1,用它的值作为 if 语句的判定条件实现开头和暂停的功能转换。假如时间为0,按钮变为“重新开头”,点击后弹出 确认重新开头对话框,挑选“是”重新开头嬉戏。嬉戏开头后单击按钮,用KillTimer> 实现暂停功能,按钮变为“开头”。再点击就重新调用SetTimer> 开启计时器,按钮变为“暂停”。<5)随机产生多个气球。定义一个二维数组,第一维表示随机产生的气球数目,其次维表示气球中心坐标。在 OnTimer 大事中,响应绘图大事时,通过纵坐标递减实现气球上升,并使用rand>函数使横纵坐标随机变化实现气球的随机摇摆,当气球升至显示区域外就重新产生一个。响应时间大事时,定义一个时间全局变量并初始化为60,变量递减同时以文本形式不断输出以实现倒计时。假如时间为0,就暂停。在OnCreate>函数下,通过 for 循环随机产生每个气球中心点的横纵坐标,并通过SetTimer>定义两个定时器,分数每0.05 秒刷新一次,时间每过1 秒刷新一次。<6)用鼠标“打”气球。这是鼠标的单击大事,当嬉戏暂停或终止时不执行。嬉戏进行时,判定鼠标单击的位置是否在气球上,即判定鼠标坐标到气球中心的距离,当点在气球范畴内的时候将气球坐标移至界面外,气球消逝,同时分数加100,并重新以文本形式输出。3. 核心代码说明<1)变量定义#define NUM 10/ 每一次随机产生的气球最大数int aNUM2 。/第一维掌握数目 其次维表示气球坐标int count=60。/时间long score。/分数bool state=1。说明:此段代码写在程序的开端,将产生的气球数目赋值给变量,就只需转变此处变量的值就可以轻易的转变气球个数,易于修改操作。二维数组的第一维与 for 循环语句相结合,可以实现对每一个气球的操作,其次维表示坐标,实现对气球的定位。可编辑资料 - - - 欢迎下载精品名师归纳总结<2)绘制气球、绳子和的平线else/CDialog:OnPaint>。CPaintDC dcthis>。CPen bPenPS_SOLID, 0, RGB0,0,0>>。 /黑色画笔CBrush rbrushRGB255,0,0>>。 /红色画刷dc.SelectObject&bPen>。 dc.SelectObject&rbrush>。dc.ExcludeClipRect450,0,800,600>。/规定图形显示区域dc.ExcludeClipRect0,401,800,600>。dc.ExcludeClipRect0,0,10,600>。dc.ExcludeClipRect0,0,800,10>。dc.MoveTo30,400>。/绘制的平线dc.LineTo440,400>。forint i=0。i<=NUM 。i+>/ 绘制气球和绳子以气球的中心点作可编辑资料 - - - 欢迎下载精品名师归纳总结为参考点高 50dc.Ellipseai0-20,ai1-25,ai0+20,ai1+25>。/宽 40 dc.MoveToai0,ai1+25> 。dc.LineToai0,ai1+65> 。/绳长 40可编辑资料 - - - 欢迎下载精品名师归纳总结说明:用 RGB>函数挑选颜色,黑色画笔绘制气球轮廓、绳子和的平线,红色画刷填充气球。为使界面分明,需要规定显示气球的区域,四次调用ExcludeClipRect>函数分别擦除了界面右、下、左、上的部分区域。绘制的平线时,纵坐标需稍小于绘图区的下边界纵坐标。为简化操作,选取球心作为气球的定位点,并以此点坐标表示气球和绳子的端点坐标,操作此点即操作整体。<3)“退出”按钮void CTempDlg:OnExit>ifIDYES=MessageBox" 确认退出 .","Exit",MB_YESNO>>/弹出确认退出对话框CDialog:OnOK> 。说明:单击按钮,屏幕弹出对话框,点击“是”,调用OnOK> 退出程序。<4)“暂停 /开头”按钮void CTempDlg:OnS_P>可编辑资料 - - - 欢迎下载精品名师归纳总结ifstate=0&&count=0>/ 时间为 0 单击重新开头ifIDYES=MessageBox" 是否重新开头 ."," ",MB_YESNO>>SetDlgItemTextIDP_S,"暂停">。/按钮变为暂停char buffer15 。score=0。sprintf buffer, "SCORE:%4d",score>。m_score1=LPCTSTR>buffer。UpdateData0>。count=60。state=1。SetTimer1,50,NULL> 。/分数 0.05 秒刷新一次SetTimer2,1000,NULL> 。/时间 1 秒刷新一次return。ifstate=1>/点击后暂停 按钮变为开头SetDlgItemTextIDP_S,"开头">。KillTimer1> 。KillTimer2> 。state=0。Else/点击后嬉戏开头 按钮变为暂停SetDlgItemTextIDP_S,"暂停">。SetTimer1,50,NULL> 。SetTimer2,1000,NULL> 。state=1。说明:state 初值为 1,通过判定其值执行相应的if 语句。嬉戏开头后,单击按钮,按钮变为“开头”,同时调用KillTimer> 函数,程序暂停。再次单击,按钮变为“暂停”,调用SetTimer>函数,程序连续。随着嬉戏的进行,当时间递减为 0 时,点击弹出确认重新开头的对话框,如点击“是”,就时间变为60,分数归 0 并输出,按钮变为“暂停”,嬉戏重新开头。<5)大事响应:气球运动和倒计时void CTempDlg:OnTimerUINT nIDEvent>int i 。switch nIDEvent>可编辑资料 - - - 欢迎下载精品名师归纳总结case 1:fori=0 。i<=NUM 。i+>ifai1<=0|ai0<0>/气球升至界面外 就重新随机产生一个ai0=rand>%450-30>+30 。ai1=rand>%480-450>+450 。可编辑资料 - - - 欢迎下载精品名师归纳总结Else/气球上升并随机摇摆ai1-=rand>%4+2 。ai0+=rand>%4-2 。可编辑资料 - - - 欢迎下载精品名师归纳总结InvalidateRectNULL,TRUE> 。return 。case 2: /输出时间char buffer15 。count-。sprintf buffer, "TIME:%4d",count> 。 /格式化输出到字符串m_time1=LPCTSTR>buffer 。UpdateData0>。 ifcount=0>SetDlgItemTextIDP_S,"重新开头 ">。KillTimer1> 。KillTimer2> 。state=0。return 。说明:OnTimer>函数是通过switch 语句对大事进行响应,此段程序中,case1中第一对每个气球进行了位置判定,如气球中心到了界面之外就重新产愤怒 球。而界面中的气球就在上升过程中随机摇摆,这样就大大防止了气球相互重叠的情形。 case2 中主要实现倒计时功能,并将时间转化为字符格式输出,时间为 0 时,开头按钮变为“重新开头”。<6)创建、定义函数int CTempDlg:OnCreateLPCREATESTRUCT lpCreateStruct>if CDialog:OnCreatelpCreateStruct> = -1> return -1。可编辑资料 - - - 欢迎下载精品名师归纳总结srand int>GetCurrentTime >> 。/ 初始化随机数发生器rand>%MAX-MIN>+MINPOINT point 。/记录鼠标位置GetCursorPos&point>。ScreenToClient&point>。forint i=0 。i<=NUM 。i+>ai0=rand>%450-30>+30 。ai1=rand>%480-450>+450 。SetTimer1,50,NULL> 。SetTimer2,1000,NULL> 。char buffer15 。sprintf buffer, "SCORE:%4d",score>。 /输出分数m_score1=LPCTSTR>buffer。sprintf buffer, "TIME:%4d",count> 。 /输出时间m_time1=LPCTSTR>buffer 。return 0。说明:此段代码主要就各功能进行函数的创建和定义,包括:初始化随机数发生器并猎取随机数产愤怒球,定义并猎取鼠标位置,设置时间和分数的定时 器,定义时间和分数的输出。<7)鼠标单击大事void CTempDlg:OnLButtonDownUINT nFlags, CPoint point> / 打气球ifstate=0> return。forint i=0 。i<=NUM 。i+>ifpoint.x-ai0>*point.x-ai0><=400&&point.y- ai1>*point.y-ai1><=625>/判定鼠标是否点中气球ai0=0 。ai1=0 。score+=100。char buffer15 。sprintf buffer, "SCORE:%4d",score>。m_score1=LPCTSTR>buffer。UpdateData0>。break。可编辑资料 - - - 欢迎下载精品名师归纳总结CDialog:OnLButtonDownnFlags, point> 。说明 :打气球过程是通过鼠标点击气球实现的。State 为 0 时,嬉戏暂停或终止,程序不运行。嬉戏过程中,通过判定鼠标点击的位置与气球中心位置的距离判定是否点中气球。如点中,将气球移至显示界面外,同时分数加100 并重新输出。4. 测试报告嬉戏开头后,界面如下:点击暂停按钮,程序暂停:可编辑资料 - - - 欢迎下载精品名师归纳总结用鼠标点击气球,分数加 100:可编辑资料 - - - 欢迎下载精品名师归纳总结时间倒计为 0,程序暂停,按钮变为“重新开头”:点击“重新开头”按钮,弹出确认对话框:可编辑资料 - - - 欢迎下载精品名师归纳总结点击“是”,嬉戏重新开头,分数为0,时间从 60 倒计:点击“退出”按钮,弹出确认对话框:可编辑资料 - - - 欢迎下载精品名师归纳总结点击“是”就程序退出。5. 存在问题及分析<1)随机产愤怒球时,为使界面清楚美观,需要掌握产生的数目,尽量防止气球相互重叠掩盖的情形。数目可由二维数组掌握,后一问题就必需操作气球位置来解决,程序中是通过气球的随机摇摆来削减重叠机会的。<2)打气球时,判定鼠标是否点中气球,实际就是判定到椭圆中心的距离。而点中范畴其实是气球所在的矩形。如要点中椭圆,就判定时最好与椭圆方程相结合。<3)嬉戏中对分数的刷新频率要把握适度,太快屏幕显得不稳固,太慢分数变化不准时。经在嬉戏中的不断调整挑选了 0.05 秒作为刷新频率,比较合适。<4)对于“暂停 /开头”按钮的功能交替,需要设置一个变量作为判定条件。因此定义一个 bool 型变量, 0、1 分别代表两个功能。其实也可以定义一个整型变量,用奇数和偶数代表两个功能状态。6. 总结在嬉戏功能实现方面,本程序基本实现了嬉戏中需要的各种基本功能,包括:1>气球由的平线随机产生,并向上运动,同时随机小范畴摇摆。2>用户使用鼠标点击气球,点中气球,气球消逝,分数增加100 分。3>嬉戏时间为 60 秒,时间采纳倒计时方式显示,嬉戏时间为0 时,程序暂停,单击“重新开头”按钮,提示用户是否重新开头。4> “开头 /暂停 ”按钮。嬉戏开头后,点击“暂停 ”按钮,嬉戏处于暂停状态,按钮文字变为 “开头”。点击 “开头”按钮,嬉戏重新开头,按钮文字变为 “暂停”。 5> “退出 ”按钮。点击 “退出 ”按钮,提示是否退出信息,如确定退出,关闭程序。如取消,就回到软件运行界面。仍存在的不足是:运行程序时嬉戏直接开头,不是通过点击“开头”按钮实现的。本程序简洁易懂,层次清楚,可读性和可操作性都很强,用简洁的语句实现了多种功能,修改或完善时也较为敏捷便利。可编辑资料 - - - 欢迎下载