俄罗斯方块mfc实验报告

合集下载

俄罗斯方块实验报告

俄罗斯方块实验报告

俄罗斯方块实验报告编写“俄罗斯方块”游戏1、问题分析。

编写俄罗斯方块游戏,首先是界面问题,要有一个相对美观的游戏界面,可以有很多种解决的方法,可以用DOS的界面,也可以用MFC做。

界面做好后,最重要的就是七个方块如何存放,翻转,显示等等一系列问题,首先,我们要把这七个方块用一种数据结构存储起来;其次,在游戏中将这七个方块随机挑选出来并显示在屏幕上,根据键盘事件进行旋转;最后,判断到达底部的方块是简单叠加还是引发消除事件。

普通俄罗斯方块游戏中,只有七个基本方块:|,Z,N,L,7,|-,O,方块都可以画在一个4*4的方格中。

于是就有两个方法:一个是只存储七个方块,在游戏运行的时候计算旋转后的方块形状;另一个是将所有的方块全部存储起来,在游戏运行的时候计算取其中的哪个方块。

另外,考虑到4*4是16,而一个int正好是16位(TC2是16位,其他的是32位),所以可以把一个方块存储在一个int数据中,取出的时候,判断它的每个bit位,为1处有小方块,为0处是空白。

所以可以分别用二维数组和bit的方法来表示这些方块。

对于二维数组而言,其控制旋转的操作会很简单,就是控制数组的行列以决定到底该取出哪一种方块,所以程序中我会采用这种方法。

如何控制方块的下落速度,如何让实现左移,右移,下落,如何销行,如何计分,又如何加速等等都是需要考虑的问题。

对于控制方块的下落速度,首先应该现弄明白方块是怎样下落的,目前最常用的就是每隔一定得时间进行重新绘图,就像动画片一样,当很多副相关的画面不断在人眼前播放,由于人眼的掩蔽效应就会形成动着的画面,看起来就是物体在那里移动,于此原理相同,当改变方块在画面上的位置,再以一定得时间间隔进行重新刷图,其效果看起来就是方块在移动;也就是说控制方块下落速度的其实就是控制重新绘图的时间间隔,控制时间的函数有以下几种:a)调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200毫秒的时间间隔。

俄罗斯方块实验报告

俄罗斯方块实验报告

邮电大学通达学院算法与数据结构设计报告(2016/ 2017学年第二学期)专业软件工程嵌入式学号姓名学号姓名学号姓名指导教师指导单位计算机学院计算机科学与技术系日期2017-5-26目录课题容---------------------------------------1算法设计与分析---------------------------------1 算法实现---------------------------------------9测试数据及结果分析----------------------------38 调试过程中的问题------------------------------40 总结------------------------------------------41俄罗斯方块一、课题容实现俄罗斯方块游戏。

主要功能为游戏界面显示、上下左右键响应以及当前得分统计。

通过该课题全面熟悉数组、字符串等的使用。

掌握设计的基本方法及友好界面的设计。

课题要求:1、游戏界面显示:下落方块和方块堆、左右移动、旋转、删除行等特效以及得分。

2、动作选择:上下左右键对应于旋转、加速、左右移动的功能。

3、得分统计判断:判定能否消除行、并统计得分总数等。

扩展要求:1、用户数据管理。

2、游戏玩法:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。

这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。

没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。

基本规则1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位。

2、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。

俄罗斯方块实验报告

俄罗斯方块实验报告

程序设计实践报告(2012/2013学年第2学期)题目:俄罗斯方块游戏设计专业学生姓名班级学号指导教师指导单位软件工程系日期 2013.03.27俄罗斯方块游戏设计一、课题内容和要求本程序的主要任务就是编写简单的俄罗斯方块游戏,要求设计比较美观和健全的游戏界面,可以实现方块预览、方块的控制、显示更新、分数更新以及帮助等基本功能,减少程序本身的错误,增强游戏的可操作性。

程序的设计将结合一些有关C语言图形界面设计的内容,该部分是之前没有接触过的,要求利用这次机会,比较简约地了解相关内容及其简单应用。

本程序的实现是选用Windows XP/7操作系统以及Microsoft Visual Studio 2008 C++为编译器,用C语言完成程序设计的实践。

使用Win32控制台应用程序,最终在DOS界面下形成程序的主界面。

