c语言俄罗斯方块最简单代码(c语言编写俄罗斯方块全部程序)

http://www.itjxue.com  2023-03-17 15:06  来源:未知  点击次数: 

大叔用C语言实现俄罗斯方块小游戏,高手在民间!

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

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

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

游戏 欢迎界面

游戏 主界面:

游戏 结束界面:

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

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

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

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语言编写俄罗斯方块程序?

俄罗斯方块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语言写的俄罗斯方块程序?

1、考虑怎么存储俄罗斯方块

俄罗斯方块的形状一共有19种类型,如果拿数组来表示的话,可能会比较会浪费空间(网上有很多实现代码)

考虑到每种方块形状的范围是4 *4的小方块,用 字模点阵的方式来存储,即设置一个4行4列的数组,元素置1即代表这个位置有小?

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

1000?

1000?

1100?

0000?

上述4*4来表示L形状的方块。?

4*4 =16 bit 正好为short类型,所以每一个方块可以用一个short类型的数据来表示。

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

但是这种方式扩展性不好,每当有一种新方块时需要改动,?

所以可以写一个配置文件来表示19种方块。(RockShape.ini)

@###@###@@######1234

从配置文件中读取方块的类型的代码在(Init.h的ReadRock函数中)在下面3中解释下代码如何实现

2如何画出方块

可以使用EasyX库来画出简单的图形,?

EasyX库是在VC下实现TC的简单绘图功能的一个库,这个库很容易学会(直接 百度EasyX库,里面有详细的教程)

那么如何画出方块,方块已经存储到一个short类型中了?

从short中读取出,可以用一个掩码mask = 1来与short的每个bit位相与,结果为1,则画出一个小方块;?

函数声明:

void DisplayRock(int rockIdx, ?RockLocation_t* ?LocatePtr, bool displayed)1

参数1:表示在数组中的下标,取出short类型的方块表示数据?

参数2:表示当前坐标,即画出方块的左上角的坐标x,y?

参数3:true表示画出该方块,false 表示擦除该方块。

//方块在图形窗口中的位置(即定位4*4大块的左上角坐标) ?typedef struct LOCATE

{ ? ?int left; ? ?int top;

} RockLocation_t;123456

3如何实现同一种类型方块的翻转,

在按‘↑’时应该翻转同一种类型的方块,?

比如下面的横杆和竖杆

@###@###@###@###@@@@############****1234567891011

可以假想成静态循环链表来实现这种方式?

使同一种类型的方块循环起来,

用一个struct结构来表示一种方块

typedef struct ROCK

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

unsigned short rockShapeBits; ? ?int ? ? ? ? ?nextRockIndex; ?//下一个方块,在数组中的下标 ?} RockType;123456

定义一个RockType类型的数组来存储19种方块?

RockType RockArray[19] = { (0, 0) };

当我们按“↑”时,把传入画方块函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。

简单解释下ReadRock函数的实现:当读取到空行的时候表示 一种方块已经读取完毕,当读取到****?行时 表示同一种类型的方块读取完毕,具体看代码实现,代码中具体的注释

4、主要游戏实现的逻辑

贴一个预览图吧?

注:上述预览图的游戏控制区和游戏显示区在Draw.h的DrawGameWindow()函数实现的

(1)在初始位置画出方块,在预览区画出下一次的方块?

(2)方块有两种行为:响应键盘命令UserHitKeyBoard(),自由下落?

如果敲击键盘了(w ,a ,s ,d, )空格表示暂停,如果在规定时间内没有敲击键盘的话,方块自由下落一个单位

if (kbhit()) //如果敲击键盘了 就处理按键

{

userHit = getch();

UserHitKeyBoard(userHit, curRockIndex, curRockLocation);

} ? ? ? ?//没有 就自动下移一个单位 :不能用else,因为可能按键不是上下左右

DWORD newtime = GetTickCount(); ? ? ? ?if (newtime - oldtime = (unsigned int)(300) moveAbled == TRUE)

{

oldtime = newtime;

DisplayRock(curRockIndex, curRockLocation, false);

curRockLocation.top += ROCK_SQUARE_WIDTH; //下落一格

}1234567891011121314

(3)当方块落地(即不能下移了)时,判断是否满行,如果满行则消除,然后再判断游戏是否结束,游戏结束的话,直接退出游戏

判断满行:FullLine()函数,从最底下的一行开始判断,直到遇到一行空行,

while (count != xROCK_SQUARE_NUM ) //遇到空行 14

{

linefull = true; ? ? ? ?count = 0; ? ? ? ?for (int i = 1; i = xROCK_SQUARE_NUM; ++i)

{ ? ? ? ? ? ?if (game_board[idx][i] == 0)

{

linefull = false; ? ? ? ? ? ? ? ?count++;

}

} ? ? ? ?if (linefull) //满行,消除当前行,更新分数

{

DelCurLine(idx);//消除满行

game_socres += 3;

UpdateSocres(game_socres);

idx++;//因为下面要减1

}

idx--;

}123456789101112131415161718192021

(4)消除满行?

将要删除的满行擦除:即将方块化成与背景色相同的,该代码为黑色?

然后将上面的一行向下移,移一行删除一行,直到遇到空行?

具体看代码的具体实现 game.h?

void DelCurLine(int rowIdx)

(4)判断方块是否能移动?

在game.h中实现

bool MoveAble(int rockIndex, RockLocation_t* currentLocatePtr, int f_direction)1

**比较当前位置的坐标(左上角)开始,能否放下rockIndex的方块。?

注:f_direction为”↑”的话,则传入的rockIndex为下一个方块**

如果不能移动的话,给游戏game_board设置标记表示该位置被占有

//全局变量-游戏板的状态描述(即表示当前界面哪些位置有方块) ?//0表示没有,1表示有(多加了两行和两列,形成一个围墙,便于判断方块是否能够移动) ?int game_board[yROCK_SQUARE_NUM + 2][xROCK_SQUARE_NUM + 2] = { 0 };123

实现过程遇到的一些问题

(1)在快速下落的时候,可能方块会掉出围墙的范围内,?

快速下落是使方块每次下落2个单位距离。?

在判断不能下落时,使当前坐标的top即y减去一个单位的距离

(2)遇到多行满行时消除不了,?

在判断满行时,循环找出满行,找出一个满行,就消除一行,然后继续判断是否满行,直到遇到空行

求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);

}

(责任编辑:IT教学网)

更多

推荐其他WEB语言文章