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

📄 block.c

📁 这是老早前学生时代用TurboC++3.0写的dos程序
💻 C
📖 第 1 页 / 共 2 页
字号:
     }

/* The group function is about move block */
/* It is cental step move for a time */
/* The Rolate is process block rolating */
/* and move to left and right */
/* and process key value for move and rolated */

void movecental()
     {
       char c[4];
       switch( getkey() )
	     {
	       case 0: if( endscreen(&time_mark,SCORE) )
			 {
			   EXITGAME=1; break;
			 }
		       else break;
	       case 3: rolateblock(); break;
	       case 4: moveblock(LEFT); break;
	       case 5: moveblock(RIGHT); break;
	       case 6: QUICKLY=1; break;
	       case 7: if( ++LEVER>9 ) LEVER=0;
		       setcolor(BLUE);
		       clearchar(LEVER_X,LEVER_Y,3);
		       sprintf(c,"%d",LEVER);
		       moveto(LEVER_X,LEVER_Y);
		       outtext(c);
		       break;
	       case 1:
	       case 2: clearchar(NORMAL_X,NORMAL_Y,6);
		       moveto(NORMAL_X,NORMAL_Y);
		       setcolor(BLUE);
		       DIFF=DIFF^1;
		       outtext(NORMAL[DIFF]);
		       break;
	     }
       return;
     }
void movestep()
     {
       BNODE *p;
       int mark=0;

       if( isstop() ) return;
       for(p=head;p;p=p->next)
	  {
	    p->y++;
	    if( p->y >= PLAYWIDTH ) mark=1;
	  }
       if( mark ) for(p=head;p;p=p->next) p->y--;
       else DISTENCEY++;

       return;
     }
void rolateblock()
     {
       int i,j,l,temp,mark=1;
       int b[32];
       BNODE *p;
       if( isstop() ) return;
       if( DISTENCEX<0 || DISTENCEX>9 || isstop() ) return;
       for(p=head,l=0; p && mark ;p=p->next,l++)
	  {
	    b[l++]=p->x;  b[l]=p->y;
	    i=p->x; j=p->y;
	    i-=DISTENCEX; j-=DISTENCEY;
	    i--; j--;
	    temp=j;
	    j=-i; i=temp;
	    i++;j++;
	    if( i>PLAYLENGTH-DISTENCEX || j>PLAYWIDTH-DISTENCEY
			    || i+DISTENCEX<0 || i+DISTENCEX>PLAYLENGTH-1)
	      { mark=0; continue; }
	    p->x=i+DISTENCEX;  p->y=j+DISTENCEY;
	  }
       if( !mark )
	 {
	   for(i=0,p=head;i<l;i++,p=p->next)
	      {
		p->x=b[i++];  p->y=b[i];
	      }
	 }
       return;
     }
void moveblock(int m1)
     {
       register i,l,mark=1;
       BNODE *p;
       switch( m1 )
	     {
	       case LEFT: if( ismove(LEFT) )
			    {
			      for(p=head,l=0; p && mark ;p=p->next,l++)
				 {
				   p->x-=1;
				 }
			      DISTENCEX--;
			      return;
			    }
			  return;
	       case RIGHT: if( ismove(RIGHT) )
			     {
			       for(p=head,l=0; p && mark ;p=p->next,l++)
				  {
				    p->x+=1;
				  }
			       DISTENCEX++;
			       return;
			     }
			  return;
	     }
       return;
     }

void wait(int x)
     {
       register i,j;
       for(i=0;i<=x;i++)
	  for(j=0;j<5000;j++);
       return;
     }
int getbnodexy()
    {
       register i,j,l;
       int bnum;
       for(i=0,bnum=0,l=0;i<4;i++)
	  for(j=0;j<4;j++)
	     if( setview[i][j] )
	       {
		 blockaddr[l]=j;  l++;
		 blockaddr[l]=i;  l++;
		 bnum++;
	       }
       return bnum;
    }
int iskey()
    {
      return bioskey(1);
    }
