Tetris game编程过程

来源:互联网 发布:三个矩阵分配律 编辑:程序博客网 时间:2024/05/23 11:45

 

经过了一周多的编译和测试,我的第一个游戏 Tetris终于完成了。程序还很幼稚。

  首先说一下此程序的设计思路和运行方式,代码会附加在后文。思路上采用分块编写,分块测试,从简单到复杂的填充式方法。首先,把俄罗斯方块要实现的功能分成单独的部分,分别测试,1.游戏启动2.边框3.四格图案4.下降方式 5.旋转6.左右控制7下降悬停8行满总体下移。

游戏启动还是通过传统的enter载入。而边框则运用二维数组赋值的办法,把目标图案加载到数组里面形成边框。而四格图案的控制则成了瓶颈,经过讨论,决定用坐标法来控制四格图案的位置。而这5种四格图案采用分别赋值坐标的方式。接下来下降的方法则采用由10和由01的方式来处理,通过循环对每一行的处理成功让其下降。关于旋转由于时间太短没能实现,非常遗憾。日后会再加入这个功能。6.7.8依然采用变换01的方法变换不加赘述。

运行方式和俄罗斯方块运行方式一样,左右控制略有区别。A和d键分别控制左右。

接下来说一说当中遇到的问题及解决的过程(可略过):

在实现自由下降后发现一个问题,下降之后总会跑出边框外。这点让我很头疼,后来经过讨论,采用“遇1”停止运行的方式成功避免上诉问题,并且得到启发实现了“悬停”功能。编译后期方块下降时还不能“自由”,熟知的getch()函数已经不能解决问题,然后学长教给我kbhit()的用法,经过调整终于实现“自由”下降。

这次项目学到了很多,也体会到合作的重要性.希望今后会有更大的提高.

总结的不好,程序也很幼稚,欢迎审阅人及读者批评指正。下面是运行代码:#include<iostream>

using namespace std;

#include<conio.h>

#include<stdlib.h>

#include<windows.h>

 

int main()

