c语言图形小游戏(俄罗斯方块)

类别:编程语言 点击:0 评论:0 推荐:

#include <stdio.h>
#include <stdlib.h>
#include<graphics.h>
int Mark[32][13];
int flag=0;
void InitMark() /*init the cap */
{int i,j;
 for(i=1;i<31;i++)
  for(j=1;j<11;j++)
   Mark[i][j]=0;
 for(j=0;j<13;j++)
  {Mark[0][j]=1;
   Mark[31][j]=1;
  }
 for(i=1;i<31;i++)
 {Mark[i][0]=1;
  Mark[i][11]=1;
  Mark[i][12]=0;
 }
}


void Draw1(int x,int y)      /*draw the long bock*/
{setfillstyle(1,2);
 bar(x-9,y+1,x-1,y+9);Mark[(y-90)/10][(x-100)/10]=1;Mark[(y-90)/10][12]++;
 bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1; Mark[(y-90)/10][12]++;
 bar(x+11,y+1,x+19,y+9);Mark[(y-90)/10][(x-80)/10]=1;Mark[(y-90)/10][12]++;
 bar(x+21,y+1,x+29,y+9);Mark[(y-90)/10][(x-70)/10]=1;Mark[(y-90)/10][12]++;
}

void Draw1_1(int x,int y)/*覆盖上一个长形方块*/
{setfillstyle(1,BLACK);
 bar(x-9,y+1,x+29,y+10);
 Mark[(y-90)/10][(x-100)/10]=0;Mark[(y-90)/10][12]--;
 Mark[(y-90)/10][(x-90)/10]=0;Mark[(y-90)/10][12]--;
 Mark[(y-90)/10][(x-80)/10]=0;Mark[(y-90)/10][12]--;
 Mark[(y-90)/10][(x-70)/10]=0;Mark[(y-90)/10][12]--;
}

void Draw1_2(int x,int y)/*The up long Block*/
{setfillstyle(1,2);
 bar(x+1,y-9,x+9,y-1);Mark[(y-100)/10][(x-90)/10]=1;Mark[(y-100)/10][12]++;
 bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1;Mark[(y-90)/10][12]++;
 bar(x+1,y+11,x+9,y+19);Mark[(y-80)/10][(x-90)/10]=1;Mark[(y-80)/10][12]++;
 bar(x+1,y+21,x+9,y+29);Mark[(y-70)/10][(x-90)/10]=1;Mark[(y-70)/10][12]++;
}

void Draw1_3(int x,int y) /*cover the Long Block*/
{setfillstyle(1,BLACK);
 bar(x+1,y-9,x+9,y+29);
 Mark[(y-100)/10][(x-90)/10]=0;Mark[(y-100)/10][12]--;
 Mark[(y-90)/10][(x-90)/10]=0;Mark[(y-90)/10][12]--;
 Mark[(y-80)/10][(x-90)/10]=0;Mark[(y-80)/10][12]--;
 Mark[(y-70)/10][(x-90)/10]=0;Mark[(y-70)/10][12]--;
}

void Draw2(int x,int y)      /*draw the Tian bock*/
{setfillstyle(1,3);
 bar(x-9,y+1,x-1,y+9);Mark[(y-90)/10][(x-100)/10]=1;Mark[(y-90)/10][12]++;
 bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1; Mark[(y-90)/10][12]++;
 bar(x-9,y+11,x-1,y+19);Mark[(y-80)/10][(x-100)/10]=1;Mark[(y-80)/10][12]++;
 bar(x+1,y+11,x+9,y+19);Mark[(y-80)/10][(x-90)/10]=1;Mark[(y-80)/10][12]++;
}

void Draw2_1(int x,int y)   /*cover the Tian bock*/
{setfillstyle(1,BLACK);
 bar(x-9,y+1,x+9,y+19);
 Mark[(y-90)/10][(x-100)/10]=0;Mark[(y-90)/10][12]--;
 Mark[(y-90)/10][(x-90)/10]=0; Mark[(y-90)/10][12]--;
 Mark[(y-80)/10][(x-100)/10]=0;Mark[(y-80)/10][12]--;
 Mark[(y-80)/10][(x-90)/10]=0;Mark[(y-80)/10][12]--;
}