二、概要设计struct //此结构体数表是打印各个方块的依据{ //是该程序设计的灵魂int vary_x[4];int vary_y[4];} vary[]={{{0, 2, 4, 6},{0, 0, 0, 0}},{{0, 0, 0, 0},{0,-1,-2,-3}},{{0, 2, 2, 0},{0, 0,-1,-1}},{{0,-2,-2,-4},{0 ,0,-1,-1}},{{0, 0, 2, 2},{0,-1,-1,-2}},{{0, 2, 2, 4},{0, 0,-1,-1}},{{0, 0,-2,-2},{0,-1,-1,-2}},{{0, 0, 2, 4},{0,-1, 0, 0}},{{0, 0, 0, 2},{0,-1,-2,-2}},{{0, 0,-2,-4},{0,-1,-1,-1}},{{0, 2, 2, 2},{0, 0,-1,-2}},{{0, 2, 4, 4},{0, 0, 0,-1}},{{0,-2,-2,-2},{0, 0,-1,-2}},{{0, 0, 2, 4},{0,-1,-1,-1}},{{0, 0, 0,-2},{0,-1,-2,-2}},{{0 ,2, 4, 2},{0, 0, 0,-1}},{{0, 0, 2, 0},{0,-1,-1,-2}},{{0,-2, 0, 2},{0,-1,-1,-1}},{{0, 0,-2, 0},{0,-1,-1,-2}},};本程序中关于方块的颜色、运动的速度都采用的数组常量的形式,数组的编号分别对应方块形状的编号,这样就使得“方块形状——方块颜色——运动速度”一一对应起来,更直观和方便地实现动态管理。

C++俄罗斯方块实验报告(附实验体会)

C++俄罗斯方块实验报告(附实验体会)

程序设计综合实验设计文档惠州学院HUIZHOUUNIVERSITY课程名称:程序设计综合实验姓名:实验名称:俄罗斯方块学号:任课教师:专业:计算机科学与技术班级:计算机科学与技术1班实验时间:第一周至第十二周实验成绩:批阅教师签字:综合实验项目:俄罗斯方块游戏1、问题需求(1)游戏等级:游戏分为1-10十个等级,等级越高,方块下落速度越快;(2)由方向键控制游戏:上键控制方块变形、下键控制方块下移并判断是否有消行、左键控制方块左移、右键控制方块右移;(3)游戏积分:一次性消的行数越多加的分数越多,当消行每超过30行自动提高一个游戏等级。

