资源描述
计算机实习报告 姓名:刘天班级: 2010211114学号: 10210417小班序号:14指导老师:丘广晖题目:俄罗斯方块 俄罗斯方块实验报告一功能说明1.1总体功能说明 本程序主要是用VC6.0编程软件通过Windows控制台,实现俄罗斯方块这一游戏。本程序实现了俄罗斯方块的随机产生及移动等,玩家在进入游戏界面后,可以通过键盘操作这个游戏。在游戏界面右边,写有玩家分数和一定的操作说明,同时内部也有暂停和退出的设置,在玩家疲惫时,可随时停止游戏。1.2用户界面(1)欢迎界面(2)游戏界面(3)结束界面1.3使用方法 玩家可通过键盘的W、S、A、D键分别控制方块的上下左右,暂停键是E,之后可按任意键继续游戏,退出键则是Q。边框右侧有下一个方块的预告。二程序设计说明2.1 总体设计框架C+程序执行流程(总流程图):开 始 定义一些变量,并将部分变量初始化定义界面函数,旋转函数,移动函数等进入欢迎界面NO按下任意键进入游戏?YES 进入游戏界面停留在游戏界面按下暂停按钮?YESNO 按下退出按钮?结束画面YES2.2 关键算法描述bool table1523=0; 绘制操作面板;bool menu(); 设定游戏的初始界面(欢迎界面);void spin(); 决定方块的旋转;TurnLeft()、TurnRight()、TurnDown()则是俄罗斯方块移动方向的判定; typenext=rand()%7; 随机数的产生,决定了方块的形状; while(1); 循环的开始;if(kbhit(); 上下左右控制的判定;2.3 程序设计的难点和关键点一、怎样设置方块的状态,变化等;二、怎样使将要产生的方块与预示方块相同;三、方块下落时如何判定下方已存在方块,从而使这个方块不在下落;四、消行的实现。2.4 调试的方法调试中多采用断点调试单步执行的方法来查看和改正错误。2.5 程序性能评价优点:1、 游戏运行流畅,整体较为稳定,不会因为玩家的误操作而出现停滞;2、 游戏说明简单明确,上手容易;3、 采用模块化编程,多个文件组成整个工程;4、 编码中的变量、函数等名称合理而清楚,一目了然;不足:1、 某些细节上还不够精致,可能还存在bug;2、 视觉效果一般。3、 程序代码的格式还不够工整,有待提高。4、 没有多种界面风格,没有等级系统,不够人性化。三心得体会从一开始的手无足措到一步步的攻克困难,从一开始的茫然停滞到如今的清晰明朗,小学期在时间不知不觉的流逝中,就这样结束了。俄罗斯方块从可以随机出现,到可以自动下落,从左右移动,到可以自动旋转,消行,加分 看着一个个下落的方块,兴奋的心情真的难以用语言描述。回忆着小学期的一幕幕,我慢慢的对编程产生了强烈的兴趣,同时,也有了把它做好的信心和决心。我相信,我可以越做越好。附代码:#includecolorConsole.h#include #include #include#includeHANDLE handle;WORD wColors2;int x1=1,x2=1,x3=1,x4=1;/int y1=1,y2=1,y3=1,y4=1;/方块坐标int type,typenext,typetemp=0;/目前方块和下一个方块的产生int score=0,speed=10,times=0,level=0;/得分和速度等int key;/按键char scorech10=0;bool flag=1;/生成新方块判定bool start=1;bool table1523=0; /绘制操作面板bool menu() /游戏的初始界面 (欢迎界面)for(int o=1;o0;i-)for(int j=1;j14;j+)tableij=0;wColors0=FOREGROUND_BLUE|FOREGROUND_GREEN;textout(handle,6,5,wColors,1,欢迎进入);textout(handle,10,6,wColors,1,俄罗斯方块);textout(handle,6,10,wColors,1,请按任意键进入游戏);while(start)if(kbhit()start=0; textout(handle,6,5,wColors,1, );textout(handle,10,6,wColors,1, );textout(handle,6,10,wColors,1, ); return 0;void erase()/清除textout(handle,x1*2,y1,wColors,1, );textout(handle,x2*2,y2,wColors,1, );textout(handle,x3*2,y3,wColors,1, );textout(handle,x4*2,y4,wColors,1, );void rewrite()/出现textout(handle,x1*2,y1,wColors,1,);textout(handle,x2*2,y2,wColors,1,);textout(handle,x3*2,y3,wColors,1,);textout(handle,x4*2,y4,wColors,1,);void spin()/旋转switch(type)case 0:if(typetemp=0)if(tabley2+1x2|tabley2+2x2|tabley2+3x2)=0)x1=x2;x3=x2;x4=x2;y1=y2+1;y3=y2+2;y4=y2+3;typetemp=(typetemp+1)%2;elseif(tabley2x2-1|tabley2x2+1|tabley2x2+2)=0)y1=y2;y3=y2;y4=y2;x1=x2-1;x3=x2+1;x4=x2+2;typetemp=(typetemp+1)%2;break;case 1:break;case 2:switch(typetemp)case 0:if(tabley4x1|tabley4+1x4)=0)y1+;x3=x4;y3=y4+1;typetemp=(typetemp+1)%4;break;case 1:if(tabley4x4+1)=0)y3=y4;x3=x4+1;typetemp=(typetemp+1)%4;break;case 2:if(tabley4+1x4)=0)x1=x4;y1=y4+1;typetemp=(typetemp+1)%4;break;case 3:if(tabley2x2-1|tabley2x2+1)=0)y1=y2;y3=y2;x1=x2-1;x3=x2+1;typetemp=(typetemp+1)%4;break;break;case 3:switch(typetemp)case 0:if(tabley2+1x2|tabley2+2x2)=0)x3=x2;y3=y2+1;x4=x2;y4=y2+2;typetemp=(typetemp+1)%4;break;case 1:if(tabley3x3-1|tabley3x3+1|tabley3-1x3+1)=0)x4=x3-1;y4=y3;x1=x3+1;y1=y3;x2=x3+1;y2=y3-1;typetemp=(typetemp+1)%4;break;case 2:if(tabley4-1x4|tabley4+1x4|tabley4+1x4+1)=0)x1=x4;y1=y4-1;x2=x4;y2=y4+1;x3=x4+1;y3=y4+1;typetemp=(typetemp+1)%4;break;case 3:if(tabley1x1+1|tabley1x1+2)=0)x2=x1+1;y2=y1;x3=x1+2;y3=y1;typetemp=(typetemp+1)%4;break;break;case 4:switch(typetemp)case 0:if(tabley4+1x4|tabley4+1x4-1)=0)x2=x4;y2=y4+1;x1=x4-1;y1=y4+1;typetemp=(typetemp+1)%4;break;case 1:if(tabley4x4-1|tabley4x4-2|tabley4-1x4-2)=0)y3=y4;x3=x4-1;y2=y4;x2=x4-2;y1=y4-1;x1=x4-2;typetemp=(typetemp+1)%4;break;case 2:if(tabley1x1+1|tabley2+1x2)=0)y2=y1;x2=x1+1;y3=y1+1;x3=x1;y4=y1+2;x4=x1;typetemp=(typetemp+1)%4;break;case 3:if(tabley2x2+1|tabley2+1x2+1)=0)y3=y2;x3=x2+1;y4=y2+1;x4=x2+1;typetemp=(typetemp+1)%4;break;break;case 5:if(typetemp=0)if(tabley3x3-1|tabley3+1x3-1)=0)x1=x3-1;y1=y3;x4=x3-1;y4=y3+1;typetemp=(typetemp+1)%2;elseif(tabley2x2-1|tabley3x3+1)=0)x1=x2-1;y1=y2;x4=x3+1;y4=y3;typetemp=(typetemp+1)%2;break;case 6:if(typetemp=0)if(tabley4x4+1|tabley4+1x4+1)=0)x2=x4+1;y2=y4;x3=x4+1;y3=y4+1;typetemp=(typetemp+1)%2;elseif(tabley4x4-1|tabley1x1+1)=0)x2=x1+1;y2=y1;x3=x4-1;y3=y4;typetemp=(typetemp+1)%2;break; bool TurnLeft()/左移判定if(tabley1x1-1|tabley2x2-1|tabley3x3-1|tabley4x4-1)=0) return(true);else return(false);bool TurnRight()/右移判定if(tabley1x1+1|tabley2x2+1|tabley3x3+1|tabley4x4+1)=0)return 1;else return 0;bool TurnDown()/下移判定if(tabley1+1x1|tabley2+1x2|tabley3+1x3|tabley4+1x4)=0)return 1;else return 0;/int main()handle=initiate();wColors0=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN; wColors1=FOREGROUND_RED; textout(handle,36,15,wColors,1,操作说明:);textout(handle,36,16,wColors,1,左: A);textout(handle,36,17,wColors,1,右: D);textout(handle,36,18,wColors,1,加速下落:S);textout(handle,36,19,wColors,1,翻转: W);textout(handle,36,20,wColors,1,暂停: E);textout(handle,36,21,wColors,1,退出: Q);textout(handle,36,4,wColors,1,当前分数:);textout(handle,36,8,wColors,1,下一块:);srand(time(NULL);textout(handle,0,0,wColors+1,1,);textout(handle,0,22,wColors+1,1,);for(int k=1;k22;k+)textout(handle,0,k,wColors+1,1,|);textout(handle,28,k,wColors+1,1,|);wColors0=FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED;for(int m=1;m23;m+)/table初始化tablem0=1;tablem14=1;for(int n=0;n15;n+)table22n=1;if(menu()return 0;typenext=rand()%7; while(1) / 循环if(flag)/下一个方块flag=0;typetemp=0;type=typenext;switch(type) case 0:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=8;y4=1;break; case 1:x1=6;y1=1;x2=7;y2=1;x3=6;y3=2;x4=7;y4=2;break;case 2:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=6;y4=2;break;case 3:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=5;y4=2;break;case 4:x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=7;y4=2;break;case 5:x1=5;y1=1;x2=6;y2=1;x3=6;y3=2;x4=7;y4=2;break;case 6:x1=6;y1=1;x2=7;y2=1;x3=5;y3=2;x4=6;y4=2;break;rewrite();typenext=rand()%7;switch(typenext)/下一块预览 case 0:textout(handle,36,10,wColors,1,);textout(handle,36,11,wColors,1, );break;case 1:textout(handle,36,10,wColors,1, );textout(handle,36,11,wColors,1, );break;case 2:textout(handle,36,10,wColors,1, );textout(handle,36,11,wColors,1, );break;case 3:textout(handle,36,10,wColors,1, );textout(handle,36,11,wColors,1, );break;case 4:textout(handle,36,10,wColors,1, );textout(handle,36,11,wColors,1, );break;case 5:textout(handle,36,10,wColors,1, );textout(handle,36,11,wColors,1, );break;case 6:textout(handle,36,10,wColors,1, );textout(handle,36,11,wColors,1, );break;if(kbhit()/上下左右按键控制key=getch();switch(key) case 100:/右case 68: if(TurnRight() erase(); x1+;x2+;x3+;x4+;rewrite();break; case 97:/左 case 65:if(TurnLeft()erase();x1-;x2-;x3-;x4-;rewrite();break;case 115:/下 case 83:if(TurnDown() erase();y1+;y2+;y3+;y4+;rewrite();break; case 119:/上 case 87:erase();spin();rewrite();break; case 69:/暂停 case 101:wColors0=FOREGROUND_RED;textout(handle,0,23,wColors,1, 暂停中. 按任意键继续 );key=getch();wColors0=FOREGROUND_BLUE|FOREGROUND_GREEN;textout(handle,0,23,wColors,1, );break; case 113:/退出 case 81:return 0;Sleep(50);times=(times+1)%speed;if(times=0)/自动下移判定if(TurnDown()/下移erase(); y1+;y2+;y3+;y4+; rewrite();else /不下移itoa(score,scorech,10);textout(handle,36,5,wColors,1,scorech); tabley1x1=1;tabley2x2=1; tabley3x3=1; tabley4x4=1; flag=1; typetemp=0; for(int a=1;a0;p-)/消行的判定 for(int q=1;q0;b-) for(int g=1;g0;c-)/刷新 for(int Q=1;Q14;Q+) if(tablecQ)textout(handle,Q*2,c,wColors,1,); else textout(handle,Q*2,c,wColors,1, );
展开阅读全文