Android俄罗斯方块课程设计报告

合集下载

俄罗斯方块课课程设计

俄罗斯方块课课程设计

俄罗斯方块课课程设计一、教学目标本课程旨在让学生了解和掌握俄罗斯方块的基本知识和技巧,通过实践操作,培养学生的逻辑思维能力和反应能力。

知识目标包括了解俄罗斯方块的起源、规则和发展历程,掌握基本的操作技巧。

技能目标包括能够熟练操作俄罗斯方块,实现各种高级技巧,如连消、旋转等。

情感态度价值观目标包括培养学生团队合作精神,鼓励他们在面对挑战时保持积极的态度。

二、教学内容教学内容主要包括俄罗斯方块的基本知识、操作技巧和策略。

首先,介绍俄罗斯方块的起源和发展历程,让学生了解这一经典游戏的历史。

然后,教授基本的操作技巧,如上下移动、旋转等,并通过实践练习,让学生熟练掌握。

接下来,引导学生学习高级技巧,如连消、组合等,并探讨如何在游戏中运用这些技巧。

最后,通过分析不同水平的俄罗斯方块游戏,让学生了解游戏难度和策略的选择。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。

首先,讲授法,由教师讲解俄罗斯方块的基本知识和技巧。

其次,讨论法,学生分组讨论游戏策略和技巧,促进团队合作和思维碰撞。

再次,案例分析法,分析不同水平的俄罗斯方块游戏,让学生了解游戏难度和策略的选择。

最后,实验法,学生通过实践操作,掌握操作技巧和策略。

四、教学资源为了支持教学内容和教学方法的实施,我们将选择和准备适当的教学资源。

教材方面,将使用《俄罗斯方块教程》作为主教材,辅助以相关参考书籍。

多媒体资料方面,将收集俄罗斯方块的历史资料、游戏视频等,以丰富学生的学习体验。

实验设备方面,将准备电脑或游戏机等设备,让学生能够进行实践操作。

五、教学评估本课程的评估方式将包括平时表现、作业和考试三个部分,以全面客观地评价学生的学习成果。

平时表现将根据学生在课堂上的参与度、合作表现和操作技巧进行评估。

作业部分将布置相关的练习题和游戏设计任务,要求学生在规定时间内完成,以此检验他们的理解和应用能力。

考试部分将包括客观题和主观题,以测试学生对俄罗斯方块知识的掌握和操作技巧的熟练程度。

俄罗斯方块游戏设计报告

俄罗斯方块游戏设计报告

C语言课程设计报告设计题目:俄罗斯方块游戏设计院系:班级:学号:姓名:指导教师:设计地点:开课时间:学生姓名成绩评语:指导教师(签名)年月日目录1.设计目的和任务....................................................................................................................................... - 1 -1.1目的: .............................................................................................................................................. - 1 -1.2任务: .............................................................................................................................................. - 1 -2.开发环境.................................................................................................................................................... - 1 -2.1硬件环境:.................................................................................................................................... - 1 -2.2软件环境:.................................................................................................................................... - 1 -3.设计题目...................................................................................................................................................... - 2 -3.1题目名称:.................................................................................................................................... - 2 -3.2题目详细描述: ........................................................................................................................... - 2 -3.3功能要求: ............................................................................................................................................ - 2 -4.相关技术以及知识点.......................................................................................................................... - 3 -4.1编写BLOCK类:............................................................................................................................... - 3 -4.2 PATHGRADIENTBRUSH 类: ........................................................................................................ - 3 -4.3 RANDOM类:.................................................................................................................................. - 3 -4.4 GDI图形处理: ........................................................................................................................... - 3 -5. 设计与实现 .............................................................................................................................................. - 4 -5.1 设计流程图................................................................................................................................... - 4 -5.2 游戏主体界面 .............................................................................................................................. - 4 -5.3 游戏图形界面 ............................................................................................................................ - 11 -5.4 图形的移动与消行 ................................................................................................................... - 13 -5.5 得分的实现................................................................................................................................. - 15 -6.总结 ........................................................................................................................................................ - 16 -7.参考资料................................................................................................................................................ - 16 -1.设计目的和任务1.1目的:在现今电子信息高速发展的时代,电子游戏已深入人们的日常生活,成为老少皆宜的娱乐方式。

软件工程课程设计报告俄罗斯方块

软件工程课程设计报告俄罗斯方块

《软件工程》课程设计报告课题:俄罗斯块学院:计算机与信息学院专业:软件工程姓名(学号):晋烨(2011112360)指导教师:昭一、任务分析俄罗斯块是个老少皆宜的小游戏,它实现由四块正形的色块组成,计算机随机产生不同七种类型的块,根据计算机时钟控制它在一定的时间不停的产生,用户根据键盘的四个向键控制翻转、向左、向右和向下操作,然后程序根据这七种块堆叠成各种不同的模型。

二、可行性研究报告1、设计背景俄罗斯块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。

俄罗斯块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。

随着计算机的发展而发展,俄罗斯块不断推出新,深爱广大玩家喜爱。

这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的块进行组合,来训练玩家的反应能力。

因此开发此游戏软件可满足人们的一些娱乐的需求。

此俄罗斯块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯块游戏。

2、设计目的通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯广场游戏,使自己熟应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对J2SE基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。

3、设计要求本游戏开发的总体任务是实现游戏的可操作性,以及界面的美观性。

整个开发过程遵循软件工程规,采用JAVA GUI编程实现界面以及事件的控制。

用户根据键盘的四个向键控制翻转、向左、向右、和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换向、积分以及等级的功能。

4、设计目标通过本游戏的开发,主要实现游戏的可操作性及美观性,同时使自己对JAVA语言的了解更进一层,为将来的实际工作打下坚实的基础。

三、需求分析游戏需求28种状态的块随机产生,自由下落,落下时可由玩家用上、下、左、右控制键控制翻转和移动,以便玩家所需要的形态和位置落下。

基于android环境的俄罗斯方块_毕业设计

基于android环境的俄罗斯方块_毕业设计

一、绪论1.1.项目背景本题目将设计一个俄罗斯方块(Tetris, 俄文:Тетрис)。

它是一款风靡全球的电视游戏机和掌上游戏机游戏,由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。

俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

由于上手简单、老少皆宜,从而家喻户晓,风靡世界。

1.2.开发平台此项目基于android 环境进行开发,使用的编程工具为eclipse,它是以android语言作为其基本语言的一种可视化编程工具。

Android 是Google开发的基于Linux平台的开源手机操作系统. Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。

应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

Activity之间通过Intent进行通信。

你的应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。

广播接收器没有用户界面。

然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。

一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。

android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。

注:Activity生命周期二、项目规则及设计思路2.1.项目规则玩家通过点触虚拟键盘,左右控制方块左右移动,按上代表旋转,按下代表加速向下移动,每满一行消除,获得相应积分100,积分每增长2000,等级加1,游戏速度加快2.2.实现思路2.2.1.界面设计注:游戏界面中,利用二维数组进行保存,其值为1代表该点有方块占用,值为0代表空白,根据值绘制整张游戏窗口。

anderoit俄罗斯方块课程设计

anderoit俄罗斯方块课程设计

anderoit俄罗斯方块课程设计一、课程目标知识目标:1. 学生能理解俄罗斯方块游戏的规则及游戏策略。

