当前位置:文档之家› 双人版俄罗斯方块实验报告

双人版俄罗斯方块实验报告

程序设计实践设计报告课题名称:双人版俄罗斯方块学生:王子轩班级: 2014211118 班序号: 02 学号: 2014210504 日期: 6/301.课题概述1.1课题目标和主要容本课题在控制台下设计并实现一个俄罗斯方块的游戏。

这是一款桌面游戏,最终要写成一个双人模式和选择难度的俄罗斯方块游戏,涉及到了控制台图形界面和多线程编程。

对于每个俄罗斯方块模块来说,中间是工作区,右边是记录当前游戏的级别和分数。

游戏开始后,自动播放背景音乐,通过键盘的W、S、A、D和上、下、左、右来控制方块的旋转、下移、左移、右移,ESC键退出。

本课题的开发环境为Visual Studio 2012集成开发环境,工程类型为Win32 Console Application。

1.2系统的主要功能基本功能:双人版俄罗斯方块扩展功能:背景音乐、游戏分级、存储显示最高分2. 系统设计2.1 系统总体框架开始界面☛☛打开背景音乐☛☛显示两个游戏界面☛☛初始化各项数值(分数和等级)☛☛两位玩家操作游戏☛☛一个玩家失败时游戏结束2.2 系统详细设计[1] 模块划分图及描述1.void Init(int, int map[MAPH][MAPW]);初始化给定的工作区并调用show函数。

2.void Turn(int map[MAPH][MAPW], int a[][4], int w, int h, int *x, int y);实现方块的旋转。

3.bool IsAvailable(int map[MAPH][MAPW], int a[], int x, int y, int w, int h);判断方块在工作区的下一个位置上是否存在其他方块,若不存在则返回TRUE,否则返回FALSE。

4.void DrawBlocks(int a[], int w, int h, int x, int y, WORD wColors[], int nColors,int dx, int dy);显示方块和边界。

5.void ClearSquare(int a[], int w, int h, int x, int y, int dx, int dy);实现擦除方块的功能。

6.void GameOver();实现游戏结束界面的相关功能。

7.void DeleteLine(int m[][MAPW], int row, int dx, int dy); 实现方块满一行后消除一行的效果。

8.int main()主函数,启动整个程序。

9.DWORD WINAPI WriteThread(LPVOID lpParam)线程1,用于显示玩家1的界面,处理玩家1的游戏进程,包括方块下落、变换、消行、更新分数、技能效果等。

包括处理玩家二的键盘输入信息。

10.DWORD WINAPI WriteThread1(LPVOID lpParam)线程2,用于显示玩家2的界面,处理玩家2的游戏进程,包括方块下落、变换、消行、更新分数、技能效果等。

包括处理玩家二的键盘输入信息。

[2] 类关系图及描述[3] 程序流程图及描述2.3 关键算法分析算法1:bool IsAvailable[1] 算法功能判断方块是否可以移动[2] 算法基本思想判断方块在工作区的下一个位置上是否存在其他方块,若不存在则返回TRUE否则返回FALSE。

[3] 算法空间、时间复杂度分析[4] 代码逻辑(可用伪代码描述)bool IsAvailable(int a[],int x,int y,int w,int h){for(int i=y;i<y+h;i++)for(int j=x;j<x+w;j++)if(map[i][j] && a[w*(i-y)+j-x])return 0;return 1;}算法2: void DrawBlocks[1] 算法功能显示边界和方块[2] 算法基本思想遍历数组的每一个元素,若元素值不是0,则显示一个基本方块,否则不显示,同时根据计算出来的temp值决定显示方块还是边界。