2、总体设计:(1)用数组存放方块(2)输出地图(3)在地图里面输出方块(4)开始游戏(5)方块的旋转(6)方块是否能下落(7)判断方块是否能下落(8)提示下一个即将下落的方块(9)控制方块的下落速度(10)分成10等级,等级越高方块下落得更快(11)消行处理(12)游戏结束3、详细设计设计说明:本程序运行代码如下:#include <conio.h>#include <stdlib.h>#include <windows.h>#include "colorConsole.h"#define SQUARE_COLOR FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY //方块的颜色#define up 72#define down 80#define left 75#define right 77#define esc 27#define MAPW 12 //地图的宽度#define MAPH 20 //地图的高度BOOL isavailable(int a[],int x,int y,int w,int h); //判定是否能放下void turn(int a[][4],int w,int h,int *x,int y); //转动int * create(); //创建方块void init(); //初始化工作void drawblocks(int a[],int w,int h,int x,int y,WORD wColors[],int nColors); void clearcache(); //清除键盘缓冲区void end();void clearsquare(int *a,int w,int h,int x,int y);void gameover();void deletemap(int m[][MAPW],int row,int w,int h); //消除一行int dx=30,dy=5; //屏幕上的偏移量int score=0,level=0;int map[MAPH][MAPW];int a1[4][4]={{1},{1,1,1}};int a2[4][4]={{0,1},{1,1,1}};int a3[4][4]={{1,1},{0,1,1}};int a4[4][4]={{0,0,1},{1,1,1}};int a5[4][4]={{0,1,1},{1,1}};int a6[4][4]={{1,1,1,1}};int a7[4][4]={{1,1},{1,1}};int a[4][4];int main(){init();int *b=NULL;b=create(); //预创建方块int q=0;int sign,blank,x,y;while(1){for(int i=0;i<4;i++) //复制方块for(int j=0;j<4;j++)if(a[i][j]=*(b+i*4+j)) blank=i;y=1-blank;x=4;clearsquare(&a[0][0],4,4,13,13);b=create();HANDLE handle;handle=initiate();WORD wColors[1]={FOREGROUND_RED| FOREGROUND_GREEN|FOREGROUND_INTENSITY };drawblocks(b,4,4,13,13,wColors,1);wColors[0]=SQUARE_COLOR;drawblocks(&a[0][0],4,4,x,y,wColors,1);clearcache();char string[5];wColors[0]=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;textout(handle,26+dx,5+dy,wColors,1,itoa(score,string,10));textout(handle,26+dx,9+dy,wColors,1,itoa(level,string,10));sign=1;while(sign){int delay=0,max_delay=100-10*level; //延迟量while(delay<max_delay){if(_kbhit()) //用if避免按住键使方块卡住{int draw=0;int key=_getch();switch (key){case up:clearsquare(&a[0][0],4,4,x,y);turn(a,4,4,&x,y);draw=1;break;case down:delay=max_delay;break;case left:if(isavailable(&a[0][0],x-1,y,4,4)){clearsquare(&a[0][0],4,4,x,y);x--;draw=1;}break;case right:if(isavailable(&a[0][0],x+1,y,4,4)){clearsquare(&a[0][0],4,4,x,y);x++;draw=1;}break;case esc:end();break;}if(draw){HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};drawblocks(&a[0][0],4,4,x,y,wColors,1);draw=0;}}_sleep(8);delay++;}if(isavailable(&a[0][0],x,y+1,4,4)) //判断是否能下移{clearsquare(&a[0][0],4,4,x,y);y++;HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};drawblocks(&a[0][0],4,4,x,y,wColors,1);}else{sign=0; //标记,使跳出while(sign) 循环,产生新方块if(y<=1) gameover(); //是否结束for(int i=0;i<4;i++) //放下方块for(int j=0;j<4;j++)if(a[i][j]&&((i+y)<MAPH-1)&&((j+x)<MAPW-1))map[i+y][j+x]=a[i][j];int full,k=0;for(i=y;i<min(y+4,MAPH-1);i++){full=1;for(int j=1;j<11;j++)if(!map[i][j]) full=0;if(full) //消掉一行{deletemap(map,i,MAPW,MAPH);k++;q++;score=score+k;level=min(q/30,9);}}}}}return EXIT_SUCCESS;}BOOL isavailable(int a[],int x,int y,int w,int h){for(int i=max(y,1);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;}int * create(){int * a=NULL;int c=rand()%7;switch(c){case 0:a=&a1[0][0];break;case 1:a=&a2[0][0];break;case 2:a=&a3[0][0];break;case 3:a=&a4[0][0];break;case 4:a=&a5[0][0];break;case 5:a=&a6[0][0];break;case 6:a=&a7[0][0];break;}return a;}void init() //初始化工作{for(int i=0;i<20;i++){map[i][0]=-2;map[i][11]=-2;}for(i=0;i<12;i++){map[0][i]=-1;map[19][i]=-1;}map[0][0]=-3;map[0][11]=-3;map[19][0]=-3;map[19][11]=-3;HANDLE handle;handle=initiate();WORD wColors[1]={ FOREGROUND_GREEN|FOREGROUND_INTENSITY};textout(handle,26+dx,3+dy,wColors,1,"分数");textout(handle,26+dx,7+dy,wColors,1,"等级");textout(handle,26+dx,11+dy,wColors,1,"下一个方块提示");wColors[1]=FOREGROUND_RED|FOREGROUND_INTENSITY;drawblocks(&map[0][0],12,20,0,0,wColors,1);textout(handle,dx,dy,wColors,1,"◇══════════◇");wColors[0]= FOREGROUND_GREEN|FOREGROUND_INTENSITY;textout(handle,dx-16,dy,wColors,1,"按任意键开始");wColors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY ;textout(handle,dx-15,dy+3,wColors,1,"制作者");wColors[0]=FOREGROUND_BLUE| FOREGROUND_GREEN|FOREGROUND_INTENSITY ;textout(handle,dx-15,dy+5,wColors,1,"赵强");int x=_getch();srand(x);textout(handle,dx-16,dy,wColors,1," ");}void drawblocks(int a[],int w,int h,int x,int y,WORD wColors[],int nColors){HANDLE handle;handle = initiate();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,"■");}}void clearcache(){while(_kbhit()){_getch();}}void end(){exit(EXIT_SUCCESS);}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(i=0;i<4;i++)if(isavailable(&b[0][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;}}void clearsquare(int *a,int w,int h,int x,int y){HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};for(int i=0;i<h;i++)for(int j=0;j<w;j++)if(a[i*w+j]&&i+y>0)textout(handle,2*(x+j)+dx,y+i+dy,wColors,1," "); }void gameover(){HANDLE handle;handle=initiate();WORD wColors[1]={FOREGROUND_RED| FOREGROUND_GREEN};textout(handle,7+dx,10+dy,wColors,1,"游戏结束");clearcache();_getch();exit(EXIT_SUCCESS);}void deletemap(int m[][MAPW],int row,int w,int h){HANDLE handle;handle=initiate();WORD wColors[1]={SQUARE_COLOR};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];drawblocks(&m[i][1],MAPW-2,1,1,i,wColors,1);}for(i=1;i<MAPW-1;i++)m[1][i]=0;}HANDLE initiate(){HANDLE hOutput;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);return hOutput;}BOOL textout(HANDLE hOutput,int x,int y,WORD wColors[],int nColors,LPTSTR lpszString){DWORD cWritten;BOOL fSuccess;COORD coord;coord.X = x; // start at first cellcoord.Y = y; // of first rowfSuccess = WriteConsoleOutputCharacter(hOutput, // screen buffer handlelpszString, // pointer to source stringlstrlen(lpszString), // length of stringcoord, // first cell to write to&cWritten); // actual number writtenif (! fSuccess)cout<<"error:WriteConsoleOutputCharacter"<<endl;for (;fSuccess && coord.X < lstrlen(lpszString)+x; coord.X += nColors){fSuccess = WriteConsoleOutputAttribute(hOutput, // 屏幕缓存处理wColors, // pointer to source stringnColors, // length of stringcoord, // first cell to write to&cWritten); // actual number written }if (! fSuccess)cout<<"error:WriteConsoleOutputAttribute"<<endl;return 0;}4、程序运行结果截图:按任意键游戏开始方块左移方块右移下一个方块开始下落方块变形消一行,增加1分成功消多行消多行后分数增加更多消完30行后,提升一个等级方块叠到顶端后游戏结束5、程序使用说明:(1)按任意键开始游戏(2)控制方块下落位置进行消行处理(3)成功消行后加分,当消30行之后等级升一级,最高达到10等级(4)当产生的新方块不能再下落时,游戏结束。