2. 学生能掌握Andertoise编程环境中基本的编程语句和逻辑结构。

3. 学生能了解计算机坐标系以及如何在编程中应用。

技能目标:1. 学生能够使用Andertoise编程环境,独立编写简单的俄罗斯方块游戏程序。

2. 学生能够通过编程实践,培养逻辑思维和问题解决能力。

3. 学生能够运用所学知识,进行有效的团队协作,共同完成项目任务。

情感态度价值观目标:1. 学生培养对编程的兴趣,增强学习信息技术的积极性和主动性。

2. 学生在团队合作中学会相互尊重、沟通协作,培养团队精神和责任感。

3. 学生通过编程实践,认识到编程对生活的影响,培养创新意识和实践能力。

课程性质:本课程以实践为主,结合理论知识,通过项目式学习,让学生在动手实践中掌握编程技能。

学生特点:六年级学生具备一定的逻辑思维能力,对新事物充满好奇,喜欢动手实践。

教学要求:教师需引导学生主动探索,关注学生个体差异,提供个性化指导,鼓励团队合作,提高学生的编程能力和信息素养。

通过课程目标的实现,使学生在知识、技能和情感态度价值观方面得到全面发展。

二、教学内容1. 俄罗斯方块游戏原理介绍:游戏规则、游戏界面、方块形状及运动规律。

相关教材章节:第五章《游戏设计基础》第二节《游戏规则与界面设计》2. Andertoise编程环境使用:基本操作、编程语句、逻辑结构。

相关教材章节:第二章《Andertoise编程基础》3. 计算机坐标系及其应用:坐标系概念、坐标转换、在编程中的应用。

相关教材章节:第四章《图形与动画》第一节《计算机坐标系》4. 编程实现俄罗斯方块游戏:a. 设计游戏界面及基本框架。

b. 编写方块生成、移动、旋转等基本功能。

c. 实现方块消去及得分机制。

d. 游戏逻辑优化及调试。

相关教材章节:第五章《游戏设计基础》第三节《游戏功能实现》5. 团队合作与项目实践:分组合作、任务分配、进度管理、成果展示。

俄罗斯方块课程设计报告

俄罗斯方块课程设计报告

1.系统概述 (1)2.设计说明书 (4)3.系统操作界面 (6)4.源程序编码 (7)5.测试计划 (36)6.改进意见 (39)7 •课程设计心得体会 (40)8.参考书籍、资料 (40)系统概述1.1现状分析在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐的需求。

此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。

1.2项目要求俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。

