C语言实现俄罗斯方块游戏 TC2.0环境,主要用到TC提供的graphics来实现相关的绘图,实际运行效果如下:
对应TC2.0下载http://www.dotcpp.com/wp/144.html
作者原创亲测,源码如下:
- /********************************************************************/
- // Name:俄-罗-斯-方-块 V1.0
- // Author:Giant
- // Time: 2015/5/17
- /********************************************************************/
- #include"graphics.h"
- #include"time.h"
- #include"math.h"
- #include"dos.h"
- #include"conio.h"
- #define NULL 0
- #define False 0
- #define True 1
- #define REVOLVE 5
- #define DOWN 2
- #define LEFT 3
- #define RIGHT 4
- #define TIMER 0x1c
- #define ESC 27
- #define DOWN_MAX 420
- void interrupt (*oldtimer)(void);
- static unsigned grade=0;
- char msg[10]="Grade : ";
- char msg1[10]="\0";
- typedef struct boxes
- {
- unsigned int box;
- int color;
- int next;
- }DESIGN;
- DESIGN a[19]={35008,2,1, /* The 19 shapes of boxes ,includes size,color and the next number*/
- 3712,2,2,
- 50240,2,3,
- 736,2,0,
- 1100,YELLOW,5,
- 2272,YELLOW,6,
- 51328,YELLOW,7,
- 3616,YELLOW,4,
- 35904,4,9,
- 1728,4,8,
- 19584,12,11,
- 3168,12,10,
- 1248,5,13,
- 35968,5,14,
- 3648,5,15,
- 19520,5,12,
- 34952,6,17,
- 3840,6,16,
- 3264,10,18};
- int screeninarry[19][21]={0};
- int TimerCounter=0;
- void interrupt newtimer(void)
- {
- (*oldtimer)();
- TimerCounter++;
- }
- void SetTimer(void interrupt(*IntProc)(void))
- {
- oldtimer=getvect(TIMER);
- disable();
- setvect(TIMER,IntProc);
- enable();
- }
- void KillTimer()
- {
- disable();
- setvect(TIMER,oldtimer);
- enable();
- }
- void background()
- {
- int x1=getmaxx()/2-200,y1=60,x2=getmaxx()/2+200,y2=420; /* x,y is maingameinterface of coordinate*/
- int i;
- setlinestyle(0,1,3);
- /* set bkground */
- setfillstyle(1,BLUE);
- bar(0,0,getmaxx(),getmaxy());
- /* maingameinterface */
- setcolor(WHITE);
- setlinestyle(0,1,3);
- rectangle(x1,y1,x2,y2); /* 18* 20 & 360 * 400 */
- setfillstyle(1,LIGHTBLUE);
- bar(x1,y1,x2,y2);
- /* set outbox left and right */
- setcolor(WHITE);
- setlinestyle(0,1,3);
- rectangle(x2+20,80,x2+100,160);
- setfillstyle(1,LIGHTBLUE); /* setfill maingameinterface */
- bar(x2+20,80,x2+100,160); /* setfill occupation box */
- i=20;
- setlinestyle(0,1,3);
- while(i<80)
- {
- line(x2+20,80+i,x2+100,80+i);
- i=i+20;
- }
- i=20;
- while(i<80)
- {
- line(x2+20+i,80,x2+20+i,160);
- i=i+20;
- }
- /* this is about of the game ,include opreta and author and so on*/
- setlinestyle(0,1,3);
- rectangle(x2+10,240,x2+110,DOWN_MAX);
- bar(x2+10,240,x2+110,DOWN_MAX);
- moveto(x2+10,250);
- outtext("Welcomeplay!");
- moveto(x2+10,270);
- outtext("'P' is pause");
- moveto(x2+10,290);
- outtext("'R' is renew");
- moveto(x2+10,310);
- outtext("'Esc' is exit");
- moveto(x2+10,340);
- outtext(" ----by Giant");
- }
- /* */
- void box(unsigned int box,int color) /* box difine shape,color */
- {
- int x=getmaxx()/2+200+20,y=80; /* set dutum of x,y */
- int i=getmaxx()/2+200+20,n;
- unsigned int max=box;
- unsigned int mask=32768;
- /* init boxes */
- int k=20;
- setfillstyle(1,LIGHTBLUE);
- bar(x,80,x+80,160);
- k=20;
- setcolor(WHITE);
- setlinestyle(0,1,3);
- while(k<80)
- {
- line(x,80+k,x+80,80+k);
- k=k+20;
- }
- k=20;
- while(k<80)
- {
- line(x+k,80,x+k,160);
- k=k+20;
- }
- /* boxes it is ok */
- setfillstyle(1,color);
- setlinestyle(0,1,3);
- for(n=0;n<16;n++) { if(mask & max) { rectangle(x,y,x+20,y+20); bar(x,y,x+20,y+20); } x=x+20; if(x-i==80) { x=(x-i)%80+i; y=y+20; } mask=mask>>1;
- }
- }
- double killfullline(int lasty)
- {
- int vga=getmaxx()/2-200;
- int x=vga,y=lasty,yy=lasty;
- int n=0;
- int count=0,i=0;
- int color;
- int score=0;
- for(y=lasty;y>=lasty-60;y=y-20) {
- count=0;
- x=vga;
- for(i=0;i<20;i++,x=x+20)
- {
- if(screeninarry[(y-60)/20][(x-vga)/20]==2)
- {
- count++;
- }
- }
- if(20==count)
- {
- n=0;
- score=0;
- x=vga;
- n++;
- score=score+10*pow(2,n);
- setfillstyle(1,LIGHTBLUE);
- setcolor(LIGHTBLUE);
- for(x=vga,i=0;i<20;x=x+20,i++) /* clean fullline */ { rectangle(x,y,x+20,y+20); bar(x,y,x+20,y+20); screeninarry[(y-60)/20][(x-vga)/20]=0; } for(x=vga,i=0,yy=y;yy>=60;x=x+20,i++)
- {
- if(i==20)
- {
- i=0;
- x=vga;
- /* killfullline(yy); */
- yy=yy-20;
- }
- if(screeninarry[(yy-20-60)/20][(x-vga)/20]==2)
- {
- color=getpixel(x+10,yy-10); /* get color of this box*/
- screeninarry[(yy-20-60)/20][(x-vga)/20]=0;
- setfillstyle(1,LIGHTBLUE);
- bar(x,yy-20,x+20,yy);
- setcolor(LIGHTBLUE);
- rectangle(x,yy-20,x+20,yy);
- setfillstyle(1,color);
- setlinestyle(0,1,3);
- setcolor(WHITE);
- rectangle(x,yy,x+20,yy+20);
- bar(x,yy,x+20,yy+20);
- screeninarry[(yy-60)/20][(x-vga)/20]=2;
- }
- }
- y=y+20;
- } /*if (20==count) */
- } /* for */
- return score;
- } /* killfullline */
- int drawshape(int startx,int starty,int n,int flag) /* set start,coordinate of x,y */
- {
- int x,y;
- int vga=getmaxx()/2-200;
- int i=0;
- int var;
- int x1=getmaxx()/2-200,y1=60,x2=getmaxx()/2+200,y2=420;
- int bottom;
- unsigned int mask=32768;
- unsigned int max=a[n].box;
- setfillstyle(1,LIGHTBLUE);
- if(flag==0)
- var=1;
- else
- var=2;
- setfillstyle(1,BLUE);
- bar(getmaxx()/2-120,20,getmaxx()/2+120,50);
- settextstyle(1, 0, 3);
- outtextxy(getmaxx()/2-100,20,msg);
- /*setfillstyle(1,BLUE);
- bar(x1,0,x2,y1);*/
- setlinestyle(0,1,3);
- setcolor(WHITE);
- rectangle(x1,y1,x2,y2);
- x=startx,y=starty;
- for(i=0;i<16;i++) /* draw picture of shape */ { if(x-startx==80) { x=startx; y=y+20; } if(mask & max) { setfillstyle(1,a[n].color); setlinestyle(0,1,3); rectangle(x,y,x+20,y+20); bar(x,y,x+20,y+20); screeninarry[(y-60)/20][(x-vga)/20]=var; bottom=y; } x=x+20; mask=mask>>1;
- }
- /*setfillstyle(1,BLUE);
- bar(x1,0,x2,y1);*/
- setlinestyle(0,1,3);
- setcolor(WHITE);
- rectangle(x1,y1,x2,y2);
- /* delay */
- return bottom;
- /* in */
- }
- void cleanshape(int startx,int starty,int n)
- {
- int x=startx,y=starty;
- int vga=getmaxx()/2-200;
- int i=0;
- unsigned int max;
- unsigned int mask=32768;
- max=a[n].box;
- for(i=0;i<16;i++) /* clean shape to bk */ { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) { setfillstyle(1,LIGHTBLUE); bar(x,y,x+20,y+20); setcolor(LIGHTBLUE); rectangle(x,y,x+20,y+20); screeninarry[(y-60)/20][(x-vga)/20]=0; } x=x+20; mask=mask>>1;
- }
- }
- int checkshape(int startx,int starty,unsigned int shapebox,int direction)
- {
- int i=0,x=startx,y=starty,tempx=startx,tempy=starty;
- int vga=getmaxx()/2-200;
- unsigned int mask=32768;
- unsigned int max=a[shapebox].box;
- /**/
- if(direction==LEFT)
- {
- for(x=startx,y=starty,i=0;i<16;x=x+20,i++)
- {
- if(x-startx==80)
- {
- x=startx;
- y=y+20;
- }
- if(x<vga || screeninarry[(y-60)/20][(x-vga)/20]==2)
- return False;
- mask=mask>>1;
- }
- return True;
- }
- else if(direction==RIGHT)
- {
- mask=32768;
- for(x=startx,y=starty,i=0;i<16;x=x+20,i++) { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) if(x+20 > getmaxx()-vga || screeninarry[(y-60)/20][(x-vga)/20]==2)
- return False;
- mask=mask>>1;
- }
- return True;
- }
- else if(direction==DOWN)
- {
- mask=32768;
- for(x=startx,y=starty,i=0;i<16;x=x+20,i++) { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) if(y>=DOWN_MAX || screeninarry[(y-60)/20][(x-vga)/20]==2)
- return False;
- mask=mask>>1;
- }
- return True;
- }
- else if(direction==REVOLVE)
- {
- mask=32768;
- for(x=startx,y=starty,i=0;i<16;x=x+20,i++) { if(x-startx==80) { x=startx; y=y+20; } if(max & mask) if(screeninarry[(y-60)/20][(x-vga)/20]==2 || y>=DOWN_MAX || x+20 > getmaxx()-vga || x<vga) return False; mask=mask>>1;
- }
- return True;
- }
- else
- printf("direction is error!\n ");
- }
- int main()
- {
- int drive,mode;
- int i=0;
- int bottom=0;
- int xofshape,xofbox;
- int flag;
- int startx=150,starty=0;
- char ch,ch1;
- char direction;
- srand((unsigned)time(0));
- drive=DETECT;
- initgraph(&drive,&mode,"C:\\TC20\\BGI");
- /* srand((unsigned)time(0)); */
- background();
- memset(screeninarry,0,19*21*sizeof(int));
- SetTimer(newtimer);
- while(1) {
- setfillstyle(1,BLUE);
- bar(getmaxx()/2-120,20,getmaxx()/2+120,50);
- settextstyle(1, 0, 3);
- outtextxy(getmaxx()/2-100,20,msg);
- if(i==0)
- {
- xofshape=rand()%19;
- xofbox=rand()%19;
- }
- else
- {
- xofshape=xofbox;
- xofbox=rand()%19;
- }
- i++;
- box(a[xofbox].box,a[xofbox].color);
- startx=getmaxx()/2-200+120;
- starty=60;
- while(1)
- {
- if(bioskey(1))
- {
- direction=bioskey(0);
- if(direction==ESC )
- {
- setcolor(WHITE);
- settextstyle(1, 0, 3);
- moveto(getmaxx()/2-150,440);
- outtext("Are you sure to exit ?(y/n)");
- ch=getch();
- if(ch=='y' || ch== 'Y')
- exit(0);
- else
- {
- setfillstyle(1,BLUE);
- bar(getmaxx()/2-150,430,getmaxx()/2+180,500);
- }
- }
- if(direction=='r' || direction=='R')
- {
- setcolor(WHITE);
- settextstyle(1, 0, 3);
- moveto(getmaxx()/2-100,440);
- outtext("pausing......");
- ch=getch();
- setfillstyle(1,BLUE);
- bar(getmaxx()/2-120,430,getmaxx()/2+120,490);
- }
- if(direction=='a' || direction=='A')
- {
- if(checkshape(startx-20,starty,xofshape,LEFT))
- {
- cleanshape(startx,starty,xofshape);
- startx=startx-20;
- drawshape(startx,starty,xofshape,0);
- }
- }
- if(direction=='d' || direction=='D')
- {
- if(checkshape(startx+20,starty,xofshape,RIGHT))
- {
- cleanshape(startx,starty,xofshape);
- startx=startx+20;
- drawshape(startx,starty,xofshape,0);
- }
- }
- if(direction=='s' || direction=='S')
- {
- if(checkshape(startx,starty+20,xofshape,DOWN))
- {
- TimerCounter=TimerCounter+18;
- }
- }
- if(direction=='w' || direction=='W')
- {
- if(checkshape(startx,starty,a[xofshape].next,REVOLVE) )
- {
- cleanshape(startx,starty,xofshape);
- xofshape=a[xofshape].next;
- drawshape(startx,starty,xofshape,0);
- }
- }
- }
- if(TimerCounter>=18)
- {
- if(checkshape(startx,starty+20,xofshape,DOWN) )
- {
- drawshape(startx,starty,xofshape,0);
- cleanshape(startx,starty,xofshape);
- starty=starty+20;
- drawshape(startx,starty,xofshape,0);
- TimerCounter=0;
- }
- else /* can not down */
- {
- if(starty<=60)
- {
- setcolor(WHITE);
- while(1)
- {
- if(bioskey(1))
- exit(1);
- moveto(getmaxx()/2-100,450);
- bar(getmaxx()/2-120,20,getmaxx()/2+120,50);
- settextstyle(1, 0, 3);
- outtextxy(getmaxx()/2-100,20,msg);
- outtext("Game over ! ! !");
- delay(2000);
- setfillstyle(1,BLUE);
- bar(getmaxx()/2-120,440,getmaxx()/2+120,460);
- }
- }
- /* down is ok var=2 */
- bottom=drawshape(startx,starty,xofshape,1);
- grade=grade+killfullline(bottom);
- itoa(grade,msg1,10);
- strcpy(msg+8,msg1);
- break;
- }
- }
- }
- }
- closegraph();
- KillTimer();
- }
C语言研究中心(www.dotcpp.com)