计算机实习报告——俄罗斯方块

计算机实习报告——俄罗斯方块

小游戏——俄罗斯方块实验报告一.功能说明1.1总体功能说明设计完成俄罗斯方块游戏。

按任意键可开始游戏,游戏开始后随机产生一个方块并自动下落,下落过程中可以对方块进行左右移动、旋转、加速下落、暂停的操作。

叠满一行后方块自动消失,并记录1分,每30分升一级,速度加快,共九级。

当叠到小窗口顶部时游戏结束,可选择退出或开始新的游戏。

1.2用户界面开始界面:按任意键可开始游戏游戏界面:控制方块左右移动、旋转、加速下落暂停、退出游戏结束界面:显示最终得分、等级,选择开始新游戏还是退出1.3使用方法游戏控制:移动:←→旋转:↑下降:↓暂停:Space退出:Esc难度划分:每得30分为1个等级,共9个等级二.程序设计说明2.1 总体设计框架2.2 关键算法描述算法1:判断方块移动方向是否可以移动。

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;}判断:当移动方向上地图的值和方块的值都不为0时,返回值为0,不能移动。

反之返回值为1,可以移动。

算法2:方块的旋转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(i=0;i<4;i++)if(isavailable(&b[0][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;}}定义b[i][j],将a旋转赋值给b,判断b与所在位置是否可以放下,若可以,再将b值赋值给a。

C++MFC课程设计-俄罗斯方块

C++MFC课程设计-俄罗斯方块
OnDraw(&cDC);
OnStart();
}
//如果还有下降的空间
if (fy == 0) {//如果是刚刚新产生的图形
int lastfy = fy;
Point pt;
while (!Wall::Stop(wall, tile.curTile, fx, ++lastfy)) {} //一直到发生停止命令以后
//判定是否过关
if (Wall::Skip(wall, Speed)) {
KillTimer(Timer);
Speed = 400 / ((400 / Speed) + 1);
play = 0; //逻辑上结束了游戏
MessageBox("恭喜,过关了");
CClientDC cDC(this);
--lastfy;
pt = Point(LU.x+30*fx, LU.y+30*lastfy);
Graph::ShowShadow(&cDC, tile.curTile, pt);
}
Point pt; //清洗掉上次的图形
pt = Point(LU.x+30*fx, LU.y+30*lastfy);
COLORREF Statu_Col[10][19]; //如果被覆盖用来保留颜色,默认为0
};
主导作用的OnTimer函数:
void CMyTaskView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static void Completed(CDC *pDC, Wall &wall);

