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

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

程序设计实践

课题名称:双人版俄罗斯方块

学生:王子轩

班级: 2014211118 班序号: 02 学号: 2014210504 日期: 6/30

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);实现擦

除方块的功能。

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

for(int j=x;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

for(int j=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,"◆");

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

if(a[i][j])

{

b[j][line]=a[i][j];

sign=1;

}

if(sign)

{

line++;

相关文档
最新文档