⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fangc.c

📁 俄罗斯方块
💻 C
📖 第 1 页 / 共 2 页
字号:
 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=-1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=6;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=0;
 info->y[2]=-1;
 info->x[3]=1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=6;
 last->next=info;
 last=info;

 info=(struct diamond *)malloc(sizeof(struct diamond));
 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=-1;
 info->y[1]=0;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=1;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=6;
 last->next=info;
 last=info;
 last->next=first;

 for (i=0;i<=random(4);i++)
 {
  first=first->next;
 }
 return first;
}
/*****************************************************************************************/
struct diamond *create_Z()
{
 struct diamond *info;
 struct diamond *first;
 first=(struct diamond *)malloc(sizeof(struct diamond));
 info=(struct diamond *)malloc(sizeof(struct diamond));
 first->next=info;
 info->next=first;
 first->x[0]=0;
 first->y[0]=0;
 first->x[1]=-1;
 first->y[1]=0;
 first->x[2]=0;
 first->y[2]=1;
 first->x[3]=1;
 first->y[3]=1;
 first->start_x=5;
 first->start_y=2;
 first->color=9;

 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=1;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=1;
 info->y[3]=-1;
 info->start_x=5;
 info->start_y=2;
 info->color=9;

 if(random(2)==0) {return first;}
  else {return first->next;}
}
/*****************************************************************************************/
struct diamond *create_N()
{
 struct diamond *info;
 struct diamond *first;
 first=(struct diamond *)malloc(sizeof(struct diamond));
 info=(struct diamond *)malloc(sizeof(struct diamond));
 first->next=info;
 info->next=first;
 first->x[0]=0;
 first->y[0]=0;
 first->x[1]=0;
 first->y[1]=1;
 first->x[2]=-1;
 first->y[2]=1;
 first->x[3]=1;
 first->y[3]=0;
 first->start_x=5;
 first->start_y=2;
 first->color=14;

 info->x[0]=0;
 info->y[0]=0;
 info->x[1]=0;
 info->y[1]=-1;
 info->x[2]=1;
 info->y[2]=0;
 info->x[3]=1;
 info->y[3]=1;
 info->start_x=5;
 info->start_y=2;
 info->color=14;

