当前位置:首页 > 代码 > 正文

c俄罗斯方块代码(c++俄罗斯方块最简单代码)

admin 发布:2022-12-19 04:05 90


本篇文章给大家谈谈c俄罗斯方块代码,以及c++俄罗斯方块最简单代码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

C语言代码俄罗斯方块(yCodeBlocks)?

#include "mywindows.h"

HANDLE handle;

// 初始化句柄

void initHandle()

{

handle = GetStdHandle(STD_OUTPUT_HANDLE);

}

// 设置颜色

void setColor(int color)

{

SetConsoleTextAttribute(handle, color);

}

void setPos(int x, int y)

{

//, ,

COORD coord = {x*2, y};

SetConsoleCursorPosition(handle, coord);

}

// 设置光标是否可见

void setCursorVisible(int flag)

{

CONSOLE_CURSOR_INFO info;

info.bVisible = flag; //光标是否可见

info.dwSize = 100; //光标宽度1-100

SetConsoleCursorInfo(handle, info);

}

// 关闭句柄

void closeHandle()

{

CloseHandle(handle);

}

求C语言俄罗斯方块代码

俄罗斯方块C源代码

#include stdio.h

#include windows.h

#include conio.h

#include time.h

#define  ZL  4     //坐标增量, 不使游戏窗口靠边

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

#define 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( );  //获得下一方块序号

void csh( );  //初始化界面

void start( );  //开始部分

void prfk ( );  //打印方块

void clfk( );  //清除方块

void mkfk( );  //制作方块

void keyD( );  //按键操作

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

void clHA( );  //清除满行的方块

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

int main( )

{ csh( );

while(1)

   {start( );  //开始部分

     while(1)

     { prfk( );  

         Sleep(speed);  //延时

        clfk( );

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

        keyD( );  

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

       if (ifmov( )==0) { y--; prfk( ); dlHA( ); break;} //不可动放下,删行,跨出循环

     }

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

   if (j==0) { system("cls");gtxy(10,10);printf("游戏结束!"); getch(); break; }

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

  }

return 0;

}

void gtxy(int m, int n)  //控制光标移动

