当前位置:神舟问>生活百科>求C语言俄罗斯来自方块代码

求C语言俄罗斯来自方块代码

2024-03-13 02:41:01 编辑:join 浏览量:546

求C语言俄罗斯来自方块代码

俄罗斯里依训土穿厚求考管吗艺方块C源代码

#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <time.h>

#de率或秋何敌形针个张声fine  ZL  4  //坐标增量, 不使游戏窗口靠边

#define WID  36  //游戏窗口的宽度

#d达村据告众比efine HEI  20  //游戏窗口的高度

int i,j,Ta,Tb,Tc;   // Ta,Tb,Tc用于记住和转换方块变量的值

int a[60][60]={0};  //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框

int b[4];    //标记4个"口"方块:1有,0无,类似开关

int x,y, level,score,speed;  //方块中心位置的x,y坐标,游戏等级、得分和游戏速度

int flag,next; //当前要操作的方块类型序号,下一个方块殖机查员牛也缺发存轴类型序号

void gtxy(int m, int n); //以下声明要用到的自编函数

void gflag( ); //获得下一方块序号

voi主去再装按预自女d csh( ); //初始化界面

void start( ); //开始部分

路和便号新威势声感它剧void prfk ( ); //打印方块

void clfk( ); //清除方块

void mkfk( ); //制作方块

void keyD( ); //按键操作

int  ifmov( ); //判断方块能否移动或变体

voidclHA( ); //清除满行的方块

void c国失半该离田则检波吧lNEXT( ); //清除边框外的NEXT方块

int main( )

{ csh( );  

  while(1)

   {start( );  //开始部分

    while(1)

    { prfk( );  

     Sleep(speed); //延志战介凯志连

  蔽碧誉   clfk( );

     Tb=x;Tc=flag;  //临存当前x坐标和序号,以备撤销操作

     keyD( ); 

     y++;     //方块向下移动

     i蒸相谁袁微金控f (ifmov( )==0) { y--; prfk( ); dlHA( ); break;} //不可动放下,删行,跨出循环

    }

   for(i=y-2;i<y+2;i++){ if (i==ZL) { j=0; } } //方块触到框顶

   if (怕手乡混选致检j==0) { system("cls");gtxy(10,10);printf("游戏结束!"); getch(); break; } 

   c花应lNEXT( ); //清除框外的NEXT方块

  }

 return 0酸接第举怕土;

}

void gtxy(架座层握迫int m, int n)  //控制光标移动

{COORD pos;  //里但让吗福皇货定义变量

 pos.X = m;  //横坐标

 pos.Y = n;   //纵坐标

 SetConsoleCursorPosition(GetSt吧历觉等了观拿展班条金dHandle(STD_OUTPUT_HANDLE), pos某拉星); 

}

void csh( )    //初始化界面

{gtxy(ZL+WID/2-5,ZL-2); printf("俄罗斯方块");      //打印游戏名称

 gtxy(ZL+WID+3,ZL+7); printf("******* NEXT:");  //打印菜单信息

 gtxy(ZL+WID+3,ZL+13); printf("**********");

 慧厅gtxy(ZL+WID+3,ZL+15); printf("Esc :退出游戏");

gtxy(ZL+WID+3,ZL+17); printf("↑键:变体");

 gtxy(ZL+WID+3,ZL+19); printf("空格:暂停游戏");

 gtxy(ZL,ZL);  printf("╔");  gtxy(ZL+WID-2,ZL);  printf("╗");  //打印框角

 gtxy(ZL,ZL+HEI);  printf("╚");  gtxy(ZL+WID-2,ZL+HEI);  printf("╝");

a[ZL][ZL+HEI]=2;  a[ZL+WID-2][ZL+HEI]=2;  //记住有图案

 for(i=2;i<WID-2;i+=2) {gtxy(ZL+i,ZL);  printf("═"); }  //打印上横框

 for(i=2;i<WID-2;i+=2) {gtxy(ZL+i,ZL+HEI); printf("═"); a[ZL+i][ZL+HEI]=2; } 宏段//下框

 for(i=1;i<HEI;i++) { gtxy(ZL,ZL+i);  printf("║"); a[ZL][ZL+i]=2; }  //左竖框记住有图案

 for(i=1;i<HEI;i++) {gtxy(ZL+WID-2,ZL+i); printf("║"); a[ZL+WID-2][ZL+i]=2; } //右框

 CONSOLE_CURSOR_INFO cursor_info={1,0};   //以下是隐藏光标的设置

 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);

 level=1; score=0; speed=400;

 gflag( );  flag=next;  //获得一个当前方块序号

}

