C#弹球程序报告.docx

上传人:b****7 文档编号:8691501 上传时间:2023-02-01 格式:DOCX 页数:34 大小:43.91KB
下载 相关 举报
C#弹球程序报告.docx_第1页
第1页 / 共34页
C#弹球程序报告.docx_第2页
第2页 / 共34页
C#弹球程序报告.docx_第3页
第3页 / 共34页
C#弹球程序报告.docx_第4页
第4页 / 共34页
C#弹球程序报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

C#弹球程序报告.docx

《C#弹球程序报告.docx》由会员分享,可在线阅读,更多相关《C#弹球程序报告.docx(34页珍藏版)》请在冰豆网上搜索。

C#弹球程序报告.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1