C语言俄罗斯方块游戏源代码.docx
《C语言俄罗斯方块游戏源代码.docx》由会员分享,可在线阅读,更多相关《C语言俄罗斯方块游戏源代码.docx(19页珍藏版)》请在冰豆网上搜索。
C语言俄罗斯方块游戏源代码
/*学无止境*/
#include
#include
#include
#defineESC27
#defineUP328
#defineDOWN336
#defineLEFT331
#defineRIGHT333
#defineBLANK32
#defineBOTTOM2
#defineCANNOT1
#defineCAN0
#defineMAX30
#defineF1315
#defineADD43
#defineEQUAL61
#defineDEC45
#defineSOUNDs115
#defineSOUNDS83
#definePAUSEP80
#definePAUSEp112
voidInit();
voidDown();
voidGoOn();
voidksdown();
voidDisplay(intcolor);
voidGive();
intTouch(intx,inty,intdx,intdy);
intGeyKey();
voidSelect();
voidDetectFill();
voidGetScores();
voidFail();
voidHelp();
voidQuit();
voidDrawBox(intx,inty,intColor);
voidOutTextXY(intx,inty,char*String);
voidDispScore(intx,inty,charCh);
voidDrawNext(intColor);
intHeng=12,Shu=20;/*横竖*/
intPosition[MAX][MAX];
intmiddle[MAX][MAX];
intActH,ActS;
intAct,Staus;
inti,j,k;
intWid=10;
intNoPass=CAN;
floatDelays=15000;
intBeginH=250,BeginS=7;
floatSeconds=0;
intScores=0;
intflag=1;
intSounds=CAN;
intPreAct,NextAct;
inta[8][4][4][4]={{{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},
{1,1,1,1,0,0,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},
{1,1,1,1,0,0,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,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,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++;break;
}
Give();
if(Touch(ActH,ActS,0,0)==CANNOT)
{
Staus=OldStaus;
Give();
}
Display(Act+1);
break;
}
}
}
voidksdown()
{
while(flag){
if(Touch(ActH,ActS,0,0)==CAN){ActS++;}
else{
ActS--;
flag=0;
}
}
flag=1;
}
voidQuit()
{
intch,TopScore;
FILE*fp;
if((fp=fopen("Russian.scr","r+"))!
=NULL)
{
fscanf(fp,"%d",&TopScore);
if(Scores>TopScore)
{
setcolor
(1);
outtextxy(470,80,"Hello!
");
outtextxy(470,100,"Inalltheplayers,");
outtextxy(470,120,"YouaretheFirst!
");
outtextxy(470,140,"Andyourscorewill");
outtextxy(470,160,"betheNEWRECORD!
");
fseek(fp,0L,0);
fprintf(fp,"%d",Scores);
}
fclose(fp);
}
setcolor
(1);
OutTextXY(470,220,"AreYouSure(Yes/no)?
");
ch=getch();
if(ch=='y'||ch=='Y')
{
closegraph();
delay(20);
exit(0);
}
setcolor(0);
outtextxy(470,220,"AreYouSure(Yes/no)?
");
}
voidOutTextXY(intx,inty,char*String)
{
inti=0;
chara[2];
moveto(x,y);
a[1]='\0';
while(*(String+i)!
='\0')
{
a[0]=*(String+i);
outtext(a);
if(Sounds==CAN&&a[0]!
='')
{
sound(3000);
delay(50);
nosound();
}
i++;
}
}
voidHelp()
{
unsignedSave;
void*Buf;
Save=imagesize(160,120,500,360);
Buf=malloc(Save);
getimage(160,120,500,360,Buf);
setfillstyle(1,1);
bar(160,120,500,280);
setcolor(0);
OutTextXY(170,130,"About&Help");
OutTextXY(170,150,"################");
OutTextXY(170,160,"##################");
OutTextXY(170,170,"########################");
OutTextXY(170,180,"#############");
OutTextXY(170,190,"#############");
OutTextXY(170,200,"#############");
OutTextXY(170,210,"#################");
OutTextXY(170,220,"############");
OutTextXY(170,230,"############");
OutTextXY(170,260,"GoodLucklytoYou!
!
!
");
getch();
putimage(160,120,Buf,0);
free(Buf);
}
voidGetScores()
{
intSec10000,Sec1000,Sec100,Sec10,Sec1;
setfillstyle(0,1);
bar(60,250,109,260);
Sec1=Scores%10;
Sec10=(Scores%100-Scores%10)/10;
Sec100=(Scores%1000-Scores%100)/100;
Sec1000=(Scores%10000-Scores%1000)/1000;
Sec10000=(Scores%100000-Scores%10000)/10000;
DispScore(60,250,'0'+Sec10000);
DispScore(70,250,'0'+Sec1000);
DispScore(80,250,'0'+Sec100);
DispScore(90,250,'0'+Sec10);
DispScore(100,250,'0'+Sec1);
DispScore(110,250,'0');
DispScore(120,250,'0');
}
voidDispScore(intx,inty,charCh)
{
chara[2];
a[1]='\0';
a[0]=Ch;
outtextxy(x,y,a);
}
voidGive()
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
b[i][j]=a[Act][Staus][i][j];
}
voidDisplay(intcolor)
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(b[i][j]==1)DrawBox(ActH+i,ActS+j,color);
}
voidDrawBox(intx,inty,intColor)
{
x=BeginH+x*(Wid+2);
y=BeginS+y*(Wid+2);
setfillstyle(1,Color);
bar(x+2,y+2,x+Wid-1,y+Wid-1);
if(Color==0)
setcolor(9);
else
setcolor(Act+1);
rectangle(x+4,y+4,x+Wid-4,y+Wid-4);
}
voidDrawNext(intColor)
{
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[NextAct][0][i][j]==1)DrawBox(Heng+4+i,1+j,Color);
}
voidDetectFill()
{
intNumber,Fall,FallTime=0;
for(i=Shu-1;i>=0;i--)
{
Number=0;
for(j=0;jif(Position[j][i]==1)Number++;
if(Number==Heng)
{
FallTime++;
if(Sounds==CAN)
{
sound(500);
delay(500);
nosound();
}
for(Fall=i;Fall>0;Fall--)
for(j=0;j{
Position[j][Fall]=Position[j][Fall-1];
middle[j][Fall]=middle[j][Fall-1];
if(Position[j][Fall]==0)DrawBox(j,Fall,0);
elseDrawBox(j,Fall,middle[j][Fall]+1);
}
i++;
}
}
switch(FallTime)
{
case0:
break;
case1:
Scores+=1;break;
case2:
Scores+=3;break;
case3:
Scores+=6;break;
case4:
Scores+=10;break;
}
if(FallTime!
=0)
{
GetScores();
if(Scores%100==0)Delays-=100;
}
}
voidFail()
{
if(Sounds==CAN)
{
for(k=0;k<3;k++)
{
sound(300);
delay(200);
nosound();
}
}
setcolor
(1);
OutTextXY(440,200,"Gameover!
");
Quit();
closegraph();
exit(0);
}