俄罗斯方块 实验报告

俄罗斯方块 实验报告

俄罗斯方块实验报告俄罗斯方块实验报告引言:俄罗斯方块是一款经典的益智游戏,广受全球玩家的喜爱。

本次实验旨在通过对俄罗斯方块游戏的研究和分析,探讨其对玩家注意力、反应速度和空间思维能力的影响。

实验设计:我们邀请了30名志愿者参加本次实验,他们年龄在18至30岁之间,没有玩过俄罗斯方块的经验。

实验分为两个阶段:训练和测试。

在训练阶段,志愿者接受了一周的俄罗斯方块游戏训练,每天30分钟。

在测试阶段,我们记录了志愿者在玩俄罗斯方块游戏时的注意力、反应速度和空间思维能力。

注意力的影响:通过实验数据的分析,我们发现参与者在训练后的注意力得到了显著提高。

在游戏过程中,他们能够更加集中精力,并快速识别和应对不断出现的方块。

这表明俄罗斯方块对于增强注意力有积极的影响。

反应速度的影响:在测试阶段,我们通过记录参与者的游戏得分和完成时间来评估他们的反应速度。

结果显示,参与者的反应速度在训练后有所提高。

他们能够更快地做出决策和操作,有效地应对不断变化的游戏局面。

这证明俄罗斯方块对于提升反应速度具有一定的作用。

空间思维能力的影响:俄罗斯方块游戏需要玩家在有限的空间中放置方块,因此对空间思维能力提出了较高的要求。

在实验中,我们通过分析参与者的游戏策略和得分情况来评估他们的空间思维能力。

结果显示,参与者在训练后的空间思维能力有所提升。

他们能够更好地规划和利用空间,有效地放置方块,从而获得更高的得分。

这表明俄罗斯方块对于培养空间思维能力具有积极的影响。

结论:通过本次实验,我们得出了以下结论:俄罗斯方块对玩家的注意力、反应速度和空间思维能力都有积极的影响。

训练后的参与者在注意力集中、反应速度和空间思维方面都有所提高。

因此,俄罗斯方块可以作为一种有效的益智游戏,用于提升个体的认知能力。

进一步研究:尽管本次实验结果对于我们理解俄罗斯方块的影响有了一定的启示,但仍有一些问题需要进一步研究。

例如,我们可以拓展样本数量和年龄范围,以获得更全面的数据。

俄罗斯方块实训总结报告

俄罗斯方块实训总结报告

一、引言随着计算机技术的发展,编程已经成为计算机专业学生必须掌握的基本技能之一。

为了提高我们的编程能力和实践能力,学校组织了一次俄罗斯方块实训活动。

本次实训旨在通过设计和实现一个简单的俄罗斯方块游戏,让我们深入了解游戏编程的基本原理和技巧,培养我们的团队合作精神。

以下是对本次俄罗斯方块实训的总结报告。

二、实训目的1. 掌握游戏编程的基本原理和技巧。

2. 熟悉并运用各种编程语言进行游戏开发。

3. 培养团队合作精神和沟通能力。

4. 提高问题解决能力和创新能力。

三、实训内容1. 游戏设计:确定游戏规则、界面布局、角色设定等。

2. 编程实现:选择合适的编程语言,编写游戏代码。

3. 测试与优化:对游戏进行测试,找出并修复存在的问题,提高游戏性能。

