




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 基于C语言的俄罗斯方块游戏的设计与实现 摘要 俄罗斯方块是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。为了实现俄罗斯方块这一经典游戏,决定在Dev-C+集成开发环境下采用C语言开发完成。开发工程遵循软件工程的知识,从问题定义,可行性研究、需求分析、概要设计、详细设计,到最后对软件进行测试,整个开发过程贯穿软件工程的知识体系。本游戏由界面模块、运行模块等构成,其中界面模块实现了游戏菜单以及选择菜单的打印;运行模块通过制作俄罗斯方块,打印俄罗斯方块,消除俄罗斯方块等函数实现。此游戏可以使我们重温这款游戏的带给我们的童年快乐,增加我们对美好童年的回忆。关键字:俄罗斯
2、方块;C语言;数据结构 Design and implementation of tetris Abstract Tetris is a kind of casual games designed by Alexey Pajitnov,a Russian, in June 1984. In order to spread this classical game, we decide to realize it by C programming language in Dev-C+ integrated development environment.Knowledge abiding by a
3、 software engineering, definition begins from software problem,proceed to carry out feasibility study,need analysis,essentials design,detailed design,at last implemented the test on the software. Entire exploitation process has run through the software engineering knowledge hierarchy. This game cons
4、ists of interface module, operation module and so on. Interface module can print the game menu and the selection menu while operation module can be achieved by functions, such as making tetris, printing tetris and removing tetris. Tetris makes us review our joyful childhood and enriches our memories
5、 during the years of childhood. Key words: tetris;c language;data structure; 目录1. 引言11.1 设计背景11.2 系统配置11.3 开发工具与平台12.系统分析32.1可行性分析32.2 需求分析33. 概要设计53.1模块组织54. 数据库设计64.1 概念模型设计(E-R图)64.2数据库需求分析74.3 数据库表结构75.详细设计95.1 程序设计95.2 游戏页面的设计与实现105.3运行功能模块的实现115.3.1制作俄罗斯方块165.3.2 打印俄罗斯方块。175.3.3 清除俄罗斯方块185.3.4
6、 判断方块是否可以移动195.3.5判断是否满行216.游戏运行测试246.1 系统测试原理及测试原则246.1.1系统测试原理246.1.2 系统测试原则246.2 系统测试的方法256.3本游戏测试26结 论29参考文献30致 谢31外文翻译32英文译文32附英文原文:381. 引言1.1 设计背景 随着计算机技术的不断发展,以及计算机的普及,越来越多的人拥有了自己的电脑,越来越多的人从事计算机行业。许多人掌握了一些计算机的编程语言以及相关的技术,希望通过自己所学的知识来实现自己童年时代玩过的一些经典游戏,俄罗斯方块可谓是经典中的经典。本游戏使用C语言,数据结构等相关知识来实现。玩家首先通
7、过点击游戏图标进入游戏,进入游戏后通过观看后面的选择菜单来开始游戏,俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。1.2 系统配置运行本系统需要满足以下的一些配置要求。操作系统:Windows 2000/2003/XP/win7开发环境: Dev-C+1.3 开发工具与平台(1)C语言C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言
8、程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言最初的标准。(2)Dev-C+开发环境Dev-C+是一个Windows环境下C/C+的集成开发环境(IDE),它是一款自由软件,遵守GPL许可协议分发源代码。它集合了MinGW等众多自由软件,并且可以取得最新版本的各种工具支持,而这一切工作都是来自全球的狂热者所做的工作。Dev-C+是NOI、NOIP等比赛的指定工具,缺点是Debug功能弱。由于原开发公司
9、在开发完4.9.9.2后停止开发,所以现在正由其它公司更新开发,但都基于4.9.9.2.Dev-C+ 最新版本:5.11。Dev-C+使用MingW64/TDM-GCC编译器,遵循C+ 11标准,同时兼容C+98标准。开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集合了编辑器、编译器、连接程序和执行程序,提供高亮度语法显示的,以减少编辑错误,还有完善的调试功能,适合初学者与编程高手的不同需求,是学习C或C+的首选开发工具!多国语言版中包含简繁体中文语言界面及技巧提示,还有英语、俄语、法语、德语、意大利语等二十多个国家和地区语言提供选择。该软件采用 Delphi 开发。 2.系统
10、分析2.1可行性分析可行性分析是在全面调查基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、运行的方面进行分析和研究,以避免投资失误,保证新系统开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。这部分将从以下四个方面进行研究:技术可行性、经济可行性、操作可行性和调度可行性。(1)技术可行性因为计算机硬件的发展越来越快,现在PC机的性能已经可以完全胜任小型游戏的运行。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。(2)经济可行性根据调查的资料,只需要一台计算机安
11、装上一款集成开发工具软件就可以成本5000元。(3)操作可行性由于这个课题是以PC机作为运行平台,为了满足对这款经典游戏的实现,只要掌握C语言的一些基本技能就可以开发,玩家通过阅读菜单就可以来玩游戏。2.2 需求分析对软件需求分析就是通过调查研究,建立系统的数据模型、功能模型、行为模型,用户和开发人员在“系统必须做什么”这个问题上实现相互理解,达到共识,从而形成双方认可的软件产品的需求规格说明书。这样有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,便于采用工程方法开发软件,提高软件的质量,便于开发人员、维护人员、管理人员之间的交流、协作,并作为工作成果的原始依据,并且在向潜
12、在用户传递软件功能、性能需求,使其能够判断该软件是否与自己的需求相关。19种状态的方块随机产生,自由下落,落下时可由玩家用上、左、右控制键控制翻转和移动,以便以玩家所需要的形态和位置落下。落下时,方块的方格如果能填满某一行,则这一行消去。消去一行后,游戏可给玩家加分,若由存在空格的方块填满整个窗口,则游戏失败。游戏功能需求如下: 游戏界面需求:良好的游戏界面可以让玩家充分感受到游戏带来的娱乐性,游戏的背景色是黑色,方块用白色边框。 游戏形状需求:一共有19种状态,即长条形、Z字形、反Z形、田字形、7字形、反7形、T字型,各个方块要能实现它的变形,可设为逆时针。
13、 键盘处理事件需求:方块下落时,可通过键盘方向键(上、左、右键)对该方块进行变形,、向左、向右移动。 显示需求:方块形状的变换,分数、等级的显示,以及游戏帮助等功能。当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定分数的时候,会增加相应的等级,游戏难度也随之增加。3. 概要设计3.1模块组织俄罗斯方块游戏由界面模块、运行模块等构成,其中界面模块实现了游戏菜单以及选择菜单的打印;运行模块通过制作俄罗斯方块,打印俄罗斯方块,消除俄罗斯方块等函数实现。 俄罗斯方块界面模块运行模块图3-1 俄罗斯方块游戏模块组织图打印俄罗斯方块制作俄罗斯方块判断是否可移清
14、除俄罗斯方块判断是否满行4. 数据库设计4.1 概念模型设计(E-R图)数据模型是是数据特征的抽象,从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表与操作提供一个抽象的框架。描述了数据结构、数据操作及数据约束。 E-R图概念化地构建实体间关系的模型,这使得它们区别于数据库模型图。E-R图的理念是:项目所有参与者能理解E-R图。E-R图由不同实体类型、关系、特性和类型构成。实体是诸如用户的实际对象,有时更抽象,但必须有业务意义。特性用于描述实体,关系用于实体之间。实体:现实世界中的事物;属性:事物的特性;联系:现实世界中事物间的关系。实体集的关系有一对一、一对多、多对多
15、的联系。 等级用户名字 分数图4-1 玩家的E-R图4.2数据库需求分析作为一个简单的游戏,不同于其他类型的系统,需要包含的信息量不是很大。只需要包含用户的名字和分数即可。4.3 数据库表结构根据需求分析,设计数据库表结构如下:玩家得分表中包括有玩家姓名和分数具体设计如表4-3所示。表4-3 用户基本信息表t_user编号字段名称数据类型说明1namechar用户ID(主键)2scoreint分数通过对文件的操作来模拟数据库,通过函数save_result()来实现对玩家姓名,等级和分数的存储。 实现的代码如下:void save_result(struct Tetris *tetris)FI
16、LE *fp; /声明文件类型指针 char ch; /声明一个char类型变量 if(fp=fopen("file.c","a")=NULL)/判断是否可以打开文件 printf("can not open filen");exit(0);ch=getchar();/输入玩家姓名 while(ch!='#')fputc(ch,fp);ch=getchar(); fprintf(fp,"level:%d score:%d",tetris->level,tetris->score);/输入
17、玩家等级和得分 fputc(10,fp);/输入一个换行符 fclose(fp);/关闭指针 5.详细设计在本章将具体讨论如何实现功能模块,最终实现整个系统。经过这个阶段的设计工作,应该得出对游戏的描述,从而在编码阶段可以把这个描述直接翻译成用C语言书写的程序。5.1 程序设计本游戏的设计包含界面设计和运行设计。数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。本游戏中的俄罗斯方块结构体Tetris包括中心方块的x轴坐标,中心方块的y轴坐标,
18、标记方块类型的序号,下一个俄罗斯方块类型的序号,俄罗斯方块移动的速度,产生俄罗斯方块的个数,游戏的分数游戏的等级。struct Tetris int x; /中心方块的x轴坐标 int y; /中心方块的y轴坐标 int flag; /标记方块类型的序号 int next; /下一个俄罗斯方块类型的序号 int speed; /俄罗斯方块移动的速度 int count; /产生俄罗斯方块的个数 int score; /游戏的分数 int level; /游戏的等级; 5.2 游戏页面的设计与实现界面模块主要由一个界面函数make_frame()实现。通过一个函数conio.h中gotoxy()
19、函数来控制光标的移动,来绘制出游戏的主界面。并且通过数字2来标记游戏界面的边框。 void make_frame() HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); /定义显示器句柄变量 gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); /打印游戏名称 printf("俄罗斯方块"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); /打印选择菜单 printf("*下一个方块:"); gotoxy(hOut,FrameX+2*
20、Frame_width+3,FrameY+13); printf("*"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17); printf("键:变体"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19); printf("空格:暂停游戏"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15); printf("Esc :退出游戏"); gotoxy(hOut,FrameX,Frame
21、Y); /打印框角并记住该处已有图案 printf(""); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY); printf(""); gotoxy(hOut,FrameX,FrameY+Frame_height); printf(""); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height); printf(""); aFrameXFrameY+Frame_height=2; aFrameX+2*Frame_width
22、-2FrameY+Frame_height=2; for(i=2;i<2*Frame_width-2;i+=2) gotoxy(hOut,FrameX+i,FrameY); printf(""); /打印上横框 for(i=2;i<2*Frame_width-2;i+=2) gotoxy(hOut,FrameX+i,FrameY+Frame_height); printf(""); /打印下横框 aFrameX+iFrameY+Frame_height=2; /记住下横框有图案 for(i=1;i<Frame_height;i+) go
23、toxy(hOut,FrameX,FrameY+i); printf(""); /打印左竖框 aFrameXFrameY+i=2; /记住左竖框有图案 for(i=1;i<Frame_height;i+) gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i); printf(""); /打印右竖框 aFrameX+2*Frame_width-2FrameY+i=2; /记住右竖框有图案 5.3运行功能模块的实现整个游戏分为界面模块和运行模块。下面详细讨论主要的几个运行函数的实现。在每个函数的介绍中,将具体说明一些
24、涉及要点。运行模块分为制作俄罗斯方块,打印俄罗斯方块,清除俄罗斯方块,判断是否可以移动,判断是否满行。运行的主模块主要通过上键,左键,右键来分别控制方块的翻转,向左,向右移动。通过空格键来控制游戏的暂停和继续。其中运行的主模块代码如下:void start_game() HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); /定义显示器句柄变量 struct Tetris t,*tetris=&t; /定义结构体的指针并指向结构体变量 unsigned char ch; /定义接收键盘输入的变量 tetris->count=0; /初始化俄
25、罗斯方块数为0个 tetris->speed=300; /初始移动速度为300ms tetris->score=0; /初始游戏的分数为0分 tetris->level=1; /初始游戏为第1关 while(1) /循环产生方块,直至游戏结束 get_flag(tetris); /得到产生俄罗斯方块类型的序号 temp=tetris->flag; /记住当前俄罗斯方块序号 /打印下一个俄罗斯方块的图形(右边窗口) tetris->x=FrameX+2*Frame_width+6; tetris->y=FrameY+10; tetris->flag =
26、tetris->next; print_tetris(hOut,tetris); tetris->x=FrameX+Frame_width; /初始中心方块x坐标 tetris->y=FrameY-1; /初始中心方块y坐标 tetris->flag=temp; /取出当前的俄罗斯方块序号 while(1) /控制方块方向,直至方块不再下移 label:print_tetris(hOut,tetris);/打印俄罗斯方块 Sleep(tetris->speed); /延缓时间 clear_tetris(hOut,tetris); /清除痕迹 temp1=tetri
27、s->x; /记住中心方块横坐标的值 temp2=tetris->flag; /记住当前俄罗斯方块序号 if(kbhit() /判断是否有键盘输入,有则用ch接收 ch=getch(); if(ch=75) /按键则向左动,中心横坐标减2 tetris->x-=2; if(ch=77) /按键则向右动,中心横坐标加2 tetris->x+=2; if(ch=72) /按键则变体即当前方块顺时针转90度 if( tetris->flag>=2 && tetris->flag<=3 ) tetris->flag+; tetris
28、->flag%=2; tetris->flag+=2; if( tetris->flag>=4 && tetris->flag<=7 ) tetris->flag+; tetris->flag%=4; tetris->flag+=4; if( tetris->flag>=8 && tetris->flag<=11 ) tetris->flag+; tetris->flag%=4; tetris->flag+=8; if( tetris->flag>=12
29、&& tetris->flag<=15 ) tetris->flag+; tetris->flag%=4; tetris->flag+=12; if( tetris->flag>=16 && tetris->flag<=19 ) tetris->flag+; tetris->flag%=4; tetris->flag+=16; if(ch=32) /按空格键,暂停 print_tetris(hOut,tetris); while(1) if(kbhit() /再按空格键,继续游戏 ch=ge
30、tch(); if(ch=32) goto label; if(if_moveable(tetris)=0) /如果不可动,上面操作无效 tetris->x=temp1; tetris->flag=temp2; else /如果可动,执行操作 goto label; tetris->y+; /如果没有操作指令,方块向下移动 if(if_moveable(tetris)=0) /如果向下移动且不可动,方块放在此处 tetris->y-; print_tetris(hOut,tetris); del_full(hOut,tetris); break; for(i=tetri
31、s->y-2;i<tetris->y+2;i+) /游戏结束条件:方块触到框顶位置 if(i=FrameY) j=0; /如果游戏结束,j=0 if(j=0) system("cls"); getch(); break; /清除下一个俄罗斯方块的图形(右边窗口) tetris->flag = tetris->next; tetris->x=FrameX+2*Frame_width+6; tetris->y=FrameY+10; clear_tetris(hOut,tetris); 5.3.1制作俄罗斯方块这个模块通过make_tet
32、ris()实现。这个函数的作用是通过随机产生的俄罗斯方块的标志数来制作出相对应的方块。其中俄罗斯方块的标志随机数通过get_flag()函数得到。get_flag()函数代码如下:void get_flag(struct Tetris *tetris) tetris->count+; /记住产生方块的个数 srand(unsigned)time(NULL); /初始化随机数 if(tetris->count=1) tetris->flag = rand()%19+1; /记住第一个方块的序号 tetris->next = rand()%19+1; /记住下一个方块的序号
33、5.3.2 打印俄罗斯方块。打印俄罗斯方块通过print_tetris()函数实现,首先对数组b进行修改,修改标记位为1,通过对制作好的俄罗斯方块在数组中的一定范围的标记扫描来打印出俄罗斯方块。print_tetris()函数代码如下: void print_tetris(HANDLE hOut,struct Tetris *tetris) for(i=0;i<4;i+) bi=1; /数组b4的每个元素的值都为1 make_tetris(tetris); /制作俄罗斯方块 for( i=tetris->x-2; i<=tetris->x+4; i+=2 ) for(j
34、=tetris->y-2;j<=tetris->y+1;j+) if( aij=1 && j>FrameY ) gotoxy(hOut,i,j); printf(""); /打印边框内的方块 5.3.3 清除俄罗斯方块清除俄罗斯方块通过clear_tetris()函数实现,首先对数组b进行修改,修改标记位为0,通过对制作好的俄罗斯方块在数组中的一定范围的标记的扫描来消除出俄罗斯方块。clear_tetris()代码如下:void clear_tetris(HANDLE hOut,struct Tetris *tetris) for(i
35、=0;i<4;i+) bi=0; /数组b4的每个元素的值都为0 make_tetris(tetris); /制作俄罗斯方块 for( i=tetris->x-2; i<=tetris->x+4; i+=2 ) for(j=tetris->y-2;j<=tetris->y+1;j+) if( aij=0 && j>FrameY ) gotoxy(hOut,i,j); printf(" "); /清除方块 5.3.4 判断方块是否可以移动判断方块是否可以移动通过if_moveable()函数实现,当中心方块位置上
36、有图案时,返回值为0,即不可移动,其他"口"字方块位置上无图案时,返回值为1,即可移动。if_moveable()代码如下:int if_moveable(struct Tetris *tetris) if(atetris->xtetris->y!=0)/当中心方块位置上有图案时,返回值为0,即不可移动 return 0; else if( /当为田字方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动 ( tetris->flag=1 && ( atetris->xtetris->y
37、-1=0 && atetris->x+2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | /或为直线方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动 ( tetris->flag=2 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y=0 && atetris->x+4tetris->y=0 ) ) |
38、( tetris->flag=3 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y-2=0 && atetris->xtetris->y+1=0 ) ) | ( tetris->flag=4 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y=0 && atetris->xtetris->y+1=0 ) )
39、| ( tetris->flag=5 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris->x-2tetris->y=0 ) ) | ( tetris->flag=6 && ( atetris->xtetris->y-1=0 && atetris->x-2tetris->y=0 && atetris->x+2tetris->y=0 )
40、) | ( tetris->flag=7 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=8 && ( atetris->xtetris->y+1=0 && atetris->x-2tetris->y=0 && atetris->x+2tetris->y+1=
41、0 ) ) | ( tetris->flag=9 && ( atetris->xtetris->y-1=0 && atetris->x-2tetris->y=0 && atetris->x-2tetris->y+1=0 ) ) | ( tetris->flag=10 && ( atetris->xtetris->y-1=0 && atetris->x-2tetris->y-1=0 && atetris->x+2tetris
42、->y=0 ) ) | ( tetris->flag=11 && ( atetris->xtetris->y+1=0 && atetris->x+2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=12 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris->x-2
43、tetris->y-1=0 ) ) | ( tetris->flag=13 && ( atetris->x-2tetris->y=0 && atetris->x-2tetris->y+1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=14 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris
44、->x+2tetris->y+1=0 ) ) | ( tetris->flag=15 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=16 && ( atetris->xtetris->y+1=0 && atetris->xtetris->y-1=0 &&
45、 atetris->x+2tetris->y-1=0 ) ) | ( tetris->flag=17 && ( atetris->x-2tetris->y=0 && atetris->x-2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=18 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 &a
46、mp;& atetris->x-2tetris->y+1=0 ) ) | ( tetris->flag=19 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y+1=0 && atetris->x+2tetris->y=0 ) ) ) return 1; return 0;5.3.5判断是否满行判断是否满行通过del_full()函数实现。在del_full()函数首先竖坐标依次从下往上,横坐标依次由左至右判断是否满行(判断是否满
47、足k=Frame_width),如果底层方块满行,先对底层行清除后再把上面的方块下移然后在判断是否满行。void del_full(HANDLE hOut,struct Tetris *tetris) /当某行有Frame_width-2个方块时,则满行 int k,del_count=0; /分别用于记录某行方块的个数和删除方块的行数的变量 for(j=FrameY+Frame_height-1;j>=FrameY+1;j-) k=0; for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2) if(aij=1) /竖坐标依次从下往上,横坐标依次
48、由左至右判断是否满行 k+; /记录此行方块的个数 if(k=Frame_width-2) for(k=FrameX+2;k<FrameX+2*Frame_width-2;k+=2) /删除满行的方块 akj=0; gotoxy(hOut,k,j); printf(" "); Sleep(1); for(k=j-1;k>FrameY;k-) /如果删除行以上的位置有方块,则先清除,再将方块下移一个位置 for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2) if(aik=1) aik=0; gotoxy(hOut,i,k
49、); printf(" "); aik+1=1; gotoxy(hOut,i,k+1); printf(""); j+; /方块下移后,重新判断删除行是否满行 del_count+; /记录删除方块的行数 tetris->score+=100*del_count; /每删除一行,得100分 if( del_count>0 && ( tetris->score%1000=0 | tetris->score/1000>tetris->level-1 ) ) /如果得1000分即累计删除10行,速度加快20m
50、s并升一级 tetris->speed-=20; tetris->level+; 6.游戏运行测试6.1 系统测试原理及测试原则6.1.1系统测试原理测试主要依据是被试系统的研制任务书和技术规格书,是对软件雄体功能和性能的综合测试与评估。测试原理是软件测试活动的理论基础,测试方法是铡试原理的实际应用和获得测试数据的手段。基于软件的共性,对于软件的测试要遵循一般软件的测试原理和方法。同时,针对软件的特性,必须找到合适的测试方法。测试用例的合理性对于软件的测试与评估具有关键作用,而如何使设计的用例、合理并且典型有效并不容易。所以应该与软件的研制人员以及最终用户一起,有针对性地研究实际操
51、作环境并加以描述,形成合理的测试用例集。另一方面,软件运行环境的复杂程度对软件评估具有重要作用,所以应产生尽量逼真的运行背景以便于研究。软件测试的周期如图6.1所示。图6.1 软件测试周期示意图6.1.2 系统测试原则程序员应避免测试自己编写的程序;测试用例的设计必须包括预期的输出结果;测试用例应包括有效的和期望的输入情况,也要包括无效的和不期望的输入情况;所有的测试都应追溯到用户需求,所有测试活动都应该是有计划的,并且计划能够得到保障。只检查程序是否做了它应该做的事这仅完成了测试工作的一半,另一半则是要检查程序是否做了它不该做的事;一段程序中存在错误的概率与在这段程序中已发现的错误数成比例;
52、测试上作必须有明确的目标;尽早地和不断地进行软件测试;穷举测试是不可能的,充分覆盖程序逻辑是有可能的。6.2 系统测试的方法软件测试的方法和技术是多种多样的。对于软件测试技术,可以从不同的角度加以分类:从是否需要执行被测软件的角度,可分为静态测试和动态测试。从测试是否针对系统的内部结构和具体实现算法的角度来看,可分为白盒测试和黑盒测试。 (1)黑盒测试 黑盒测试也称功能测试或数据驱动测试或基于规范的测试,它是在己知产品所应具有的功能的前提下,通过测试来检测每个功能是否都能正常使用,在测试时,把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,测试者对程序接口进行测试,它
53、只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。黑盒测试方法主要有等价类划分、边值分析、因果图、错误推测等。“黑盒”法着眼于程序外部结构,不考虑内部逻辑结构,只是针对软件的界面和软件需求规格说明中规定的功能进行测试。“黑盒”法是穷举输入测试,只有把所有可能的输入都作为测试情况使用,才能以这种方法查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但是可能的输入进行测试。(2)白盒测试白盒测试也称结构测试或逻辑驱动测试或基于实现的测试,它是知道产品内部工作过程。可通过测试来检测产品内部动作是否按照规格说明书的规定止常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都能按预定要求正确工作。白盒测试的主要方法有程序逻辑驱动测试、基本路径测试和数据流测试等。“白盒”法需要全面了解程序的内部逻辑结构、对所有逻辑路径进行测试。因此,白盒”法是穷举路径测试。但即使每条路径都测试了仍然可能有错误。第一,穷举路
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物医药市场营测试卷
- 2025中考英语书面表达之话题作文专项复习课件
- 电动汽车设计与制造-课件 第2章 前期阶段
- 办公室装修招标文件范本
- 小清新绩效管理答辩
- 音乐与文化的结合国际舞台上的吸引力
- 革新传统打造现代医疗建筑的特色
- 顾客体验与忠诚度建设在新零售战略中的地位
- 顾客画像构建在办公用品电商中的应用
- 顾客体验为导向的新零售门店空间设计
- 岩土锚杆技术规程课件
- 风寒感冒及风热感冒诊断及合理用药课件
- 第五版PFMEA编制作业指导书
- 文献整理表格
- VDA6.3过程审核检查表(中英文版)
- DBJ∕T 13-261-2017 福建省二次供水不锈钢水池(箱)应用技术规程
- 二手车评估作业表简单实际样本
- 物资出入库单模板
- 05示例:玉米脱粒机的设计(含全套CAD图纸)
- 北师大版小学数学五年级下册单元测试题含答案(全册)
- 护理技术—鼻饲法课件
评论
0/150
提交评论