俄罗斯方块实习报告.docx
- 文档编号:9111979
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:20
- 大小:191.33KB
俄罗斯方块实习报告.docx
《俄罗斯方块实习报告.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块实习报告.docx(20页珍藏版)》请在冰豆网上搜索。
俄罗斯方块实习报告
计算机实习报告
姓名:
刘天
班级:
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
YES
NO
YES
2.2关键算法描述
booltable[15][23]={0};绘制操作面板;
boolmenu();设定游戏的初始界面(欢迎界面);
voidspin();决定方块的旋转;
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、没有多种界面风格,没有等级系统,不够人性化。
三.心得体会
从一开始的手无足措到一步步的攻克困难,从一开始的茫然停滞到如今的清晰明朗,小学期在时间不知不觉的流逝中,就这样结束了。
俄罗斯方块从可以随机出现,到可以自动下落,从左右移动,到可以自动旋转,消行,加分……看着一个个下落的方块,兴奋的心情真的难以用语言描述。
回忆着小学期的一幕幕,我慢慢的对编程产生了强烈的兴趣,同时,也有了把它做好的信心和决心。
我相信,我可以越做越好。
附代码:
#include"colorConsole.h"
#include
#include
#include
#include
HANDLEhandle;
WORDwColors[2];
intx1=1,x2=1,x3=1,x4=1;//
inty1=1,y2=1,y3=1,y4=1;//方块坐标
inttype,typenext,typetemp=0;//目前方块和下一个方块的产生
intscore=0,speed=10,times=0,level=0;//得分和速度等
intkey;//按键
charscorech[10]={0};
boolflag=1;//生成新方块判定
boolstart=1;
booltable[15][23]={0};//绘制操作面板
boolmenu()//游戏的初始界面(欢迎界面)
{
for(into=1;o<22;o++)
{
textout(handle,2,o,wColors,1,"");
}
for(inti=21;i>0;i--)
{
for(intj=1;j<14;j++)
{
table[i][j]=0;
}
}
wColors[0]=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,"");
}
}
return0;
}
voiderase()//清除
{
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,"");
}
voidrewrite()//出现
{
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,"■");
}
voidspin()//旋转
{
switch(type)
{
case0:
if(typetemp==0)
{
if((table[y2+1][x2]||table[y2+2][x2]||table[y2+3][x2])==0)
{
x1=x2;x3=x2;x4=x2;
y1=y2+1;y3=y2+2;y4=y2+3;
typetemp=(typetemp+1)%2;
}
}
else
{
if((table[y2][x2-1]||table[y2][x2+1]||table[y2][x2+2])==0)
{
y1=y2;y3=y2;y4=y2;
x1=x2-1;x3=x2+1;x4=x2+2;
typetemp=(typetemp+1)%2;
}
}
break;
case1:
break;
case2:
switch(typetemp)
{
case0:
if((table[y4][x1]||table[y4+1][x4])==0)
{
y1++;
x3=x4;y3=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case1:
if((table[y4][x4+1])==0)
{
y3=y4;x3=x4+1;
typetemp=(typetemp+1)%4;
}
break;
case2:
if((table[y4+1][x4])==0)
{
x1=x4;y1=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case3:
if((table[y2][x2-1]||table[y2][x2+1])==0)
{
y1=y2;y3=y2;
x1=x2-1;x3=x2+1;
typetemp=(typetemp+1)%4;
}
break;
}
break;
case3:
switch(typetemp)
{
case0:
if((table[y2+1][x2]||table[y2+2][x2])==0)
{
x3=x2;y3=y2+1;
x4=x2;y4=y2+2;
typetemp=(typetemp+1)%4;
}
break;
case1:
if((table[y3][x3-1]||table[y3][x3+1]||table[y3-1][x3+1])==0)
{
x4=x3-1;y4=y3;
x1=x3+1;y1=y3;
x2=x3+1;y2=y3-1;
typetemp=(typetemp+1)%4;
}
break;
case2:
if((table[y4-1][x4]||table[y4+1][x4]||table[y4+1][x4+1])==0)
{
x1=x4;y1=y4-1;
x2=x4;y2=y4+1;
x3=x4+1;y3=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case3:
if((table[y1][x1+1]||table[y1][x1+2])==0)
{
x2=x1+1;y2=y1;
x3=x1+2;y3=y1;
typetemp=(typetemp+1)%4;
}
break;
}
break;
case4:
switch(typetemp)
{
case0:
if((table[y4+1][x4]||table[y4+1][x4-1])==0)
{
x2=x4;y2=y4+1;
x1=x4-1;y1=y4+1;
typetemp=(typetemp+1)%4;
}
break;
case1:
if((table[y4][x4-1]||table[y4][x4-2]||table[y4-1][x4-2])==0)
{
y3=y4;x3=x4-1;
y2=y4;x2=x4-2;
y1=y4-1;x1=x4-2;
typetemp=(typetemp+1)%4;
}
break;
case2:
if((table[y1][x1+1]||table[y2+1][x2])==0)
{
y2=y1;x2=x1+1;
y3=y1+1;x3=x1;
y4=y1+2;x4=x1;
typetemp=(typetemp+1)%4;
}
break;
case3:
if((table[y2][x2+1]||table[y2+1][x2+1])==0)
{
y3=y2;x3=x2+1;
y4=y2+1;x4=x2+1;
typetemp=(typetemp+1)%4;
}
break;
}
break;
case5:
if(typetemp==0)
{
if((table[y3][x3-1]||table[y3+1][x3-1])==0)
{
x1=x3-1;y1=y3;
x4=x3-1;y4=y3+1;
typetemp=(typetemp+1)%2;
}
}
else
{
if((table[y2][x2-1]||table[y3][x3+1])==0)
{
x1=x2-1;y1=y2;
x4=x3+1;y4=y3;
typetemp=(typetemp+1)%2;
}
}
break;
case6:
if(typetemp==0)
{
if((table[y4][x4+1]||table[y4+1][x4+1])==0)
{
x2=x4+1;y2=y4;
x3=x4+1;y3=y4+1;
typetemp=(typetemp+1)%2;
}
}
else
{
if((table[y4][x4-1]||table[y1][x1+1])==0)
{
x2=x1+1;y2=y1;
x3=x4-1;y3=y4;
typetemp=(typetemp+1)%2;
}
}
break;
}
}
boolTurnLeft()//左移判定
{
if((table[y1][x1-1]||table[y2][x2-1]||table[y3][x3-1]||table[y4][x4-1])==0)
return(true);
else
return(false);
}
boolTurnRight()//右移判定
{
if((table[y1][x1+1]||table[y2][x2+1]||table[y3][x3+1]||table[y4][x4+1])==0)
return1;
elsereturn0;
}
boolTurnDown()//下移判定
{
if((table[y1+1][x1]||table[y2+1][x2]||table[y3+1][x3]||table[y4+1][x4])==0)
return1;
elsereturn0;
}
////////////////////////////////////////////////////////////////////////////////
intmain()
{
handle=initiate();
wColors[0]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN;
wColors[1]=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(intk=1;k<22;k++)
{
textout(handle,0,k,wColors+1,1,"||");
textout(handle,28,k,wColors+1,1,"||");
}
wColors[0]=FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED;
for(intm=1;m<23;m++)//table初始化
{
table[m][0]=1;
table[m][14]=1;
}
for(intn=0;n<15;n++)
{
table[22][n]=1;
}
if(menu())
return0;
typenext=rand()%7;
while
(1)////////////////循环
{
if(flag)//下一个方块
{
flag=0;
typetemp=0;
type=typenext;
switch(type)
{
case0:
x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=8;y4=1;break;
case1:
x1=6;y1=1;x2=7;y2=1;x3=6;y3=2;x4=7;y4=2;break;
case2:
x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=6;y4=2;break;
case3:
x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=5;y4=2;break;
case4:
x1=5;y1=1;x2=6;y2=1;x3=7;y3=1;x4=7;y4=2;break;
case5:
x1=5;y1=1;x2=6;y2=1;x3=6;y3=2;x4=7;y4=2;break;
case6:
x1=6;y1=1;x2=7;y2=1;x3=5;y3=2;x4=6;y4=2;break;
}
rewrite();
typenext=rand()%7;
switch(typenext)//下一块预览
{
case0:
textout(handle,36,10,wColors,1,"■■■■");textout(handle,36,11,wColors,1,"");break;
case1:
textout(handle,36,10,wColors,1,"■■");textout(handle,36,11,wColors,1,"■■");break;
case2:
textout(handle,36,10,wColors,1,"■■■");textout(handle,36,11,wColors,1,"■");break;
case3:
textout(handle,36,10,wColors,1,"■■■");textout(handle,36,11,wColors,1,"■");break;
case4:
textout(handle,36,10,wColors,1,"■■■");textout(handle,36,11,wColors,1,"■");break;
case5:
textout(handle,36,10,wColors,1,"■■");textout(handle,36,11,wColors,1,"■■");break;
case6:
textout(handle,36,10,wColors,1,"■■");textout(handle,36,11,wColors,1,"■■");break;
}
}
if(kbhit())//上下左右按键控制
{
key=getch();
switch(key)
{
case100:
//右
case68:
if(TurnRight())
{
erase();
x1++;x2++;x3++;x4++;
rewrite();
}
break;
case97:
//左
case65:
if(TurnLeft())
{
erase();
x1--;x2--;x3--;x4--;
rewrite();
}
break;
case115:
//下
case83:
if(TurnDown())
{
erase();
y1++;y2++;y3++;y4++;
rewrite();
}
break;
case119:
//上
case87:
erase();
spin();
rewrite();
break;
case69:
//暂停
case101:
wColors[0]=FOREGROUND_RED;
textout(handle,0,23,wColors,1,"暂停中..按任意键继续");
key=getch();
wColors[0]=FOREGROUND_BLUE|FOREGROUND_GREEN;
textout(handle,0,23,wColors,1,"");
break;
case113:
//退出
case81:
return0;
}
}
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);
table[y1][x1]=1;
table[y2][x2]=1;
table[y3][x3]=1;
table[y4][x4]=1;
flag=1;
typetemp=0;
for(inta=1;a<14;a++)//死亡的判定
{
if(table[1][a])
{
textout(handle,4,8,wColors,1,"");
textout(handle,4,9,wColors,1,"GAMEOVER");
textout(handle,4,10,wColors,1,"");
textout(handle,4,11,wColors,1,"按任意键重新开始");
textout(handle,4,12,wColors,1,"");
Slee
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 实习 报告