{

int date[20][20],i,j,fill,slow;

for(i=0;i<20;i++)

{

date[0][i]=1;

date[19][i]=1;

date[i][0]=1;

date[i][19]=1;

}

//边框赋值用的

 

int choice,ch,a,b,c,d,e,f,g,h,n=6;  //一个图形 四个块坐标

step:choice=n%5;

switch(choice)

 {

 

case 1:a=1;b=9;c=1;d=10;e=1;f=11;g=1;h=12;n++;;break;

 

case 2:a=1;b=10;c=1;d=11;e=2;f=10;g=2;h=11;n++;;break;

case 3:a=1;b=10;c=2;d=10;e=3;f=10;g=3;h=11;n++;break;

case 4:a=1;b=11;c=2;d=10;e=2;f=11;g=2;h=12;n++;break;

case 0: a=1;b=9;c=2;d=9;e=2;f=10;g=3;h=10;n++;break;

default :;

}

 

char Direct;

date[a][b]=1; //块的真假  真为有块

date[c][d]=1;

date[e][f]=1;

date[g][h]=1;

while(1)

{

if( kbhit() )

{

ch=getch();

if(ch=='a'&&b!=1)      //左移

{

date[a][b]=0;

date[c][d]=0;      //先消除

date[e][f]=0;

date[g][h]=0;

 

date[a][--b]=1;

date[c][--d]=1;   //再赋值1

date[e][--f]=1;

date[g][--h]=1;

}

if(ch=='d'&&h!=18)  //向右移 同理

{

date[a][b]=0;

date[c][d]=0;

date[e][f]=0;

date[g][h]=0;

 

date[a][++b]=1;

date[c][++d]=1;

date[e][++f]=1;

date[g][++h]=1;

}

 

}

switch(choice)

{

case 1:if((date[a+1][b]!=1)&&(date[c+1][d]!=1)&&(date[e+1][f]!=1)&&(date[g+1][h]!=1))

   {  date[a][b]=0;   //自由下降

date[c][d]=0;

date[e][f]=0;

date[g][h]=0;

 

date[++a][b]=1;

date[++c][d]=1;

date[++e][f]=1;

date[++g][h]=1;

}

break;

case 2:if((date[e+1][f]!=1)&&(date[g+1][h]!=1))

   {date[a][b]=0;   //自由下降

date[c][d]=0;

date[e][f]=0;

date[g][h]=0;

 

date[++a][b]=1;

date[++c][d]=1;

date[++e][f]=1;

date[++g][h]=1;

}

   break;

case 3:if((date[e+1][f]!=1)&&(date[g+1][h]!=1))

   {date[a][b]=0;   //自由下降

date[c][d]=0;

date[e][f]=0;

date[g][h]=0;

 

date[++a][b]=1;

date[++c][d]=1;

date[++e][f]=1;

date[++g][h]=1;

}

   break;

case 4:if((date[c+1][d]!=1)&&(date[e+1][f]!=1)&&(date[g+1][h]!=1))

   {date[a][b]=0;   //自由下降

date[c][d]=0;

date[e][f]=0;

date[g][h]=0;

 

date[++a][b]=1;

date[++c][d]=1;

date[++e][f]=1;

date[++g][h]=1;

}

    break;

case 0:if((date[c+1][d]!=1)&&(date[g+1][h]!=1))  

   { date[a][b]=0;   //自由下降

date[c][d]=0;

date[e][f]=0;

date[g][h]=0;

 

date[++a][b]=1;

date[++c][d]=1;

date[++e][f]=1;

date[++g][h]=1;

}

break;

    default :;}

 

 

 

switch(choice)

{

case 1:if((date[a+1][b]==1)||(date[c+1][d]==1)||(date[e+1][f]==1)||(date[g+1][h]==1))   

goto step;break;

case 2:if((date[e+1][f]==1)||(date[g+1][h]==1))

   goto step;break;

case 3:if((date[e+1][f]==1)||(date[g+1][h]==1))

   goto step;break;

case 4:if((date[c+1][d]==1)||(date[e+1][f]==1)||(date[g+1][h]==1))

    goto step;break;

case 0:if((date[c+1][d]==1)||(date[g+1][h]==1))   

goto step;break;

    default :;}

system("CLS");

 

char blank=32;                                  //边框娃娃头

for(i=0;i<20;i++)

{

for(j=0;j<20;j++)

{

if(date[i][j]==1)

cout<<"";

else

cout<<blank<<" " ;

 

}

cout<<endl;

}

Sleep(50);

 

for(i=1;i<=18;i++)

{ if(date[i][1]==1&&date[i][2]==1&&date[i][3]==1&&date[i][4]==1&&date[i][5]==1&&date[i][6]==1&&date[i][7]==1&&date[i][8]==1&&date[i][9]==1&&date[i][10]==1&&date[i][11]==1&&date[i][12]==1&&date[i][13]==1&&date[i][14]==1&&date[i][15]==1&&date[i][16]==1&&date[i][17]==1&&date[i][18]==1)

{slow=1;

date[i][1]=0;date[i][2]=0;date[i][3]=0;date[i][4]=0;date[i][5]=0;date[i][6]=0;date[i][7]=0;date[i][8]=0;date[i][9]=0;date[i][10]=0;date[i][11]=0;date[i][12]=0;date[i][13]=0;date[i][14]=0;date[i][15]=0;date[i][16]=0;date[i][17]=0;date[i][18]=0;

fill=i;

}

else

slow=0;

}

if(slow==1)

{

for(i=fill-1;i>=1;i--)

{

for(j=1;j<=18;j++)

{

date[i+1][j]=date[i][j];

date[i][j]=0;

}

}

}

 

}

//输出函数  娃娃头

return 0;

}

0 0
原创粉丝点击