{COORD pos;  //定义变量

pos.X = m;  //横坐标

pos.Y = n;   //纵坐标

SetConsoleCursorPosition(GetStdHandle(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;iWID-2;i+=2) {gtxy(ZL+i,ZL);  printf("═"); }  //打印上横框

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

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

for(i=1;iHEI;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;i4;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  jZL ){ 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;i4;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  jZL ){ 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( ); }

void clHA( )   //清除满行的方块

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

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

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

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

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

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

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

        for(k=j-1;kZL;k--)

        { for(i=ZL+2;iZL+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 ( Hang0  (score%500==0 || score/500 level-1 ) )  //得分满500速度加快升一级

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

}

怎样用c语言编写俄罗斯方块程序?

俄罗斯方块C源代码

#include stdio.h

#include windows.h

#include conio.h

#include time.h

#define  ZL  4     //坐标增量, 不使游戏窗口靠边

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

#define 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( );  //获得下一方块序号

void csh( );  //初始化界面

void start( );  //开始部分

void prfk ( );  //打印方块

void clfk( );  //清除方块

void mkfk( );  //制作方块

void keyD( );  //按键操作

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

void clHA( );  //清除满行的方块

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

int main( )

{ csh( );   

   while(1)

     {start( );  //开始部分

       while(1)

       { prfk( );  

         Sleep(speed);  //延时

          clfk( );

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

          keyD( );  

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

         if (ifmov( )==0) { y--; prfk( ); dlHA( ); break;} //不可动放下,删行,跨出循环

       }

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

     if (j==0) { system("cls");gtxy(10,10);printf("游戏结束!"); getch(); break; } 

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

    }

  return 0;

}

void gtxy(int m, int n)  //控制光标移动

{COORD pos;  //定义变量

pos.X = m;  //横坐标

pos.Y = n;   //纵坐标

SetConsoleCursorPosition(GetStdHandle(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;iWID-2;i+=2) {gtxy(ZL+i,ZL);  printf("═"); }  //打印上横框

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

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

for(i=1;iHEI;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;i4;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  jZL ){ 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;i4;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  jZL ){ 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( ); }

void clHA( )   //清除满行的方块

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

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

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

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

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

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

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

        for(k=j-1;kZL;k--)

        { for(i=ZL+2;iZL+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 ( Hang0  (score%500==0 || score/500 level-1 ) )  //得分满500速度加快升一级

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

}

如何用C语言编一个俄罗斯方块

游戏界面预览:

菜单预览:

自定义每个小方块颜色功能界面:

游戏主要有四部分组成:Square类,Block类,gameField类,游戏引擎

Square类:

这个类描述的对象是组成大方块中的每个小正方形实体。

类设计:

class Square

{

public Point location; //小方块的坐标

public Size size; //小方块大小

public Color foreColor; //小方块前景色

public Color backColor; //小方块背景色

public Square(Size initSize,Color initForeColor,Color initBackColor) //构造函数

{ ……}

public void Draw(System.IntPtr winHandle) //在指定设备上画方块

{ …… }

public void Erase(System.IntPtr winHandle)//擦除方块

{ …… }

}

Block类:

这个类描述的对象是某一个大方块的实体。每个大方块由四个小正方形组成,一共有7种组合方式。这个类需要实现一个大方块实体所有的属性和动作。包括:方块的形状,位置,方块左移,右移,下移,旋转等。

类设计:

class Block

{

public Square square1; //组成block的四个小方块

public Square square2;

public Square square3;

public Square square4; private const int squareSize = GameField.SquareSize; //小方块的边长

public enum BlockTypes

{

undefined = 0,

square = 1,

line = 2,

J = 3,

L = 4,

T = 5,

Z = 6,

S = 7

};//一共有7种形状

public BlockTypes blockType; //方块的形状

//七个小方块的颜色数组

private Color foreColor;

private Color backColor;

//方块的方向

public enum RotateDirections

{

North = 1,

East = 2,

South = 3,

West = 4

};

public RotateDirections myRotation = RotateDirections.North;

public Block(Point thisLocation,BlockTypes bType)

{ ……}

//含有自定义颜色的重载

public Block(Point thisLocation, BlockTypes bType,Color fc,Color bc)

{ ……} /*画方块*/

public void Draw(System.IntPtr winHandle)

{…… }

/*擦方块*/

public void Erase(System.IntPtr winHandle)

{…… } /*移动*/

public bool down()

{……}

public bool left()

{……}

public bool right()

{……}

/*旋转block*/

public void Rotate()

{……}

/*检测是否到顶*/

public int Top()

{……}

}

GameField类:

这个类描述的对象是游戏场景实体,包括场景的背景色,大小,方块是否还可以移动,以及场景中填满一行的检测等。

类设计:

class GameField

{

public const int width = 20; //场景的宽,以方块个数为单位

public const int height = 30;

public const int SquareSize = 15; //每个四分之一小方块的边长

public static Color BackColor; //场景的背景色

public static System.IntPtr winHandle; //场景的handle

public static Color[] BlockForeColor ={ Color.Blue, Color.Beige, Color.DarkKhaki, Color.DarkMagenta, Color.DarkOliveGreen, Color.DarkOrange, Color.DarkRed };

public static Color[] BlockBackColor ={ Color.LightCyan, Color.DarkSeaGreen, Color.Beige, Color.Beige, Color.Beige, Color.Beige, Color.Beige };

public static bool isChanged=false; //设置是否被更改的标志位

public static SoundPlayer sound = new SoundPlayer(); //播放声音 public static Square[,] arriveBlock = new Square[width, height]; //保存已经不能再下落了的方块

public static int[] arrBitBlock=new int[height]; //位数组:当某个位置有方块时,该行的该位为1

private const int bitEmpty = 0x0; //0000 0000 0000 0000 0000

private const int bitFull = 0xFFFFF; //1111 1111 1111 1111 1111 /*检测某个位置是否为空*/

public static bool isEmpty(int x, int y)

{……}

/*将方块停住*/

public static void stopSquare(Square sq, int x, int y)

{……}

/*检测行是否满

* 返回:成功消除的行数和 (方便统计分数)

*/

public static int CheckLines()

{ ……}

/*播放声音*/

public static void PlaySound(string soundstr)

{……}

/*重画*/

public static void Redraw()

{ …… }

//结束

}

游戏引擎:

游戏引擎正如其名,就像一个发动机一样让游戏不间断运行。本游戏中就是让方块以一定的速度下落。并响应键盘事件,实行左右移动,和向下加速功能。(代码见源码)

声音播放:

音效是游戏不可缺少的一部分。在.Net2.0中已经提供了一个类来播放声音。在using System.Media;命名空间。

本游戏中播放声音的代码如下:(在 GameField类中)

using System.Media;

public static SoundPlayer sound = new SoundPlayer();

/*播放声音*/

public static void PlaySound(string soundstr)

{

switch (soundstr)

{

case "FinishOneLine": //消除一行的声音

if (!File.Exists("FinishOneLine.wav")) return;

sound.SoundLocation = "FinishOneLine.wav";

break;

case "CanNotDo": //当无法操作时

if (!File.Exists("CanNotDo.wav")) return;

sound.SoundLocation = "CanNotDo.wav";

break;

}

sound.Play();

}

要播放的时候调用PlaySound()方法即可。

其实步骤很简单,先引用System.Media空间,然后创建一个SoundPlayer 对象,用SoundLocation 属性设置声音文件的地址,然后调用Play()方法即可播放。不过注意,这个类可以播放的声音格式只有Wav文件。

保存游戏设置:

在游戏中经常要保存用户自定义的设置。本游戏通过写进ini文件来保存。

主要代码如:

/*加载窗体时从配置文件Setting.ini中读取游戏设置*/

private void getSettings()

{

if (!File.Exists("Setting.ini"))

return;

FileStream fs = new FileStream("Setting.ini", FileMode.OpenOrCreate, FileAccess.ReadWrite);

StreamReader sr = new StreamReader(fs);

string line1=sr.ReadLine();

string line2=sr.ReadLine();

string line3=sr.ReadLine();

if (line1 != null line1.Split('=').Length 1)

{

GameField.BackColor = Color.FromArgb(int.Parse(line1.Split('=')[1]));

picBackGround.BackColor = GameField.BackColor;

}

if (line2 != null line2.Split('=').Length 1)

GameField.BlockForeColor = strToColor(line2.Split('=')[1]);

if (line3 != null line3.Split('=').Length 1)

GameField.BlockBackColor = strToColor(line3.Split('=')[1]);

sr.Close();

fs.Close();

}

/*如果游戏设置被更改,将新的设置保存到Setting.ini*/

private void saveSettings()

{

FileStream fs = new FileStream("Setting.ini", FileMode.Create, FileAccess.ReadWrite);

StreamWriter sw = new StreamWriter(fs);

sw.WriteLine("GameFieldColor="+GameField.BackColor.ToArgb());

sw.WriteLine("BlockFroeColor=" + colorToStr(GameField.BlockForeColor));

sw.WriteLine("BlockBackColor=" + colorToStr(GameField.BlockBackColor));

sw.Flush();

sw.Close();

fs.Close();

}

要源码+QQ348199903

c语言俄罗斯方块代码

#include stdio.h 

#include dos.h 

#include conio.h 

#include graphics.h 

#include stdlib.h 

#ifdef __cplusplus 

#define __CPPARGS ... 

#else 

#define __CPPARGS 

#endif 

#define MINBOXSIZE 15 /* 最小方块的尺寸 */ 

#define BGCOLOR 7 /* 背景着色 */ 

#define GX 200 

#define GY 10 

#define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ 

/* 按键码*/ 

#define VK_LEFT 0x4b00 

#define VK_RIGHT 0x4d00 

#define VK_DOWN 0x5000 

#define VK_UP 0x4800 

#define VK_HOME 0x4700 

#define VK_END 0x4f00 

#define VK_SPACE 0x3920 

#define VK_ESC 0x011b 

#define VK_ENTER 0x1c0d 

/* 定义俄罗斯方块的方向(我定义他为4种)*/ 

#define F_DONG 0 

#define F_NAN 1 

#define F_XI 2 

#define F_BEI 3 

#define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/ 

#define NEXTROW 12 /* 要出的下一个方块的横从标*/ 

#define MAXROW 14 /* 游戏屏幕大小*/ 

#define MAXCOL 20 

#define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/ 

#define SCROW 60 

int gril[22][16]; /* 游戏屏幕坐标*/ 

int col=1,row=7; /* 当前方块的横纵坐标*/ 

int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/ 

int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ 

int minboxcolor=6,nextminboxcolor=6; 

int num=0; /*游戏分*/ 

int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*/ 

/* 以下我用了一个3维数组来纪录方块的最初形状和方向*/ 

int boxstr[7][4][16]={{ 

{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, 

{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}, 

{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, 

{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}}, 

{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}, 

{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}, 

{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0}, 

{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}, 

{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0}, 

{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0}, 

{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0}, 

{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}}, 

{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0}, 

{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0}, 

{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0}, 

{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}}, 

{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, 

{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}, 

{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0}, 

{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}}, 

{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}, 

{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}, 

{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}, 

{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}}, 

{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0}, 

{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0}, 

{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0}, 

{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}} 

}; 

/* 随机得到当前方块和下一个方块的形状和方向*/ 

void boxrad(){ 

minboxcolor=nextminboxcolor; 

boxgs=nextboxgs; 

boxfx=nextboxfx; 

nextminboxcolor=random(14)+1; 

if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8) 

nextminboxcolor=9; 

nextboxfx=F_DONG; 

nextboxgs=random(7); 

/*初始化图形模试*/ 

void init(int gdrive,int gmode){ 

int errorcode; 

initgraph(gdrive,gmode,"e:\\tc"); 

errorcode=graphresult(); 

if(errorcode!=grOk){ 

printf("error of: %s",grapherrormsg(errorcode)); 

exit(1); 

/* 在图形模式下的清屏 */ 

void cls() 

setfillstyle(SOLID_FILL,0); 

setcolor(0); 

bar(0,0,640,480); 

/*在图形模式下的高级清屏*/ 

void clscr(int a,int b,int c,int d,int color){ 

setfillstyle(SOLID_FILL,color); 

setcolor(color); 

bar(a,b,c,d); 

/*最小方块的绘制*/ 

void minbox(int asc,int bsc,int color,int bdcolor){ 

int a=0,b=0; 

a=SCCOL+asc; 

b=SCROW+bsc; 

clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color); 

if(color!=BGCOLOR){ 

setcolor(bdcolor); 

line(a+1,b+1,a-1+MINBOXSIZE,b+1); 

line(a+1,b+1,a+1,b-1+MINBOXSIZE); 

line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE); 

line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE); 

/*游戏中出现的文字*/ 

void txt(int a,int b,char *txt,int font,int color){ 

setcolor(color); 

settextstyle(0,0,font); 

outtextxy(a,b,txt); 

/*windows 绘制*/ 

void win(int a,int b,int c,int d,int bgcolor,int bordercolor){ 

clscr(a,b,c,d,bgcolor); 

setcolor(bordercolor); 

line(a,b,c,b); 

line(a,b,a,d); 

line(a,d,c,d); 

line(c,b,c,d); 

/* 当前方块的绘制*/ 

void funbox(int a,int b,int color,int bdcolor){ 

int i,j; 

int boxz[4][4]; 

for(i=0;i16;i++) 

boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];

for(i=0;i4;i++) 

for(j=0;j4;j++) 

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

minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor); 

/*下一个方块的绘制*/ 

void nextfunbox(int a,int b,int color,int bdcolor){ 

int i,j; 

int boxz[4][4]; 

for(i=0;i16;i++) 

boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];

for(i=0;i4;i++) 

for(j=0;j4;j++) 

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

minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor); 

/*时间中断定义*/ 

#define TIMER 0x1c 

int TimerCounter=0; 

void interrupt ( *oldhandler)(__CPPARGS); 

void interrupt newhandler(__CPPARGS){ 

TimerCounter++; 

oldhandler(); 

void SetTimer(void interrupt (*IntProc)(__CPPARGS)){ 

oldhandler=getvect(TIMER); 

disable(); 

setvect(TIMER,IntProc); 

enable(); 

/*由于游戏的规则,消掉都有最小方块的一行*/ 

void delcol(int a){ 

int i,j; 

for(i=a;i1;i--) 

for(j=1;j15;j++){ 

minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR); 

gril[i][j]=gril[i-1][j];

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

minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0); 

/*消掉所有都有最小方块的行*/ 

void delete(){ 

int i,j,zero,delgx=0; 

char *nm="00000"; 

for(i=1;i21;i++){ 

zero=0; 

for(j=1;j15;j++) 

if(gril[j]==0) 

zero=1; 

if(zero==0){ 

delcol(i); 

delgx++; 

num=num+delgx*delgx*10; 

dj=num/10000; 

sprintf(nm,"%d",num); 

clscr(456,173,500,200,4); 

txt(456,173,"Number:",1,15); 

txt(456,193,nm,1,15); 

/*时间中断结束*/ 

void KillTimer(){ 

disable(); 

setvect(TIMER,oldhandler); 

enable(); 

/* 测试当前方块是否可以向下落*/ 

int downok(){ 

int i,j,k=1,a[4][4]; 

for(i=0;i16;i++) 

a[i/4][i%4]=boxstr[boxgs][boxfx][i];

for(i=0;i4;i++) 

for(j=0;j4;j++) 

if(a[j]  gril[col+i+1][row+j]) 

k=0; 

return(k); 

/* 测试当前方块是否可以向左行*/ 

int leftok(){ 

int i,j,k=1,a[4][4]; 

for(i=0;i16;i++) 

a[i/4][i%4]=boxstr[boxgs][boxfx][i];

for(i=0;i4;i++) 

for(j=0;j4;j++) 

if(a[j]  gril[col+i][row+j-1]) 

k=0; 

return(k); 

/* 测试当前方块是否可以向右行*/ 

int rightok(){ 

int i,j,k=1,a[4][4]; 

for(i=0;i16;i++) 

a[i/4][i%4]=boxstr[boxgs][boxfx][i];

for(i=0;i4;i++) 

for(j=0;j4;j++) 

if(a[j]  gril[col+i][row+j+1]) 

k=0; 

return(k); 

/* 测试当前方块是否可以变形*/ 

int upok(){ 

int i,j,k=1,a[4][4]; 

for(i=0;i4;i++) 

for(i=0;i16;i++) 

a[i/4][i%4]=boxstr[boxgs][boxfx+1][i];

for(i=3;i=0;i--) 

for(j=3;j=0;j--) 

if(a[j]  gril[col+i][row+j]) 

k=0; 

return(k); 

/*当前方块落下之后,给屏幕坐标作标记*/ 

void setgril(){ 

int i,j,a[4][4]; 

funbox(0,0,minboxcolor,0); 

for(i=0;i16;i++) 

a[i/4][i%4]=boxstr[boxgs][boxfx][i];

for(i=0;i4;i++) 

for(j=0;j4;j++) 

if(a[j]) 

gril[col+i][row+j]=1; 

col=1;row=7; 

/*游戏结束*/ 

void gameover(){ 

int i,j; 

for(i=20;i0;i--) 

for(j=1;j15;j++) 

minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0); 

txt(103,203,"Game Over",3,10); 

/*按键的设置*/ 

void call_key(int keyx){ 

switch(keyx){ 

case VK_DOWN: { /*下方向键,横坐标加一。*/ 

if(downok()){ 

col++; 

funbox(0,0,minboxcolor,0);} 

else{ 

funbox(0,0,minboxcolor,0); 

setgril(); 

nextfunbox(NEXTCOL,NEXTROW,4,4); 

boxrad(); 

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0); 

delete(); 

break; 

case VK_UP: { /*上方向键,方向形状旋转90度*/ 

if(upok()) 

boxfx++; 

if(boxfx3) 

boxfx=0; 

funbox(0,0,minboxcolor,0); 

break; 

case VK_LEFT:{ /*左方向键,纵坐标减一*/ 

if(leftok()) 

row--; 

funbox(0,0,minboxcolor,0); 

break; 

case VK_RIGHT:{ /*右方向键,纵坐标加一*/ 

if(rightok()) 

row++; 

funbox(0,0,minboxcolor,0); 

break; 

case VK_SPACE: /*空格键,直接落到最后可以落到的们置*/ 

while(downok()) 

col++; 

funbox(0,0,minboxcolor,0); 

setgril(); 

nextfunbox(NEXTCOL,NEXTROW,4,4); 

boxrad(); 

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0); 

delete(); 

break; 

default: 

txt(423,53,"worng key!",1,4); 

txt(428,80,"Plese Enter Anly Key AG!",1,4); 

getch(); 

clscr(420,50,622,97,BGCOLOR); 

/*时间中断开始*/ 

void timezd(void){ 

int key; 

SetTimer(newhandler); 

boxrad(); 

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0); 

for(;;){ 

if(bioskey(1)){ 

key=bioskey(0); 

funbox(0,0,BGCOLOR,BGCOLOR); 

if(key==VK_ESC) 

break; 

call_key(key); 

if(TimerCountergamedj[dj]){ 

TimerCounter=0; 

if(downok()){ 

funbox(0,0,BGCOLOR,BGCOLOR); 

col++; 

funbox(0,0,minboxcolor,0); 

else { 

if(col==1){ 

gameover(); 

getch(); 

break; 

setgril(); 

delete(); 

funbox(0,0,minboxcolor,0); 

col=1;row=7; 

funbox(0,0,BGCOLOR,BGCOLOR); 

nextfunbox(NEXTCOL,NEXTROW,4,4); 

boxrad(); 

nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0); 

/*主程序开始*/ 

void main(void){ 

int i,j; 

char *nm="00000"; 

init(VGA,VGAHI); 

cls(); 

/*屏幕坐标初始化*/ 

for(i=0;i=MAXCOL+1;i++) 

for(j=0;j=MAXROW+1;j++) 

gril[i][j]=0;

for(i=0;i=MAXCOL+1;i++) { 

gril[i][0]=1;

gril[i][15]=1;

for(j=1;j=MAXROW;j++){ 

gril[0][j]=1; 

gril[21][j]=1; 

clscr(0,0,640,480,15); 

win(1,1,639,479,4,15); 

win(SCCOL+MINBOXSIZE-2,SCROW+MINBOXSIZE-2,SCCOL+15*MINBOXSIZE+2,SCROW+21*MINBOXSIZE+2,BGCOLOR,0); 

nextboxgs=random(8); 

nextboxfx=random(4); 

sprintf(nm,"%d",num); 

txt(456,173,"Number:",1,15); 

txt(456,193,nm,1,15); 

txt(456,243,"Next Box:",1,15); 

timezd(); 

KillTimer(); 

closegraph(); 

getch();

}

用c语言编写俄罗斯方块程序 求详解

1、用C语言绘制图形界面

EasyX图形库()即TC的图形库在VC下的移植。

包含库#include graphics.h

先初始化图形窗口

initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH为窗口的宽带,WINDOW_HIGH为窗口的高度。

清空绘图设备

cleardevice();

设置画笔颜色

setcolor(RED) ;

设置线条风格

setlinestyle(PS_SOLID, NULL, 0);

画矩形

rectangle

还有画线、显示文字等函数,可以参照其帮助文档。

注意:由于我们用的是EasyX图形库,故源文件后缀要为.cpp,但其中内容都是C的语法。

2、存储表示出俄罗斯方块的形状

一、我们可以用编号,不同的编号代表不同的俄罗斯方块,根据编号把不同方块的画法写在代码中,这样19种

方块就得有19种相应的代码来描绘。而且这样扩展性不好,若以后设计了新的方块,则需要更改大量源代码。

二、我们很自然的想到可用字模点阵的形式来表示,即设置一个4行4列的数组,元素置1即代表这个位置有小

方块,元素置0即代表这个位置无小方块,这个整个的4*4的数组组成俄罗斯方块的形状。

1000

1000

1100

0000

这个方法挺靠谱,但我们还可以优化一下:不用4*4的数组,而是用16个bit位来表示这个点阵。这样存储起来比较方便,故我们用unsigned int 的低16位来表示方块的点阵。

我们可以用掩码与表示俄罗斯方块的位进行操作,来识别并在屏幕上画出方块。

我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。

但这样做未免有点太费力,且扩展性也不太好,若以后设计的新方块种类加入,要改变数组rockArray中的值。

我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中,在程序初始化时读取文件,把这些点阵转换成unsigned int的变量存储在rockArray中。

这样,以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可。

@###

@###

@@##

####   (为使得看起来更醒目,我们用@表示1,用#表示0)

3、让图形动起来

在某位置处用函数DrawRock在屏幕上画出俄罗斯方块,然后再擦除掉(即用背景色在原位置处重绘一次方块),最后在下落的下一个位置处用函数DrawRock在屏幕上画出俄罗斯方块,如此循环,中间用计时器间隔一段时间以控制下落的速度。

同理,按下屏幕的左右键也是如此,只是在按下键盘时把方块的位置重新计算了。

那么按下上方向键时,如何让方块翻转呢?

我们在配置文件中就把方块的顺时针翻转形态放在了一起:

@###

@###

@@##

####

@@@#

@###

####

####

@@##

#@##

#@##

####

##@#

@@@#

####

####

我们每按一次上方向键改变一次方块的形状即可。若一直按上键,形状应该是循环地翻滚。

我们想到了循环链表的数据结构可实现这个效果。

可是我们若把这些一种类的方块的各种形态串成循环链表形式,那么每次重新生成方块时我们就难以随机地生成方块了。

故还是得用数组来存储,但又要有循环链表的功能,于是我们想到了静态循环链表。

我们用结构体来作为一个方块在rockArray中的元素

typedef struct ROCK

{  //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行)

unsigned int rockShapeBits ;

int          nextRockIndex ;  //下一个方块,在数组中的下标

} RockType ;

这样,当我们按下上方向键时,把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。

参考资料:C语言图形界面篇

关于c俄罗斯方块代码和c++俄罗斯方块最简单代码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/2121.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载