void gflag( ) //获得下一个方块的序号

{ srand((unsigned)time(NULL)); next = rand()%19+1;}

void start( )  //开始部分

{ gflag( ); Ta=flag; flag=next;  //保存当前方块序号,将下一方块序号临时操作

  x=ZL+WID+6; y=ZL+10; prfk( );  //给x,y赋值,在框外打印出下一方块

 flag=Ta; x=ZL+WID/2; y=ZL-1;  //取回当前方块序号,并给x,y赋值

}

void prfk ( )  //打印俄罗斯方块

{ for(i=0;i<4;i++) {b[i]=1; }  //数组b[4]每个元素的值都为1

  mkfk ( );  //制作俄罗斯方块

 for( i= x-2; i<=x+4; i+=2 )  //打印方块

  { for(j=y-2;j<= y+1;j++) { if( a[i][j]==1 && j>ZL ){ gtxy(i,j); printf("□"); } } }

 gtxy(ZL+WID+3,ZL+1); printf("level : %d",level); //以下打印菜单信息

 gtxy(ZL+WID+3,ZL+3); printf("score : %d",score);

 gtxy(ZL+WID+3,ZL+5); printf("speed : %d",speed);

}

void clfk( )  //清除俄罗斯方块

{ for(i=0;i<4;i++) { b[i]=0; }  //数组b[4]每个元素的值都为0

  mkfk ( );  //制作俄罗斯方块

 for( i=x-2; i<=x+4; i+=2 )  //清除方块

  { for(j=y-2;j<=y+1;j++){ if( a[i][j]==0 && j>ZL ){ gtxy(i,j); printf("  "); } } }

}

