C语言俄罗斯方块游戏源代码.docx
- 文档编号:23897677
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:19
- 大小:53.71KB
C语言俄罗斯方块游戏源代码.docx
《C语言俄罗斯方块游戏源代码.docx》由会员分享,可在线阅读,更多相关《C语言俄罗斯方块游戏源代码.docx(19页珍藏版)》请在冰豆网上搜索。
C语言俄罗斯方块游戏源代码
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,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;i for(j=0;j {Position[i][j]=1; middle[i][j]=-1; } for(i=0;i for(j=0;j Position[i][j]=0; for(i=0;i for(j=0;j DrawBox(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;i for(j=0;j if(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;j if(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); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 俄罗斯方块 游戏 源代码