void Draw3(int x,int y)
{setfillstyle(1,4);
 bar(x-9,y+1,x-1,y+9);Mark[(y-90)/10][(x-100)/10]=1;Mark[(y-90)/10][12]++;
 bar(x+1,y+1,x+9,y+9);Mark[(y-90)/10][(x-90)/10]=1; Mark[(y-90)/10][12]++;
 bar(x+1,y+11,x+9,y+9);Mark[(y-80)/10][(x-90)/10]=1;Mark[(y-80)/10][12]++;
 bar(x+11,y+11,x+19,y+19);Mark[(y-80)/10][(x-80)/10]=1;Mark[(y-90)/10][12]++;
}
void Draw3_1(int x,int y)
{setfillstyle(1,BLACK);
 bar(x-10,y,x+10,y+10);
 Mark[(y-90)/10][(x-100)/10]=0;Mark[(y-90)/10][12]--;
 Mark[(y-90)/10][(x-90)/10]=0; Mark[(y-90)/10][12]--;
 bar(x,y+10,x+20,y+20);
 Mark[(y-80)/10][(x-90)/10]=0;Mark[(y-80)/10][12]--;
 Mark[(y-80)/10][(x-80)/10]=0;Mark[(y-90)/10][12]--;
}


void Screen()
{
 rectangle(100,100,200,400);
 rectangle(250,150,300,200);
}

int Block()
{int i,j;
 i=flag;
 flag=random(3);

switch(flag)
 {case 0:setfillstyle(1,BLACK);
  bar(251,151,299,199);
  setfillstyle(1,RED);
         bar(256,171,264,179);
  bar(266,171,274,179);
  bar(276,171,284,179);
  bar(286,171,294,179);
  break;
  case 1:setfillstyle(1,BLACK);
  bar(251,151,299,199);
         setfillstyle(1,RED);
         bar(271,156,279,164);
  bar(271,166,279,174);
  bar(271,176,279,184);
  bar(271,186,279,194);
         break;
  case 2:setfillstyle(1,BLACK);
  bar(251,151,299,199);
         setfillstyle(1,RED);
         bar(266,156,274,164);
  bar(276,156,284,164);
  bar(266,166,274,174);
  bar(276,166,284,174);
         break;
 }
 return i;
}

