C语言俄罗斯方块游戏源代码.docx
《C语言俄罗斯方块游戏源代码.docx》由会员分享,可在线阅读,更多相关《C语言俄罗斯方块游戏源代码.docx(17页珍藏版)》请在冰豆网上搜索。
C语言俄罗斯方块游戏源代码
C语言俄罗斯方块游戏源代码
/*学无止境*/
#include
#include
#include
#defineESC27
#defineUP328
#defineDOWN336
#defineLEFT331
#defineRIGHT333
#defineBLANK32
#defineBOTTOM2
#defineCANNOT1
#defineCAN0
#defineMAX30
#defineF1315
#defineADD43
#defineEQUAL61
#defineDEC45
#defineSOUNDs115
{{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}},
{{1,1,1,0,0,1,0,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},
{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},
{1,0,0,0,1,1,0,0,1,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},
{0,1,1,0,1,1,0,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},
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0}},
{{1,0,0,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,1,1,0,0,0,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}},
{{0,0,1,0,1,1,1,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},
{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0}},
{{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}};
intb[4][4];
main(intargc,char*argv[])
{
if(argc!
=1)
{
if(argv[1]!
="")
Heng=atoi(argv[1]);
if(argv[2]!
="")
Shu=atoi(argv[2]);
}
Init();/*初始化界面*/
PreAct=random(8);/*取得当前的方块*/
for(;;)/*以下是游戏流程*/
{
NextAct=random(8);/*取得下一个方块*/
DrawNext
(1);/*画出下一个方块*/
Act=PreAct;
if(Heng%2==0)ActH=Heng/2;
elseActH=(Heng-1)/2;
ActS=0;/*方块开始从游戏空间的中间下落*/
Staus=0;/*取开始的状态*/
NoPass=CAN;/*物体可以下落*/
Give();/*取得当前的方块*/
Display(Act+1);/*显示当前的方块,每种方块的颜色不同*/
GoOn();/*游戏的算法精髓所在*/
PreAct=NextAct;/*方块下落完毕,取得下一个方块*/
DrawNext(0);
}
}
voidInit()
{
intGraphDriver=DETECT,GraphMode;
registerbgidriver(EGAVGA_driver);
initgraph(&GraphDriver,&GraphMode,"");
if(kbhit())Sounds=CANNOT;
setcolor
(1);
OutTextXY(10,10,"Tetris");
OutTextXY(30,30,"Version2.0");
OutTextXY(10,120,"Help:
");
OutTextXY(20,140,"+:
Faster");
OutTextXY(20,160,"-:
Slower");
OutTextXY(20,180,"Esc:
Quit");
OutTextXY(20,200,"F1:
Help");
OutTextXY(10,310,"Copyright(c)1998.2.22");
OutTextXY(10,320,"ByMr.Unique");
outtextxy(10,250,"Score:
00000");
rectangle(BeginH-3,BeginS-3,BeginH+Heng*(Wid+2)+2,BeginS+Shu*(Wid+2)+2);
rectangle(BeginH-5,BeginS-5,BeginH+Heng*(Wid+2)+4,BeginS+Shu*(Wid+2)+4);
rectangle(BeginH+(Heng+4)*(Wid+2)-2,BeginS+10,BeginH+(Heng+8)*(Wid+2)+2,BeginS+12+4*(Wid+2));
for(i=0;ifor(j=0;j{Position[i][j]=1;
middle[i][j]=-1;
}
for(i=0;ifor(j=0;jPosition[i][j]=0;
for(i=0;ifor(j=0;jDrawBox(i,j,0);
randomize();
}
voidGoOn()
{
for(;;)
{
Seconds+=0.2;/*控制方块的下落速度*/
if(Seconds>=Delays)
{
Down();
Seconds=0;
if(NoPass==BOTTOM)
{
DetectFill();
middle[ActH][ActS]=Act;
if(ActS==0)
Fail();
return;
}
}
if(kbhit())
Select();
}
}
voidDown()/*方块下降*/
{
Display(0);
if(Touch(ActH,ActS,0,1)==CAN)
ActS++;
else
middle[ActH][ActS]=Act;
Display(Staus+1);
}
intTouch(intx,inty,intdx,intdy)
{
NoPass=CAN;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
Position[x+dx+i][y+dy+j]+=b[i][j];
for(i=0;ifor(j=0;jif(Position[i][j]>1)
NoPass=CANNOT;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
Position[x+dx+i][y+dy+j]-=b[i][j];
middle[x+dx+i][y+dy+j]=Act;
}
if(NoPass==CANNOT&&dx==0&&dy==1)
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
Position[x+i][y+j]+=b[i][j];
NoPass=BOTTOM;
}
returnNoPass;
}
intGetKey(void)
{
intCh,Low,Hig;
Ch=bioskey(0);
Low=Ch&0x00ff;
Hig=(Ch&0xff00)>>8;
return(Low==0?
Hig+256:
Low);
}
voidSelect()
{
intOldStaus,acts=ActS;
switch(GetKey())
{
caseESC:
Quit();break;
caseDOWN:
Seconds+=14500;break;
caseLEFT:
Display(0);
if(ActH>0&&Touch(ActH,ActS,-1,0)==CAN)
{ActH--;}
Display(Act+1);break;
caseRIGHT:
Display(0);
if(ActH{ActH++;}
Display(Act+1);break;
caseBLANK:
Display(0);
ksdown();
Display(Act+1);
break;
caseF1:
Help();break;
caseEQUAL:
caseADD:
if(Delays>300)Delays-=100;break;
caseDEC:
if(Delays<3000)Delays+=100;break;
casePAUSEP:
casePAUSEp:
getch();break;
caseSOUNDS:
caseSOUNDs:
if(Sounds==CAN)
Sounds=CANNOT;
else
Sounds=CAN;break;
caseUP:
if(Act==7)
{
while(acts=1)
acts++;
Position[ActH][acts]=0;
DrawBox(ActH,acts,0);
acts=ActS;
break;
}
else
{
Display(0);
OldStaus=Staus;
switch(Act)
{
case0:
case3:
case4:
if(Staus==1)Staus=0;elseStaus=1;break;
case1:
break;
case2:
case5:
case6:
if(Staus==3)Staus=0;elseStaus+