




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计:俄罗斯方块 课 程 设 计 报 告课程设计名称:俄罗斯方块 系 : 三系 学生姓名: 班 级: 学 号: 成 绩: 指导教师: 开课时间: 学年 学期第 16 页 共 16 页目录摘 要21.需求分析32.结构设计32.1.系统模块设计图33.系统实现63.1.配置窗口63.1.1.砖块样式配置63.1.2.参数配置113.2.运行窗口134.课程设计总结155.参考文献156.附录15摘 要在这两周内我制作了一个小游戏俄罗斯方块。进一步掌握c#语言的语法,并通过这个案例的制作。使得我知道了什么是程序开发,如何进行程序开发有个更明确的定位。这个游戏大家都玩过,都知道规则。我制作的这个俄罗斯方块可以自己来订做砖块样式。俄罗斯方块是一款风靡全球的电视游戏和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的意见大事。这款游戏最初是由苏联的游戏制作人alex pajitnov制作懂得,它看似简单但变化无穷,令人上瘾。相信大多数人都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。究其历史,俄罗斯方块最早还是出现在pc机上,而我国的用户都是通过红白机了解、喜欢上他的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来讲,它的规则很简单,容易上手,且游戏过程变化无穷,而在“联众俄罗斯方块”中,更有一些联众网络游戏所独有的魅力有单机作战与两人在线对战的两种模式还增加了积分制,是用户既能感受到游戏中的乐趣,也给用户提供了一个展示自己高超技艺的舞台。1. 需求分析俄罗斯方块游戏是一个经典的小游戏,由于它简单有趣,因而得到了广泛的流行,男女老幼都适合。而俄罗斯方块游戏的设计工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系较大,包括界面的显示与更新、数据收集等,在设计的过程中,必将运用到各方面的知识,这对于c#语言设计者而言,是个很好的锻炼机会。我采用一个5*5的矩阵来表示方块的样式。2. 结构设计2.1. 系统模块设计图l 图a.为实体建造计算机模型+struarr0000001100011000000000000blockstringconfigblockset首先要解决的问题是:怎样把砖块转化成计算机能识别的类型?好让计算机对其进行逻辑处理;其次,如何存储这些信息。l 图b.存储砖块信息的过程用户点击配置砖块样式和颜色10111101解决把砖块数据提取与转存。l 图c.画出表示砖块的一块画板只需要画中间的四条线就够啦,用到一个函数,drawline()画直线。图d:把砖块的样式通过一个算法转化成一个数组将大砖块的每个小砖块都编上代码,抑郁访问。图e:把砖块里面,有小砖块按下的表示为1,其他为0.图f:读取数据时,用公式计算数组下表下没为存储砖块信息的类:砖块block砖块信息blockinfo砖块组信息blockgroup砖块配置信息config存储配置信息blockset.xml存储砖块信息的数组infoarr画板palette3. 系统实现3.1. 配置窗口3.1.1. 砖块样式配置a.画模板中的初始图形private void lblmode_paint(object sender, painteventargs e)/画模板中的初始图形 graphics gp = e.graphics;/定义的画布对象 gp.clear(color.black);/是初始的画布为黑色 pen p = new pen(color.white);/定义白色画笔画线 for (int i = 0; i 156; i = i + 31)/画了:横6条,竖6条 gp.drawline(p,0,i,155,i);/画横白线 gp.drawline(p,i,0,i,155);/画竖白线 /填充矩阵中的方块 solidbrush s = new solidbrush(blockcolor); for (int x = 0; x 5; x+) for (int y = 0; y 5; y+) if (struarrx, y) gp.fillrectangle(s, 31 * x + 1, 31 * y + 1, 30, 30); b.配置砖块的样式private void lblmode_mouseclick(object sender, mouseeventargs e)/模板的mouseclick事件,给方块涂色 if (e.button != mousebuttons.left)/判断是否点击了鼠标左键,如果不是就退出 return; int xpos, ypos;/xpos表示数组第一个下标,ypos表示数组第二个下标if (0 = e.x % 31 | 0 = e.y % 31)/判断鼠标点下的区域,使它不为边界线 return; xpos = e.x / 31;/把屏幕像素值转换为数组下标 ypos = e.y / 31; struarrxpos, ypos = !struarrxpos, ypos;/记录方块的形状 bool b = struarrxpos, ypos; graphics gp = lblmode.creategraphics();/得到lblmode的graphics solidbrush s=new solidbrush (b ? blockcolor : color .black );/创建一个刷子,并确定它的颜色 gp.fillrectangle (s,31*xpos+1,31*ypos+1,30,30);/给所点击的方块涂颜色 gp.dispose ();/释放graphics c.颜色对话框private void lblcolor_click(object sender, eventargs e)/配置模板中砖块的颜色 colordialog1.showdialog();/打开颜色对话框blockcolor = colordialog1.color;/使砖块的背景颜色置为所选颜色lblcolor.backcolor = colordialog1.color;/使标签的背景颜色置为所选颜色 lblmode.invalidate();/使颜色lblmode重画,执行它的paint事件 d.选择右边的列表框时所触发的事件private void lsvblockset_itemselectionchanged(object sender, listviewitemselectionchangedeventargs e)/ 当lsvblockset中所选的项发生改变时所触发的事件 if (e.isselected)/避免重复执行事件 blockcolor = color.fromargb(int.parse(e.item.subitems1.text);/把字符串信息转换为颜色类 lblcolor.backcolor = blockcolor; string s = e.item.subitems0.text;/取砖块样式信息 for (int i = 0; i s.length; i+) struarri / 5, i % 5 = (si = 1);/i/5代表每一行,i%5代表每一列,即遍历砖块形状的每一个字符,记录在struarr中 lblmode.invalidate(); e.增加一个砖块样式private void btnadd_click(object sender, eventargs e)/向listview中添加数据 bool isempty = false;/首先查找图案是否为空 foreach (bool i in struarr) if (i) isempty = true; break; if (!isempty) messagebox.show(图案为空,请先用鼠标点击左窗口绘制图案!, 提示窗口, messageboxbuttons.ok, messageboxicon.information); return; stringbuilder sb = new stringbuilder(25);/定义一个可变字符字符串 foreach (bool i in struarr) sb.append(i ? 1 : 0);/在此实例的结尾追加指定字符串的副本。 string blockstring = sb.tostring(); /再检查是否有重复图案 foreach (listviewitem item in lsvblockset.items) if (item.subitems0.text = blockstring)/判断每个listviewitem项的第一个小项的文本信息 messagebox.show(该图案已经存在!,提示窗口,messageboxbuttons.ok ,messageboxicon.information); return; /把新砖块图案信息添加进listview listviewitem myitem = new listviewitem(); myitem = lsvblockset.items.add(blockstring);/增加listviewitem的一行数据的第一个 myitem.subitems.add(convert.tostring(blockcolor.toargb();/获取包含myitem的所有子项的集合,并为其增加一个子项数据。 f.删除一个砖块样式 private void btndel_click(object sender, eventargs e)/删除lsvblockset内的所选项 if (lsvblockset.selecteditems.count = 0)/判断lsvblockset内是否有项目被选中 messagebox.show(请在右边窗口选择一个条目进行删除,提示窗口,messageboxbuttons .ok ,messageboxicon .information ); return; lsvblockset.items.remove(lsvblockset .selecteditems0);/删除被选中项目 messagebox.show(删除成功!, 提示窗口, messageboxbuttons.ok, messageboxicon.information); btnclear.performclick();/清空模块中的砖块 g.修改你所选中的砖块样式 private void btnupdate_click(object sender, eventargs e)/更新lsvblockset内的所选项 if (lsvblockset.selecteditems.count = 0)/判断是否有项目被选中 messagebox.show(请在右边窗口选择一个条目进行修改!, 提示窗口, messageboxbuttons.ok, messageboxicon.information); return; bool isempty = false;/判断图案是否为空 foreach (bool i in struarr) if (i) isempty = true; break; if (!isempty) messagebox.show(图案为空,请先用鼠标点击左边窗口绘制图案再进行修改!, 提示窗口 , messageboxbuttons.ok, messageboxicon.information); return; stringbuilder sb = new stringbuilder(25); foreach (bool i in struarr)/把图案的字符串信息转换为二进制数组信息 sb.append(i ? 1 : 0); lsvblockset.selecteditems0.subitems0.text = sb.tostring();/改变图案信息 lsvblockset.selecteditems0.subitems1.text = convert.tostring(blockcolor.toargb();/改变颜色信息 h. 清空模板中的图形 private void btnclear_click(object sender, eventargs e)/清空模板中的图形 for (int x = 0; x 5; x+)/把struarr内所有元素为false,实现清空 for (int y = 0; y =33&e.keyvalue =45&e.keyvalue =48&e.keyvalue =65&e.keyvalue =96&e.keyvalue =109&e.keyvalue =186&e.keyvalue =45&e.keyvalue =222) /检查是否存在冲突的快捷键 foreach (control c in gbkeyset.controls)/遍历包含在控件内的控件。 control tempc = c as textbox;/? if (tempc !=null &(textbox )tempc ).text!= ) if (int)(textbox)tempc).tag) = e.keyvalue)/tag获取或设置包含有关控件的数据的对象。 (textbox )tempc ).text =; (textbox )tempc ).tag =keys.none; (textbox )sender ).text =e.keycode .tostring ();/如a,b (textbox )sender ).tag =(keys )e.keyvalue;/如65,90,77 3.2. 运行窗口a.预览窗口的绘制 private void lblready_paint(object sender, painteventargs e)/准备画板的绘制 if (p != null) p.paintready(e.graphics);/重画一下砖块 b.开始游戏 private void btnstart_click(object sender, eventargs e)/开始 if (p != null) p.close(); p = new palette(palettewidth, paletteheight, rectpix, palettecolor, graphics.fromhwnd(pbrun.handle), graphics.fromhwnd(lblready.handle); p.start(); c.暂停游戏 private void btnpause_click(object sender, eventargs e) if (p = null) return; if (btnpause.text = 暂停) p.pause(); btnpause.text = 继续; else p.endpause(); btnpause.text = 暂停; d.配置游戏 private void btnconfig_click(object sender, eventargs e) if (btnpause.text = 暂停) btnpause.performclick(); using (frmconfig frmconfig = new frmconfig() frmconfig.showdialog(); e.绘制运行窗口 private void pbrun_paint(object sender, painteventargs e)/运行窗口的绘制 if (p!=null ) p.paintpalette(e.graphics);/重画整个画板 4. 课程设计总结我们用了将近半个月的时间,终于把俄罗斯方块游戏完成了。这两个月里,我们搜集资料、查看书籍,由于上学期对面向对象程序设计
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高端住宅小区物业管理合同签订与物业服务标准
- 精细定制事实婚姻离婚房产分割及赡养费支付协议范本
- 离婚财产分割协议书范本:股权、股票、投资收益分配
- 盐湖提锂技术2025年成本优化与产能扩张产业政策与市场环境适应性策略创新报告
- 2025设施租赁与安装协议
- 影视工业化制作流程2025年质量控制与影视行业标准化建设分析报告
- 2025年新能源汽车充电设施智能化对电动汽车充电服务市场拓展影响报告
- 2025建筑材料采购协议范本下载
- 2025年中国高速吹风机行业市场全景分析及前景机遇研判报告
- 智慧社区团购2025年运营管理与用户持续活跃度提升策略报告
- 《仓库出入库流程》课件
- 房屋市政工程生产安全重大事故隐患排查表(2024版)
- 《员工质量意识培训》课件
- 有债务男方愿意承担一切债务离婚协议书范文
- 2024年湖北省高考政治试卷真题(含答案逐题解析)
- 氧化还原反应配平专项训练
- 2022年6月天津市普通高中学业水平合格性考试化学试卷(含答案解析)
- 考古与人类学习通超星期末考试答案章节答案2024年
- 合同收货确认书范本
- 工程款支付审批表
- 2021工程总承包项目文件收集与档案规范第4部分:水力发电工程
评论
0/150
提交评论