void mkfk( )  //制作俄罗斯方块

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

 switch(flag)   //共6大类,19种小类型

 { case 1: { a[x][y-1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //田字方块

  case 2: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x+4][y]=b[3]; break; }  //直线方块:----

  case 3: { a[x][y-1]=b[1]; a[x][y-2]=b[2]; a[x][y+1]=b[3]; break; }  //直线方块: |

  case 4: { a[x-2][y]=b[1]; a[x+2][y]=b[2]; a[x][y+1]=b[3]; break; }  //T字方块

  case 5: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y]=b[3]; break; }  //T字顺时针转90度

  case 6: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转180度

  case 7: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //T字顺转270度

  case 8: { a[x][y+1]=b[1]; a[x-2][y]=b[2]; a[x+2][y+1]=b[3]; break; } //Z字方块

  case 9: { a[x][y-1]=b[1]; a[x-2][y]=b[2]; a[x-2][y+1]=b[3]; break; }  //Z字顺转90度

  case 10: { a[x][y-1]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //Z字顺转180度

  case 11: { a[x][y+1]=b[1]; a[x+2][y-1]=b[2]; a[x+2][ y]=b[3]; break; } //Z字顺转270度

  case 12: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y-1]=b[3]; break; }  //7字方块

 case 13: {a[x-2][y]=b[1]; a[x+2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转90度

  case 14: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x+2][y+1]=b[3]; break; }  //7字顺转180度

  case 15: { a[x-2][y]=b[1]; a[x-2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //7字顺转270度

  case 16: { a[x][y+1]=b[1]; a[x][y-1]=b[2]; a[x+2][y-1]=b[3]; break; }  //倒7字方块

 case 17: { a[x-2][y]=b[1]; a[x+2][y+1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转90度

 case 18: { a[x][y-1]=b[1]; a[x][y+1]=b[2]; a[x-2][y+1]=b[3]; break; }  //倒7字顺转180度

  case 19: { a[x-2][y]=b[1]; a[x-2][y-1]=b[2]; a[x+2][y]=b[3]; break; }  //倒7字顺转270度

 }

}

void keyD( )  //按键操作

{ if (kbhit( ))       

   { int key;

   key=getch();

     if (key==224)

       { key=getch();

     if (key==75) { x-=2; }  //按下左方向键,中心横坐标减2

         if (key==77) { x+=2; }  //按下右方向键,中心横坐标加2

    if (key==72)     //按下向上方向键,方块变体

          { if (flag>=2 && flag<=3 ) { flag++; flag%=2; flag+=2; }

           if ( flag>=4 && flag<=7 ) { flag++; flag%=4; flag+=4; }

           if (flag>=8 && flag<=11 ) { flag++; flag%=4; flag+=8; }

           if (flag>=12 && flag<=15 ) { flag++; flag%=4; flag+=12; }

           if ( flag>=16 && flag<=19 ) { flag++; flag%=4; flag+=16; } }

     }

   if (key==32)     //按空格键,暂停

        { prfk( ); while(1) { if (getch( )==32) { clfk( );break;} } } //再按空格键,继续游戏

   if (ifmov( )==0) { x=Tb; flag=Tc; } //如果不可动,撤销上面操作

   else { prfk( ); Sleep(speed); clfk( ); Tb=x;Tc=flag;} //如果可动,执行操作

  }

}

int ifmov( )   //判断能否移动

{ if (a[x][y]!=0) { return 0; }  //方块中心处有图案返回0,不可移动

 else{ if ( (flag==1 && ( a[x][ y-1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) || 

     (flag==2 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x+4][y]==0 ) ) || 

     (flag==3 && ( a[x][y-1]==0 && a[x][y-2]==0 && a[x][y+1]==0 ) ) ||

     (flag==4 && ( a[x-2][y]==0 && a[x+2][y]==0 && a[x][y+1]==0 ) ) ||

     (flag==5 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y]==0 ) ) ||

     (flag==6 && ( a[x][ y-1]==0 && a[x-2][y]==0 && a[x+2][y]==0 ) ) ||

     (flag==7 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y]==0 ) ) ||

     (flag==8 && ( a[x][y+1]==0 && a[x-2][y]==0 && a[x+2][y+1]==0 ) ) ||

     (flag==9 && ( a[x][y-1]==0 && a[x-2][y]==0 && a[x-2][y+1]==0 ) ) ||

     (flag==10 && ( a[x][y-1]==0 && a[x-2][y-1]==0 && a[x+2][y]==0 ) ) ||

     (flag==11 && ( a[x][y+1]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) ||

     (flag==12 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x-2][y-1]==0 ) ) ||

    (flag==13&&(a[x-2][y]==0&&a[x+2][y-1]==0&&a[x+2][y]==0))||

      (flag==14&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x+2][y+1]==0))||

    (flag==15&&(a[x-2][y]==0&&a[x-2][y+1]==0&&a[x+2][y]==0))||

    (flag==16&&(a[x][y+1]==0&&a[x][y-1]==0&&a[x+2][y-1]==0))||

    (flag==17&&(a[x-2][y]==0&&a[x+2][y+1]==0&&a[x+2][y]==0))||

      (flag==18&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x-2][y+1]==0))||

    (flag==19&&(a[x-2][y]==0&&a[x-2][y-1]==0

       && a[x+2][y]==0 ) ) ) { return 1; }

    }

  return 0; //其它情况返回0

}

void clNEXT( ) //清除框外的NEXT方块

{ flag = next;  x=ZL+WID+6;  y=ZL+10;  clfk( ); }

voidclHA( ) //清除满行的方块

{ int k, Hang=0;  //k是某行方块个数, Hang是删除的方块行数

 for(j=ZL+HEI-1;j>=ZL+1;j--)  //当某行有WID/2-2个方块时,则为满行

  { k=0; for(i=ZL+2;i<ZL+WID-2;i+=2)

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

     { k++; //下面将操作删除行

    if (k==WID/2-2) { for(k=ZL+2;k<ZL+WID-2;k+=2) 

      { a[k][j]=0; gtxy(k,j); printf("  "); Sleep(1); }

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

     { for(i=ZL+2;i<ZL+WID-2;i+=2)  //已删行数上面有方块,先清除再全部下移一行

      { if(a[i][k]==1) { a[i][k]=0; gtxy(i,k); printf("  ");a[i][k+1]=1; 

       gtxy(i,k+1); printf("□"); } }

      }

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

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

     }

   }

   }

  }

  score+=100*Hang; //每删除一行,得100分

 if ( Hang>0 && (score%500==0 || score/500> level-1 ) ) //得分满500速度加快升一级

  { speed-=20; level++; if(speed<200)speed+=20;} 

}

标签:C语言,方块,代码

版权声明:文章由 神舟问 整理收集,来源于互联网或者用户投稿,如有侵权,请联系我们,我们会立即处理。如转载请保留本文链接:https://www.shenzhouwen.com/life/299024.html
热门文章