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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

双人版俄罗斯方块实验报告
北京邮电大学信息与通信工程学院
程序设计实践




课题名称: 双人版俄罗斯方块学生姓名: 王子轩班级: 2014211118 班内序号: 02 学号: 2014210504 日期: 6/30
第1页
北京邮电大学信息与通信工程学院
1( 课题概述
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);实现擦
第2页
北京邮电大学信息与通信工程学院
除方块的功能。

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] 程序流程图及描述
第3页
北京邮电大学信息与通信工程学院
第4页
北京邮电大学信息与通信工程学院
第5页
北京邮电大学信息与通信工程学院
2.3 关键算法分析
第6页
北京邮电大学信息与通信工程学院
算法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++)
第7页
北京邮电大学信息与通信工程学院
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])
第8页
北京邮电大学信息与通信工程学院{
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)
{
第9页
北京邮电大学信息与通信工程学院
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++)
{
第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(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. 程序运行结果分析
包括输入数据来源和格式、输出显示方式、主要界面、操作流程、响应时间,运行效果等。

第11页
北京邮电大学信息与通信工程学院
第12页
北京邮电大学信息与通信工程学院
4. 总结
4.1课题的难点和关键点
在写本程序的过程中,出现了许多问题,如方块位置不对,方块冲突,方块卡住不动,线程没有反应等等,在调试时使用了逐过程调试的方法,一一解决了这些问题。

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

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

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

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

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

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

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

第13页
北京邮电大学信息与通信工程学院
参考文献
[1]程序设计实践,北京邮电大学出版社,刘瑞芳等著
[2]怎样在游戏源码(C++)里加上背景音乐,,百度知道第14页。

相关文档
最新文档