int Control(int CH,int x,int y)
{int key;

 switch(CH)
 {case 0:/*对平放长操作*/
  Draw1(x,y);
  while(Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
  {
   if(kbhit())
   {key=getch();
   if(key==75&&Mark[(y-90)/10][(x-110)/10]==0) {Draw1_1(x,y);x-=10;Draw1(x,y);}
   else if(key==77&&Mark[(y-90)/10][(x-60)/10]==0) {Draw1_1(x,y);x+=10;Draw1(x,y);}
  else if(key==32&&Mark[(y-100)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-90)/10]==0)  {Draw1_1(x,y);Control(1,x,y);break;}
       else if(key==80&&Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
             {Draw1_1(x,y);
              while(Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
                          {y+=10;
                          }
              Draw1(x,y);
              break;
              }
        else if(key==27){return 27;}
   }
   Draw1_1(x,y);
   y+=10;
   Draw1(x,y);
    delay(10000000000);
  }
  break;
  case 1: /*对竖放长操作*/
  Draw1_2(x,y);
  while(Mark[(y-60)/10][(x-90)/10]==0)
  {
   if(kbhit())
   {key=getch();
    if(key==75&&Mark[(y-100)/10][(x-100)/10]==0&&Mark[(y-90)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-100)]==0&&Mark[(y-70)/10][(x-100)/10]==0)
    {Draw1_3(x,y);x-=10;Draw1_2(x,y);}
    else if(key==77&&Mark[(y-100)/10][(x-80)/10]==0&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-70)/10][(x-80)/10]==0)
    {Draw1_3(x,y);x+=10;Draw1_2(x,y);}
   else if(key==32&&Mark[(y-90)/10][(x-100)/10]==0&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-70)/10][(x-70)/10]==0) {Draw1_3(x,y);Control(0,x,y);break;}
        else if(key==80&&Mark[(y-60)/10][(x-90)/10]==0)
             {Draw1_3(x,y);
              while(Mark[(y-60)/10][(x-90)/10]==0)
                          {y+=10;
                          }
              Draw1_2(x,y);
              break;
              }
         else if(key==27) {return 27;}
   }
   Draw1_3(x,y);/*cover the before Up Block*/
   y+=10;
   Draw1_2(x,y);
   delay(10000000000);
   }
         break;
  case 2:Draw2(x,y);/*对田方处理*/
  while(Mark[(y-70)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-100)/10]==0)
  {
   if(kbhit())
   {key=getch();
   if(key==75&&Mark[(y-90)/10][(x-110)/10]==0&&Mark[(y-80)/10][(x-110)/10]==0) {Draw2_1(x,y);x-=10;Draw2(x,y);}
   else if(key==77&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0) {Draw2_1(x,y);x+=10;Draw2(x,y);}
  else if(key==80&&Mark[(y-70)/10][(x-100)/10]==0&&Mark[(y-70)/10][(x-90)/10]==0)
             {Draw2_1(x,y);
              while(Mark[(y-70)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-100)/10]==0)
                          {y+=10;
                          }
              Draw2(x,y);
              break;
              }
        else if(key==27){return 27;}
   }
   Draw2_1(x,y);
   y+=10;
   Draw2(x,y);
    delay(10000000000);
  }
      break;
  case 3:Draw3(x,y);  /*left Tian design*/
  while(Mark[(y-70)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-100)/10]==0)
  {
   if(kbhit())
   {key=getch();
   if(key==75&&Mark[(y-90)/10][(x-110)/10]==0&&Mark[(y-80)/10][(x-100)/10]==0) {Draw3_1(x,y);x-=10;Draw3(x,y);}
   else if(key==77&&Mark[(y-90)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0) {Draw3_1(x,y);x+=10;Draw3(x,y);}
  else if(key==32&&Mark[(y-90)/10][(x-110)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-70)/10][(x-90)/10]==0)  {Draw3_1(x,y);Control(4,x,y);break;}
       else if(key==80&&Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
             {Draw1_1(x,y);
              while(Mark[(y-80)/10][(x-100)/10]==0&&Mark[(y-80)/10][(x-90)/10]==0&&Mark[(y-80)/10][(x-80)/10]==0&&Mark[(y-80)/10][(x-70)/10]==0)
                          {y+=10;
                          }
              Draw1(x,y);
              break;
              }
        else if(key==27){return 27;}
   }
   Draw1_1(x,y);
   y+=10;
   Draw1(x,y);
    delay(10000000000);
  }
   break;
  case 4:break;
  case 5:break;
  case 6:break;
 }
}
void Delete()
{int y,y1,x;
 for(y=1;y<=30;y++)
 {if(Mark[y][12]==10)
  {for(y1=y;y1>1;y1--)
    Mark[y1][12]=Mark[y1-1][12];
    Mark[1][12]=0;
   for(y1=y;y1>1;y1--)
    for(x=1;x<=10;x++)
     Mark[y1][x]=Mark[y1-1][x];
   for(x=1;x<=10;x++)
     Mark[1][x]=0;
  setfillstyle(1,BLACK);
  bar(101,101,199,399);
  for(y1=1;y1<=30;y1++)
   for(x=1;x<=10;x++)
    if(Mark[y1][x]==1)
    {setfillstyle(1,2);
     bar(x*10+91,y1*10+91,x*10+99,y1*10+99);
    }
  }
 }
}

int Gameover()
{if(Mark[1][12]>=1&&Mark[2][12]>=1&&Mark[3][12]>=1&&Mark[4][12]>=1&&Mark[5][12]>=1) return 1;
 else return 0;
}

void main()
{  int gd,gm,CH,NC,OFF=0;
   gd=DETECT;
   initgraph(&gd,&gm,"");
   randomize();
   InitMark();
   NC=0;
   Screen();  /*屏幕设置*/
   flag=random(3);
   while(1)
   {
    CH=Block();
    NC=Control(CH,140,110);  /*控制图形函数*/

   if(NC==27) break;
   Delete();
   OFF=Gameover();
   if(OFF) break;
   }
   getch();
   cleardevice();
   closegraph();
}


本文地址:http://com.8s8s.com/it/it22432.htm