int getkey()
    {
      union{
	     char c[2];
	     int keys;
	   }k;

      k.keys=bioskey(0);

      if( !k.c[0] )
	switch( k.c[1] )
	      {
		case PAGE_UP: return 1;
		case PAGE_DOWN: return 2;
		case ARROW_UP: return 7;
		case ARROW_LEFT: return 4;
		case ARROW_RIGHT: return 5;
		case ARROW_DOWN: return 6;
		default: return 255;
	      }
      else switch( k.c[0] )
		 {
		   case ESC: return 0;
		   case '2': return 6;
		   case '5': return 3;
		   case '4': return 4;
		   case '6': return 5;
		   case '0': return 6;
		   case 'y':
		   case 'Y': return 8;
		   case 'N':
		   case 'n': return 9;
		   case ENTER: return 10;
		   default: return 255;
		 }
    }

int isstop()
    {
      BNODE *p,*p1;
      int x,y;
      for(p=head;p;p=p->next)
	 {
	   x=p->x;
	   y=p->y;  y++;
	   if( y>PLAYWIDTH-1 ) return 1;
	   if( playview[y][x] )
	     {
	       for(p1=head;p1;p1=p1->next)
		  {
		    if( p1->x==x && p1->y==y )
		    break;
		  }
	       if(!p1) return 1;
	     }
	 }
      return 0;
    }
void clearline()
     {
       register i,j,l;
       int number,line[4];

       for(i=0;i<4;i++,line[i]=0);
       for(i=0,number=0;i<PLAYWIDTH;i++)
	  {
	    for(j=0;j<PLAYLENGTH;j++)
	       {
		 if( !playview[i][j] ) break;
	       }
	    if(j==PLAYLENGTH )
	      {
		line[number]=i;  number++;
		for(j=0;j<PLAYLENGTH;playview[i][j]=0,j++);
	      }
	  }
       if( number )
	 {
	   for(i=0;i<number;i++)
	      {
		for(j=line[i];j>0;j--)
		   {
		     for(l=0;l<PLAYLENGTH;l++)
			{
			playview[j][l]=playview[j-1][l];
			}
		   }
	      }
	   for(i=0;i<PLAYLENGTH;playview[0][i]=0,i++);
	   printplayview();
	   changevar(number);
	 }
     }
int gameover()
    {
     register i;

     for(i=0;i<PLAYLENGTH ;i++)
	if( playview[1][i] ) break;
     if( i==PLAYLENGTH )  return 0;

     if( endscreen(&time_mark,SCORE) ) return 1;
     LEVER=0; SCORE=0; LINE=0; EXITGAME=0;
     printvar();
     clearplayview();
     printplayview();
     time_mark=t;
     return 0;
    }
int ismove(int mark)
    {
      register i,value;
      BNODE *p;
      switch(mark)
	    {
	      case RIGHT: value=1;
			  for(p=head;p;p=p->next)
			     {
			      if(p->x+1==PLAYLENGTH||playview[p->y][p->x+1])
			      value=0;
			     }
			  return value;
	      case LEFT:  value=1;
			  for(p=head;p;p=p->next)
			     {
			       if( p->x-1<0 || playview[p->y][p->x-1] )
			       value=0;
			     }
			  return value;
	    }
      return value;
    }
void freememory()
     {
       BNODE *p;
       for(p=head ;head; p=head)
	  {
	    head=head->next;
	    free(p);
	  }
       return;
     }
void placetime(struct time *playtime )
     {
       struct time tp;
       static struct time starttime;

       if( TIMEMARK ) { gettime(&starttime); TIMEMARK=0; }
       gettime(&tp);
       if( tp.ti_sec==starttime.ti_sec ) return;
       starttime=tp;
       playtime->ti_sec++;
       if( playtime->ti_sec==60 )
	 {
	   playtime->ti_sec=0;
	   playtime->ti_min++;
	   if( playtime->ti_min==60 )
	     {
	       playtime->ti_min=0;
	       playtime->ti_hour++;
	       if( playtime->ti_hour==24 ) playtime->ti_hour=0;
	     }
	 }
       printtime(*playtime);
       return;
     }

void printtime(struct time tp)
     {
       char buf[20];

       sprintf(buf,"%02d:%02d:%02d",tp.ti_hour,tp.ti_min,tp.ti_sec);
       settextjustify(LEFT_TEXT,TOP_TEXT);
       settextstyle(DEFAULT_FONT,HORIZ_DIR,2);

       setcolor(BLUE);
       clearchar(TIME_X,TIME_Y,10);
       moveto(TIME_X,TIME_Y);
       outtext(buf);

       return;
     }