四、实训过程1. 游戏设计阶段在游戏设计阶段,我们小组首先讨论并确定了游戏的基本规则:玩家通过操作控制俄罗斯方块,将不同形状的方块放置在游戏区域,当一行或几行方块被填满时,这些方块会消失,玩家获得分数。

游戏分为多个等级,随着等级的提高,游戏难度逐渐增加。

2. 编程实现阶段在编程实现阶段,我们小组分工合作,分别负责不同模块的开发。

以下是各模块的开发情况:(1)主界面:使用HTML和CSS设计游戏主界面,包括游戏区域、分数显示、游戏难度选择等。

(2)俄罗斯方块生成与移动:使用JavaScript编写代码,实现俄罗斯方块的生成、移动和旋转等功能。

(3)游戏逻辑:编写游戏逻辑代码,包括方块下落、消除、计分等。

(4)游戏音效:使用HTML5的audio标签,为游戏添加背景音乐和音效。

3. 测试与优化阶段在测试与优化阶段,我们对游戏进行了多次测试,发现并修复了一些问题。

主要优化内容包括:(1)提高游戏运行速度,减少卡顿现象。

(2)优化游戏音效,使音效更加真实。

(3)调整游戏难度,使游戏更具挑战性。

五、实训成果通过本次俄罗斯方块实训,我们小组成功实现了一个具有基本功能的俄罗斯方块游戏。

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

程序设计实践设计报告课题名称:俄罗斯方块(MFC版)学生姓名:黄嘉慧班级:2012211113班内序号:27学号:2012210389日期:2014.6.11. 实验概述1.1 课题目标和主要内容。

本课题的主要内容是用MFC 实现经典游戏俄罗斯方块的编写。

目标是能够正常运行,并且无过于严重的问题。

使用的平台为MFC (基于对话框)。

1.2采用计分升级制来进行游戏。

当一次消去一行时,得一分,一次两行得4分,一次3行,得9分,一次4行,得16分。

每50分为一个等级,得分足够则升级并重新开始游戏。

2.程序设计2.1 系统总体框架用一个4维数组DiamondStruct[7][4][4][4]来表示所有的方块,用一个POINT 类型的DiamondPos 来表示方块当前的位置,然后通过一个二维数组BlockPanel[][],来表示整个游戏界面,同时进行障碍的添加。

游戏过程中,通过改变DiamondPos 来进行方块的下降以及左右移动,通过DiamondStruct[7][4][4][4]中第二个参数的改变来进行方块的变换。

2.2系统详细设计【1】模块划分图及描述【2】类关系图及描述CWinApp 与CDialog 为基类。

其它为添加的类。

【3】程序流程图及描述【4】存储结构,内存分配主要存储结构为数组。

同时分配内存的有,画笔,Diamond类的指针,Panel类的指针,Block类的指针,Mill类的指针,Manager类的指针。

2.3 关键算法分析【1】bool Diamond::FullLine(){bool IsFull,Full=false;pManager->SeriesLine=0;for(int iy=0;iy<=pPanel->nVGridNum;iy++){IsFull=true;for(int ix=0;ix<=pPanel->nHGridNum;ix++){if(!pBlock->BlockPanel[ix][iy]) IsFull=false;}if(IsFull){Full=true;pManager->SeriesLine++;for(int jy=iy;jy>0;jy--){ Sleep(10);for(int jx=0;jx<=pPanel->nHGridNum;jx++){pBlock->BlockPanel[jx][jy]=pBlock->BlockPanel[jx][jy-1];}}}}pManager->LineNumber+=pManager->SeriesLine;pManager->Result+=pManager->SeriesLine*pManager->SeriesLine;if(Full)return true;else return false;}该算法实现的功能为,判断是否已经满行,并且若是满行,进行消行,加分的操作。

该算法的时间复杂度为O(n)=【(nVGridNum)^2*nHGridNum.】/2【2】bool Diamond::overlap(){bool bTuFa=false;POINT TexPos;for(int iy=3;iy>=0;iy--){for(int ix=0;ix<4;ix++){if(DiamondStruct[DiamondType][DiamondState][ix][iy]){TexPos.x=ix+DiamondPos.x;TexPos.y=iy+DiamondPos.y;pPanel->PanelPosToPos(TexPos);TexPos.y+=pPanel->GridSize.cy;if(TexPos.x<pPanel->PanelRect.left ||TexPos.x>pPanel->PanelRect.right||TexPos.y>pPanel->PanelRect.bottom)bTuFa=true;if(pBlock->BlockPanel[DiamondPos.x+ix][DiamondPos.y+iy]) bTuFa=true;}}}if(bTuFa) return true;return 0;}该算法的功能为实现判断方块是否与边界或者已有障碍重叠,若是重叠,则返回值0,若没有重叠,返回值1。

