C语言小游戏源代俄罗斯方块.docx
《C语言小游戏源代俄罗斯方块.docx》由会员分享,可在线阅读,更多相关《C语言小游戏源代俄罗斯方块.docx(12页珍藏版)》请在冰豆网上搜索。
![C语言小游戏源代俄罗斯方块.docx](https://file1.bdocx.com/fileroot1/2022-10/7/df3e94f5-aad9-4951-9083-9ab63d41b388/df3e94f5-aad9-4951-9083-9ab63d41b3881.gif)
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,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