计算机语言C#课程设计.doc
课程设计说明书 名称 计算机语言C#课程设计 2011年 6月 20 日 至 2011 年 6 月 24 日 共 1 周目 录目 录I一、课程设计的目的与要求211目的:21.2要求:2二、题目说明32.1程序开发背景32.2开发工具介绍3三、总体设计4四、详细说明54.1、窗体设计。54.2、用timer控件控制小球移动方向。64.3、使用键盘控制挡板左右移动。84.3、判断游戏难易程度。8五、遇到的问题和解决方法10六、课程设计总结10七、参考文献11附录(源程序代码)11一、 课程设计的目的与要求11目的:1、熟悉.NET开发环境,能够使用C#语言在.NET平台上独立设计、开发WINDOWS应用程序。2、掌握C#语言的异常处理技术,能够使用.NET各种调试方法调试代码,掌握帮助的使用方法。3、掌握常用控件以及控件的常用属性的使用方法。1.2要求:1、设计选题:学生可以在“Windows应用程序设计课程设计选题”指定的题目中选取课程设计题目,具体题目以此文件为准。也可以自选,但自选的题目必须在课程设计开始前得到指导教师的认可。2、软件界面美观大方,操作简洁易用,功能完备可靠。二、题目说明设计一个简单的弹珠游戏程序,游戏者可以用左右键移动游戏界面底部的挡板来挡回下落的小球。2.1程序开发背景 弹球游戏是基于一些人长时间在电脑前工作感到疲劳而开发。弹球游戏是一个简单的娱乐小游戏,电脑使用者在疲劳时可以通过玩弹球游戏来放松心情、解除身体疲劳从而提高工作效率。同时弹球游戏也适于儿童,儿童可以通过该游戏开发智力、增强儿童的动手能力。2.2开发工具介绍该程序是通过C#开发的,C#是一种安全的、稳定的、简单的、优雅的,由C和C+衍生出来的面向对象的编程语言。它在继承C和C+强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)。C#综合了VB简单的可视化操作和C+的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。微软C#语言定义主要是从C和C+继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C+继承的可选选项方面比Java要广泛一些(比如说struts),它还增加了自己新的特点(比方说源代码版本定义),但它还不太成熟,不可能挤垮Java。 C#还需要进化成一种开发者能够接受和采用的语言.而微软当前为它的这种新语言大造声势也是值得注意的.目前大家的反应是:“这是对Java的反击。” 2005年4月,微软发布了Visual Studio 2005 Beta2,这已经是具备了几乎全部功能的Visual Studio,包括的产品有SQL Server2005、Team Foundation Server和Team Suite。这时的C#编译器已经能够处理C# 2.0中所有的新特性。该程序就是通过 Visual Studio 2005进行开发制作的。三、总体设计1、弹球游戏的功能就是游戏者可以用左右键移动游戏界面底部的挡板来挡回下落的小球。小球要按一定的方向移动,按游戏难易程度来控制小球的移动速度。小球有四个移动方向:左下、右下、右上和左上,每个移动的方向分别用一个timer控件来控制。小球向左下方向移动时timer1打开,如果小球碰到左边界时,小球反弹向右下方向移动。此时timer1关闭而控制小球向右下方向移动的timer2控件打开。而如果小球碰到挡板时小球反弹向左上方向移动,此时timer1关闭而控制小球向左上方向移动的timer4控件打开。但是如果挡板没有挡到小球而到达下边界则游戏结束,同时四个timer控件全部关闭、窗体上显示“Game Over”字样。同理其他情况也一样。2、在窗体设计方面,在窗体上方加一个menuStrip控件用于控制游戏的开始与结束以及查询游戏的相关信息如:开发背景、功能等。同时窗体的背景可以添加一个背景图片以美化窗体。3、可以使用方向键控制挡板左右的移动的方向。由于KeyDown事件可以捕获键盘上大部分的键(功能键等),但是不捕获方向键 ,所以需要在窗体代码中重写一个ProgressDialogKey的方法才能够实现。四、详细说明4.1、窗体设计。在窗体设计方面,在窗体上方加一个menuStrip控件用于控制游戏的开始与结束以及查询游戏的相关信息如:开发背景、功能等。同时窗体的背景可以添加一个背景图片以美化窗体。图4-1整个窗体界面在点击游戏下的背景项时会出现此游戏开发背景的信息说明,如图4-2所示.同时点击帮助下的功能项时会出现此游戏功能信息说明,如图4-3所示。 图4-2 开发背景说明图4-3 游戏功能说明4.2、用timer控件控制小球移动方向。 由于小球移动时碰到边界和挡板时就会改变移动方向,所以需要通过timer控件来控制。小球有四个移动方向:左下、右下、右上和左上,每个移动的方向分别用一个timer控件来控制。所以分四种情况。具体如下:(1)、用timer1控制小球向左下移动。如果小球碰到左边界时,小球反弹向右下方向移动。此时timer1关闭而控制小球向右下方向移动的timer2控件打开。而如果小球碰到挡板时小球反弹向左上方向移动,此时timer1关闭而控制小球向左上方向移动的timer4控件打开。但是如果挡板没有挡到小球而到达下边界则游戏结束,同时四个timer控件全部关闭、窗体上显示“Game Over”字样。代码如下: this.buttonBall.Top = this.buttonBall.Top + a;/* 通过改变小球距上边界*/this.buttonBall.Left = this.buttonBall.Left - a;/*左边界的距离使小球移动*/ /*通过改变a的值来改变小球移动速度*/ if (this.buttonBall.Left < 0) timer1.Enabled = false; timer2.Enabled = true; if (buttonBall.Top + buttonBall.Size.Height = button1.Top && buttonBall.Left > button1.Left && buttonBall.Left < (button1.Left + button1.Size.Width) timer1.Enabled = false;/*通过判断小球与挡板位置来决定小球是否弹起*/ timer4.Enabled = true;if (buttonBall.Top > panel2.Size.Height)/*挡板没有挡到小球而到达下边界则游戏结束,*/ /* 窗体上显示“Game Over”字样*/ label1.Text = "Game over" timer1.Enabled = false; timer2.Enabled = false; (2)、用timer2控制小球向右下移动。如果小球碰到右边界时,小球反弹向左下方向移动。此时timer2关闭而控制小球向左下方向移动的timer1控件打开。而如果小球碰到挡板时小球反弹向右上方向移动,此时timer2关闭而控制小球向左上方向移动的timer3控件打开。但是如果挡板没有挡到小球而到达下边界则游戏结束,同时四个timer控件全部关闭、窗体上显示“Game Over”字样。代码如下: this.buttonBall.Top = this.buttonBall.Top + a; this.buttonBall.Left = this.buttonBall.Left + a; if (this.buttonBall.Left +buttonBall.Size.Width> panel2.Size.Width) /*判断小球是否到达右边界而弹起*/ timer2.Enabled = false; timer1.Enabled = true; if (buttonBall.Top + buttonBall.Size.Height) = button1.Top && buttonBall.Left > button1.Left && buttonBall.Left < (button1.Left + button1.Size.Width) /*通过判断小球与挡板位置来决定小球是否弹起*/ timer2.Enabled = false; timer3.Enabled = true; if (buttonBall.Top > panel2.Size.Height) /*挡板没有挡到小球而到达下边界则游戏结束,*/ label1.Text = "Game over" /* 窗体上显示“Game Over”字样*/ timer2.Enabled = false; timer3.Enabled = false; (3)、用timer3控制小球向右上移动。如果小球碰到右边界时,小球反弹向左上方向移动。此时timer3关闭而控制小球向左上方移动的timer4控件打开。而如果小球碰到上边界时小球反弹向右下方向移动,此时timer2关闭而控制小球向右下方向移动的timer2控件打开。代码如下: this.buttonBall.Top = this.buttonBall.Top - a; this.buttonBall.Left = this.buttonBall.Left + a; if (this.buttonBall.Left + buttonBall.Size.Width > panel2.Size.Width) /*判断小球是否到达右边界而弹起*/ timer3.Enabled = false; timer4.Enabled = true; if (buttonBall.Top < 0) /*判断小球是否到达上边界而弹起*/ timer3.Enabled = false; timer2.Enabled = true; (4)、用timer4控制小球向左上移动。如果小球碰到左边界时,小球反弹向右上方向移动。此时timer4关闭而控制小球向右上方向移动的timer3控件打开。而如果小球碰到上边界时小球反弹向左下方移动,此时timer4关闭而控制小球向右下方向移动的timer1控件打开。代码如下: this.buttonBall.Top = this.buttonBall.Top - a; this.buttonBall.Left = this.buttonBall.Left - a; if (this.buttonBall.Left < 0) /*判断小球是否到达左边界而弹起*/ timer4.Enabled = false; timer3.Enabled = true; else if (buttonBall.Top < 0) /*判断小球是否到达上边界而弹起*/ timer4.Enabled = false; timer1.Enabled = true; 4.3、使用键盘控制挡板左右移动。 可以使用方向键控制挡板左右的移动的方向。由于KeyDown事件可以捕获键盘上大部分的键(功能键等),但是不捕获方向键 ,所以需要在窗体代码中重写一个ProgressDialogKey的方法才能够实现。代码如下: protected override bool ProcessDialogKey(Keys keyData) switch (keyData) case Keys.Left: if(button1.Left>0) this.button1.Left = this.button1.Left - 15; break; case Keys.Right: if(button1.Left+button1.Size.Width<panel2.Size.Width) this.button1.Left = this.button1.Left + 15; break; return true; 4.3、判断游戏难易程度。 先声名一个变量小球的移动距离a,通过改变a的值来控制小球的移动速度。代码如下: private void 标准ToolStripMenuItem_Click(object sender, EventArgs e) a = 10; private void 困难ToolStripMenuItem_Click(object sender, EventArgs e) a = 15; private void 极难ToolStripMenuItem_Click(object sender, EventArgs e) a = 20; 五、遇到的问题和解决方法1、在用键盘的方向键控制挡板左右移动时,使用以前的代码时挡板不能移动。多次修改后还是无法移动。询问老师之后,代码没有错误就是无法执行。最后到网上查询了相关信息,找到了另一个相关代码protected override bool ProcessDialogKey(Keys keyData)并同过switch条件判断。2运行时当小球碰到挡板时不能反弹,然后对代码进行分析,认真计算小球与挡板的位置、发现代码有一些混乱。最后对题目重新梳理一下、对代码也重新整理最终解决了问题。 六、课程设计总结在做课程设计过程中遇到了很多问题,主要还是平时基础知识没学好,但在同学和老师的帮助下,以及通过查阅相关资料,问题才解决了,最终完成课程设计。此次课程设计为我们提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼我们的分析解决实际问题的能力,提高了我们适应实际,实践编程的能力。经过这次课程设计有挺多的收获。虽然程序最后是完成了,但是实现的过程中却遇到了很多问题。平时感觉挺简单的那些枯燥单调的代码,真正到了自己运用的时候却无从下手;好不容易写出来的一大段代码,一经调试却跳出来一大堆的错误;还有就是这最后的课程设计报告书,平时都不怎么碰的word文档,文档处理、排版又成了令人头疼的一大问题。但是,解决问题的过程恰是不断学习的过程:平时所学的一小段一小段的代码到现在必须把它们联系起来使用,把平时学的知识运用到实际,增强了我的实践动手能力;面对一大堆的错误,只得一个个找出来,一个个改掉,一遍遍的调试,一行行代码的运行,不断地重复,最终将错误改正,这番痛苦的过程让我学会了如何调试运行,如何逐行逐语句运行,锻炼了我调试、测试程序的能力;同时,报告书的书写,让我学会了word文档的排版以及文档处理,学会如何做出美观整齐的课程设计报告书。课程设计中遇到的问题只凭自己苦思冥想是不能全部解决的,这是同学老师的建议和网络给了我很大的帮助。遇到自己解决不了的问题时,多多向老师同学请教,或许问题就能迎刃而解。另外,生在这个信息化社会,互联网的作用不言而喻,许多问题只要在网上搜索一下就能得到非常令人满意的解答。此次课程设计锻炼了我和老师同学交流的能力,以及网上搜索资源,筛选信息的能力。七、参考文献1 C#范例完全自学手册 王小科, 吕双, 梁冰编著 人民邮电出版社 20092 C#程序开发范例宝典.第2版 梁冰, 吕双, 王小科编著 人民邮电出版社 2009附录(源程序代码) public partial class Form1 : Form public int a = 5; public Form1() InitializeComponent(); private void 新游戏ToolStripMenuItem_Click(object sender, EventArgs e) timer2.Enabled = true; label1.Text = "" private void timer1_Tick(object sender, EventArgs e) timer2.Enabled = false; timer4.Enabled = false; this.buttonBall.Top = this.buttonBall.Top + a; this.buttonBall.Left = this.buttonBall.Left - a; if (this.buttonBall.Left < 0) timer1.Enabled = false; timer2.Enabled = true; if (buttonBall.Top + buttonBall.Size.Height = button1.Top && buttonBall.Left > button1.Left && buttonBall.Left < (button1.Left + button1.Size.Width) timer1.Enabled = false; timer4.Enabled = true; if (buttonBall.Top > panel2.Size.Height) label1.Text = "Game over" buttonBall.Dispose(); timer1.Enabled = false; timer2.Enabled = false; private void timer2_Tick(object sender, EventArgs e) timer3.Enabled = false; this.buttonBall.Top = this.buttonBall.Top + a; this.buttonBall.Left = this.buttonBall.Left + a; if (this.buttonBall.Left +buttonBall.Size.Width> panel2.Size.Width) timer2.Enabled = false; timer1.Enabled = true; if (buttonBall.Top + buttonBall.Size.Height) = button1.Top && buttonBall.Left > button1.Left && buttonBall.Left < (button1.Left + button1.Size.Width) timer2.Enabled = false; timer3.Enabled = true; if (buttonBall.Top > panel2.Size.Height) label1.Text = "Game over" buttonBall.Dispose(); timer2.Enabled = false; timer3.Enabled = false; private void timer3_Tick(object sender, EventArgs e) timer2.Enabled = false; this.buttonBall.Top = this.buttonBall.Top - a; this.buttonBall.Left = this.buttonBall.Left + a; if (this.buttonBall.Left + buttonBall.Size.Width > panel2.Size.Width) timer3.Enabled = false; timer4.Enabled = true; if (buttonBall.Top < 0) timer3.Enabled = false; timer2.Enabled = true; private void timer4_Tick(object sender, EventArgs e) timer1.Enabled = false; timer3.Enabled = false; this.buttonBall.Top = this.buttonBall.Top - a; this.buttonBall.Left = this.buttonBall.Left - a; if (this.buttonBall.Left < 0) timer4.Enabled = false; timer3.Enabled = true; else if (buttonBall.Top < 0) timer4.Enabled = false; timer1.Enabled = true; protected override bool ProcessDialogKey(Keys keyData) switch (keyData) case Keys.Left: if(button1.Left>0) this.button1.Left = this.button1.Left - 15; break; case Keys.Right: if(button1.Left+button1.Size.Width<panel2.Size.Width) this.button1.Left = this.button1.Left + 15; break; return true; private void 标准ToolStripMenuItem_Click(object sender, EventArgs e) a = 10; private void 困难ToolStripMenuItem_Click(object sender, EventArgs e) a = 15; private void 极难ToolStripMenuItem_Click(object sender, EventArgs e) a = 20; private void 背景ToolStripMenuItem_Click(object sender, EventArgs e) MessageBox.Show("2011年6月22日10软件测试班级课程设计!"); private void 功能ToolStripMenuItem_Click(object sender, EventArgs e) MessageBox.Show("弹球游戏是一个简单的娱乐小游戏,电脑使用者"+ "在疲劳时可以通过玩弹球游戏来放松心情、解除"+ "身体疲劳从而提高工作效率。同时弹球游戏也适"+ "于儿童,儿童可以通过该游戏开发智力、增强儿"+ "童的动手能力。");