本软件要实现的功能如下:(1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。

(2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。

(3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。

(4)1.3 系统功能模块示意图项目开发计划书项目开发计划书设计说明1.1游戏区模块1.2控制区模块1.3系统流程图(2)游戏控制模块(开始,暂停继续,提高等级,降低等级, 停止,新游戏,帮助)系统操作界面游戏打开界面回鬲矗慕歹斯方块苦戏□Array游戏进行中界面自犠罗斯方块却E源代码编码#i nclude <stdio.h>#in elude <bios.h>#in elude <dos.h>#in elude vgraphics.h> #i nclude <stri ng.h>#i nclude <stdlib.h>#define true 1#define false 0#defi ne BoardWidth 12#defi ne BoardHeight 23 #define _INNER_HELPERinner helper method */ /*Scan Codes Define*/en umKEYCODESK_ESC =0x011b.K_UP =0x4800, /* upward arrow */K_LEFT =0x4b00,K_DOWN =0x5000,K_RIGHT =0x4d00,K_SPACE =0x3920,K_P =0x1970};/* the data structure of the block */ typedef struct tagBlock {char c[4][4]; /* cell fill info array, 0-empty, 1-filled */ int x; /* block position cx [ 0,BoardWidht -1] */ int y; /* block position cy [-4,BoardHeight-1] */ char color; /* block color */char size; /* block max size in w idth or height */char name; /* block name (the block's shape) */} Block;/* game's global info */int FrameTime= 1300;int CellSize= 18;int BoardLeft= 30;int BoardTop= 30;/* next block grid */int NBBoardLeft= 300;int NBBoardTop= 30;int NBCellSize= 10;/* score board position */int ScoreBoardLeft= 300;int ScoreBoardTop=100;int ScoreBoardWidth=200;int ScoreBoardHeight=35;int ScoreColor=LIGHTCYAN;/* infor text postion */int InfoLeft=300;int InfoTop=200;int InfoColor=YELLOW;int BorderColor=DARKGRAY;int BkGndColor=BLACK;int GameRunning=true;int TopLine=BoardHeight-1; /* top empty line */int TotalScore=100;char info_score[20];char info_help[255];char info_common[255];/* our board, Board[x][y][0]-isFilled, Board[x][y][1]-fillColor*/unsigned char Board[BoardWidth][BoardHeight][2];char BufferCells[4][4]; /* used to judge if can rotate/* current moving block */ next Blockto appear */ /* function list */int GetKeyCode();int CanMove(int dx,int dy);int CanRotate();int RotateBlock(Block *block);int MoveBlock(Block *block,int dx,int dy); void DrawBlock(Block *block,int,int,int); void EraseBlock(Block *block,int,int,int); void DisplayScore();void DisplayInfo(char* text);void GenerateBlock(Block *block);void NextBlock();void InitGame();int PauseGame();void QuitGame();/*Get Key Code */int _INNER_HELPEGRetKeyCode(){int key=0;if(bioskey(1)){key=bioskey(0);}return key;}/* display text! */void _INNER_HELPEDRisplayInfo(char *text) {setcolor(BkGndColor);outtextxy(InfoLeft,InfoTop,info_common);strcpy(info_common,text); setcolor(InfoColor);outtextxy(InfoLeft,InfoTop,info_common);}/* create a new block by key number,* the block anchor to the top-left corner of 4*4 cells block */Block curBlock; Block nextBlock; /*_INNER_HELPEGRenerateBlock(Block *block)int key=(random(13)*random(17)+random(1000)+random(3000))%7;block->size=3;/* because most blocks' size=3 */ memset(block->c,0,16); switch(key){case 0:block->name='T'; block->color=RED; block->c[1][0]=1;block->c[1][1]=1, block->c[2][1]=1; block->c[1][2]=1; break; case 1:block->name='L'; block->color=YELLOW; block->c[1][0]=1; block->c[1][1]=1;block->c[1][2]=1, block->c[2][2]=1; break; case 2:block->name='J';block->color=LIGHTGRAY; block->c[1][0]=1; block->c[1][1]=1;block->c[1][2]=1, block->c[0][2]=1; break; case 3:block->name='z'; block->color=CYAN;block->c[0][0]=1, block->c[1][0]=1; block->c[1][1]=1, block->c[2][1]=1; break; case 4:block->name='5';block->color=LIGHTBLUE;block->c[1][0]=1, block->c[2][0]=1; block->c[0][1]=1, block->c[1][1]=1; break; case 5:block->name='o'; block->color=BLUE;*/void {block->size=2;block->c[0][0]=1, block->c[1][0]=1;block->c[0][1]=1, block->c[1][1]=1; break;case 6: block->name='I'; block->color=GREEN;block->size=4; block->c[1][0]=1; block->c[1][1]=1;block->c[1][2]=1; block->c[1][3]=1; break;}}/* get next block! */ void NextBlock(){/* copy the nextBlock to curBlock */curBlock.size=nextBlock.size; curBlock.color=nextBlock.color;curBlock.x=(BoardWidth-4)/2; curBlock.y=-curBlock.size;memcpy(curBlock.c,nextBlock.c,16);/* generate nextBlock and show it */EraseBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);GenerateBlock(&nextBlock);nextBlock.x=1,nextBlock.y=0;DrawBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);}/* rotate the block, update the block struct data */int _INNER_HELPE R otateCells(char c[4][4],char { char temp,i,j;switch(blockSize){case 3:temp=c[0][0];c[0][0]=c[2][0], c[2][0]=c[2][2], c[0][2]=temp;temp=c[0][1];c[0][1]=c[1][0], c[1][0]=c[2][1],blockSize)c[2][2]=c[0][2],c[2][1]=c[1][2break;/* judge if the block can move toward the direction */ int CanMove(int dx,int dy){int i,j,tempX,tempY;for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(curBlock.c[i][j]){/* cannot move leftward or rightward */ tempX = curBlock.x + i + dx;if(tempX<0 || tempX>(BoardWidth-1)) return false;/* make sure x is valid! *//* cannot move downward */tempY = curBlock.y + j + dy; if(tempY>(BoardHeight-1)) onlychecked lower bound, maybe negative!!!! /* the cell already filled,if(tempY>=0 && Board[tempX][tempY][0]) returnfalse;}}}return true;}/* judge if the block can rotate */ int CanRotate(){int i,j,tempX,tempY; /* update buffer */memcpy(BufferCells, curBlock.c, 16); RotateCells(BufferCells,curBlock.size); for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++)c[1][2]=temp ; case 4: /* only 'I'c[1][0]=1-c[1][0], c[0][1]=1-c[0][1], c[3][1];break;}}block arived here! */ c[1][2]=1-c[1][2], c[2][1]=1-c[1][3]=1-c[1][3];c[3][1]=1- return false; /* y is*/ we must check Y's upper bound before check cell*/{if(BufferCells[i][j]){tempX=curBlock.x+i;tempY=curBlock.y+j;if(tempX<0 || tempX>(BoardWidth-1))return false;if(tempY>(BoardHeight-1))return false;if(tempY>=0 && Board[tempX][tempY][0])return false;}}}return true;}/* draw the block */void _INNER_HELPERDrawBlock(Block *block,int bdLeft,intbdTop,int cellSize){int i,j;setfillstyle(SOLID_FILL,block->color);for(i=0;i<block->size;i++){for(j=0;j<block->size;j++){if(block->c[i][j] && (block->y+j)>=0){floodfill(bdLeft+cellSize*(i+block->x)+cellSize/2,bdTop+cellSize*(j+block->y)+cellSize/2,BorderColor);}}}}/* Rotate the block, if success, return true */int RotateBlock(Block *block){char temp,i,j;int b_success;if(block->size==2)return true;if(( b_success=CanRotate())){EraseBlock(block,BoardLeft,BoardTop,CellSize);memcpy(curBlock.c,BufferCells,16);DrawBlock(block,BoardLeft,BoardTop,CellSize);}return b_success;}/* erase a block, only fill the filled cell with background color */ void_INNER_HELPEREraseBlock(Block *block,int bdLeft,int bdTop,int cellSize){int i,j;setfillstyle(SOLID_FILL,BkGndColor);for(i=0;i<block->size;i++){for(j=0;j<block->size;j++){if(block->c[i][j] && (block->y+j>=0)){floodfill(bdLeft+cellSize*(i+block->x)+cellSize/2,bdTop+cellSize*(j+block->y)+cellSize/2, BorderColor);}}}}/* move by the direction if can, donothing if cannot* return value: true - success, false - cannot move toward this direction */ int MoveBlock(Block *block,int dx,int dy) {int b_canmove=CanMove(dx,dy); if(b_canmove){EraseBlock(block,BoardLeft,BoardTop,CellSize); curBlock.x+=dx; curBlock.y+=dy;DrawBlock(block,BoardLeft,BoardTop,CellSize);}return b_canmove;}/* drop the block to the bottom! */ int DropBlock(Block *block){EraseBlock(block,BoardLeft,BoardTop,CellSize); while(CanMove(0,1)){curBlock.y++;}DrawBlock(block,BoardLeft,BoardTop,CellSize);return 0;/* return value is assign to the block's alive */}/* init the graphics mode, draw the board grid */ void InitGame(){int i,j,gdriver=DETECT,gmode; struct time sysTime; /* draw board cells */memset(Board,0,BoardWidth*BoardHeight*2); memset(nextBlock.c,0,16); strcpy(info_help,"P: Pause Game. --by hoodlum1980"); initgraph(&gdriver,&gmode,"");setcolor(BorderColor); for(i=0;i<=BoardWidth;i++) {line(BoardLeft+i*CellSize, BoardTop+ BoardHeight*CellSize); }for(i=0;i<=BoardHeight;i++){line(BoardLeft,BoardLeft+BoardWidth*CellSize,}/* draw board outer border rectangle(BoardLeft-CellSize/4,BoardLeft+BoardWidth*CellSize+CellSize/4, BoardTop+BoardHeight*CellSize+CellSize/4); /* draw next block grids */ for(i=0;i<=4;i++){line(NBBoardLeft+i*NBCellSize, NBBoardTop,NBBoardLeft+i*NBCellSize, NBBoardTop+4*NBCellSize);BoardTop, BoardLeft+i*CellSize,BoardTop+i*CellSizeBoardTop+ i*CellSize); rect */BoardTop-CellSize/4,line(NBBoardLeft, NBBoardTop+i*NBCellSize,NBBoardLeft+4*NBCellSize, NBBoardTop+i*NBCellSize);}/* draw score rect */rectangle(ScoreBoardLeft,ScoreBoardTop,ScoreBoardLeft+ScoreBoardWidth,S coreBoardTop+ScoreBoardHeight);DisplayScore();/* set new seed! */ gettime(&sysTime);srand(sysTime.ti_hour*3600+sysTime.ti_min*60+sysTime.ti_sec);GenerateBlock(&nextBlock);NextBlock(); /* create first block */setcolor(DARKGRAY);outtextxy(InfoLeft,InfoTop+20,"Up -rotate Space-drop");outtextxy(InfoLeft,InfoTop+35,"Left-left Right-right");outtextxy(InfoLeft,InfoTop+50,"Esc -exit");DisplayInfo(info_help);}/* set the isFilled and fillcolordata to the board */void _INNER_HELPEFRillBoardData(){int i,j;for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(curBlock.c[i][j] && (curBlock.y+j)>=0){Board[curBlock.x+i][curBlock.y+j][0]=1;Board[curBlock.x+i][curBlock.y+j][1]=curBlock.color;}/* draw one line of the board */void _INNER_HELPEPRaintBoard(){int i,j,fillcolor; for(j=max((TopLine-4),0);j<BoardHeight;j++){for(i=0;i<BoardWidth;i++){ fillcolor=Board[i][j][0]? Board[i][j][1]:BkGndColor;setfillstyle(SOLID_FILL,fillcolor);floodfill(BoardLeft+i*CellSize+CellSize/2,BoardTop+j*CellSize+CellSize/2,BorderColor);}}}/* check if one line if filled full and increase the totalScore! */ void_INNER_HELPECRheckBoard(){int i,j,k,score=10,sum=0,topy,lines=0;/* we find the top empty line! */ j=topy=BoardHeight-1;do{sum=0;for(i=0;i< BoardWidth; i++){ sum+=Board[i][topy][0];}topy--;} while(sum>0 && topy>0);/* remove the full filled line (max remove lines count = 4) */ do{sum=0;for(i=0;i< BoardWidth; i++) sum+=Board[i][j][0];if(sum==BoardWidth)/* we find this line is full filled, remove it! */{/* move the cells data down one line */ for(k=j; k > topy;k--){ for(i=0;i<BoardWidth;i++) {Board[i][k][0]=Board[i][k-1][0];Board[i][k][1]=Board[i][k-1][1];}}/*make the top line empty! */ for(i=0;i<BoardWidth;i++) {Board[i][topy][0]=0;Board[i][topy][1]=0;}topy++; /* move the topline downward one line! */ lines++; /*lines <=4 */ TotalScore+=score;score*=2; /* adding: 10, 30, 70, 150 */}elsej--;} while(sum>0 && j>topy && lines<4);/* speed up the game when score is high, minimum is 400 */FrameTime=max(1200-100*(TotalScore/200), 400);TopLine=topy;/* update the top line *//* if no lines remove, only add 1: */if(lines==0)TotalScore++;}/* display the score */void _INNER_HELPEDRisplayScore(){setcolor(BkGndColor);outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);setcolor(ScoreColor);sprintf(info_score,"Score: %d",TotalScore);outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);}/* we call this function when a block is inactive. */ void UpdateBoard(){FillBoardData(); CheckBoard();PaintBoard();DisplayScore();}/* pause the game, and timer handler stop move down the block! */ int PauseGame(){int key=0;DisplayInfo("Press P to Start or Resume!"); while(key!=K_P && key!=K_ESC) { while(!(key=GetKeyCode())){}}DisplayInfo(info_help);return key;}/* quit the game and do cleaning work. */ void QuitGame(){ closegraph();}/* the entry point function. */void main(){int i,flag=1,j,key=0,tick=0;InitGame(); if(PauseGame()==K_ESC) goto GameOver;/* wait until a key pressed */ while(key!=K_ESC){/* wait until a key pressed */ while(!(key=GetKeyCode())) {tick++;if(tick>=FrameTime){/* our block has dead! (can't move down), we get nextblock */if(!MoveBlock(&curBlock,0,1)){UpdateBoard();NextBlock();if(!CanMove(0,1))goto GameOver;}tick=0;}delay(100);}switch(key){case K_LEFT:MoveBlock(&curBlock,-1,0);break;case K_RIGHT:MoveBlock(&curBlock,1,0);break;case K_DOWN:MoveBlock(&curBlock,0,1);break;case K_UP:RotateBlock(&curBlock);break;case K_SPACE:DropBlock(&curBlock);break;case K_P:PauseGame();break;}}GameOver:DisplayInfo("GAME OVER! Press any key to exit!"); getch(); /* wait the user Press any key. */ QuitGame();}测试计划1.1 测试方案本游戏的测试方法采用检查各个功能能否实现的方法1.2测试项目及功能控制区开始:实现游戏的开始暂停:实现游戏暂停继续:实现游戏继续提高级数: 提高级数增加游戏的难度降低级数:降低级数减小游戏的难度菜单区新游戏:游戏结束从新开始新一轮的游戏提高级数:提高游戏难度降低级数:减小游戏难度退出:退出游戏开始:开始游戏暂停:暂停正在进行的游戏从新开始:重新开始游戏停止:停止正在进行的游戏帮助信息:游戏控制键显示区:显示俄罗斯方块提前显示窗口:显示下一个方块的样式测试进度:本游戏在我和同组李帅同学的辛苦努力下用了半天的时间完成了1.3测试准备编写相应的驱动模块,并精心设计测试用例1.4测试机构测试人员: 王新勃职责:找出程序中的错误,实现游戏的功能1.5 测试项目说明测试1:名称:控制区功能测试目的:测试控制区各个功能的按钮。

俄罗斯方块课程设计报告

俄罗斯方块课程设计报告

目录1. 系统概述 12. 设计说明书 43. 系统操作界面 64. 源程序编码75.测试计划6.改进意见36 397.课程设计心得体会40 8. 参考书籍、资料40系统概述1.1 现状分析在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐的需求。

此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。

1.2 项目要求俄罗斯方块游戏是一款适合大众的游戏软件,它适合不同年龄的人玩。

本软件要实现的功能如下:(1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。

(2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。

(3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。

(4)1.3 系统功能模块示意图显示玩家操作游戏区显示操作结果开始俄罗斯方块游戏暂停 /继续提高等级游戏控制降低等级退出项目开发计划书项目开发计划书名称时间工作内容下达设计任务1 天(集中)说明如何着手设计的方法和设计任务的解释说明。

收集、分析资料及项目组在项目经理的组织下选题、分析,2 天识别实体,完成《项目开发计划书》及小文档组人员分工。

各项目组完成系统层次图、用户界面设计、设计 2 天数据库表设计、报表设计,完成《设计说明书》程序编写和测试7 天根据方案进行现场编程、调试。

编写设计文档 2 天完成软件测试以及《用户操作手册》的编写。

各小组提交文档,教师根据情况选择是否文档提交、答辩 1 天答辩及答辩方式(抽样答辩或全员答辩)。

设计说明1.1 游戏区模块创建游戏区游戏区模块处理玩家游戏操作显示游戏结果1.2 控制区模块开始游戏暂停游戏游戏控制模块初始级别设置退出游戏1.3 系统流程图开始设置初始级别随机选择方块类型创建游戏区是否到顶部游戏开局是方块下落一行游戏结束否处理玩家操作1.4 模块简介是否到顶部1.功能模块(1)游戏区模块(创建游戏区,处理玩家操作,显示操作结果)(2)游戏控制模块(开始,暂停继续,提高等级,降低等级,停止,新游戏,帮助)系统操作界面游戏打开界面游戏进行中界面源代码编码#include <stdio.h>#include <bios.h>#include <dos.h>#include <graphics.h>#include <string.h>#include <stdlib.h>#define true 1#define false 0#define BoardWidth 12#define BoardHeight 23#define _INNER_HELPER/*inner helper method *//*Scan Codes Define*/enum KEYCODES{K_ESC =0x011b,K_UP =0x4800, /* upward arrow */ K_LEFT =0x4b00,K_DOWN =0x5000,K_RIGHT =0x4d00,K_SPACE =0x3920,K_P =0x1970};/* the data structure of the block */typedef struct tagBlock{char c[4][4]; /* cell fill info array, 0-empty, 1-filled */ int x; /* block position cx [0,BoardWidht -1] */ int y; /* block position cy [-4,BoardHeight-1] */ char color; /* block color */char size; /* block max size in width or height */char name; /* block name (the block's shape) */} Block;/* game's global info */int FrameTime= 1300;int CellSize= 18;int BoardLeft= 30;int BoardTop= 30;/* next block grid */int NBBoardLeft= 300;int NBBoardTop= 30;int NBCellSize= 10;/* score board position */int ScoreBoardLeft= 300;int ScoreBoardTop=100;int ScoreBoardWidth=200;int ScoreBoardHeight=35;int ScoreColor=LIGHTCYAN;/* infor text postion */int InfoLeft=300;int InfoTop=200;int InfoColor=YELLOW;int BorderColor=DARKGRAY;int BkGndColor=BLACK;int GameRunning=true;int TopLine=BoardHeight-1; /* top empty line */int TotalScore=100;char info_score[20];char info_help[255];char info_common[255];/* our board, Board[x][y][0]-isFilled, Board[x][y][1]-fillColor */unsigned char Board[BoardWidth][BoardHeight][2];char BufferCells[4][4]; /* used to judge if can rotate block */ Block curBlock; /* current moving block */Block nextBlock; /* next Block to appear *//* function list */int GetKeyCode();int CanMove(int dx,int dy);int CanRotate();int RotateBlock(Block *block);int MoveBlock(Block *block,int dx,int dy);void DrawBlock(Block *block,int,int,int);void EraseBlock(Block *block,int,int,int);void DisplayScore();void DisplayInfo(char* text);void GenerateBlock(Block *block);void NextBlock();void InitGame();int PauseGame();void QuitGame();/*Get Key Code */int _INNER_HELPERGetKeyCode(){int key=0;if(bioskey(1)){key=bioskey(0);}return key;}/* display text!*/void _INNER_HELPERDisplayInfo(char*text){setcolor(BkGndColor);outtextxy(InfoLeft,InfoTop,info_common);strcpy(info_common,text);setcolor(InfoColor);outtextxy(InfoLeft,InfoTop,info_common);}/* create a new block by key number,* the block anchor to the top-left corner of 4*4 cells*/void _INNER_HELPERGenerateBlock(Block*block){int key=(random(13)*random(17)+random(1000)+random(3000))%7;block->size=3;/* because most blocks' size=3 */memset(block->c,0,16);switch(key){case 0:block->name='T';block->color=RED;block->c[1][0]=1;block->c[1][1]=1,block->c[2][1]=1;block->c[1][2]=1;break;case 1:block->name='L';block->color=YELLOW;block->c[1][0]=1;block->c[1][1]=1;block->c[1][2]=1,block->c[2][2]=1;break;case 2:block->name='J';block->color=LIGHTGRAY;block->c[1][0]=1;block->c[1][1]=1;block->c[1][2]=1,block->c[0][2]=1;break;case 3:block->name='z';block->color=CYAN;block->c[0][0]=1,block->c[1][0]=1;block->c[1][1]=1,block->c[2][1]=1;break;case 4:block->name='5';block->color=LIGHTBLUE;block->c[1][0]=1,block->c[2][0]=1;block->c[0][1]=1,block->c[1][1]=1;break;case 5:block->name='o';block->color=BLUE;block->size=2;block->c[0][0]=1,block->c[1][0]=1;block->c[0][1]=1,block->c[1][1]=1;break;case 6:block->name='I';block->color=GREEN;block->size=4;block->c[1][0]=1;block->c[1][1]=1;block->c[1][2]=1;block->c[1][3]=1;break;}}/* get next block!*/void NextBlock(){/* copy the nextBlock to curBlock*/curBlock.size=nextBlock.size;curBlock.color=nextBlock.color;curBlock.x=(BoardWidth-4)/2;curBlock.y=-curBlock.size;memcpy(curBlock.c,nextBlock.c,16);/* generate nextBlock and show it*/EraseBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);GenerateBlock(&nextBlock);nextBlock.x=1,nextBlock.y=0;DrawBlock(&nextBlock,NBBoardLeft,NBBoardTop,NBCellSize);}/* rotate the block, update the block struct data */int _INNER_HELPERotateCells(char c[4][4],char blockSize){char temp,i,j;switch(blockSize){case 3:temp=c[0][0];c[0][0]=c[2][0], c[2][0]=c[2][2], c[2][2]=c[0][2], c[0][2]=temp;temp=c[0][1];c[0][1]=c[1][0], c[1][0]=c[2][1], c[2][1]=c[1][2],c[1][2]=temp;break;case 4: /* only 'I' block arived here! */c[1][0]=1-c[1][0], c[1][2]=1-c[1][2], c[1][3]=1-c[1][3];c[0][1]=1-c[0][1], c[2][1]=1-c[2][1], c[3][1]=1- c[3][1];break;}}/* judge if the block can move toward the direction */int CanMove(int dx,int dy){int i,j,tempX,tempY;for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(curBlock.c[i][j]){/* cannot move leftward or rightward */tempX = curBlock.x + i + dx;if(tempX<0 || tempX>(BoardWidth-1)) return false; /* make sure x is valid! *//* cannot move downward */tempY = curBlock.y + j + dy;if(tempY>(BoardHeight-1)) return false; /* y is only checked lower bound, maybe negative!!!! *//* the cell already filled, we must check Y's upper bound before check cell ! */if(tempY>=0 && Board[tempX][tempY][0]) return false;}}}return true;}/* judge if the block can rotate */int CanRotate(){int i,j,tempX,tempY;/* update buffer */memcpy(BufferCells, curBlock.c, 16);RotateCells(BufferCells,curBlock.size);for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(BufferCells[i][j]){tempX=curBlock.x+i;tempY=curBlock.y+j;if(tempX<0 || tempX>(BoardWidth-1))return false;if(tempY>(BoardHeight-1))return false;if(tempY>=0&& Board[tempX][tempY][0])return false;}}}return true;}/* draw the block*/void _INNER_HELPERDrawBlock(Block *block,int bdLeft,int bdTop,int cellSize){int i,j;setfillstyle(SOLID_FILL,block->color);for(i=0;i<block->size;i++){for(j=0;j<block->size;j++){if(block->c[i][j]&& (block->y+j)>=0){floodfill(bdLeft+cellSize*(i+block->x)+cellSize/2,bdTop+cellSize*(j+block->y)+cellSize/2,BorderColor);}}}}/* Rotate the block, if success, return true*/int RotateBlock(Block*block){char temp,i,j; int b_success; if(block->size==2)return true;b_success=CanRotate()))EraseBlock(block,BoardLeft,BoardTop,CellSize); memcpy(curBlock.c,BufferCells,16);DrawBlock(block,BoardLeft,BoardTop,CellSize); }return b_success; }/* erase a block, only fill the filled cell with background color */void _INNER_HELPEREraseBlock(Block *block,int bdLeft,int bdTop,intcellSize) {int i,j;setfillstyle(SOLID_FILL,BkGndColor); for(i=0;i<block->size;i++) {for(j=0;j<block->size;j++) {if(block->c[i][j] && (block->y+j>=0)) {floodfill(bdLeft+cellSize*(i+block->x)+cellSize/2, bdTop+cellSize*(j+block->y)+cellSize/2, BorderColor);} } } }/* move by the direction if can, donothing if cannot* return value: true - success, false - cannot move toward this direction */int MoveBlock(Block *block,int dx,int dy) {int b_canmove=CanMove(dx,dy); if(b_canmove) {if(( {EraseBlock(block,BoardLeft,BoardTop,CellSize);curBlock.x+=dx;curBlock.y+=dy;DrawBlock(block,BoardLeft,BoardTop,CellSize);}return b_canmove;}/* drop the block to the bottom!*/int DropBlock(Block*block){EraseBlock(block,BoardLeft,BoardTop,CellSize);while(CanMove(0,1)){curBlock.y++;}DrawBlock(block,BoardLeft,BoardTop,CellSize);return 0;/* return value is assign to the block's alive*/}/* init the graphics mode, draw the board grid */void InitGame(){int i,j,gdriver=DETECT,gmode;struct time sysTime;/* draw board cells */memset(Board,0,BoardWidth*BoardHeight*2);memset(nextBlock.c,0,16);strcpy(info_help,"P: Pause Game. --by hoodlum1980");initgraph(&gdriver,&gmode,"");setcolor(BorderColor);for(i=0;i<=BoardWidth;i++){line(BoardLeft+i*CellSize, BoardTop, BoardLeft+i*CellSize, BoardTop+ BoardHeight*CellSize);}for(i=0;i<=BoardHeight;i++){line(BoardLeft, BoardTop+i*CellSize, BoardLeft+BoardWidth*CellSize, BoardTop+ i*CellSize);}/* draw board outer border rect */rectangle(BoardLeft-CellSize/4, BoardTop-CellSize/4,BoardLeft+BoardWidth*CellSize+CellSize/4,BoardTop+BoardHeight*CellSize+CellSize/4);/* draw next block grids*/for(i=0;i<=4;i++){line(NBBoardLeft+i*NBCellSize, NBBoardTop, NBBoardLeft+i*NBCellSize, NBBoardTop+4*NBCellSize);line(NBBoardLeft, NBBoardTop+i*NBCellSize,NBBoardLeft+4*NBCellSize, NBBoardTop+i*NBCellSize);}/* draw score rect*/rectangle(ScoreBoardLeft,ScoreBoardTop,ScoreBoardLeft+ScoreBoardWidth,S coreBoardTop+ScoreBoardHeight);DisplayScore();/* set new seed! */gettime(&sysTime);srand(sysTime.ti_hour*3600+sysTime.ti_min*60+sysTime.ti_sec);GenerateBlock(&nextBlock);NextBlock();/* create first block*/setcolor(DARKGRAY);outtextxy(InfoLeft,InfoTop+20,"Up-rotate Space-drop");outtextxy(InfoLeft,InfoTop+35,"Left-left Right-right");outtextxy(InfoLeft,InfoTop+50,"Esc-exit");DisplayInfo(info_help);}/* set the isFilled and fillcolor data to the board */void_INNER_HELPERFillBoardData(){int i,j;for(i=0;i<curBlock.size;i++){for(j=0;j<curBlock.size;j++){if(curBlock.c[i][j]&& (curBlock.y+j)>=0){Board[curBlock.x+i][curBlock.y+j][0]=1;Board[curBlock.x+i][curBlock.y+j][1]=curBlock.color;}}}}/* draw one line of the board */void_INNER_HELPERPaintBoard(){int i,j,fillcolor;for(j=max((TopLine-4),0);j<BoardHeight;j++){for(i=0;i<BoardWidth;i++){fillcolor=Board[i][j][0]? Board[i][j][1]:BkGndColor;setfillstyle(SOLID_FILL,fillcolor);floodfill(BoardLeft+i*CellSize+CellSize/2,BoardTop+j*CellSize+CellSize/2,BorderColor);}}}/* check if one line if filled full and increase the totalScore! */ void_INNER_HELPERCheckBoard(){int i,j,k,score=10,sum=0,topy,lines=0;/* we find the top empty line!*/j=topy=BoardHeight-1;do{sum=0;for(i=0;i<BoardWidth;i++){sum+=Board[i][topy][0];}topy--;} while(sum>0&& topy>0);/* remove the full filled line (max remove lines count = 4) */ do{sum=0;for(i=0;i<BoardWidth;i++)sum+=Board[i][j][0];if(sum==BoardWidth)/*we find this line is full filled, remove it!*/{/* move the cells data down one line*/for(k=j;k > topy;k--){for(i=0;i<BoardWidth;i++){Board[i][k][0]=Board[i][k-1][0];Board[i][k][1]=Board[i][k-1][1];}}/*make the top line empty!*/for(i=0;i<BoardWidth;i++){Board[i][topy][0]=0;Board[i][topy][1]=0;}topy++;/* move the topline downward one line!*/lines++;/* lines <=4 */TotalScore+=score;score*=2;/* adding: 10, 30, 70, 150 */}elsej--;} while(sum>0 && j>topy&& lines<4);/* speed up the game when score is high, minimum is 400 */FrameTime=max(1200-100*(TotalScore/200),400);TopLine=topy;/* update the top line*//* if no lines remove, only add 1: */if(lines==0)TotalScore++;}/* display the score */void_INNER_HELPERDisplayScore(){setcolor(BkGndColor);outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);setcolor(ScoreColor);sprintf(info_score,"Score: %d",TotalScore);outtextxy(ScoreBoardLeft+5,ScoreBoardTop+5,info_score);}/* we call this function when a block is inactive. */ voidUpdateBoard(){FillBoardData();CheckBoard();PaintBoard();DisplayScore();}/* pause the game, and timer handler stop move down the block!*/ int PauseGame(){int key=0;DisplayInfo("Press P to Start or Resume!");while(key!=K_P && key!=K_ESC){while(!(key=GetKeyCode())){}}DisplayInfo(info_help);return key;}/* quit the gameand do cleaning work.*/void QuitGame(){closegraph();}/* the entry point function. */void main(){int i,flag=1,j,key=0,tick=0;InitGame();if(PauseGame()==K_ESC)goto GameOver;/* wait until a key pressed */while(key!=K_ESC){/* wait until a key pressed */while(!(key=GetKeyCode())){tick++;if(tick>=FrameTime){/* our block has dead! (can't move down), we get next block*/if(!MoveBlock(&curBlock,0,1)){UpdateBoard();NextBlock();if(!CanMove(0,1))goto GameOver;}tick=0;}delay(100);}switch(key){case K_LEFT:MoveBlock(&curBlock,-1,0);break;case K_RIGHT:MoveBlock(&curBlock,1,0);break;case K_DOWN:MoveBlock(&curBlock,0,1);break;case K_UP:RotateBlock(&curBlock);break;case K_SPACE:DropBlock(&curBlock);break;case K_P:PauseGame();break;}}GameOver:DisplayInfo("GAME OVER! Press any key to exit!");getch(); /* wait the user Press any key.*/QuitGame();}测试计划1.1 测试方案本游戏的测试方法采用检查各个功能能否实现的方法1.2 测试项目及功能控制区开始:实现游戏的开始暂停:实现游戏暂停继续:实现游戏继续提高级数 : 提高级数增加游戏的难度降低级数:降低级数减小游戏的难度菜单区新游戏:游戏结束从新开始新一轮的游戏提高级数:提高游戏难度降低级数:减小游戏难度退出:退出游戏开始:开始游戏暂停:暂停正在进行的游戏从新开始:重新开始游戏停止:停止正在进行的游戏帮助信息:游戏控制键显示区:显示俄罗斯方块提前显示窗口:显示下一个方块的样式测试进度:本游戏在我和同组李帅同学的辛苦努力下用了半天的时间完成了1.3 测试准备编写相应的驱动模块,并精心设计测试用例1.4 测试机构测试人员 :王新勃职责:找出程序中的错误,实现游戏的功能1.5 测试项目说明测试 1:名称:控制区功能测试目的:测试控制区各个功能的按钮。

俄罗斯方块程序课程设计

俄罗斯方块程序课程设计

俄罗斯方块程序课程设计一、课程目标知识目标:1. 学生能理解俄罗斯方块游戏的规则和基本原理。

2. 学生能掌握计算机编程语言的基本语法和结构,如变量、循环、条件语句等。

3. 学生能运用所学知识编写一个简单的俄罗斯方块程序。

技能目标:1. 学生能够运用逻辑思维和问题解决能力,分析游戏规则并进行程序设计。

2. 学生能够通过编程实践,培养代码编写和调试的能力。

3. 学生能够与他人合作,进行团队沟通和协作,共同完成程序开发。

情感态度价值观目标:1. 学生培养对计算机编程的兴趣,激发创造力和创新能力。

2. 学生通过编程实践,培养解决问题的自信心和耐心。

3. 学生在团队合作中学会互相尊重、倾听他人意见,培养良好的团队协作精神。

课程性质:本课程为信息技术学科,结合编程教育,旨在培养学生的逻辑思维、问题解决能力和团队合作意识。

学生特点:学生处于初中年级,具备一定的计算机操作基础,对游戏有浓厚兴趣,但编程经验有限。

教学要求:教师应注重引导学生从游戏兴趣出发,激发学生的学习动机,通过实际操作和实践,培养学生的编程技能和合作能力。

同时,注重个别差异,给予不同学生个性化的指导和支持。

通过本课程的学习,使学生能够将所学知识应用于实际编程任务中,达到预期的学习成果。

二、教学内容1. 俄罗斯方块游戏原理介绍:- 游戏规则- 游戏界面设计2. 编程语言基础:- 变量和数据类型- 运算符和表达式- 循环结构(for循环、while循环)- 条件语句(if-else分支)3. 编程实践:- 俄罗斯方块程序设计- 游戏窗口创建- 方块形状和移动逻辑- 碰撞检测与消除逻辑- 游戏得分与结束判定4. 团队合作与沟通:- 项目任务分配- 团队协作与交流- 代码整合与调试5. 教学内容安排与进度:- 第一周:游戏原理介绍,编程语言基础学习- 第二周:循环结构和条件语句学习,设计方块移动逻辑- 第三周:碰撞检测与消除逻辑编写,游戏得分与结束判定- 第四周:团队合作,完成整个俄罗斯方块程序本教学内容参考教材相关章节,结合课程目标进行系统组织,确保学生在掌握编程基础的同时,能够独立编写俄罗斯方块程序,并培养团队合作能力。

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

河南城建学院课程设计报告书专业:计算机科学与技术课程设计名称:《Java高级应用》题目:俄罗斯方块班级:学号:设计者:同组人员:指导老师:完成时间:2016年06月08目录一、设计目的 (1)二、需求分析 (1)2.1游戏功能的需求分析 (1)2.2方块及旋转变换需求分析 (1)2.3游戏运行需求分析 (1)2.4消行和分数统计需求分析 (1)三、模块分析及设计 (1)3.1 总体设计思想 (1)3.2功能模块 (1)四、制作过程及要点 (1)4.1 游戏一个单元块的设计与实现 (1)4.2俄罗斯方块的控制设计 (1)4.3 俄罗斯方块的设计与实现 (1)4.4要点分析 (1)五、设计总结 (1)六、参考资料 (1)一、设计目的在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐的需求。

此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。

俄罗斯方块是家喻户晓的益智小游戏,它由俄罗斯人阿列克谢帕基特诺夫(Alexey Pazhitnov)在1984年6月利用空暇时间编写的游戏程序,故此得名。

俄罗斯方块的基本规则是移动、旋转和摆放游戏随机产生的各种方块,使之排列成完整的一行或多行并且消除得分。

它看似简单却变化无穷,俄罗斯方块上手极其简单,且游戏过程变化无穷,作为游戏本身很有魅力,但是要熟练掌握其中的操作和摆放技巧,难度却不低。

此软件给用户提供了一个展现自己高超技艺的场所,在这里,它不仅放松自己,还能感受到游戏中的乐趣。

游戏区域会从顶部不断随机落下7种方块类型的一种,游戏区域右上角有一个区域可以显示下一个方块的形状,玩家可以控制俄罗斯方块移动、旋转。

通过玩家的操作,下坠物在游戏区域以“摆积木”的形式出现。

下坠物在一行或多行堆满后就可以自动消除,消行后会得到相应的分数,如果当前下坠物堆积至窗口顶端,则游戏结束。

二、需求分析2.1游戏功能的需求分析先分析一下整个游戏的具体实现,首先,游戏有开始、帮助、切换界面、结束游戏等操作接口,而在游戏过程中,随着玩家的按键,会出现下坠物的形态变化、摆放下坠物件、销毁填满的行以及分数的增加和等级速度、产生下一个方块、退出等功能。

先分析游戏的特点,游戏需要产生不同种类的俄罗斯方块,要对俄罗斯方块进行左右移动,旋转,加速下落等功能,然后对这些功能一一进行细化,写出对应的实现的代码,并美化游戏界面,从而完成整个游戏的设计。

2.1.1游戏方块控制功能当玩家按下相应的操作键位时,通过条件判断,判断该操作是否可行,如果可行就执行相应的操作。

主要的操作有游戏方块的左移,右移,旋转变形以及方块加速。

例如当按下左移按钮时,方块会进行判断是否可左移,返回值为真时可以左移,否则不能。

2.1.2方块的生成及显示功能游戏中会有两个地方产生俄罗斯方块,一个是游戏区域上方会有俄罗斯方块落下,还有就是在屏幕右上角,也会产生下一个俄罗斯方块,该俄罗斯方块为游戏区域下一个要产生的方块。

同时当游戏俄罗斯方块左右移动,下落,旋转变形时,要与先前的游戏方块重合并完成消除行功能,还要求出被操作后的方块坐标,用新坐标重绘下一个游戏方块。

2.1.3方块的摆放消行功能当方块落到底部的时候,通过条件判断,把方块摆放在屏幕底部并持续显示,当某行或者某几行被填满的时候,要把这几行消除,并且被消除的行数上方的方块整体下移。

2.1.4游戏分数统计功能记录游戏积分,每当有行被消除时,游戏积分会根据一次消除的行数而增加相应的分数,分数要设置一个最高值,当到达最高分时等级增加,难度增大。

2.1.5游戏速度更新功能当游戏积分达到某一条件时,系统将自动为玩家提高难度。

难度增加的时候,方块的下降速度会加快,增加游戏可玩性和趣味性。

2.1.6游戏等级更新功能当游戏积分达到某一条件时,系统将自动为玩家提高难度。

难度增加的时候,方块的下降速度会加快,相应的等级也会增加,增加游戏可玩性和趣味性。

2.1.7游戏结束控制功能通过判断,如果摆放的方块超过屏幕顶端的时候,则游戏结束,可以返回菜单重新开始游戏。

也可通过点击退出按钮,结束游戏,退出游戏界面。

2.2方块及旋转变换需求分析本游戏共有7种类型的方块,而每种类型方块还可以通过旋转变换成4种不同形态的方块进行摆放。

方块生成后可以将它们摆放在一个游戏显示运行的区域内,该区域可以看作是有许多个等面积小方格构成的区域,而这些区域的状态只有两种,被方块占据或空闲。

因此,对于整个游戏区域的空间是占据或空闲,可以用一位数来标识,对于7种方块和它们旋转后的形态我们可以用不同的标识进行标记。

对于旋转,游戏中所有方块都是按照顺时针旋转的规则进行的,而且在旋转过程中它们不会因为旋转而下降,总会保持在同一高度,但是在同一高度最多旋转三次,就会下降一格,任何下坠物经过一个旋转周期还会变回原型。

2.3游戏运行需求分析游戏开始后会随机产生一个方块,显示在游戏区域,同时右上角也会随机产生一个新的方块,该方块为游戏区域下一个将要产生的方块,游戏区域不再随机生成方块。

当游戏区域的方块下落到底后,新的方块再次进入游戏区域,如此循环,直到游戏结束,这就是游戏的正常工作。

当用户进行一定的操作交互的时候,运行程序可以根据用户的操作指示对方块进行控制,而这些操作都是响应相关的按键而执行的。

按游戏中定义的旋转键,此事件实现下坠方块旋转操作,方块并非任何情况都能旋转,如果旋转后与已摆放好的方块有冲突或超出边界时,均不能发生旋转。

因此首先要判断是否有足够的空间进行旋转,然后决定是否旋转。

按游戏左键,此事件实现下坠方块左移操作,首先要判断此方块是否能够发生左移,当越界或被其他摆放好的方块阻挡时,则不能左移。

按游戏右键,此事件实现下坠方块右移操作。

首先要判断此方块是否能够发生右移,当越界或被其他摆放好的方块阻挡时,则不能右移。

2.4消行和分数统计需求分析当一个方块下落到游戏区域底部进行摆放后就要进行一次消行检测,检测是否有行被填满,检测时从刚摆放的方块最上面那一行开始往下检测,由于方块的形状限制可知每次最多只能消除四行,所以只需检测四行即可。

检测到一行被填满时该行上面的方块整体下移一行,包括空洞,然后继续检测下一行,直到四行都被检测完。

消行以后要统计游戏的积分,根据每次消除的行数t的不同而累加不同的积分,游戏积分通过公式score+=t*t*100来计算,消除一行得100分,消除两行得400分,消除三行得900分,消除四行得1600分。

设置最高分数,当分数达到最高分数后,游戏等级增加,游戏速度数值会增加以及加快速度,游戏速度有一个最大值,当到达这个值时,游戏速度将不再加快。

分数统计和消除行是连贯动作,在消除行后要对分数进行增加,同时页面更新,页面上的分数,等级,速度都会更新,游戏区域的方块也更新,有一行被消除,游戏继续。

当方块落到底部的时候,通过条件判断,把方块摆放在屏幕底部并持续显示,当某行或者某几行被填满的时候,要把这几行消除,并且被消除的行数上方的方块整体下移。

三、模块分析及设计3.1 总体设计思想俄罗斯方块游戏设计主要从9个方面进行构思。

(1)游戏主界面的设计。

(2)方块的设计。

(3)方块的旋转。

(4)方块的运动情况(包括向左、向右)(5)方块的自动消行功能。

(6)游戏速度的调节。

(7)游戏积分的计算。

(8)游戏开始菜单的设计。

(9)游戏结束界面的设计。

3.2功能模块3.2.1开始和退出游戏模块首先开始和退出游戏按钮出现在进入游戏界面和游戏界面,需要在xml下加入Button按钮,当点击按钮时跳转到目标界面或者开始游戏。

例如点击进入游戏的开始按钮,会进入游戏界面,游戏界面也可点击开始按钮才能开始游戏,游戏开始后可以点击退出按钮,终止当前游戏,返回到进入游戏界面,或者当方块满时,游戏自动结束,退出游戏界面。

图3.1 图3.23.2.2游戏控制模块俄罗斯方块包括对游戏中的方块进行的操作,如左(右)移动,旋转,下落加速等功能。

图3.3 图3.43.2.3游戏帮助功能在游戏的开始界面上,当玩家对该游戏不熟悉时可点击帮助按钮。

图3.5图3.6四、制作过程及要点4.1 游戏一个单元块的设计与实现每一个俄罗斯方块包括四个四个单元块,设置一个单元块的大小,对单元块的位置用坐标表示,根据绘制好的网格定义单元格坐标,判断单元格的一些功能的实现,例如旋转,左右移动,是否与其他单元块接触。

通过检测单元块是否超界来判断,并把结果返回。

4.2俄罗斯方块的控制设计方块是游戏最基本的元素,俄罗斯方块所有的操作都是建立在对方块的操作上。

对方块的控制,实际就是对每一个小方块的控制,一个俄罗斯方块单元是由4个小方块构成,通过计算每一个小方块的横纵坐标来表现出一个下落或者一个已经摆放好的俄罗斯方块单元。

由此来布置游戏区域方块的显示,方块的控制主要在TetrisBlock类里实现,用来判断方块的各种操作是否可行,如果可行则执行相应的操作,否则操作无效。

控制方块时,首先要判断该操作是否可以执行,判断方法主要有判断方块是否可以左右移动,判断方块是否碰壁,判断方块是否触顶。

判断方块是否可以左移。

包括方块的翻转以及当某一行的方块满后的消除功能。

首先对俄罗斯方块的定义进行初始化,如种类,方向,颜色,以及存放用的数组。

俄罗斯方块需进行判断,需要对每个单元块进行判断,例如是否能旋转,需要每一个单元块都能旋转,整个方块才能旋转,接着是判断是否接触边界,如果已接触边界,则不能左(右)移动,否则可左(右)移动,方块下落过程中可加速,需判断是否接触底端或与其他方块接触,接触则不能加速,反之可加速。

4.3 俄罗斯方块的设计与实现通过构造函数,定义随机产生方块种类以及对应填充色,可随机产生一个俄罗斯方块。

对俄罗斯方块的位置用坐标表示,判断当一行满之后,消除这一行并相应的分数增加。

4.4要点分析完成这个项目主要有几个问题要处理:①边界问题,即如何判断俄罗斯方块是否已经到达边界,主要是在左右移动和下降过程中,判断俄罗斯方块是否已经抵达边界,使其不超越边界。

②接触问题,即如何判断俄罗斯方块已经与其他俄罗斯方块接触,此时应该停止方块的下落,或者避免方块间重合。

③旋转问题,俄罗斯方块要旋转很简单,只要用转换公式即可,但问题是如何判断旋转后的位置是否不合法,即有没有可能触及边界,或者与其他俄罗斯方块重合。

④消去问题,当网格中有一行填满了方块,需要消去此行,并将在其上的所有方块均向下移动一行,更新分数等相关信息。

第①和第②个问题类似,每个俄罗斯方块(TetrisBlock)对象包含四个更小的块单元(BlockUnit), 在处理这两个问题的时候只要在块单元类当中添加判断块单元对象是否接触边界或者其他俄罗斯方块的块单元的方法,然后俄罗斯方块类的判断接触边界或其他俄罗斯方块的方法,只需依次调用该俄罗斯方块对象的所有块单元对象的判断方法,若其中一个块单元接触边界,则该俄罗斯方块接触边界。

相关文档
最新文档