首页 > 技能分享 > C语言-俄罗斯方块

C语言-俄罗斯方块

#include<stdio.h> 
#include<stdlib.h> 
#include<graphics.h> 
#include<bios.h> 
#include<conio.h> 
#include <time.h> 
#include <ctype.h> 
#define red     4 
#define blue    1 
#define magenta 5 
#define BACK  0 
#define SPACE 0x3920 /*变换*/ 
#define DOWN  0x5000 
#define LEFT  0x4b00 
#define RIGHT 0x4d00 
#define ESC   0x011b 
struct node 
{ int l,t,r,b; 
  int color; 
}q1[27][14]; 
struct list  
{ int x1,y1; 
  int x2,y2; 
  int x3,y3; 
  int x4,y4; 
  int relation; 
}q2[20]; 
int mark,mark1,mark2,change=1; 
int a[27]={0}; 
int dx,dy;     /*水平,纵向平移量*/ 
int key; 
int score=0; 
int levle; 
void bgegin()  /*19种方快*/ 
{ q2[1].x1=4; q2[1].x2=4; q2[1].x3=4; q2[1].x4=4; q2[2].x1=4; q2[2].x2=3; q2[2].x3=2; q2[2].x4=1;   /*竖*/ 
  q2[1].y1=5; q2[1].y2=6; q2[1].y3=7; q2[1].y4=8; q2[2].y1=6; q2[2].y2=6; q2[2].y3=6; q2[2].y4=6; 
  q2[1].relation=2; q2[2].relation=1;  
  q2[3].x1=4; q2[3].x2=4; q2[3].x3=3; q2[3].x4=3;                                                 /*方*/ 
  q2[3].y1=6; q2[3].y2=7; q2[3].y3=6; q2[3].y4=7; 
  q2[3].relation=3;  
  q2[4].x1=4; q2[4].x2=3; q2[4].x3=3; q2[4].x4=2; q2[5].x1=3; q2[5].x2=3;q2[5].x3=4; q2[5].x4=4;   /* 右Z*/ 
  q2[4].y1=6; q2[4].y2=6; q2[4].y3=7; q2[4].y4=7; q2[5].y1=6; q2[5].y2=7;q2[5].y3=7; q2[5].y4=8; 
  q2[4].relation=5; q2[5].relation=4;   
  q2[6].x1=4;q2[6].x2=4;q2[6].x3=3; q2[6].x4=3; q2[7].x1=4; q2[7].x2=3;q2[7].x3=3; q2[7].x4=2;  /* 左Z*/ 
  q2[6].y1=5;q2[6].y2=6;q2[6].y3=6; q2[6].y4=7; q2[7].y1=6; q2[7].y2=6;q2[7].y3=5; q2[7].y4=5; 
  q2[6].relation=7; q2[7].relation=6;   
  q2[8].x1=4;  q2[8].x2=3;  q2[8].x3=2;  q2[8].x4=2;  q2[9].x1=3;  q2[9].x2=3;  q2[9].x3=3;  q2[9].x4=4;          /*F*/ 
  q2[8].y1=6;  q2[8].y2=6;  q2[8].y3=6;  q2[8].y4=7;  q2[9].y1=5;  q2[9].y2=6;  q2[9].y3=7;  q2[9].y4=7; 
  q2[10].x1=4; q2[10].x2=4; q2[10].x3=3; q2[10].x4=2; q2[11].x1=4; q2[11].x2=3; q2[11].x3=4; q2[11].x4=4; 
  q2[10].y1=5; q2[10].y2=6; q2[10].y3=6; q2[10].y4=6; q2[11].y1=5; q2[11].y2=5; q2[11].y3=6; q2[11].y4=7; 
  q2[8].relation=9;q2[9].relation=10;q2[10].relation=11;q2[11].relation=8;   
  q2[12].x1=2;q2[12].x2=2;q2[12].x3=3; q2[12].x4=4; q2[13].x1=4;q2[13].x2=4;q2[13].x3=4; q2[13].x4=3;      /*左F*/          
  q2[12].y1=5;q2[12].y2=6;q2[12].y3=6; q2[12].y4=6; q2[13].y1=5;q2[13].y2=6;q2[13].y3=7; q2[13].y4=7; 
  q2[14].x1=4;q2[14].x2=4;q2[14].x3=3; q2[14].x4=2; q2[15].x1=4;q2[15].x2=3;q2[15].x3=3; q2[15].x4=3; 
  q2[14].y1=5;q2[14].y2=6;q2[14].y3=5; q2[14].y4=5; q2[15].y1=5;q2[15].y2=5;q2[15].y3=6; q2[15].y4=7; 
  q2[12].relation=13;q2[13].relation=14;q2[14].relation=15;q2[15].relation=12;   
  q2[16].x1=4;q2[16].x2=4;q2[16].x3=4; q2[16].x4=3; q2[17].x1=4;q2[17].x2=3;q2[17].x3=3; q2[17].x4=2;   /*卡*/ 
  q2[16].y1=5;q2[16].y2=6;q2[16].y3=7; q2[16].y4=6; q2[17].y1=6;q2[17].y2=6;q2[17].y3=7; q2[17].y4=6; 
  q2[18].x1=4;q2[18].x2=3;q2[18].x3=3; q2[18].x4=3; q2[19].x1=4;q2[19].x2=3;q2[19].x3=3; q2[19].x4=2; 
  q2[18].y1=6;q2[18].y2=5;q2[18].y3=6; q2[18].y4=7; q2[19].y1=6;q2[19].y2=6;q2[19].y3=5; q2[19].y4=6; 
  q2[16].relation=17;q2[17].relation=18;q2[18].relation=19;q2[19].relation=16; 

 

} 
void drawmap()    /*画图*/ 
{ int i,j; 
  setbkcolor(BLACK); 
  for(i=0;i<=13;i++) 
     {for(j=0;j<=26;j++) 
  { if(i==0||i==12||j==0||j==26||i==13) 
              q1[j][i].color=red;  
          else 
             {setfillstyle(1,blue);         
              q1[j][i].color=blue;  
      } 
           q1[j][i].l=83+(i)*17;   q1[j][i].t=5+(j)*17; 
           q1[j][i].r=98+(i)*17;   q1[j][i].b=20+(j)*17; 
           bar(q1[j][i].l,q1[j][i].t,q1[j][i].r,q1[j][i].b ); 
           if(i==0||i==12||j==0||j==26||i==13) 
              Draw3dRect(q1[j][i].l,q1[j][i].t,q1[j][i].r,q1[j][i].b ); 
           if(j<4)       
             {setfillstyle(1,0);     
              bar(q1[j][i].l,q1[j][i].t,q1[j][i].r,q1[j][i].b ); 
             } 
           if(j==4) 
              Draw3dRect(q1[j][i].l,q1[j][i].t,q1[j][i].r,q1[j][i].b ); 
           if(i==13)       
             {setfillstyle(1,0);    
              bar(q1[j][i].l,q1[j][i].t,q1[j][i].r,q1[j][i].b ); 
             }  
         }  
    }             
  for(i=1;i<=4;i++) 
     {for(j=1;j<=4;j++) 
  {setfillstyle(1,blue);         
          bar( 304+(i-1)*17,90+(j-1)*17,319+(i-1)*17,105+(j-1)*17); 
          if(i==1||i==2||i==3||i==4) 
             if(j==1) 
                Draw3dRect( 304+(i-1)*17,90+(j-2)*17,319+(i-1)*17,105+(j-2)*17); 
          if(i==4) 
            { if(j==1)    
                Draw3dRect( 304+(i)*17,90+(j-2)*17,319+(i)*17,105+(j-2)*17);  
                Draw3dRect( 304+(i)*17,90+(j-1)*17,319+(i)*17,105+(j-1)*17);  
             if(j!=1)   
                Draw3dRect( 304+(i)*17,90+(j-1)*17,319+(i)*17,105+(j-1)*17);  
            } 
 
    } 
}                        
void rands()           /*随机产生方快*/ 
{if(mark!=0) 
  { 
   setfillstyle(1,blue);  
   bar(q1[q2[mark].x1][q2[mark].y1].l+8*17,q1[q2[mark].x1][q2[mark].y1].t+4*17,q1[q2[mark].x1][q2[mark].y1].r+8*17,q1[q2[mark].x1][q2[mark].y1].b+4*17 ); 
   bar(q1[q2[mark].x2][q2[mark].y2].l+8*17,q1[q2[mark].x2][q2[mark].y2].t+4*17,q1[q2[mark].x2][q2[mark].y2].r+8*17,q1[q2[mark].x2][q2[mark].y2].b+4*17 );  
   bar(q1[q2[mark].x3][q2[mark].y3].l+8*17,q1[q2[mark].x3][q2[mark].y3].t+4*17,q1[q2[mark].x3][q2[mark].y3].r+8*17,q1[q2[mark].x3][q2[mark].y3].b+4*17 );  
   bar(q1[q2[mark].x4][q2[mark].y4].l+8*17,q1[q2[mark].x4][q2[mark].y4].t+4*17,q1[q2[mark].x4][q2[mark].y4].r+8*17,q1[q2[mark].x4][q2[mark].y4].b+4*17);  
  } 
  switch(random(20))  
       { case 1:   mark=1;  break; 
         case 2:   mark=2;  break; 
         case 3:   mark=3;  break; 
         case 4:   mark=4;  break;         
         case 5:   mark=5;  break; 
         case 6:   mark=6;  break; 
         case 7:   mark=7;  break; 
         case 8:   mark=8;  break; 
         case 9:   mark=9;  break; 
         case 10:  mark=10; break; 
         case 11:  mark=11; break; 
         case 12:  mark=12; break; 
         case 13:  mark=13; break; 
         case 14:  mark=14; break; 
         case 15:  mark=15; break; 
         case 16:  mark=16; break; 
         case 17:  mark=17; break; 
         case 18:  mark=18; break; 
         case 19:  mark=19; break;          


       default:  mark=2;  break; 
       }   
   setfillstyle(1,magenta);  
   bar(q1[q2[mark].x1][q2[mark].y1].l+8*17,q1[q2[mark].x1][q2[mark].y1].t+4*17,q1[q2[mark].x1][q2[mark].y1].r+8*17,q1[q2[mark].x1][q2[mark].y1].b+4*17 ); 
   bar(q1[q2[mark].x2][q2[mark].y2].l+8*17,q1[q2[mark].x2][q2[mark].y2].t+4*17,q1[q2[mark].x2][q2[mark].y2].r+8*17,q1[q2[mark].x2][q2[mark].y2].b+4*17 );  
   bar(q1[q2[mark].x3][q2[mark].y3].l+8*17,q1[q2[mark].x3][q2[mark].y3].t+4*17,q1[q2[mark].x3][q2[mark].y3].r+8*17,q1[q2[mark].x3][q2[mark].y3].b+4*17 );  
   bar(q1[q2[mark].x4][q2[mark].y4].l+8*17,q1[q2[mark].x4][q2[mark].y4].t+4*17,q1[q2[mark].x4][q2[mark].y4].r+8*17,q1[q2[mark].x4][q2[mark].y4].b+4*17);  
} 
int downdirection(int d, int b) 
{ int i,j,c,num=0;   
  char buffer[20]; 
  if(q1[q2[mark1].x1+d][q2[mark1].y1+b].color==red||q1[q2[mark1].x2+d][q2[mark1].y2+b].color==red||q1[q2[mark1].x3+d][q2[mark1].y3+b].color==red||q1[q2[mark1].x4+d][q2[mark1].y4+b].color==red) 
    { q1[q2[mark1].x1+dx-1][q2[mark1].y1+b].color=red;q1[q2[mark1].x2+dx-1][q2[mark1].y2+b].color=red; 
      q1[q2[mark1].x3+dx-1][q2[mark1].y3+b].color=red;q1[q2[mark1].x4+dx-1][q2[mark1].y4+b].color=red; 
      a[q2[mark1].x1+d-1]++; a[q2[mark1].x2+d-1]++; 
      a[q2[mark1].x3+d-1]++; a[q2[mark1].x4+d-1]++; /*所在的层加一*/ 
      for(i=25;i>=4;i--) 
         { if(a[4]!=0) exit(0); 
           if(a[i]==11)            /*去一层*/ 
             { for(j=1;j<=11;j++) 
                  { setfillstyle(1,blue);                
                    bar(q1[i][j].l,q1[i][j].t,q1[i][j].r,q1[i][j].b); 
                    q1[i][j].color=blue; 
                    a[i]--;  
                    c=i-1; delay(5000000); 
                  }  
               num++; 
               for(;c>=5;c--)      /*下移*/ 
                  for(j=1;j<=11;j++) 
                     { if(q1[c][j].color==red) 
                         { setfillstyle(1,blue);                
                           bar(q1[c][j].l,q1[c][j].t,q1[c][j].r,q1[c][j].b); 
                           q1[c][j].color=blue; 
                           setfillstyle(1,magenta-(levle-1));                
                           bar(q1[c+1][j].l,q1[c+1][j].t,q1[c+1][j].r,q1[c+1][j].b); 
                           q1[c+1][j].color=red; 
                           a[c+1]++; 
                         } 
                       a[c]=0; 
                     }                         
               i++; 
               } 
          }   
       if(num==1) score=score+10;    /*得分*/ 
       if(num==2) score=score+30;  
       if(num==3) score=score+50;  
       if(num==4) score=score+70;  
       gotoxy(46,13); 
       setfillstyle(1,0);    
       bar(353,193,394,207 ); 
       sprintf(buffer,"0%d",score);   
       setcolor(LIGHTGREEN); 
       outtextxy(355,196,buffer); 
       return(0); 
     }     
   else 
     { 
      return(1);  
     }          
} 
int appear1(int d ,int b,int mark,int color)  
{  setfillstyle(1,color);  
   if(q2[mark].x1+d>4) 
     bar(q1[q2[mark].x1+d][q2[mark].y1+b].l,q1[q2[mark].x1+d][q2[mark].y1+b].t,q1[q2[mark].x1+d][q2[mark].y1+b].r,q1[q2[mark].x1+d][q2[mark].y1+b].b ); 

  if(q2[mark].x2+d>4) 
     bar(q1[q2[mark].x2+d][q2[mark].y2+b].l,q1[q2[mark].x2+d][q2[mark].y2+b].t,q1[q2[mark].x2+d][q2[mark].y2+b].r,q1[q2[mark].x2+d][q2[mark].y2+b].b );  
   if(q2[mark].x3+d>4) 
     bar(q1[q2[mark].x3+d][q2[mark].y3+b].l,q1[q2[mark].x3+d][q2[mark].y3+b].t,q1[q2[mark].x3+d][q2[mark].y3+b].r,q1[q2[mark].x3+d][q2[mark].y3+b].b );  
   if(q2[mark].x4+d>4) 
     bar(q1[q2[mark].x4+d][q2[mark].y4+b].l,q1[q2[mark].x4+d][q2[mark].y4+b].t,q1[q2[mark].x4+d][q2[mark].y4+b].r,q1[q2[mark].x4+d][q2[mark].y4+b].b );  
 }   
void outtexts() 
{Draw3dRect(304,310,482,462); 
 setcolor(MAGENTA); 
 outtextxy(306,315,"Space   :Chang");  
 outtextxy(306,335,"ELSE KEY:Pause/Start");  
 outtextxy(306,355,"ESC     :Exit");  
 outtextxy(306,375,"LEFT ");  
 outtextxy(306,395,"RIGHT");  
 outtextxy(306,415,"UP   ");  
 outtextxy(306,435,"DOWN ");  
 outtextxy(306,454,"THE FOUR KEYES TO MOVE");  
 setcolor(BACK); 
 Draw3dRect(304,165,400,183); 
 outtextxy (305,170,"Level:");  
 Draw3dRect(304,191,400,209); 
 outtextxy (306,197,"Score:"); 
 setcolor(LIGHTGREEN); 
 outtextxy(30,40," Welcome to play game and Please any key begin !");  
} 
int Draw3dRect(int l,int t,int r,int b) 
{   int oldcolor=getcolor();             
    setfillstyle(1,LIGHTGRAY); 
    bar(l,t,r,b); 
    setcolor(WHITE); 
    line( l, t, r, t); 
    line( l, t, l, b); 
    setcolor(BACK); 
    line( l, b, r, b); 
    line( r, t, r, b); 
    setcolor(oldcolor); 
} 
main() 
{int  gdrive=VGA;                       /*图形驱动器(gdriver)          图形模式(gmode) */ 
 int  gmode=VGAHI; 
 char str[10];  
 initgraph(&gdrive,&gmode,"c:\\tc");  
 randomize(); 
 bgegin(); 
 drawmap(); 
 outtexts();   
 rands(); 
 getch(); 
 for(levle=1;levle<=3;levle++) 
    { gotoxy(46,12); 
      setfillstyle(1,0);    
      bar(353,166,394,180 ); 
      sprintf(str,"0%d",levle);   
      setcolor(LIGHTGREEN); 
      outtextxy(355,170,str);  
      while(1) 
        {if(score==1000||score==2000||score==3000) 
            break;   
         if(change==1) 
           {  
            dx=dy=0; 
            mark1=mark; 
            change=0; 
            rands(); 
           }         
       while(bioskey(1)!=0) 
            {  
              key=bioskey(0); 
              switch(key) 
                    {case  DOWN :  dx++; 
                                   if(q1[q2[mark1].x1+dx][q2[mark1].y1+dy].color==red||q1[q2[mark1].x2+dx][q2[mark1].y2+dy].color==red||q1[q2[mark1].x3+dx][q2[mark1].y3+dy].color==red||q1[q2[mark1].x4+dx][q2[mark1].y4+dy].color==red)   
                                       dx--; 
                                   else  
                                      { 
                                       appear1(dx-1,dy,mark1,blue); 
                                       appear1(dx,dy,mark1,magenta-(levle-1));  
                                      } 
                                   break; 
                     case  LEFT:  dy--;  
                                  if(q1[q2[mark1].x1+dx][q2[mark1].y1+dy].color==red||q1[q2[mark1].x2+dx][q2[mark1].y2+dy].color==red||q1[q2[mark1].x3+dx][q2[mark1].y3+dy].color==red||q1[q2[mark1].x4+dx][q2[mark1].y4+dy].color==red)                                          dy++; 
                                   else  
                                      { 
                                       appear1(dx,dy+1,mark1,blue); 
                                       appear1(dx,dy,mark1,magenta-(levle-1));  
                                      } 
                                   break; 
                     case  RIGHT: dy++;  
                                  if(q1[q2[mark1].x1+dx][q2[mark1].y1+dy].color==red||q1[q2[mark1].x2+dx][q2[mark1].y2+dy].color==red||q1[q2[mark1].x3+dx][q2[mark1].y3+dy].color==red||q1[q2[mark1].x4+dx][q2[mark1].y4+dy].color==red)   
                                      dy--;  
                                   else  
                                      { 
                                       appear1(dx,dy-1,mark1,blue); 
                                       appear1(dx,dy,mark1,magenta-(levle-1));  
                                      } 
                                   break; 
                     case  SPACE:  mark2=mark1;    /*变向*/ 
                                   mark1=q2[mark1].relation; 
                                   if(q1[q2[mark1].x1+dx][q2[mark1].y1+dy].color==red||q1[q2[mark1].x2+dx][q2[mark1].y2+dy].color==red||q1[q2[mark1].x3+dx][q2[mark1].y3+dy].color==red||q1[q2[mark1].x4+dx][q2[mark1].y4+dy].color==red)   
                                      mark1=mark2; 
                                   else 
                                       {appear1(dx,dy,mark2,blue); 
                                        appear1(dx,dy,mark1,magenta-(levle-1));  
                                       } 
                                  break; 
                     case ESC:  exit(0); 
                     default :  getch();  /*暂停*/ 
              } 
           } 
         do 
          { 
          delay(5500000); 
          dx++; 
          if(downdirection(dx,dy)==0) 
            {  
              change=1; 
              break; 
            } 
          if(downdirection(dx,dy)==1)   
             {appear1(dx-1,dy,mark1,blue); 
              appear1(dx,dy,mark1,magenta-(levle-1));  
             } 
          } while(bioskey(1)==0);      
} 
} 
closegraph();  
}       

 

热门新闻