版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 程序设计(chn x sh j)实践设计(shj)报告 课题(kt)名称: 双人俄罗斯方块游戏程序 学生姓名: 陈宸 班 级: 2 0 1 3 2 1 1 1 1 3 班内序号: 12 学 号: 2 0 1 3 21 0 3 75 日 期: 2015.6.13课题(kt)概述1.1课题(kt)目标和主要内容本实验是在win32控制台下设计并实现双人俄罗斯方块对战的游戏。从文本(wnbn)界面开发的基础知识着手,从一般控制步骤、控制台窗口操作、文本(字符)控制、滚动和移动光标、键盘和鼠标等几个方面讨论控制台窗口届满的编程控制方法;然后讨论文字闪烁、移动等技巧;最后,将上述技术和方法进行封装和设
2、计,再结合双线程相关知识最终完成双人俄罗斯方块游戏的实现。本实验使用的开发平台为visual studio2012集成开发环境,工程类型为Win32 Console Application,采用的主要工具为C+编程语言。1.2系统的主要功能功能框图: 开始玩家选择游戏难易程度按任意键开始游戏同时开始计时,并播放音乐 随机产生7个或9个不同形状的方块 填满一排就消除,并加分;同时给对方增加一排方块可以暂停游戏,10秒后自动恢复游戏时间结束或者一方不能没有放下方块的位置 否 是判定输赢结束游戏功能(gngnng)列表及说明:功能名称功能说明双人在同一界面下对战能在一个窗口下显示两张“map”,双方
3、玩家可以同时进行游戏,看到自己及对方的游戏状况 玩家选择游戏难度通过获取按键“1”或“2”来确定随机产生的方块形状个数简单的为7中形状复杂的为9中形状播放背景音乐游戏开始时音乐自动播放方块消除,分数更改,对方方块的增加不论在最后一排还是在中间部分,只要方块填满一排就可以消除;并分数增加;同时对方的最后一排会自动生成一排含有一个空缺的方块(空缺的位置随机) 游戏暂停与恢复按空格键游戏暂停10秒左右,可以多次按空格键进行更长时间的暂停 游戏计时与输赢评判游戏开始时自动开始计时,到规定时间则游戏结束,通过双方的分数来进行“win”和“lose”的评判;若在游戏时间内有一方先用完所有空间则另一方胜利系
4、统(xtng)设计2.1 系统总体(zngt)框架 通过获取不同键盘按键分别控制两个游戏界面 = 1 * GB3 * MERGEFORMAT 设计(shj)思路:两个游戏界面之间的交互以及分数记录生成两个游戏界面设置时间控制添加背景音乐播放游戏结束判定以及输赢判定 再次开始 = 2 * GB3 * MERGEFORMAT 系统总体框架:双方成绩记录两个同时进行游戏的界面单人俄罗斯方块游戏 实现(shxin)双人对战游戏双方游戏的交互2.2系统详细(xingx)设计 = 1 * GB3 * MERGEFORMAT 模块划分(hu fn)图及描述Gameover和win函数初始化函数游戏进行mai
5、n函数窗口过程函数主要模块:初始化-基本显示函数-方块的显示和擦除-方块旋转-方块是否能下移-满一行后消行-游戏结束即遵循了MVC设计模式:设计Moldel。及工作区和方块的存储结构用来方便的存取数据;设计View。即如何根据数据显示不同的界面;设计COntroller。即如何用键盘控制数据的变化。 = 2 * GB3 * MERGEFORMAT 类关系图及描述 没有定义类结构,直接是各个功能函数在主函数中根据获取到的不同按键以及(yj)游戏的具体情况而被调用。所以这里代替类关系及描述介绍所用到的各功能函数: Turn-方块(fn kui)转动函数; IsAvailable-判断能否移动(yd
6、ng)函数; DrawBlocks-画方块函数; = 3 * GB3 * MERGEFORMAT 程序流程图及描述(1):双人对战的总体流程:显示两张map提供两个游戏界面,调用初始化函数从键盘上获取任意按键进入游戏,进入main函数从键盘上指定按键调用相应的窗口过程函数检测双方游戏情况,调用相应的窗口过程函数结束游戏调用gameover和win函数单个游戏的具体运行流程:开始初始化创建方块创建下一个方块 显示当前分数和级别键盘处理是否可以下移擦除当前方快是否是顶部 是 否 是纵坐标+1更新工作区显示新方块否是是否满一行 更新分数和级别消行游戏结束结束 = 4 * GB3 * MERGEFOR
7、MAT 存储结构(jigu)、内存分配各个(gg)函数中均使用数组、int整型、char字符型变量;工作(gngzu)区数据存储:游戏中划分出两个工作区,这两个区域内方块根据操作进行移动和翻转。用两个两位数组分别保存两个工作区中每个为位置点的信息。#define MAPW 12 /地图的宽度#define MAPH 20 /地图的高度int mapMAPHMAPW = 0; /保存工作区的区域int map2MAPHMAPW = 0;数组map及map2表示当前工作区的数据。当工作区中没有任何方块时,map和map2中的每一个位置的值为0;当工作区中有不再移动的方块时,map和map2中有方块
8、田中的位置值为17或9,17分别代表7种不同颜色和形状的方块,19代表9种不同形状的方块,若某一位置的值不是0,则表示该位置已经放了一个相应形状的方块。方块数据存储俄罗斯方块有各种不同的形状,基本形状有7或9种,每一种形状采用4x4的数组来储存,分别使用三维数组来储存。int b944=1,1,1,1,0,2,2,2,2,3,3,0,3,3,0,0,4,4,4,4,0,5,5,5,5, 6,6,6,6, 7,7,7,7, 8,8,8,8,8 , 9,0,9,9,9,9; 得到(d do)如下图的9中形状: 2.3关键算法(sun f)分析算法(sun f)1:初始化函数void Init()
9、= 1 * GB3 * MERGEFORMAT 算法(sun f)功能: 完成初始界面的显示(xinsh)、数据的初始化以及游戏难度的获取。该函数封装了GetStdHandle()控制台的API还调用了difficulty()函数以获取用户选择的游戏难度。 = 2 * GB3 * MERGEFORMAT 算法基本思想: 首先建立显示窗口,将工作区1和2均进行初始化即给各值赋上初始负值;并在窗口显示要显示的信息包括边框、游戏的相关规则和提示以及分数和下一个方块的形状提示。 = 3 * GB3 * MERGEFORMAT 算法空间、时间复杂度分析: 算法时间空间复杂度均为O(1)。 = 4 * G
10、B3 * MERGEFORMAT 算法逻辑:(具体源代码)void Init() handle=initiate();srand(time(NULL);/初始化工作区for(int i=0;i20;i+) mapi0=-2;mapi11=-2; for(int i=0;i12;i+) map0i=-1;map19i=-1;map00=-3;map011=-3;map190=-3;map1911=-3;/初始化工作(gngzu)区2for(int i=0;i20;i+) map2i0=-2;map2i11=-2;for(int i=0;i12;i+) map20i=-1;map219i=-1;m
11、ap200=-3;map2011=-3;map2190=-3;map21911=-3;WORD wColors1=FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY;textout(handle,26+dx,3+dy,wColors,1,SCORE);textout(handle,26+dx,7+dy,wColors,1,LEVEL);textout(handle,26+dx,11+dy,wColors,1,NEXT);WORD wColors21=FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_I
12、NTENSITY;textout(handle,36+dx,3+dy,wColors2,1,SCORE);textout(handle,36+dx,7+dy,wColors2,1,LEVEL);textout(handle,36+dx,11+dy,wColors2,1,NEXT); wColors0=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY;DrawBlocks(&map00,12,20,0,0,wColors,1);DrawBlocks2(&map200,12,20,0,0,wColors,1);textout(handle,dx
13、,dy,wColors,1,Luck);textout(handle,dx+44,dy,wColors,1,Luck);wColors0=FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY;textout(handle,dx,0,wColors,1,选择难易(nn y)程度,简单按1 困难按2);char ch1=_getch();m=difficulty(ch1);textout(handle,dx,0,wColors,1,按任意键开始 (将输入法切换(qi hun)为英文小写) );int ch=_getch();textout(ha
14、ndle,dx,0,wColors,1,暂停游戏连按空格键,游戏会在10秒钟后自动恢复 );算法2:游戏的主函数 = 1 * GB3 * MERGEFORMAT 算法功能: 获取按键,判定用户选择的游戏难度以控制游戏的运行,根据获取按键和游戏的情况调用相应的功能函数并且实现两个游戏进程之间的交互。 = 2 * GB3 * MERGEFORMAT 算法(sun f)基本思想: 通过getch_()函数获取按键,判定游戏是否开始;开始游戏则调用背景音乐函数播放音乐并且开始计时;设定不同的按键控制不同的工作区域以及调用不同的功能函数;开始按照获取的难度随机随机产生79种形状的方块;获取按键来控制方块
15、的移动;判断方块的状态以调用消除行函数;在消除行时更改(gnggi)分数以及实现两游戏进程之间的交互在另一工作区调用其增加一行的函数;通过时间是否(sh fu)用完或是否有一方用尽工作区来判定游戏是否结束。 = 3 * GB3 * MERGEFORMAT 算法空间、时间复杂度分析: = 4 * GB3 * MERGEFORMAT 算法逻辑:(具体源代码)算法3:游戏的暂停和自动恢复 = 1 * GB3 * MERGEFORMAT 算法功能: 通过获取暂停按键来暂停游戏,经过大约10秒后游戏自动恢复,如果需要更多暂停时间可以通过多次按键以达目的。 = 2 * GB3 * MERGEFORMAT
16、算法基本思想: 通过getch_()函数获取暂停信号,要暂停即方块不能再继续下落和生成,即将控制方块下落和生成的bool型变量isalive和isalive2均置位false;然后经过sleep_()一段时间之后再将这两个变量重新赋值为true即又开始游戏。 = 3 * GB3 * MERGEFORMAT 算法(sun f)空间、时间复杂度分析: 算法(sun f)时间空间复杂度均为O(1)。 = 4 * GB3 * MERGEFORMAT 算法(sun f)逻辑:(具体源代码)if(_kbhit() /用if避免按住键使方块卡住 char key=_getch();if (key= ) /暂
17、停和恢复游戏 isalive = false; isalive2=false; textout(handle,7+dx,10+dy,wColors,1,Pause); textout(handle,7+dx+44,10+dy,wColors,1,Pause); _sleep(5000); isalive = true; isalive2=true; textout(handle,7+dx,10+dy,wColors,1,*continiu*); textout(handle,7+dx+44,10+dy,wColors,1,*cintiniu*); _sleep(1000); textout(h
18、andle,7+dx,10+dy,wColors,1, 3 ); textout(handle,7+dx+44,10+dy,wColors,1, 3 ); _sleep(500); textout(handle,7+dx,10+dy,wColors,1, 2 ); textout(handle,7+dx+44,10+dy,wColors,1, 2 ); _sleep(500); textout(handle,7+dx,10+dy,wColors,1, 1 ); textout(handle,7+dx+44,10+dy,wColors,1, 1 ); _sleep(500); textout(h
19、andle,7+dx,10+dy,wColors,1, ); textout(handle,7+dx+44,10+dy,wColors,1, );算法3:在对方工作区域增加一行(yxng)方块 void AddLine1(int mMAPW) = 1 * GB3 * MERGEFORMAT 算法(sun f)功能: 一方成功填满一行方块将这行方块消除(xioch)并加分的同时在对方的工作区域的底部增加一行有随机一个空缺的方块。 = 2 * GB3 * MERGEFORMAT 算法基本思想:函数在main函数中被调用,即当一方有满一行的方块后调用消行函数,这时紧接着本函数,在对方的工作区底部添加
20、一行;具体的实现思想为将对方的工作区域内所有的方块全部上移一行,即从第一行开始擦除上一行的所有方块(第一行则擦除本行即可),再将其下一行的方块全部复制到本行,以此类推直到将最后一行移动到倒数第二行空出最后一行的区域,这时再用drawblock函数写入一行方块在最后一行,再产生随机数用clearsquare函数擦除这个随机方块,已达到目的。同时写了两个函数作用于不同的工作区域,以实现在不同的map上添一行。 = 3 * GB3 * MERGEFORMAT 算法空间、时间复杂度分析:空间复杂度为O(1),时间复杂度为O(n)。 = 4 * GB3 * MERGEFORMAT 算法逻辑:(具体源代码
21、)void AddLine1(int mMAPW) WORD wColors1;for(int i=1;iMAPH-1;i+)for(int j=1;jMAPW-1;j+) ClearSquare(&mi+1j,MAPW-1,1,j,i+1);mij=mi+1j;wColors0 = SQUARE_COLORmij-1;DrawBlocks(&mij,1,1,j,i,wColors,1); WORD wColors11=FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY;for(int j=1;j score2)textout(handl
22、e,7+dx+44,10+dy,wColors,1,YOU LOSE);textout(handle,7+dx,10+dy,wColors,1,YOU WIN);_sleep(3000);exit(EXIT_SUCCESS);else if(score1 score2) textout(handle,7+dx,10+dy,wColors,1,YOU LOSE);textout(handle,7+dx+44,10+dy,wColors,1,YOU WIN);_sleep(3000);exit(EXIT_SUCCESS);elsetextout(handle,7+dx,10+dy,wColors,
23、1,DRAW);textout(handle,7+dx+44,10+dy,wColors,1,DRAW);_sleep(3000);exit(EXIT_SUCCESS);2.4 其它(qt)说明:做这个(zh ge)实验时并没有使用双线程的相关知识,而是选用了更为简单但效率更低的方法将几乎所有的函数均写了两个,使其分别作用于不同的map。这样的写法,虽然(surn)总体来看效率低下且繁杂,但是在两个游戏进程交互即一方消除另一方增行时较为方便,直接调用作用域不同功能相同的两个函数即可。程序运行结果分析 = 1 * GB3 * MERGEFORMAT 输入数据来源:通过getch_()获取键盘键入
24、的相应的按键 = 2 * GB3 * MERGEFORMAT 输出显示方式:直接在命令窗口显示出游戏界面,通过键盘控制可以直接在界面上看到相应的输出结果 = 3 * GB3 * MERGEFORMAT 主要界面: = 1 * ROMAN * MERGEFORMAT I:初始化的界面(首先选择难易程度)(等待游戏(yux)开始) = 2 * ROMAN * MERGEFORMAT II:游戏(yux)开始 = 3 * ROMAN * MERGEFORMAT III左边玩家消除了一行并加一分在右边区域(qy)增加了一行黄色的方块 = 4 * ROMAN * MERGEFORMAT IV选择困难难度
25、是出现如左边的蓝色形状(xngzhun)方块左边正在(zhngzi)下落的蓝色方块为第九种形状的方块 = 5 * ROMAN * MERGEFORMAT V按空格键暂停(zn tn)游戏十秒之后游戏(yux)自动恢复 = 6 * ROMAN * MERGEFORMAT VI游戏(yux)结束 = 4 * GB3 * MERGEFORMAT 操作(cozu)流程:左边玩家用AWSD控制右边玩家用上下左右键控制按任意键开始游戏按“1”或“2”选择难易程度按游戏规则进行游戏,要暂停则按空格键然后等待游戏自动继续时间到或无下落空间则游戏结束在游戏界面中间看自己和对方的分数情况 = 5 * GB3 * MERGEFORMAT 运行时间(shjin)和运行效果运行的总时间小于等于2分钟(规定(gudng)的时间限制),运行效果能基本达到预期效果。4、总结(zngji)4.1 课题的难点和关键点本次实验是在单人俄罗斯方块的基础上进行拓展的课题,关键点在于如何在一个界面中制造出两个同时运行的游戏程序;难点在于如何实现两个游戏程序之间的交互即实现一方消掉一行的同时另一方要增加一行,以及其他功能的扩展如暂停键的设置,游戏计时的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年许昌技师学院高职部高职单招职业技能考试模拟试卷含完整答案详解【网校专用】
- 2025年蜀盛专修高职学院高职单招职业技能考试模拟试卷附参考答案详解(黄金题型)
- 2027年渭南少华山技师学院高职单招职业技能考试题库附答案详解(精练)
- 2026年重庆市荣昌县高职单招职业技能考试题库附参考答案详解【培优】
- 2024年蜀盛专修高职学院单招职业技能考试模拟试卷(巩固)附答案详解
- 2025年河北女子职院高职单招职业技能考试题库及答案详解【全优】
- 2025年晋北现代职业学院高职单招职业技能考试模拟试卷含完整答案详解(考点梳理)
- 2025年医院财务岗招聘面试真题及参考答案
- 2026年云南红河州绿春县紧密型县域医疗卫生共同体总医院选调人员笔试题库及答案解析
- 2025年儿科护理学试题附答案
- 阻火器设计计算书
- 2026年硫化氢培训考试复习题练习卷含答案
- 潞安化工集团有限公司招聘题库
- 停车场场地平整及混凝土路面施工方案
- 重庆南岸区2026年九年级质量监测英语试卷试题(含答案详解)
- 2026年卫生高级职称面审答辩(中医针灸科)副高面审经典试题及答案
- 2026年深圳市盐田港集团有限公司校园招聘笔试参考试题及答案解析
- 电解水制氢安全培训课件
- 2026年企业保密员保密知识测试卷a4版
- 2024年东莞市直机关遴选公务员笔试真题汇编附答案解析(夺冠)
- 律所聘用合同范本
评论
0/150
提交评论