void clearchar(int x,int y,int charnum)
     {
       setfillstyle(SOLID_FILL,LIGHTGRAY);
       bar(x,y,x+charnum*16,y+16);
       return;
     }
void changevar(int x)
     {
       char c[20];

       LINE+=x;

       switch(x){
	     case 1:  SCORE+=100; break;
	     case 2:  SCORE+=300; break;
	     case 3:  SCORE+=700; break;
	     case 4:  SCORE+=1500; break;
	     default: break;
       }
       if( SCORE>=(long)10000*(CURRENT+1) )
	 {
	   LEVER++;  CURRENT++;
	   if( LEVER>10 ) {
			   LEVER=0;
			   clearchar(NORMAL_X,NORMAL_Y,6);
			   moveto(NORMAL_X,NORMAL_Y);
			   setcolor(BLUE);
			   outtext(NORMAL[DIFF]);
			 }
	 }
       if( SCORE>HISCORE ) { HISCORE=SCORE; HIGH=1;}
       else HIGH=0;

       setcolor(BLUE);
       clearchar(LEVER_X,LEVER_Y,3);
       sprintf(c,"%d",LEVER);
       moveto(LEVER_X,LEVER_Y);
       outtext(c);

       clearchar(SCORE_X,SCORE_Y,7);
       sprintf(c,"%ld",SCORE);
       moveto(SCORE_X,SCORE_Y);
       outtext(c);

       clearchar(LINE_X,LINE_Y,5);
       sprintf(c,"%d",LINE);
       moveto(LINE_X,LINE_Y);
       outtext(c);

       clearchar(HISCORE_X,HISCORE_Y,7);
       sprintf(c,"%ld",HISCORE);
       moveto(HISCORE_X,HISCORE_Y);
       outtext(c);
     }
void printvar()
    {
      char c[20];

       setcolor(BLUE);
       settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
       clearchar(LEVER_X,LEVER_Y,3);
       sprintf(c,"%d",LEVER);
       moveto(LEVER_X,LEVER_Y);
       outtext(c);

       clearchar(SCORE_X,SCORE_Y,7);
       sprintf(c,"%ld",SCORE);
       moveto(SCORE_X,SCORE_Y);
       outtext(c);

       clearchar(LINE_X,LINE_Y,5);
       sprintf(c,"%d",LINE);
       moveto(LINE_X,LINE_Y);
       outtext(c);

       clearchar(HISCORE_X,HISCORE_Y,7);
       sprintf(c,"%ld",HISCORE);
       moveto(HISCORE_X,HISCORE_Y);
       outtext(c);

       moveto(NORMAL_X,NORMAL_Y);
       outtext(NORMAL[DIFF]);

       printtime(time_mark);
       return;
    }
void setvar()
     {
       int para[4],width,setx,sety;
       register i,j,mark;

       cleardevice();
       setbkcolor(BLUE);

       para[0]=LINE; para[1]=LEVER; para[2]=DIFF; para[3]=0;
       setupscreen(para,&HISCORE);
       LINE=para[0]; LEVER=para[1];  DIFF=para[2];

       randomize();
       for(i=PLAYWIDTH-1;i>=PLAYWIDTH-para[0];i--)
	  {
	    width=random(PLAYLENGTH-1)+1;
	    sety=i;
	    for(j=1;j<=width;j++)
	       {
		 for(mark=1;mark; )
		    {
		      setx=random(PLAYLENGTH);
		      if( playview[sety][setx]==0 )
			{
			   playview[sety][setx]=1;
			   mark=0;
			}
		    }
	       }
	  }
       LINE=0;
       return;
     }
int is_one_block()
    {
      if(head->next->next==NULL) return 1;
      else return 0;
    }
void draw_one_block(int x,int y,int length,int width)
     {
       setfillstyle(SOLID_FILL,LIGHTRED);
       bar(x,y,x+length-1,y+width-1);
       setcolor(WHITE);
       line(x+1,y+1,x+length-1,y+1);
       line(x+1,y+1,x+1,y+width-2);
       setcolor(DARKGRAY);
       line(x+length-1,y+width-2,x+length-1,y+1);
       line(x+1,y+width-2,x+length-1,y+width-2);
       setfillstyle(SOLID_FILL,LIGHTGRAY);
       return;
     }

⌨️ 快捷键说明

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