[3] 算法空间、时间复杂度分析[4] 代码逻辑(可用伪代码描述)void DrawBlocks(int a[],int w,int h,int x,int y,WORD wColors[],int nColors) {int temp;for(int i=0;i<h;i++)for(int j=0;j<w;j++)if((temp=a[i*w+j])&&y+i>0){if(temp==-3)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"◆");else if(temp==-2)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"║");else if(temp==-1)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"═");else if(temp>=1)textout(handle,2*(x+j)+dx,y+i+dy,wColors,nColors,"■");}}算法3: void Turn[1] 算法功能旋转方块[2] 算法基本思想按行从下向上,按列从左往右扫描,如果是有效点则进行90度翻转,即行列对调[3] 算法空间、时间复杂度分析[4] 代码逻辑(可用伪代码描述)void Turn(int a[][4],int w,int h,int *x,int y){int b[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};int sign=0,line=0;for(int i=h-1;i>=0;i--){for(int j=0;j<w;j++)if(a[i][j]){b[j][line]=a[i][j];sign=1;}if(sign){line++;sign=0;}}for(int i=0;i<4;i++)if(IsAvailable(b[0],*x-i,y,w,h)){*x-=i;for(int k=0;k<h;k++)for(int j=0;j<w;j++)a[k][j]=b[k][j];break;}}算法4: void ClearSquare[1] 算法功能擦除方块[2] 算法基本思想与Drawblocks类似,只不过不显示方块而是显示空格。

[3] 算法空间、时间复杂度分析[4] 代码逻辑(可用伪代码描述)void ClearSquare(int *a,int w,int h,int x,int y){WORD wColors[1]={0};for(int i=0;i<h;i++)for(int j=0;j<w;j++){if(a[i*w+j]>0 && (i+y>0)){textout(handle,2*(x+j)+dx,y+i+dy,wColors,1," ");}}}算法5: void DeleteLine[1] 算法功能消除一行[2] 算法基本思想按行扫描,利用clearsquare实现擦除[3] 算法空间、时间复杂度分析[4] 代码逻辑(可用伪代码描述)void DeleteLine(int m[][MAPW],int row){WORD wColors[1]={FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY};textout(handle,2+dx,row+dy,wColors,1,"﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌");_sleep(100);for(int i=row;i>1;i--){ClearSquare(&m[i][1],MAPW-2,1,1,i);for(int j=1;j<MAPW-1;j++){m[i][j]=m[i-1][j];if (m[i][j] == 0)wColors[0] = 0;elsewColors[0] = SQUARE_COLOR[m[i][j]-1];DrawBlocks(&m[i][j],1,1,j,i,wColors,1);}}for(int i=1;i<MAPW-1;i++)m[1][i]=0;}算法6: void GameOver[1] 算法功能实现结束界面[2] 算法基本思想利用记录分数的变量score1和score2来打印比分和比赛结果。

[3] 算法空间、时间复杂度分析[4] 代码逻辑(可用伪代码描述)void GameOver(){WORD wColors[1]={FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY};textout(handle,7+dx,10+dy,wColors,1,"GAME OVER");exit(EXIT_SUCCESS);}3.程序运行结果分析包括输入数据来源和格式、输出显示方式、主要界面、操作流程、响应时间,运行效果等。

4.总结4.1课题的难点和关键点在写本程序的过程中,出现了许多问题,如方块位置不对,方块冲突,方块卡住不动,线程没有反应等等,在调试时使用了逐过程调试的方法,一一解决了这些问题。

同时,为了实现资源最大利用,调试方法、程序优化和改进等方面也需要去考虑。

4.2本课题的评价本课题实现了简单的俄罗斯方块游戏,能够实现不同颜色、不同形状的方块,加强了游戏性,游戏流畅,且基本没有bug。

但是我的文件只能实现背景音乐和游戏选级两个附加功能,以后有时间会继续完善。

4.3心得体会通过本次实验我学习了在win32控制台下编写游戏程序的方法,而且主要学习了多线程编程的知识。

本次游戏涉及到的新知识很多,学习编写和改进游戏用了许多时间,尤其是多线程的这一块知识,在学习研究了很久以后才编写出简单的几行代码。

这次实验后我收获了许多实用知识,自学编程能力也得到了提升。

在假期我会继续完善这个程序,增强自身能力。

参考文献[1]程序设计实践,邮电大学,瑞芳等著[2]怎样在游戏源码(C++)里加上背景音乐?,百度知道zhidao.baidu./question/1924742278177272227.html。

相关主题