您的位置:

c语言代码俄罗斯方块,用c语言编写俄罗斯方块代码

本文目录一览:

求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语言代码俄罗斯方块(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语言编写俄罗斯方块程序 求详解

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语言实现俄罗斯方块小游戏,高手在民间!

我这次给大家带来的是,俄罗斯方块的小 游戏 ,在这个程序中,我们几乎用到了之前所有的知识点,还用到了一些ege库里边的函数和功能,比如:按键处理,文字输出、图形绘制,还有图片的显示等。

主要为大家详细介绍了Linux下C语言实现俄罗斯方块小 游戏 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

下面是我整理的C++资料,私信我“01”就可以获取了

游戏 欢迎界面

游戏 主界面:

游戏 结束界面:

我们看到的 游戏 池中所有的方块(包括正在下落的模块),都是根据上述的结构体pool中的数据在屏幕中打印出来的结果。也就是我们通过不断更改pool结构体中的数据,然后再将pool中的数据不停的显示到屏幕,就变成了我们看到的模块的移动、翻转、消行等效果。

C语言实现俄罗斯方块小 游戏 的制作代码,具体内容如下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我下次的作品。

怎样用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语言俄罗斯方块代码

#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();

}