打字练习小游戏.docx
《打字练习小游戏.docx》由会员分享,可在线阅读,更多相关《打字练习小游戏.docx(18页珍藏版)》请在冰豆网上搜索。
打字练习小游戏
XXXX大学
C#课程设计报告
打字练习小游戏
院(系)别
专业
班级
学号
姓名
指导教师
二○XX年XX月
摘要
随着社会经济的发展,计算机在生活占据着越来越重要的地位,如何高效快速的使用计算机解决问题重要性尤为突出,社会竞争压力越来越大,工作与娱乐相结合更受群众喜爱。
基于以上分析,我们开发了一个打字练习的小游戏。
本游戏应用基于VisualStudio2008平台的应用程序开发技术,采用C#作为开发编程语言,实现打字游戏的练习计算机键盘按键位置及娱乐功能。
该系统具有结构清晰、便于分布、实施简单、易于扩充、维护等特点,其功能主要是:
在玩游戏的过程中练习打字,提高打字速度,熟悉键盘。
其主要特点是操作简单,娱乐性强,可自由控制难易度。
关键词:
打字练习,C#编程
1概述
1.1设计的背景和意义
1.1.1设计的背景
1946年,第一台计算机在美国诞生。
之后随着社会经济的发展,计算机的作用与日俱增,计算机的高效运用决定了工作的效率及质量。
它被广泛运用于人们生活的各个方面,军事、工业、教育、农业等各个方面,从而更好的推动经济的增长。
同系列的其他打字游戏的功能主要包括熟悉字母,提高辨识、确认字母能力,特殊的还具有计时和惩罚奖励,调节游戏速度功能。
我们的打字游戏在实现以上的所有功能外还有所创新,不仅游戏方式新颖,还具有分数换取游戏次数的机制,使得游戏可玩性大大加强。
1.1.2设计的意义
随着计算机的更进一步普及,人们熟练掌握计算机运用已经成为衡量一个优秀人才的重要指标。
打字速度的快慢直接影响工作的质量和效率。
打字游戏,主要是培养电脑新手更快的掌握计算机的键盘布局以及特性,为以后更快更便捷的使用键盘做基础。
同时,它也是一款休闲益智的小游戏,可供人们在闲暇时刻放松自己。
这样既能娱乐又能练习打字速度,不失为一款好游戏。
1.2设计任务分工说明
本设计的完成者包括:
XX和XX,其中XX主要负责分析程序,从网上及其图书馆浏览他人程序进行剖析利用,进一步改进游戏程序。
XX主要负责系统的总体方向,及其个别控件的利用及其实现,主要是课程设计报告的编写及其排版等。
2系统分析
2.1软件功能分析
该游戏的整体功能设计如图2.1所示。
图2.1游戏整体功能图
各部分的功能说明:
此软件模仿了其他同类游戏的部分功能,简单易用,可以对游戏有直观的行认识,其游戏界面如图2.2
图2.2登陆界面展示
2.2程序流程分析
该程序主要实现对提高打字速度的能力,我们进入界面后点击游戏控制中的开始,可以进行游戏,根据用户所完成的情况,适当调节游戏速度,暂停为用户提供了一个遇忙的时间,而积分兑换是当用户失误的时候补救的一个措施,游戏中。
根据用户所完成的结果会适当的给用户积分,一般需要付出一定的积分,才能换回一条生命值,用户也可以不选择积分兑换。
系统流程如图2.3。
图2.3系统流程图
2.3程序性能分析
该软件由于是初级程序编写修改练习,因此处理方便简单易行,不需要很多的电脑专业知识,初学者也可熟练掌握。
该程序的运行环境是Windows系统,兼容性好,可以普遍的应用于各个计算机的各个系统,共享性良好。
3系统设计
3.1物理配置方案设计
由于是小容量的小游戏,因而可以在任何完整配置的电脑中使用,不存在兼容性以及使用要求问题。
游戏编写运用了MicrosoftVisualStudio2008,游戏时只需要普通的自带打开软件即可。
3.2数据文件设计
本游戏的设计程序主要有两个表构成,它们分别为游戏规则表与游戏构造表,如图3.1
3.1.1数据文件截图
下面是游戏构造文件示例性展示,如图3.1.2
3.2游戏内容表
下面是游戏规则文件示例性展示,如图3.1.3
3.1.3游戏规则表
3.3操作数据文件
启动MicrosoftVisualStudio2008运行程序,即可开始游戏
3.4界面设计
本软件主要包括两部分:
游戏控制和游戏难度。
游戏控制里又有三个控制按钮,分别为开始,暂停和积分兑换。
开始和暂停键分别控制着游戏的进程状态。
每成功击打一个飘落字母,便可获得一个积分,积分兑换作用是将玩家游戏过程中成功积攒的积分转换为玩家的生命值,每十个积分可换一次生命值。
此设置大大加强游戏的可玩性。
本游戏主要有主界面、开始界面与结束界面构成,如图
图3.4.1主界面
图3.4.2开始界面
图3.4.3结束界面
3.1.5积分换生命界面
3.4其他说明
由于时间仓促,其中让字母实现交叉飘动没能够完成,在后期我们会进一步设计和完善。
4系统实现
publicvoidflutter(inttime,intvalue)
{
if(_life<=0)
{
stop();
MessageBox.Show("生命值为0,游戏结束!
","对不起");
return;
}
this.timerrate.Interval=time;
ArrayListal=newArrayList();//存放已经沉淀到最底部的lab在hash中的key
foreach(DictionaryEntrydein_htlab)
{
Labellab=(Label)de.Value;
if(lab.Location.Y>=this.Size.Height-80)
{//如果lab坐标大于本程序最底部-80执行
lab.Dispose();//销毁lab
al.Add(de.Key);//把当前hash的key存入arraylist
_life--;//落地减生命
this.Text="第"+((_count/50)+1)+"关您的生命值:
"
+_life+"分数:
"+_count;
}
else
if(lab.Location.X<350&&lab.Location.X>250)
{
lab.Location=newPoint(lab.Location.X,
lab.Location.Y+value);
}
else
if(lab.Location.X>350)
{
lab.Location=newPoint(lab.Location.X-value,
lab.Location.Y+value);
}
else
{
lab.Location=newPoint(lab.Location.X+value,
lab.Location.Y+value);
}
//让lab像屏幕下方移动
}
for(inti=0;i{
_htlab.Remove(al[i]);
}
}
这里重点修改了字符飘动的轨迹
5总结
经过这次课程设计,我们完成了自己选择的打字母小游戏课题,有挺多的收获。
虽然程序最后是完成了,但是实现的过程中却遇到了很多问题。
平时感觉挺简单的那些枯燥单调的代码,真正到了自己运用的时候却无从下手;好不容易写出来的一大段代码,一经调试却跳出来一大堆的错误;还有就是这最后的课程设计报告书,平时都不怎么碰的word文档,文档处理、排版又成了令人头疼的一大问题。
但是,解决问题的过程恰是不断学习的过程:
平时所学的一小段一小段的代码到现在必须把它们联系起来使用,把平时学的知识运用到实际,增强了我的实践动手能力;面对一大堆的错误,只得一个个找出来,一个个改掉,一遍遍的调试,一行行代码的运行,不断地重复,最终将错误改正,这番痛苦的过程让我学们会了如何调试运行,如何逐行逐语句运行,锻炼了我调试、测试程序的能力;同时,报告书的书写,让我们学会了word文档的排版以及文档处理,学会如何做出美观整齐的课程设计报告书。
课程设计中遇到的问题只凭自己苦思冥想是不能全部解决的,这是同学老师的建议和网络给了我很大的帮助。
遇到自己解决不了的问题时,多多向老师同学请教,或许问题就能迎刃而解。
另外,生在这个信息化社会,互联网的作用不言而喻,许多问题只要在网上搜索一下就能得到非常令人满意的解答。
此次课程设计锻炼了我和老师同学交流的能力,以及网上搜索资源,筛选信息的能力
参考文献
1明日科技,C#从入门到精通,北京.清华大学出版社,2008
2付强丁宁,C#编程实战宝典,北京清华大学出版社,2014
3毕文斌孙明亮,C#Windows游戏设计,北京.清华大学出版社,2014
4齐立波,C#入门经典,北京,清华大学出版社,第五版
5王小科,王军,C#开发实战1200例,北京,清华大学出版社,2011
附录1:
项目源码
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Collections;//Hashtableadd
namespace打字游戏
{
publicpartialclassForm1:
Form
{
//私有字段
Hashtable_htlab=newHashtable();//存放lab控件
int_count=0;//游戏分数
int_life=10;//生命值,小于0死亡,过关生命10
publicForm1()
{
InitializeComponent();
}
///
///开始游戏
///
///
///
privatevoidTSMenuItemStart_Click(objectsender,EventArgse)
{
this.timerlab.Enabled=true;
this.timerrate.Enabled=true;
this.timerrate.Interval=1;
this.timerlab.Interval=1;
_count=0;
_life=10;
if(_htlab==null)
_htlab=newHashtable();
}
///
///暂停游戏
///
///
///
privatevoidTSMenuItemPause_Click(objectsender,EventArgse)
{
this.timerlab.Enabled=false;
this.timerrate.Enabled=false;
}
///
///让字符飘动的定时器Tick事件
///
///
///
privatevoidtimerrate_Tick(objectsender,EventArgse)
{
//调用飘动方法,设置飘动速度为10毫秒移动(_count/50)+1个大小的位置
flutter(10,(_count/50)+6);
}
//产生字符的定时事件
privatevoidtimerlab_Tick(objectsender,EventArgse)
{
//调用产生字符方法,每888-(_count/50)*200毫秒产生一个字号20的字符
create(888-(_count/50)*200,20);
}
///
///游戏结束时状态
///
publicvoidstop()
{
this.timerlab.Enabled=false;
this.timerrate.Enabled=false;
foreach(DictionaryEntrydein_htlab)
{
Labell=(Label)de.Value;
l.Dispose();
}
this.Text="游戏结束,请从新开始!
";
}
///
///让屏幕控件飘动方法
///
///飘动速度
///飘动范围-在软件上移动的范围
publicvoidflutter(inttime,intvalue)
{
if(_life<=0)
{
stop();
MessageBox.Show("生命值为0,游戏结束!
","对不起");
return;
}
this.timerrate.Interval=time;
ArrayListal=newArrayList();//存放已经沉淀到最底部的lab在hash中的key
foreach(DictionaryEntrydein_htlab)
{
Labellab=(Label)de.Value;
if(lab.Location.Y>=this.Size.Height-80)
{//如果lab坐标大于本程序最底部-80执行
lab.Dispose();//销毁lab
al.Add(de.Key);//把当前hash的key存入arraylist
_life--;//落地减生命
this.Text="第"+((_count/50)+1)+"关您的生命值:
"
+_life+"分数:
"+_count;
}
else
if(lab.Location.X<350&&lab.Location.X>250)
{
lab.Location=newPoint(lab.Location.X,
lab.Location.Y+value);
}
else
if(lab.Location.X>350)
{
lab.Location=newPoint(lab.Location.X-value,
lab.Location.Y+value);
}
else
{
lab.Location=newPoint(lab.Location.X+value,
lab.Location.Y+value);
}
//让lab像屏幕下方移动
}
for(inti=0;i{
_htlab.Remove(al[i]);
}
}
///
///从屏幕产生字符
///
///产生速度-毫秒
///字体大小
publicvoidcreate(intvalue,intfont)
{
this.Text="第"+((_count/50)+1)+"关您的生命值:
"
+_life+"分数:
"+_count;
this.timerlab.Interval=value;//设置产生速度毫秒
Labellab=newLabel();
lab.AutoSize=true;
lab.Font=newFont("MicrosoftSansSerif",font,
FontStyle.Regular,GraphicsUnit.Point,0);//设置字体
Randomr=newRandom();
lab.ForeColor=Color.FromArgb(r.Next(100,255),
r.Next(100,255),r.Next(100,255));//随机生成颜色
//屏幕随机出现位置
lab.Location=newPoint((this.Size.Width-50)-
r.Next(0,(this.Size.Width-50)),28);
string_char=newmyRandom().getChar
(1);//获取随机出来的字符
stringlabname="";//lab名字
inti=0;//临时计数器存储当前界面上的lab是否存在本次生成的字母个数
foreach(DictionaryEntrydein_htlab)
{
if(de.Key.ToString().IndexOf(_char)!
=-1)
{
i++;
}
}
labname=_char+(i*DateTime.Now.Millisecond);
lab.Name=labname;//设置lab名字,防止打乱顺序
lab.Text=_char;//让此lab显示生成的字符
this.Controls.Add(lab);
//把本次随机出的lab放入Hashtable集合,方便验证
_htlab.Add(labname,lab);
}
privatevoidTSMenuItemLife_Click(objectsender,EventArgse)
{
if(_count>=10)
{
_life++;
_count-=10;
this.Text="您的生命值:
"+_life+"分数:
"+_count;
}
else
MessageBox.Show("您的游戏积分不足10!
","对不起");
}
//判断用户输入字符的事件
privatevoidmainFrm_KeyUp(objectsender,KeyEventArgse)
{
foreach(DictionaryEntrydein_htlab)
{
if(de.Key.ToString().IndexOf(Convert.ToChar(e.KeyCode))!
=-1)
{
Labellab=(Label)_htlab[de.Key];
lab.BackColor=Color.White;
lab.Dispose();//销毁lab
_htlab.Remove(de.Key);//从hash移除已经不显示的lab
_count++;
this.Text="第"+((_count/50)+1)+"关您的生命值:
"
+_life+"分数:
"+_count;
break;
}
}
}
privatevoidForm1_Load(objectsender,EventArgse)
{
}
privatevoidTSMenuItemMain_Click(objectsender,EventArgse)
{
}
}
}
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespace打字游戏
{
classmyRandom
{
staticint_i=1;
publicstringgetChar(intlen)
{
string[]_char=newstring[]{"A","B","C","D","E","F","G","H","I","J",
"K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
Randomrand;
stringstr="";
while(true)
{
if(str.Length==len)
break;
rand=newRandom(DateTime.Now.Millisecond*_i);
_i++;
intr=rand.Next(0,25);
if(str.IndexOf(_char[r])!
=-1)
{
str="";
}
else
str+=_char[r];
}
returnstr;
}
}
}