C#弹球程序报告.docx
《C#弹球程序报告.docx》由会员分享,可在线阅读,更多相关《C#弹球程序报告.docx(34页珍藏版)》请在冰豆网上搜索。
C#弹球程序报告
沈阳航空航天大学
课程设计
学号
班级__
姓名_______
指导教师_______
2013年9月19日
沈阳航空航天大学
课程设计任务书
学院:
航空航天工程学部专业:
飞行器制造工程班级:
学号题目:
弹球游戏
一、课程设计时间
二、课程设计内容
设计一个弹球游戏的小系统,包括一个小球和一个木板。
木板在游戏界面的底部,可来回移动用来接住并反弹小球。
要求在游戏的过程中小球碰到界面上壁、左壁和右壁时会被弹回,碰到底部木板时小球变颜色,木板接不到小球时游戏结束。
游戏过程可随时暂停和启动。
用户界面中的应能够自主设置小球速度,记录得分的功能(计分方法由个人设计决定)。
(1)创建图形界面,并在其中绘制小球和木板;小球及木板的尺寸自行设置(最好设置成可修改);
(2)假设小球在碰撞时无能量损失(速度不变);
(3)应能设置小球速度;
(4)碰撞次数即为得分;
(5)可以选择文件或者数据库存放得分记录;
(6)游戏过程可随时暂停和启动。
三、课程设计要求
程序质量要求:
✧贯彻面向对象程序设计思想。
✧设计用户图形界面,界面友好,功能明确,操作方便。
✧可以加以其它功能或修饰。
✧代码简洁清晰,并给出必要的注释,以增强程序的可读性。
。
课程设计说明书:
✧课程结束后,上交课程设计说明书和源程序。
课程设计说明书的内容参见提供的模板。
四、指导教师和学生签字
指导教师:
________学生签名:
________
五、成绩
六、教师评语
一、需求分析
根据任务书给定的“课程设计内容”和“课程设计要求”作如下的需求分析。
该系统是一个典型的对键盘操作即时反映的游戏系统,使用键盘操控,对使用者的指令进行即时执行;该游戏系统的使用者被假定为各个年龄段的人群,该游戏系统应具有即时响应、合理、稳定、多样的特点。
1.即时响应性分析
游戏系统应该能够对玩家的指令做出即时的响应,从而达到自由操控的目的,增加游戏的可玩性。
2.合理性分析
游戏系统为了增加可玩性,就据需要有一个合理的计分系统,弹球游戏的难度在于用挡板挡回下落的小球,故而将小球撞击挡板的次数作为计分的标准。
3.稳定性分析
指游戏系统比较完备,只要是用户的操作合理,系统就不会产生任何漏洞。
4.多样性分析
游戏系统应该具有比较复杂的内容设计以增加可玩性,包括难度的设计,小球初始运动方向随机,小球的颜色随着撞击挡板而该变等。
5.主要功能分析
(1)调控游戏难度:
开始游戏后,玩家能够自由选择难度,然后正式进入游戏。
(2)暂停、重置游戏:
开始游戏后,玩家能够自由的暂停、重置当前游戏。
(3)重新选择游戏难度:
开始游戏后,玩家能够重新选择难度,重新开始游戏。
(4)小球初始速度随机性:
开始游戏后,小球会沿着除水平和与水平夹90°方向外随机运动,以增加游戏的可玩性;
(5)积分系统:
每次游戏失败会显示当前分数以及历史最高分数。
二、设计分析
为了满足本系统要求,一共设计了4个游戏界面,其基本功能简述如下:
1.第一界面:
提供开始游戏按键,触发后正式加载游戏,包扩游戏边框、挡板及多个按钮控件。
2.第二界面:
此界面为游戏难度选择界面,包括4个难度选择按钮用于更改游戏难度。
3.第三界面:
此界面为正式游戏界面,提供游戏的开始按钮、暂停按钮、重新开始游戏按钮及重新选择游戏难度按钮。
其中:
(1)开始按钮:
触发后正式绘制小球并朝着随机方向运动。
(2)暂停按钮:
触发后消除当前小球位置,锁定挡板移动。
(3)重来按钮:
触发后游戏重置(历史记录项除外)。
(4)重新选择难度按钮:
触发后,呼出第二界面,游戏重置。
4.第四界面:
此界面为游戏结束界面,提供重新游戏按钮。
三、主要界面截图
图1第一界面截图
图2第二界面截图
图3第三界面截图
图4第四界面截图
四、技术要点
(对本程序贡献较大的知识点:
GDI+绘图、随机数参与判定、键盘事件、重要算法的设计与实现)
1、小球及边框的绘制
首先设计游戏窗体的长宽数值,然后设计游戏边框,计算边框及小球位置坐标,并用GDI+方法绘制小球及挡板(小球运动时,上一位置小球擦除同样使用GDI+方法)
图5游戏中GDI+绘制部分
//绘制直线边框
Graphicsh_a=this.CreateGraphics();
Penp_a=newPen(Color.Red,5);
h_a.DrawLine(p_a,5,5,5,465);
h_a.DrawLine(p_a,5,5,415,5);
h_a.DrawLine(p_a,415,5,415,465);
//绘制小球
Graphicsh_b=this.CreateGraphics();
Penp_b=newPen(Color.Red,5);
h_b.DrawEllipse(p_b,210,455,5,5);
//擦除当前小球位置
Graphicsh_c=this.CreateGraphics();
Penp_c=newPen(Color.Cyan,5);
h_c.DrawEllipse(p_c,v_x,v_y,5,5);
2、小球运动
创建小球运动速度变量、小球运动方向判定变量、小球位置坐标变量、小球随机速度变量、小球运动正负方向判定变量。
(1)使小球运动:
规定出小球在X、Y方向上的分速度,然后放置在timer下使小球当前坐标增加或减少对应坐标上的速度,使小球位置坐标不断改变,达到使小球运动的目的。
(2)使小球初始方向随机:
规定总速度,计算出对应在X、Y上的分速度,从而使得小球在0~90°之间随机出发(不包括0°及90°)。
然后生成判定小球运动方向的随机数,据此使小球能够在0~180°之间随机触发(不包括0°及180°)。
3、小球碰壁回弹
创建小球回弹范围变量,使小球进入范围时对应X或Y速度方向反向,达到回弹的目的。
计算挡板范围,设定位置变量,从而判定小球在挡板位置内回弹。
//判定坐标方向运动
if(v_x>=400&&v_x<=403)
{
if(v_s_zf!
=1)
{
q_x=2;
}
else
{
q_x=1;
}
}
if(v_x>=10&&v_x<=13)
{
if(v_s_zf!
=1)
{
q_x=1;
}
else
{
q_x=2;
}
}
if(q_x==1)
{
v_x=v_x+v_s_x;
}
else
{
v_x=v_x-v_s_x;
}
//判定坐标方向运动
if(v_y>=10&&v_y<=13)
{
q_y=2;
}
if(v_y>=453&&v_y<=456)
{
if(v_x>=z_x)
{
if(v_x<=z_x+l_a*2+5)
{
q_y=1;
//小球改变颜色装置
Randomy_p_s=newRandom();
y_p=y_p_s.Next(1,6);
}
else
{
q_y=2;
}
}
else
{
q_y=2;
}
}
if(q_y==1)
{
v_y=v_y-v_s_y;
}
else
{
v_y=v_y+v_s_y;
}
4、键盘操控挡板移动以及挡板锁定
通过对键盘操作的响应,达到控制挡板移动的目的。
同时,在不许挡板移动的时候,经过判定,锁定挡板移动。
protectedoverrideboolProcessDialogKey(KeyskeyData)
{
switch(keyData)
{
caseKeys.Left:
if(button11.Left>10)
{
if(t_p==2)
{
z_x++;
z_x++;
z_x++;
z_x++;
z_x++;
}
z_x--;
z_x--;
z_x--;
z_x--;
z_x--;
this.button11.Location=newPoint(z_x,465);
}
break;
caseKeys.Right:
if(button11.Left+button11.Size.Width<415)
{
if(t_p==2)
{
z_x--;
z_x--;
z_x--;
z_x--;
z_x--;
}
z_x++;
z_x++;
z_x++;
z_x++;
z_x++;
this.button11.Location=newPoint(z_x,465);
}
break;
}
returntrue;
}
5、游戏结束显示分数
小球掉出挡板后,游戏结束,呼出第四界面,同时显示分数。
//历史最高分判定
if(j>j_l)
{
j_l=j_a/2-1;
}
//计分板显示内容
this.label4.Text=Convert.ToString(j_a/2-1);
this.label6.Text=Convert.ToString(j_l);
6、其它
……略……
五、个人总结
在本次c#课程设计中,我感受到了自主编程的快乐。
在编程过过程中,我也发现了自己的许多不足,在不断的对程序的增加、修改、删减中,我学到了很多c#的知识,同时我也学到,只要有坚韧不拔的毅力,就一定能够完成自己想做的事。
在本次的课程设计中,我主要是负责小球运动的计算,界面的设计,计分系统的构建等方面。
六、参考文献
1C#入门基础
2……略……
七、源程序
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
namespaceTanQiuYouXi_a
{
publicpartialclassForm1:
Form
{
publicForm1()
{
InitializeComponent();
}
//小球运动的变量
publicfloatv_x=210;
publicfloatv_y=455;
//小球运动方向判定变量
publicintq_x=1;
publicintq_y=1;
//挡板长度基准变量
publicintl_a=65;
//挡板位置基准变量
publicintw_a=210;
//小球运动位置坐标
publicintz_x;
//计分量
publicintj_a=0;
//历史最高分
publicintj_l=0;
//计分板是否出现判定
publicintj_p=1;
//停止挡板判定
publicintt_p=1;
//颜色判定变量
publicinty_p;
//画笔argb值
publicintc_a=225;
publicintc_b=0;
publicintc_c=0;
//小球速度随机变量
publicfloatv_s_a;
publicfloatv_s_x;
publicfloatv_s_y;
//小球正负方向判定
publicfloatv_s_zf;
privatevoidForm1_Load(objectsender,EventArgse){timer1.Interval=15;
//挡板可移动性?
t_p=2;
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
this.button1.Visible=false;
//绘制直线边框
Graphicsh_a=this.CreateGraphics();
Penp_a=newPen(Color.Red,5);
h_a.DrawLine(p_a,5,5,5,465);
h_a.DrawLine(p_a,5,5,415,5);
h_a.DrawLine(p_a,415,5,415,465);
//绘制小球
Graphicsh_b=this.CreateGraphics();
Penp_b=newPen(Color.Red,5);
h_b.DrawEllipse(p_b,210,455,5,5);
//难度选择按键可触发性
this.label1.Visible=true;
this.button6.Visible=true;
this.button7.Visible=true;
this.button8.Visible=true;
this.button9.Visible=true;
this.button10.Visible=true;
this.button10.Enabled=false;
//开始暂停ª停止三个键可见性及可触发性
this.button2.Visible=true;
this.button3.Visible=true;
this.button4.Visible=true;
this.button2.Enabled=false;
this.button3.Enabled=false;
this.button4.Enabled=false;
this.button5.Visible=false;
//挡板可见性?
this.button11.Visible=true;
this.button11.Enabled=false;
//挡板位移表达式º?
z_x=w_a-l_a;
//挡板可移动性?
t_p=2;
}
//开始键1小球开始运动
privatevoidbutton2_Click(objectsender,EventArgse)
{
timer1.Start();
this.button2.Enabled=false;
this.button3.Enabled=true;
this.button4.Enabled=true;
//重置挡板位置?
z_x=w_a-l_a;
this.button11.Location=newPoint(z_x,465);
//挡板可移动性?
t_p=1;
//重置小球速度
Randomv_s=newRandom();
v_s_a=v_s.Next(0,300);
v_s_x=(float)(v_s_a*0.01);
v_s_y=(float)Math.Sqrt(3*3-v_s_x*v_s_x);
Randomv_s_zf_r=newRandom();
v_s_zf=v_s_zf_r.Next(1,3);
if(v_s_zf==1)
{
v_s_x=-v_s_x;
}
while(v_s_x==0||v_s_y==0)
{
v_s_a=v_s.Next(0,300);
v_s_x=(float)(v_s_a*0.01);
v_s_y=(float)Math.Sqrt(3*3-v_s_x*v_s_x);
}
}
protectedoverrideboolProcessDialogKey(KeyskeyData)
{
switch(keyData)
{
caseKeys.Left:
if(button11.Left>10)
{
if(t_p==2)
{
z_x++;
z_x++;
z_x++;
z_x++;
z_x++;
}
z_x--;
z_x--;
z_x--;
z_x--;
z_x--;
this.button11.Location=newPoint(z_x,465);
}
break;
caseKeys.Right:
if(button11.Left+button11.Size.Width<415)
{
if(t_p==2)
{
z_x--;
z_x--;
z_x--;
z_x--;
z_x--;
}
z_x++;
z_x++;
z_x++;
z_x++;
z_x++;
this.button11.Location=newPoint(z_x,465);
}
break;
}
returntrue;
}
privatevoidtimer1_Tick(objectsender,EventArgse)
{
//擦除当前小球位置?
Graphicsh_c=this.CreateGraphics();
Penp_c=newPen(Color.Cyan,5);
h_c.DrawEllipse(p_c,v_x,v_y,5,5);
//画笔颜色设置
Colorc=Color.FromArgb(c_a,c_b,c_c);
Penp_b=newPen(c,5);
//判定X坐标方向运动
if(v_x>=400&&v_x<=403)
{
if(v_s_zf!
=1)
{
q_x=2;
}
else
{
q_x=1;
}
}
if(v_x>=10&&v_x<=13)
{
if(v_s_zf!
=1)
{
q_x=1;
}
else
{
q_x=2;
}
}
if(q_x==1)
{
v_x=v_x+v_s_x;
}
else
{
v_x=v_x-v_s_x;
}
//判定Y坐标方向运动
if(v_y>=10&&v_y<=13)
{
q_y=2;
}
if(v_y>=453&&v_y<=456)
{
if(v_x>=z_x)
{
if(v_x<=z_x+l_a*2+5)
{
q_y=1;
//小球改变颜色装置?
Randomy_p_s=newRandom();
y_p=y_p_s.Next(1,6);
}
else
{
q_y=2;
}
}
else
{
q_y=2;
}
}
if(q_y==1)
{
v_y=v_y-v_s_y;
}
else
{
v_y=v_y+v_s_y;
}
//判定argb值
switch(y_p)
{
case1:
c_a=255;
c_b=0;
c_c=0;
break;
case2:
c_a=255;
c_b=0;
c_c=255;
break;
case3:
c_a=0;
c_b=0;
c_c=0;
break;
case4:
c_a=0;
c_b=255;
c_c=0;
break;
case5:
c_a=0;
c_b=0;
c_c=255;
break;
case6:
c_a=255;
c_b=255;
c_c=0;
break;
}
//绘制小球
Graphicsh_b=this.CreateGraphics();
h_b.DrawEllipse(p_b,v_x,v_y,5,5);
//计分装置
if(v_y>=449&&v_y<=452)
{
j_a++;
}
//游戏失败装置
if(v_y>=465)
{
if(j_p==1)
{
//显示计分板
this.label2.Visible=true;
this.label3.Visible=true;
this.label4.Visible=true;
this.label5.Visible=true;
this.button12.Visible=true;
//其他按钮显示
this.button2.Enabled=false;
this.button3.Enabled=false;
this.button4.Enabled=false;
this.button10.Enabled=false;
intj=j_a/2-1;
//历史最高分判定
if(j>j_l)
{
j_l=j_a/2-1;
}
//计分板显示内容
this.label4.Text=Convert.ToString(j_a/2-1);
this.label6.Text=Convert.ToString(j_l);
//绘制直线边框¨°
Graphicsh_a=this.CreateGraphics();
Penp_a=newPen(Color.Red,5);
h_a.DrawLine(p_a,5,5,5,465);
h_a.DrawLine(p_a,5,5,415,5);
h_a.DrawLine(p_a,415,5,415,465);
}
}
}
privatevoidbutton3_Click(objectsender,EventArgse)
{
timer1.Stop();
//擦除当前小球位置
Graphicsh_c=this.CreateGraphics();
Pe