 if(random(2)==0) {return first;}
  else {return first->next;}
}
/*****************************************************************************************/
struct diamond *create_H()
{
 struct diamond *first;
 first=(struct diamond *)malloc(sizeof(struct diamond));
 first->next=first;
 first->x[0]=0;
 first->y[0]=0;
 first->x[1]=0;
 first->y[1]=1;
 first->x[2]=1;
 first->y[2]=0;
 first->x[3]=1;
 first->y[3]=1;
 first->start_x=5;
 first->start_y=2;
 first->color=1;
 return first;
}
/*****************************************************************************************/
void show_next ()
{
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 struct diamond *next;/*当前方块的翻转后的下一个状态*/
 next=nowinfo->next;
 if (next==NULL) {gotoxy(1,1);printf("null");}
 for (i=0;i<=3;i++)/*判断是否能够翻转,若不能,就直接退出该函数*/
 {
  if (grid[x+next->x[i]][y+next->y[i]]==1)
  {
   return;
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/
 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (next->x[j]==nowinfo->x[i]&&next->y[j]==nowinfo->y[i]) {haveit=1;break;}
  }
  if (haveit==0) /*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
  grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
  if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }

 nowinfo=next;
 nowx=x;
 nowy=y;
 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  if (grid[x+nowinfo->x[i]][y+nowinfo->y[i]]!=2)/*如果该格子还没有被显示*/
  {
   nowx=x+nowinfo->x[i];
   nowy=y+nowinfo->y[i];
   if (y+nowinfo->y[i]>=4)
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2; /*设置该格子当前有活动方块*/
  }
 }
 return;
}
/*****************************************************************************************/
void show_left ()
{
 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 for (i=0;i<=3;i++)/*判断是否可以向左移动*/
 {
  if (grid[x-1+nowinfo->x[i]][y+nowinfo->y[i]]==1)
  {
   return;
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/
 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (nowinfo->x[i]==nowinfo->x[j]-1&&nowinfo->y[i]==nowinfo->y[j]) {haveit=1;break;}
  }
   if (haveit==0) /*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
   grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
   if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }

 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  nowx=x+nowinfo->x[i]-1;
  nowy=y+nowinfo->y[i];
  if (grid[nowx][nowy]!=2)/*如果该格子还没有被显示*/
  {
   if (nowy>=4)
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2;
  }
 }
 x=x-1;
 return;
}
/*****************************************************************************************/
void show_right ()
{
 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 for (i=0;i<=3;i++)
 {
  if (grid[x+1+nowinfo->x[i]][y+nowinfo->y[i]]==1)
  {
   return;/*判断是否可以向右移动*/
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/
 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (nowinfo->x[i]==nowinfo->x[j]+1&&nowinfo->y[i]==nowinfo->y[j]) {haveit=1;break;}
  }
   if (haveit==0)/*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
   grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
   if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }


 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  nowx=x+nowinfo->x[i]+1;
  nowy=y+nowinfo->y[i];
  if (grid[nowx][nowy]!=2)
  {
   if (nowy>=4)/*判断该格子是否到了可以显示的区域*/
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2;
  }
 }
 x=x+1;
 return;
}
/*****************************************************************************************/
void show_down ()
{

 int i;/*计数器*/
 int j;
 int haveit;/*当前格子是否已经显示*/
 int nowx;/*记录当前每个格子的位置*/
 int nowy;
 int key;
 for (i=0;i<=3;i++)
 {
  if (grid[x+nowinfo->x[i]][y+nowinfo->y[i]+1]==1)/*判断方块是否能够下落*/
  {
   for (j=0;j<=3;j++)
   {
    grid[x+nowinfo->x[j]][y+nowinfo->y[j]]=1;
 if (y+nowinfo->y[j]<=3)
 {/*判断游戏是否已经玩完*/
  install(oldtimer);
     setfillstyle(SOLID_FILL,1);
  bar(0,465,640,480);
  outtextxy(5,469,"Do you want to restart (Y/N)...");
  for (;;)
  {
      key=bioskey(0);
      if (key==YES)
   {
       startset();
    setfillstyle(SOLID_FILL,9);
    bar(0,465,640,480);
    return;
   }
      if (key==NO)
   {
    closegraph();
    exit (0);}
   }
  }
 }

   delinfo(nowinfo);
   scandel();/*扫描,删除*/
   delay(2500);
   while(bioskey(1)) bioskey(0);/*清除键盘缓冲区*/
  /* clrkey();*/
   nowinfo=nextinfo;/*得到新的方块*/
   nextinfo=get_diamond();/*得到下一个方块*/
   showsubwin(nextinfo);
   x=nowinfo->start_x;/*重新设置方块位置*/
   y=nowinfo->start_y;
   return;
  }
 }

 setfillstyle(SOLID_FILL,backcolor);/*设置背景色以消除不需要的格子*/

 for (i=0;i<=3;i++)
 {
  haveit=0;
  for (j=0;j<=3;j++)
  {
   if (nowinfo->x[i]==nowinfo->x[j]&&nowinfo->y[i]==nowinfo->y[j]+1) {haveit=1;break;}
  }
   if (haveit==0)/*判断翻转后该格子是否显示,若不显示,将该格子设为背景色*/
  {
   grid[x+nowinfo->x[i]][y+nowinfo->y[i]]=0;
   if (y+nowinfo->y[i]>=4)/*判断该格子是否到了可以显示的区域*/
    floodfill(80+(nowinfo->x[i]+x)*20+1,-20+(nowinfo->y[i]+y)*20+1,color);
  }
 }
 setfillstyle(SOLID_FILL,nowinfo->color);/*设置填冲色为方块的颜色*/
 for (i=0;i<=3;i++)
 {
  nowx=x+nowinfo->x[i];
  nowy=y+nowinfo->y[i]+1;
  if (grid[nowx][nowy]!=2)/*如果该格子还没有被显示*/
  {
   if (nowy>=4)
   floodfill(80+nowx*20+1,-20+nowy*20+1,color);
   grid[nowx][nowy]=2;
  }
 }
 y=y+1;
 return;
}
/*****************************************************************************************/
/*void print()测试用函数
{
int i;
int j;
gotoxy(1,1);
for (j=0;j<=22;j++)
{for (i=0;i<=11;i++)
{
printf ("%d",grid[i][j]);}
printf ("\n");
}
}*/
/*****************************************************************************************/
void scandel()
{
 int i;
 int k;
 int j;
 int num;
 int scoreadd;
 scoreadd=0;
 for (k=21;k>=4;k--)
 {
  num=0;
  for (i=1;i<=10;i++)
  {
   if (grid[i][k]==1) num++;
  }
  if (num==10)
  {
   scoreadd++;
   for (i=1;i<=10;i++)
   {
    setfillstyle(SOLID_FILL,backcolor);
    floodfill(80+i*20+1,-20+k*20+1,color);
   }

   for (j=k;j>=5;j--)
   {
 for (i=1;i<=10;i++)
 {
  setfillstyle(SOLID_FILL,getpixel(80+i*20+1,-40+j*20+1));
     floodfill(80+i*20+1,-20+j*20+1,color);
  grid[i][j]=grid[i][j-1];
 }
   }
   for (i=1;i<=10;i++)
   {
    setfillstyle(SOLID_FILL,backcolor);
    floodfill(80+i*20+1,61,color);
 grid[i][4]=0;
   }
   k++;
  }
 }
if (scoreadd!=0) showscore(2*scoreadd-1);
}
/*****************************************************************************************/
void interrupt newtimer()/*新的定时中断调用*/
{
  int leveltemp;
  leveltemp=11-level;
  count++;
  if(count>=leveltemp)
  {
  addtobuffer(DOWN);
  count=0;
  }
 (*oldtimer)();
}
/*****************************************************************************************/
void install (void interrupt (*paddr)())
{
 disable();
 setvect(0x1c,paddr);
 enable();
}
/******************************************************************************************/
void delinfo (struct diamond *info)/*释放开辟的空间*/
{
 struct diamond *now;
 struct diamond *next;
 now=info->next;
 next=info->next;
 while(next!=info)
 {
  next=now->next;
  free(now);
  now=next;
 }
 free(info);
 }
