c语言俄罗斯方块最简单代码(c语言编写俄罗斯方块全部程序)
大叔用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);
}