算法的时间复杂度为O(1)【3】void Block::AddBlock(){for(int iy=0;iy<4;iy++)for(int ix=0;ix<4;ix++){if(pDiamond->DiamondStruct[pDiamond->DiamondType][pDiamond->DiamondState][ix][iy])BlockPanel[pDiamond->DiamondPos.x+ix][pDiamond->DiamondPos.y+iy]=true;}}该算法的功能为添加障碍,即当方块已经下降到不能下降的时候,将方块转化为障碍。

该算法的时间复杂度为O(1)。

【4】void Mill::MadeDiamond(){pDiamond->DiamondType=PreDiamondType;pDiamond->DiamondState=PreDiamondState;pDiamond->DiamondPos.x=5;pDiamond->DiamondPos.y=0;int nmax=rand()%25;if((nmax>=0)&(nmax<=3)){PreDiamondType=DIAMONDCAKE;}else if((nmax>=4)&(nmax<=7)){PreDiamondType=DIAMONDHOOK;}else if((nmax>=8)&(nmax<=11)){PreDiamondType=DIAMONDSEVEN;}else if((nmax>=12)&(nmax<=15)){PreDiamondType=DIAMONDHEAVE;}else if(nmax==16){PreDiamondType=DIAMONDBAR;}else if((nmax>=17)&(nmax<=20)){PreDiamondType=DIAMONDTWO;}else if((nmax>=21)&(nmax<=24)){PreDiamondType=DIAMONDSPADE;}}该算法的功能为生成新的方块,同时根据值的取值范围不同,确定每一种方块出现的概率。

该算法的时间复杂度为O(1)。

【5】void Manager::InitGame(int level){srand( (unsigned)time( NULL ) ) ;GetClientRect(theApp.m_pMainWnd->m_hWnd,&ClientRect);Result=0;LineNumber=0;Level=level;pPanel=new Panel;pPanel->PanelRect.top =int(ClientRect.bottom*0.1f);pPanel->PanelRect.bottom=int(ClientRect.bottom*0.9f);pPanel->PanelRect.left =int(ClientRect.right *0.1f);pPanel->PanelRect.right =int(ClientRect.right *0.6f);pPanel->nHGridNum =14;pPanel->nVGridNum =25;pPanel->GridSize.cx=(pPanel->PanelRect.right-pPanel->PanelRect.left)/pPanel->nHGridNum;pPanel->GridSize.cy=(pPanel->PanelRect.bottom-pPanel->PanelRect.top)/pPanel->nVGridNum;pPanel->PanelColor =RGB(200,200,200);pPanel->TextRect.SetRect(int(ClientRect.right*0.7f),int(ClientRect.bottom*0.5f),int(ClientRect.right *0.95f),int(ClientRect.bottom *0.9f));pMill=new Mill;pMill->MillRect.top =int(ClientRect.bottom*0.1f);pMill->MillRect.bottom =int(ClientRect.bottom*0.2f);pMill->MillRect.left =int(ClientRect.right *0.7f);pMill->MillRect.right =int(ClientRect.right *0.8f);pMill->GridSize.cx =(pMill->MillRect.right-pMill->MillRect.left)/4;pMill->GridSize.cy =(pMill->MillRect.bottom-pMill->MillRect.top)/4;pMill->MillColor =RGB(200,200,250);pMill->PreColor =RGB(255,0,0);pDiamond=new Diamond;pDiamond->DiamondColor=RGB(100,100,255);pMill->MadeDiamond();pBlock=new Block;pBlock->BlockColor=RGB(255,255,100);Timer1=50;Timer2=350-Level*40;FallTimer=30;SetTimer(theApp.m_pMainWnd->m_hWnd,1,Timer1,NULL);SetTimer(theApp.m_pMainWnd->m_hWnd,2,Timer2,NULL);}该算法的功能为初始化游戏的数据,数据有页面的分配数据,各个部分的颜色数据以及定时器的数据。

相关文档
最新文档