C语言课程设以一节课,老师提供了一个C语言的俄罗斯方块游戏让我们感受,本学期C语言课程,主要是各种语句的练习,这次是用以前的知识来感受一个实际的系统。

首先安装c-free,然后打开老师所发给我们的小程序。

界面很简单,没想到C语言还能做这么有意思的东西,真是没有想到。

分析一下程序,感觉比较太复杂的,但就是本学期学习的简单语句的组合,运用起来如此神奇。

1、首先是在屏幕上显示的语句printf

2、运用for语句建立窗口

 for(i=2;i<2*Frame_width-2;i+=2)

 {

  gotoxy(hOut,FrameX+i,FrameY);

  printf("═");         //打印上横框

 }

 for(i=2;i<2*Frame_width-2;i+=2)

 {

  gotoxy(hOut,FrameX+i,FrameY+Frame_height);

  printf("═");         //打印下横框

  a[FrameX+i][FrameY+Frame_height]=2;    //记住下横框有图案

 }

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

 {

  gotoxy(hOut,FrameX,FrameY+i); 

  printf("║");         //打印左竖框

  a[FrameX][FrameY+i]=2;       //记住左竖框有图案

 }

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

 {

  gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i); 

  printf("║");         //打印右竖框

  a[FrameX+2*Frame_width-2][FrameY+i]=2;   //记住右竖框有图案

 }


3、制作俄罗斯方块并将其进行旋转

void make_tetris(struct Tetris *tetris)

{

 a[tetris->x][tetris->y]=b[0];    //中心方块位置的图形状态:1-有,0-无

 switch(tetris->flag)      //共6大类,19种类型

 {

  case 1:         //田字方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x+2][tetris->y-1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 2:         //直线方块:----

   {  

    a[tetris->x-2][tetris->y]=b[1];

    a[tetris->x+2][tetris->y]=b[2];

    a[tetris->x+4][tetris->y]=b[3];

    break;

   }

  case 3:         //直线方块: |

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x][tetris->y-2]=b[2];

    a[tetris->x][tetris->y+1]=b[3];

    break;

   }

  case 4:         //T字方块

   {  

    a[tetris->x-2][tetris->y]=b[1];

    a[tetris->x+2][tetris->y]=b[2];

    a[tetris->x][tetris->y+1]=b[3];

    break;

   }

  case 5:         //T字顺时针转90度方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x][tetris->y+1]=b[2];

    a[tetris->x-2][tetris->y]=b[3];

    break;

   }

  case 6:         //T字顺时针转180度方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x-2][tetris->y]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 7:         //T字顺时针转270度方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x][tetris->y+1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 8:         //Z字方块

   {  

    a[tetris->x][tetris->y+1]=b[1];

    a[tetris->x-2][tetris->y]=b[2];

    a[tetris->x+2][tetris->y+1]=b[3];

    break;

   }

  case 9:         //Z字顺时针转90度方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x-2][tetris->y]=b[2];

    a[tetris->x-2][tetris->y+1]=b[3];

    break;

   }

  case 10:        //Z字顺时针转180度方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x-2][tetris->y-1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 11:        //Z字顺时针转270度方块

   {  

    a[tetris->x][tetris->y+1]=b[1];

    a[tetris->x+2][tetris->y-1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 12:        //7字方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x][tetris->y+1]=b[2];

    a[tetris->x-2][tetris->y-1]=b[3];

    break;

   }

  case 13:        //7字顺时针转90度方块

   {  

    a[tetris->x-2][tetris->y]=b[1];

    a[tetris->x-2][tetris->y+1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 14:        //7字顺时针转180度方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x][tetris->y+1]=b[2];

    a[tetris->x+2][tetris->y+1]=b[3];

    break;

   }

  case 15:        //7字顺时针转270度方块

   {

    a[tetris->x-2][tetris->y]=b[1];

    a[tetris->x+2][tetris->y-1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 16:        //倒7字方块

   { 

    a[tetris->x][tetris->y+1]=b[1];

    a[tetris->x][tetris->y-1]=b[2];

    a[tetris->x+2][tetris->y-1]=b[3];

    break;

   }

  case 17:        //倒7字顺指针转90度方块

   { 

    a[tetris->x-2][tetris->y]=b[1];

    a[tetris->x-2][tetris->y-1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

  case 18:        //倒7字顺时针转180度方块

   {  

    a[tetris->x][tetris->y-1]=b[1];

    a[tetris->x][tetris->y+1]=b[2];

    a[tetris->x-2][tetris->y+1]=b[3];

    break;

   }

  case 19:        //倒7字顺时针转270度方块

   {  

    a[tetris->x-2][tetris->y]=b[1];

    a[tetris->x+2][tetris->y+1]=b[2];

    a[tetris->x+2][tetris->y]=b[3];

    break;

   }

 } 

4、判断是否满行并删除满行的俄罗斯方块

void del_full(HANDLE hOut,struct Tetris *tetris)

{       //当某行有Frame_width-2个方块时,则满行

 int k,del_count=0;  //分别用于记录某行方块的个数和删除方块的行数的变量

 for(j=FrameY+Frame_height-1;j>=FrameY+1;j--)

 {

  k=0;

  for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2)

  {  

   if(a[i][j]==1) //竖坐标依次从下往上,横坐标依次由左至右判断是否满行

   {

    k++;  //记录此行方块的个数

    if(k==Frame_width-2)

    {

     for(k=FrameX+2;k<FrameX+2*Frame_width-2;k+=2)

     {  //删除满行的方块

      a[k][j]=0;

      gotoxy(hOut,k,j);

      printf("  ");

      Sleep(1);

     }

     for(k=j-1;k>FrameY;k--)

     {  //如果删除行以上的位置有方块,则先清除,再将方块下移一个位置

      for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2)

      {

       if(a[i][k]==1)

       {

        a[i][k]=0;

        gotoxy(hOut,i,k);

        printf("  ");

        a[i][k+1]=1;

        gotoxy(hOut,i,k+1);

        printf("□");

       }

      }

     }

     j++;   //方块下移后,重新判断删除行是否满行

     del_count++; //记录删除方块的行数

    }

   }

  }

 }

 tetris->score+=100*del_count; //每删除一行,得100分

 if( del_count>0 && ( tetris->score%1000==0 || tetris->score/1000>tetris->level-1 ) )

 {        //如果得1000分即累计删除10行,速度加快20ms并升一级

  tetris->speed-=20;

  tetris->level++;

 }

}

5体会

1、C语言游戏程序可以看到,C语言是我们第一门编程语言,从对计算机没有任何编程能力的菜鸟,到现在能读懂C语言的程序,感觉自己在慢慢进步。

2、计算机应用系统,就是不断接收用户的输入,然后根据相应的逻辑,显示相应的内容的过程。

3、按照这个思路,我可以把程序修改成一个打飞机的游戏,控制飞机左右一定,就是我的飞机能不仅仅在下面跑,还可以到处跑,这个只要把我的飞机限制在21行的限制取消就可以了。