双人版俄罗斯方块实验报告.docx
- 文档编号:7073209
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:12
- 大小:95.92KB
双人版俄罗斯方块实验报告.docx
《双人版俄罗斯方块实验报告.docx》由会员分享,可在线阅读,更多相关《双人版俄罗斯方块实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
双人版俄罗斯方块实验报告
双人版俄罗斯方块实验报告
北京邮电大学信息与通信工程学院
程序设计实践
设
计
报
告
课题名称:
双人版俄罗斯方块学生姓名:
王子轩班级:
2014211118班内序号:
02学号:
2014210504日期:
6/30
第1页
北京邮电大学信息与通信工程学院
1(课题概述
1.1课题目标和主要内容
本课题在控制台下设计并实现一个俄罗斯方块的游戏。
这是一款桌面游戏,最终要写成一个双人模式和选择难度的俄罗斯方块游戏,涉及到了控制台图形界面和多线程编程。
对于每个俄罗斯方块模块来说,中间是工作区,右边是记录当前游戏的级别和分数。
游戏开始后,自动播放背景音乐,通过键盘的W、S、A、D和上、下、左、右来控制方块的旋转、下移、左移、右移,ESC键退出。
本课题的开发环境为VisualStudio2012集成开发环境,工程类型为Win32ConsoleApplication。
1.2系统的主要功能
基本功能:
双人版俄罗斯方块
扩展功能:
背景音乐、游戏分级、存储显示最高分
2.系统设计
2.1系统总体框架
开始界面?
?
打开背景音乐?
?
显示两个游戏界面?
?
初始化各项数值(分数和等级)?
?
两位玩家操作游戏?
?
一个玩家失败时游戏结束
2.2系统详细设计
[1]模块划分图及描述
1.voidInit(int,intmap[MAPH][MAPW]);初始化给定的工作区并调用show函数。
2.voidTurn(intmap[MAPH][MAPW],inta[][4],intw,inth,int*x,inty);实现
方块的旋转。
3.boolIsAvailable(intmap[MAPH][MAPW],inta[],intx,inty,intw,inth);
判断方块在工作区的下一个位置上是否存在其他方块,若不存在则返回TRUE,否则返
回FALSE。
4.voidDrawBlocks(inta[],intw,inth,intx,inty,WORDwColors[],intnColors,
intdx,intdy);显示方块和边界。
5.voidClearSquare(inta[],intw,inth,intx,inty,intdx,intdy);实现擦
第2页
北京邮电大学信息与通信工程学院
除方块的功能。
6.voidGameOver();实现游戏结束界面的相关功能。
7.voidDeleteLine(intm[][MAPW],introw,intdx,intdy);实现方块满一行后消
除一行的效果。
8.intmain()主函数,启动整个程序。
9.DWORDWINAPIWriteThread(LPVOIDlpParam)线程1,用于显示玩家1的界面,处理玩
家1的游戏进程,包括方块下落、变换、消行、更新分数、技能效果等。
包括处理玩家
二的键盘输入信息。
10.DWORDWINAPIWriteThread1(LPVOIDlpParam)线程2,用于显示玩家2的界面,处理
玩家2的游戏进程,包括方块下落、变换、消行、更新分数、技能效果等。
包括处理玩
家二的键盘输入信息。
[2]类关系图及描述
[3]程序流程图及描述
第3页
北京邮电大学信息与通信工程学院
第4页
北京邮电大学信息与通信工程学院
第5页
北京邮电大学信息与通信工程学院
2.3关键算法分析
第6页
北京邮电大学信息与通信工程学院
算法1:
boolIsAvailable
[1]算法功能
判断方块是否可以移动
[2]算法基本思想
判断方块在工作区的下一个位置上是否存在其他方块,若不存在则返回TRUE
否则返回FALSE。
[3]算法空间、时间复杂度分析
[4]代码逻辑(可用伪代码描述)
boolIsAvailable(inta[],intx,inty,intw,inth)
{
for(inti=y;i for(intj=x;j if(map[i][j]&&a[w*(i-y)+j-x]) return0; return1; } 算法2: voidDrawBlocks [1]算法功能 显示边界和方块 [2]算法基本思想 遍历数组的每一个元素,若元素值不是0,则显示一个基本方块,否则不显示, 同时根据计算出来的temp值决定显示方块还是边界。 [3]算法空间、时间复杂度分析 [4]代码逻辑(可用伪代码描述) voidDrawBlocks(inta[],intw,inth,intx,inty,WORDwColors[],intnColors) { inttemp; for(inti=0;i 第7页 北京邮电大学信息与通信工程学院 for(intj=0;j if((temp=a[i*w+j])&&y+i>0) { if(temp==-3) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"? "); elseif(temp==-2) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"? "); elseif(temp==-1) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"? "); elseif(temp>=1) textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"? "); } } 算法3: voidTurn [1]算法功能 旋转方块 [2]算法基本思想 按行从下向上,按列从左往右扫描,如果是有效点则进行90度翻转,即行列 对调 [3]算法空间、时间复杂度分析 [4]代码逻辑(可用伪代码描述) voidTurn(inta[][4],intw,inth,int*x,inty){ intb[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; intsign=0,line=0; for(inti=h-1;i>=0;i--) { for(intj=0;j if(a[i][j]) 第8页 北京邮电大学信息与通信工程学院 { b[j][line]=a[i][j]; sign=1; } if(sign) { line++; sign=0; } } for(inti=0;i<4;i++) if(IsAvailable(b[0],*x-i,y,w,h)) { *x-=i; for(intk=0;k for(intj=0;j a[k][j]=b[k][j]; break; } } 算法4: voidClearSquare [1]算法功能 擦除方块 [2]算法基本思想 与Drawblocks类似,只不过不显示方块而是显示空格。 [3]算法空间、时间复杂度分析 [4]代码逻辑(可用伪代码描述)voidClearSquare(int*a,intw,inth,intx,inty) { 第9页 北京邮电大学信息与通信工程学院 WORDwColors[1]={0}; for(inti=0;i for(intj=0;j { if(a[i*w+j]>0&&(i+y>0)) { textout(handle,2*(x+j)+dx,y+i+dy,wColors,1,""); } } } 算法5: voidDeleteLine [1]算法功能 消除一行 [2]算法基本思想 按行扫描,利用clearsquare实现擦除 [3]算法空间、时间复杂度分析 [4]代码逻辑(可用伪代码描述) voidDeleteLine(intm[][MAPW],introw){ WORDwColors[1]={FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY}; textout(handle,2+dx,row+dy,wColors,1,",,,,,,,,,,"); _sleep(100); for(inti=row;i>1;i--) { ClearSquare(&m[i][1],MAPW-2,1,1,i); for(intj=1;j { 第10页 北京邮电大学信息与通信工程学院 m[i][j]=m[i-1][j]; if(m[i][j]==0) wColors[0]=0; else wColors[0]=SQUARE_COLOR[m[i][j]-1]; DrawBlocks(&m[i][j],1,1,j,i,wColors,1); } } for(inti=1;i m[1][i]=0; } 算法6: voidGameOver [1]算法功能 实现结束界面 [2]算法基本思想 利用记录分数的变量score1和score2来打印比分和比赛结果。 [3]算法空间、时间复杂度分析 [4]代码逻辑(可用伪代码描述) voidGameOver() { WORDwColors[1]={FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY}; textout(handle,7+dx,10+dy,wColors,1,"GAMEOVER"); exit(EXIT_SUCCESS); } 3.程序运行结果分析 包括输入数据来源和格式、输出显示方式、主要界面、操作流程、响应时间,运行效果等。 第11页 北京邮电大学信息与通信工程学院 第12页 北京邮电大学信息与通信工程学院 4.总结 4.1课题的难点和关键点 在写本程序的过程中,出现了许多问题,如方块位置不对,方块冲突,方块卡住不动,线程没有反应等等,在调试时使用了逐过程调试的方法,一一解决了这些问题。 同时,为了实现资源最大利用,调试方法、程序优化和改进等方面也需要去考虑。 4.2本课题的评价 本课题实现了简单的俄罗斯方块游戏,能够实现不同颜色、不同形状的方块,加强了游戏性,游戏流畅,且基本没有bug。 但是我的文件只能实现背景音乐和游戏选级两个附加功能,以后有时间会继续完善。 4.3心得体会 通过本次实验我学习了在win32控制台下编写游戏程序的方法,而且主要学习了多线程编程的知识。 本次游戏涉及到的新知识很多,学习编写和改进游戏用了许多时间,尤其是多线程的这一块知识,在学习研究了很久以后才编写出简单的几行代码。 这次实验后我收获了许多实用知识,自学编程能力也得到了提升。 在假期我会继续完善这个程序,增强自身能力。 第13页 北京邮电大学信息与通信工程学院 参考文献 [1]程序设计实践,北京邮电大学出版社,刘瑞芳等著 [2]怎样在游戏源码(C++)里加上背景音乐,,XX知道 第14页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双人 俄罗斯方块 实验 报告