/******************************************************************************************/
void addtobuffer(int c)/*向键盘缓冲区中增加一个DOWN*/
{
 unsigned i;
 i=*(unsigned far *)0x0040001CL;
 *(unsigned far *)(0x00400000L | i)=c;
 i+=2;
 if (i>=*(unsigned far *)0x00400082L) i=*(unsigned far *)0x00400080L;
 *(unsigned far *)0x0040001CL=i;
}
/******************************************************************************************/
/*void clrkey()调用dos中断清空键盘缓冲区,未使用此方法.
{
  union REGS in ;
  in.h.ah = 0x0c ;
  in.h.al = 0x00 ;
  intdos(&in , &in) ;
}
*/
/******************************************************************************************/
void showsubwin(struct diamond *next)
{
 int i;/*计数器*/
 int j;
 setfillstyle (SOLID_FILL,backcolor);
 for (i=0;i<=3;i++)
 {
  for(j=0;j<=3;j++)
  {
   floodfill(361+20*i,61+20*j,color);
  }
 }
 setfillstyle (SOLID_FILL,next->color);
 for (i=0;i<=3;i++)
 {
  floodfill(381+next->x[i]*20,81+next->y[i]*20,color);
 }
}
/******************************************************************************************/
void showscore(int scoreget)
{
 char sscore[6];
 char slevel[2];
 score+=scoreget;
 if (score<1000) level=score/100+1;
 sprintf(sscore,"%d",score);
 sprintf(slevel,"%d",level);
 setfillstyle(SOLID_FILL,9);
 bar(406,179,490,203);
 setcolor(14);
 outtextxy (408,180,slevel);
 outtextxy (408,195,sscore);
}
/*******************************************************************************************/
void startset()
{
 int i;
 int j;
 setfillstyle(SOLID_FILL,backcolor);
 for(i=0;i<=21;i++)/*重新初始化*/
 {
  for(j=1;j<=10;j++)
  if (grid[j][i]!=0)
  {
  grid[j][i]=0;
  if (i>=4) floodfill(80+j*20+1,-20+i*20+1,color);
  }
 }
 score=0;
 showscore(0);
 nowinfo=get_diamond ();/*得到一个当前方块*/
 x=nowinfo->start_x;/*初始化方块位置*/
 y=nowinfo->start_y;
 nextinfo=get_diamond ();/*得到下一个方块*/
 showsubwin(nextinfo);
 install(newtimer);
}
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -