www.pudn.com > olsfk(C-programe).rar > BOX.C


#include "signal.h" 
#include "graphics.h" 
#include "mem.h" 
#include "dir.h" 
#include "string.h" 
#include "time.h" 
#include "stdio.h" 
#include "stdlib.h" 
#include "dos.h" 
#include "bios.h" 
#include "conio.h" 
#include "io.h" 
#include "fcntl.h" 
#include "stat.h" 
#include "share.h" 
 
#define down      380 
#define DOWN      380 
#define up        372 
#define UP        372 
#define righ      377 
#define RIGHT     377 
#define left      375 
#define LEFT      375 
#define tab       9 
#define TAB       9 
#define BackSpace 8 
#define F1        359 
#define F2        360 
#define F3        361 
#define F8        366 
#define F10       368 
#define F9        367 
#define DOWN      380 
#define UP        372 
#define ROTAR     32 
#define RIGHT     377 
#define LEFT      375 
#define INSERT    382 
#define DELETE    383 
#define PrtScr    23 
#define HOME      371 
#define END       379 
#define PgDn      381 
#define PgUp      373 
#define ESC       27 
#define R_shift   0x100 
#define L_shift   0x200 
#define Alt       0x400 
#define Ctrl      0x800 
#define Scroll_Lock  0x1000 
#define Num_Lock     0x2000 
#define Caps_Lock    0x4000 
#define Insert       0x8000 
 
#define  HOUR_X      466/*ÏÔʾʱµÄºá×ø±ê*/ 
#define  HOUR_Y      220 
#define  MINU_X      500 
#define  MINU_Y      220 
#define  SECD_X      534 
#define  SECD_Y      220 
#define  BCKCLO      9 
#define  FORECLO     RED 
 
 
FILE *hzk_p; 
static unsigned int  all_box[7][4][4]={{0,0,0,0, 1,1,1,1, 0,0,0,0, 0,0,0,0}, 
                       {0,0,0,0, 0,1,0,0, 0,1,1,1, 0,0,0,0}, 
                       {0,0,0,0, 0,0,1,0, 1,1,1,0, 0,0,0,0}, 
                       {0,0,0,0, 0,0,1,0, 0,1,1,1, 0,0,0,0}, 
                       {0,0,0,0, 0,1,0,0, 1,1,1,0, 0,0,0,0}, 
                       {0,0,0,0, 0,0,1,0, 0,1,1,0, 0,1,0,0}, 
                       {0,0,0,0, 0,1,1,0, 0,1,1,0, 0,0,0,0}}; 
int max_x,max_y,h,l,x1,y1,x2,y2,voice=0,ro_way=0,sec=0; 
unsigned long start_time; 
int color=15,bkcolor=BLUE,speed=0; 
int old_status,move_left,move_right,move_down,move_rotar; 
struct box{ 
       int ch[4][4]; 
       int x,y; 
       }active,bak; 
struct win{ 
       int bx,by,dx,dy; 
      }; 
struct window{ 
    int bx,by,dx,dy; 
    }; 
struct WINHZ 
      { 
       int hx0; 
       int hy0; 
       int hb1; 
       int hb2; 
      }; 
 
char upper(char ch); 
void DELAY(int i); 
void disp_rotar(void); 
void help(void); 
void in(int x,int y,int dx,int dy); 
void sound_on(int x,int y,int color); 
void sound_off(int x,int y,int color); 
void DELAY(int k); 
void scroll_up(int ,int,int,int); 
void disp_score(void); 
void ch_rotar(void); 
void restore_scr(const char *fig_name,struct win window); 
char *key2str(unsigned int  key); 
void play_time(int); 
int play(void); 
void infor(void); 
void trace(void); 
void disp_str16(int x,int y,int color,unsigned char str[],int wd,int times); 
void disp_hz24(struct WINHZ start,int color,unsigned char hz[]); 
void Bar(int k,int p[],int x,int y); 
void produce(void); 
void prompt(void); 
void Quit_all_to_dos(void); 
int Quit_if(void); 
void pass(void); 
void face_1(void); 
void interrupt Break(void); 
void check_speed(void); 
 
void disp_sound(int,int,int); 
void cur_help(char); 
void scr_box(void); 
void start_play(void); 
void s_play(void); 
void face(void); 
void show_win(struct window win,int color,char *str); 
void clear_win(struct window win,int color); 
void set_default_key(void); 
void EXIT(int,char*); 
void disp_box(void); 
void init_var(void); 
void end(void); 
void rigts(void); 
void select(void); 
void init_graph(void); 
void set_key_menu(struct window); 
void set_key_sub(int i,struct window win); 
void sum(void); 
void msec_delay(long); 
void my_delay(int); 
void stop(void); 
void del_line(void); 
void Sound(int ok); 
void win_sound(int ok); 
void face_3(void); 
void rigt(void); 
 
char *get_Author(void); 
 
int  main_menu(int k); 
int get_keyboard(int fist); 
int exit_handler(void); 
int SELE(int x1,int y1,int x2,int y2); 
int totar(int way); 
int bar_cursor_move(int ex,int ey,int dy,int k); 
int get_key(struct window win); 
int get_key_char(void); 
int get_key_status(void); 
int more(int key); 
int speed_blink(void); 
int sound_blink(void); 
int checkq(int way,struct box act); 
int full(int i); 
int getkey(int); 
int board[25][20]; 
 
unsigned long int ss,score_rem; 
 
main() 
{int k=0,flag=0; 
 struct window win; 
 clrscr(); 
 init_graph(); 
 face(); 
 win.bx=300;win.by=50,win.dx=300,win.dy=200; 
 old_status=bioskey(2); 
 set_default_key(); 
 do{ 
 if(flag==1){setfillstyle(1,12); bar(10,425,max_x-10,450);} 
 disp_str16(164,430,14,"½­Î÷ʦ·¶´óѧÎïÀíϵÈí¼þÉè¼ÆÊÒÖÆ×÷",5,1); 
 setviewport(0,0,max_x,420,1); 
 clearviewport(); 
 k=main_menu(k); 
 setviewport(0,0,max_x,max_y,1); 
 
 trace(); 
 switch(k) 
 {case 0: flag=0;break;/*demo()*/ 
  case 1: setviewport(0,0,max_x,max_y,1); 
      start_play();clearviewport();flag=1;break; 
  case 2: setviewport(0,0,max_x,max_y,1);clearviewport(); 
      infor();clearviewport();flag=1;break;/*information()*/ 
  case 3: setviewport(0,0,max_x,420,1);set_key_menu(win); 
      flag=1;clearviewport();break; 
  case 4: setviewport(0,0,max_x,max_y,1);init_var(); 
      Quit_all_to_dos();flag=1;break; 
  }; 
 trace(); 
 }while(1); 
 Quit_all_to_dos(); 
} 
void start_play(void) 
{ 
 trace(); 
 init_var(); 
 s_play( ); 
 setfillstyle(1,GREEN); 
 bar(4,y2+2,max_x-2,max_y-4); 
 do     {int k; 
     init_var(); 
     select(); 
     k=play(); 
     if(k==ESC) return; 
     end(); 
     ss=0;disp_score(); 
    }while(1); 
} 
 
void init_graph(void) 
{int grad,gram,code; 
 grad=DETECT; 
/* if(registerbgidriver(EGAVGA_driver)<0) exit(1); 
 if(registerbgifont(small_font)<0)      exit(1);*/ 
 initgraph(&grad,&gram,""); 
 code=graphresult(); 
 if (code!=0) {printf("error:%s", grapherrormsg(code));exit(8);} 
 max_x=getmaxx();max_y=getmaxy(); 
 cleardevice(); 
} 
void face() 
{ int i; 
  struct WINHZ start; 
  outportb(0x3c8,4); 
  for(i=0;i<3;i++)   outportb(0x3c9,0);           /*clear 0*/ 
  face_1(); 
  for(i=0;i<64;i++) {outportb(0x3c8,4);           /*show on*/ 
             outportb(0x3c9,i); 
             outportb(0x3c9,i);outportb(0x3c9,i);my_delay(3);} 
  start.hx0=150; 
  start.hy0=300; 
  start.hb1=3; 
  start.hb2=3; 
  for(i=1;i<=RED;i++) 
     disp_hz24(start,i,"¶íÂÞ˹·½¿é"); 
  while(bioskey(1)) getch(); 
  bioskey(0);                                    /*show off*/ 
  for(i=63;i>0;i--) {outportb(0x3c8,4); 
             outportb(0x3c9,i); 
             outportb(0x3c9,i);outportb(0x3c9,i);my_delay(2);} 
 face_3(); 
} 
void s_play(void) 
{ 
 setfillstyle(1,BLUE);bar(1,1,max_x,max_y); 
 setlinestyle(0,0,1); 
 setcolor(GREEN); 
 line(x1+2+l/2+l,3,x1+2+l/2+l,y2+1); 
 line(x2+l-2,3,x2+l-2,y2+1); 
 line(x1+1+l/2+l,3,x1+1+l/2+l,y2+1); 
 line(x2+l-3,3,x2+l-3,y2+1); 
 line(x2+l-4,3,x2+l-4,y2+1); 
 line(3,y2+1,max_x,y2+1); line(3,y2+1,max_x,y2+1); 
 line(2,2,2,max_y-2); 
 line(3,3,3,max_y-3); 
 line(2,2,max_x-2,2); 
 line(3,3,max_x-3,3); 
 line(max_x-1,2,max_x-1,max_y-1); 
 line(max_x-2,3,max_x-2,max_y-2); 
 setcolor(WHITE); 
 line(x1+l/2+l,4,x1+l/2+l,y2); 
 line(x2+l-5,4,x2+l-5,y2); 
 line(4,y2,x1+l/2+l,y2); 
 line(x1+l/2+l+3,y2,x2+l-5,y2); 
 line(x2+l-1,y2,max_x-3,y2); 
 line(1,1,1,max_y-3); 
 line(max_x-3,3,max_x-3,y2+1); 
 line(1,1,max_x,1); 
 setfillstyle(1,9);bar(4,4,x1+l/2+l-1,y2-1);bar(x2+l-1,4,max_x-4,y2-1); 
 setcolor(BLACK); 
 line(4,4,4,y2);line(4,4,x1+l/2+l-1,4); 
 line(x2+l-2,4,x2+l-2,y2-1); 
 line(x2+l-2,4,max_x-4,4); 
 setcolor(7); 
 line(0,max_y-2,max_x,max_y-2); 
 line(max_x-1,0,max_x-1,max_y-2); 
 rigts(); 
} 
 
int play(void) 
{ 
int ok,key,i,j; 
produce();start_time=clock();sec=0; 
help(); 
cur_help('P'); 
do { 
    for(i=0;i<4;i++) 
     for(j=0;j<4;j++) 
         active.ch[i][j]=bak.ch[i][j];; 
    active.x=0; 
    active.y=4; 
    produce(); 
    prompt(); 
    ok=move(move_down); 
    if(!ok) return(0); 
    while(bioskey(1)) getch(); 
    while(ok) 
       {key=play_read();ok=0;i=0; 
       do{ 
          if(key==F10)      return(0); 
          if(key==move_down){ do{ok=move(move_down);i++; 
                   }while((ok!=0)&&(i<13)); 
                break; 
            	} 
          if(key==0)         { ok=move(move_down);break;} 
          if(key==ESC)       return(ESC); 
          ok=move(key);Sound(voice);break; 
         }while(1); 
    } 
    stop(); 
    score_rem=ss; 
    disp_score(); 
    check_speed(); 
    del_line(); 
   }while(1); 
return(0); 
} 
 
 
void produce(void) 
{int i,j,ran; 
 ran=random(7)%7; 
 for(i=0;i<4;i++) for(j=0;j<4;j++) 
 bak.ch[i][j]=all_box[ran][i][j]; 
} 
 
void prompt(void) 
{int i,j; 
 setfillstyle(1,7); 
 bar(x2+l+1,y1+51,x2+5*l+2,y1+4*h+50); 
 in(x2+l,y1+51,4*l+1,4*h); 
 setlinestyle(0,0,1); 
 setfillstyle(1,RED);setcolor(7); 
 for(i=0;i<4;i++) 
   for(j=0;j<4;j++) 
   if(bak.ch[j][i]) {bar(x2+i*l+l,y1+j*h+50,x2+(i+2)*l,y1+(j+1)*h+50); 
             setcolor(7); 
             rectangle(x2+(bak.x+i+1)*l,y1+(bak.y+j)*h+50, 
                   x2+(bak.x+i+2)*l,y1+(bak.y+j+1)*h+50); 
             out(x2+(bak.x+i+1)*l+2,y1+(bak.y+j)*h+52,l-4,h-4); 
            } 
} 
 
int move(int key) 
{int ok; 
ok=check(key,active);if(ok==0) return(0); 
scr_box(); 
do{ 
 if(key==move_down)       {active.x++;break;} 
 if(key==move_left)       {active.y--;break;} 
 if(key==move_right)      {active.y++;break;} 
 if(key==move_rotar)      {rotar();   break;} 
 nosound();ok=0;break; 
 }while(1); 
disp_box(); 
return(ok); 
} 
 
int check(int key,struct box ac)/*return 0 if can't move*/ 
{ int ok,i,j,x=ac.x,y=ac.y+4; 
  ok=1; 
  do{ 
   if(key==move_down)  {for(i=3;i>=0;i--) for(j=0;j<4;j++) 
            if((ac.ch[i][j])&&(board[i+x+1][j+y])) ok=0; 
            break;} 
   if(key==move_right)  {for(j=3;j>=0;j--) for(i=0;i<4;i++) 
            if((ac.ch[i][j])&&(board[i+x][j+y+1])) ok=0; 
            break;} 
   if(key==move_left)  {for(j=3;j>=0;j--) for(i=0;i<4;i++) 
            if((ac.ch[i][j])&&(board[i+x][j+y-1])) ok=0; 
            break;} 
 
  break; 
  } 
 while(1); 
 return(ok); 
} 
 
int rotar(void) 
{int i,j,ok=1; 
 struct box nn; 
 nn.x=active.x;nn.y=active.y; 
 for(i=0;i<4;i++)for(j=0;j<4;j++) 
 if(ro_way) nn.ch[3-j][i]=active.ch[i][j]; 
 else nn.ch[j][i]=active.ch[3-i][j]; 
 for(i=0;i<4;i++) for(j=0;j<4;j++) 
     if(nn.ch[i][j]&&board[i+nn.x][j+nn.y+4]) return(0); 
 if(ok)  for(i=0;i<4;i++) for(j=0;j<4;j++) active.ch[i][j]=nn.ch[i][j]; 
 return(ok); 
} 
 
int play_read(void) 
{int i,ch=0,ok=1; 
 int SPEED[11]={24,20,18,15,12,10,8,6,4,2,1}; 
 for(i=SPEED[speed];i>0;i--) 
   {if((ch=get_keyboard(0))!=0) 
          {if(ch==move_down) return(move_down); 
           if( (ch!=0)&&( (ok=check(ch,active))!=0)) return(ch); 
          } 
    play_time(speed/7); 
   } 
   if(ok==0) ch=0; 
 return(ch); 
} 
 
void scr_box(void) 
{int i,j,x=active.x,y=active.y; 
 int bx=x1-6; 
 setfillstyle(1,bkcolor); 
 for(i=0;i<4;i++) for(j=0;j<4;j++) 
    if(active.ch[i][j]) bar(bx+(y+j)*l,y1+(x+i)*h,bx+(y+j+1)*l,y1+(x+i+1)*h); 
} 
 
void disp_box(void) 
{int j,i,x=active.x,y=active.y; 
 int bx=x1-6; 
 setlinestyle(0,0,1); 
 setfillstyle(1,BROWN);setcolor(bkcolor); 
 for(i=0;i<4;i++)for(j=0;j<4;j++) 
 if(active.ch[i][j]){ bar(bx+(y+j)*l,y1+(x+i)*h,bx+(y+j+1)*l,y1+(x+i+1)*h); 
              setcolor(bkcolor); 
              rectangle(bx+(y+j)*l,  y1+(x+i)*h, 
                bx+(y+j+1)*l,y1+(x+i+1)*h); 
              out(bx+(y+j)*l+2,y1+(x+i)*h+2,l-4,h-4); 
             } 
} 
 
void init_var(void) 
{int i,j; 
 for(i=0;i<25;i++) for(j=0;j<20;j++) board[i][j]=0; 
 for(i=0;i<25;i++) board[i][5]=board[i][16]=1; 
 for(j=0;j<20;j++) board[20][j]=1; 
 bkcolor=BLUE; 
 color=BROWN; 
 ss=0; 
 randomize(); 
 h=20;l=h; 
 x1=max_x/3;y1=10; 
 x2=x1+l*11+1;y2=y1+20*h+2; 
} 
 
void end(void) 
{int i,j,x; 
 x=x1-6; 
 setfillstyle(1,CYAN);setcolor(bkcolor); 
 for(i=19;i>0;i--) 
 {for(j=2;j<12;j++) 
  {bar(x+j*l,y1+i*h,x+(j+1)*l,y1+(i+1)*h); 
   setcolor(bkcolor); 
   rectangle(x+j*l,y1+i*h,x+(j+1)*l,y1+(i+1)*h); 
   out(x+j*l+2,y1+i*h+2,l-4,h-4); 
  } 
 my_delay(2); 
 } 
 setfillstyle(1,bkcolor); 
 for(i=1;i<21;i++) 
  {bar(x+2*l,y1,x+12*l,y1+i*h);my_delay(2);} 
} 
 
void select(void) 
{int key,ok=1; 
 int x=x1/2+30,y=(y1+y2)/2; 
 char mess[10]; 
 setcolor(WHITE);cur_help('S'); 
 settextstyle(0,0,2); 
 do{key=speed_blink(); 
    switch(key) 
    {case down: speed=(speed+1)%10;break; 
     case up:   speed--;if(speed<0) speed=9;break; 
     case 13:   ok=0;break; 
     case F3:   ok=0;break; 
     default:   break; 
    } 
   }while(ok); 
 settextstyle(2,0,7);setcolor(WHITE); 
 sprintf(mess,"%d",speed); 
 outtextxy(x+30,y,mess);in(x-1,y-1,80,20);ok=1; 
 if(key==F3) return; 
 do{ key=sound_blink(); 
     switch(key) 
     {case down: 
      case up: voice=(voice+1)%2;break; 
      case 13: ok=0;break; 
      case F3: ok=0;break; 
      default: break; 
     } 
    }while(ok); 
 disp_sound(WHITE,x,y+30);in(x-1,y+30-1,80,20); 
 if(key==F3) return; 
 ch_rotar(); 
} 
 
int speed_blink(void) 
{int i,ok,color; 
 int x=x1/2+30,y=(y1+y2)/2; 
 char ch[10]; 
 color=WHITE;ok=1; 
 sprintf(ch,"%d",speed); 
 settextstyle(2,0,7); 
 do{ setcolor(color);my_delay(5);outtextxy(x+30,y,ch);in(x-1,y-1,80,20); 
     for(i=1;i<50;i++) {if(bioskey(1)) {ok=0; break;}} 
     setcolor(BROWN);my_delay(5);outtextxy(x+30,y,ch); 
     for(i=1;i<50;i++) {if(bioskey(1)) {ok=0;break;}} 
   } while(ok); 
 settextstyle(2,0,7); 
 setcolor(color);outtextxy(x+30,y,ch); 
 setfillstyle(1,BROWN);bar(x,y,x+70,y+17);in(x-1,y-1,80,20); 
 i=getch();if(i==0) i=300+getch(); 
 return(i); 
} 
 
int sound_blink(void) 
{int ch,color; 
 int x=x1/2+30,y=(y1+y2)/2+30; 
 settextstyle(0,0,2); 
 color=WHITE; 
 
 do{setcolor(color); 
    settextstyle(0,0,2); 
    disp_sound(color,x,y); 
    in(x-1,y-1,80,20);my_delay(5); 
    settextstyle(0,0,2); 
    disp_sound(BROWN,x,y); 
    in(x-1,y-1,80,20);my_delay(5); 
 } 
 while(!bioskey(1)); 
 
 setfillstyle(1,BROWN);bar(x,y,x+78,y+18); 
 ch=getch();if (ch==0) ch=300+getch(); 
 return(ch); 
} 
 
void disp_score(void) 
{ char d[9]; 
 int i,s=0; 
 for(i=0;i<=19;i++) s=s+full(i); 
 ss=ss+((1<15) k=1; 
 return(k); 
} 
 
void stop(void) 
{int i,j,y=active.y,x=active.x; 
 int bx=x1-6; 
 Sound(voice); 
 setcolor(bkcolor); 
  for(i=3;i>=0;i--)for(j=0;j<4;j++) 
  if(active.ch[i][j]){board[i+x][j+y+4]=1;setfillstyle(1,CYAN); 
              bar(bx+(y+j)*l,y1+(x+i)*h,bx+(y+j+1)*l,y1+(x+i+1)*h); 
              setcolor(bkcolor); 
              rectangle(bx+(y+j)*l,y1+(x+i)*h, 
                bx+(y+j+1)*l,y1+(x+i+1)*h); 
              out(bx+(y+j)*l+2,y1+(x+i)*h+2,l-4,h-4); 
             } 
} 
 
void del_line(void) 
{int i,j,n,p,x; 
 size_t num; 
 void *pot; 
 int bx=x1-6,end_line=20; 
 x=x1+17; 
 num=imagesize(x,y1-h,x2+l/2,y1+3*h); 
 if(num>0) pot=malloc(num); 
 else 
    {EXIT(0,"too big");} 
 if(pot==NULL) {EXIT(8,"haven't enough memory!");} 
 setfillstyle(1,WHITE);setcolor(bkcolor); 
 if(active.x<17) end_line=active.x+4; 
 for(i=active.x;i0;p=p-4) {getimage(x+18,y1+(p-3)*h,x2+18,y1+(p+1)*h,pot); 
        putimage(x+18,y1+(p-2)*h,pot,COPY_PUT);} 
        for(n=i;n>1;n--) for(j=1;j<24;j++) board[n][j]=board[n-1][j]; 
        for(j=6;j<16;j++) board[0][j]=0; 
        win_sound(voice); 
           } 
 if(pot!=NULL) free(pot); 
} 
 
void Sound(int k) 
{unsigned int i; 
 if(!k) return; 
 for(i=2;i<10;i++) 
   {sound(600*i);my_delay(1);} 
nosound(); 
} 
 
void win_sound(int k) 
{unsigned int i,j; 
 if(!k) return; 
 for(j=1;j<3;j++) for(i=3;i<10;i++) 
   {sound(i*1000);my_delay(1);nosound();} 
 nosound(); 
} 
 
void face_3(void) 
{int i,k,j,x,y,H,L,d; 
 struct palettetype p; 
 getpalette(&p); 
 x=10,y=max_y/2;L=max_x/40;H=L; 
 d=max_x/7-1; 
 setviewport(0,0,max_x,420,1); 
 clearviewport(); 
 setbkcolor(BLACK); 
 setcolor(BLACK); 
 set_pal(p); 
 setlinestyle(0,0,1); 
 outportb(0x3c8,4); 
 for(i=1;i<4;i++) outportb(0x3c9 ,0);  /*clear 0*/ 
 
 setfillstyle(1,RED); 
 for(k=0;k<8;k++) 
   for(i=0;i<4;i++) 
     for(j=0;j<4;j++) 
     if(all_box[k][i][j]){outport(0x3c4,0x0e02); 
              bar(x+k*d+j*L,y+i*H,x+k*d+(j+1)*L,y+(i+1)*H); 
              rectangle(x+k*d+j*L,y+i*H,x+k*d+(j+1)*L,y+(i+1)*H); 
              } 
 
 for(i=0;i<64;i++) {outportb(0x3c8,4); /*show on*/ 
            outportb(0x3c9,i); 
            outportb(0x3c9,0);outportb(0x3c9,0);my_delay(5);} 
 
 curtian();                            /*from and to*/ 
 
 outportb(0x3c8,4);                    /*restore port and palette*/ 
 outportb(0x3c9,42); 
 outportb(0x3c9,0); 
 outportb(0x3c9,0); 
 setallpalette(&p); 
 setviewport(0,0,max_x,max_y,1); 
} 
 
void rigts(void) 
{int x,y,d; 
 static char *Autor; 
 d=30; Autor=get_Author(); 
 settextstyle(2,0,6);x=35;y=(y1+y2)/2;setcolor(15); 
 disp_str16(x,y,WHITE,"ÒÆ¶¯ËÙ¶È",0,1); 
 disp_str16(x,y+d,WHITE,"ÉùÒô״̬",0,1); 
 disp_str16(x,y+d+d,WHITE,"±¾¾ÖµÃ·Ö",0,1); 
 disp_str16(x,y+3*d,WHITE,"Ðýת·½Ïò",0,1); 
 disp_str16(x,y+4*d,WHITE,"ÒÑÓÃʱ¼ä",0,1); 
 disp_str16(x,y+5*d,WHITE,"×î¸ß¼Ç¼      808000",2,1); 
 disp_str16(x2+l+3,y1+20,WHITE,"ÏÂÒ»¿é»ýľ",0,1); 
 settextstyle(2,0,7); 
 x=5; 
 disp_score(); 
 disp_rotar(); 
 disp_sound(WHITE,x1/2+30,y+30); 
 disp_speed(x1/2+30,y,WHITE); 
 setfillstyle(1,CYAN);bar(x2+l,y2-h*6,x2+l*8,y2-h); 
 out(x2+l,y2-6*h,7*h+3,5*h+3); 
 disp_str16(x2+l+3,y2-h*6+2,14,"°æ±¾ 2.00",5,1); 
 disp_str16(x2+l+3,y2-h*6+27,RED,"Éè¼Æ",5,1); 
 disp_str16(x2+l*4,y2-h*6+27,RED,Autor,2,1); 
 disp_str16(x2+l+3,y2-h*6+54,WHITE,"1997.10.27",5,1); 
} 
 
int puse() 
{int i,j,ok=1,x=active.x,y=active.y; 
 for(i=3;i>=0;i--) for(j=0;j<4;j++) 
           if(((active.ch[i][j])&&(board[i+x-1][j+y-4]))||(y>=24)) ok=0; 
 return(ok); 
} 
int getkey(int ch) 
{int x,y,d; 
 x=x1/2+30;y=(y1+y2)/2; 
 switch(ch) 
   {case 27: d=Quit_if();if(d!=0) ch=0;break; 
    case F1: ch=0;help();break; 
    case F2: voice=(voice+1)%2;disp_sound(WHITE,x,y+30);ch=0;break; 
    case F10:speed=0;voice=0;ro_way=0;disp_speed(x,y,WHITE); 
         disp_rotar();break; 
    case F8: speed=0;check_speed();ch=0;break; 
    default: if((ch==move_down)||(ch==move_left)||(ch==move_right)||(ch==move_rotar)) break; 
         else ch=0;break; 
  } 
 fflush(stdin); 
 return(ch); 
} 
void open_hzk(char *name) 
{hzk_p=fopen(name,"rb+"); 
 if(hzk_p==NULL) {closegraph();printf("can't open file: %s",name);exit(1);} 
} 
void get_hz16(unsigned char incode[],unsigned char bytes[]) 
{unsigned int qh,wh; 
 FILE *file; 
 unsigned long offset; 
 qh=incode[0]-0xa1;wh=incode[1]-0xa1; 
 offset=(94l*qh+wh)*32l-7; 
 if(fseek(hzk_p,offset,0)) {closegraph();printf("seek error:");exit(1);} 
 if(fread(bytes,1,32,hzk_p)!=32) 
    { closegraph();printf("read file error!");exit(1);} 
 
 
} 
 
void disp_hz16(int x,int y,int color,unsigned char code[]) 
{unsigned char mat[33]; 
 unsigned int i,p; 
 get_hz16(code,mat);setcolor(color); 
 for(i=0;i<32;i=i+2) 
    {p=mat[i];p=(p<<8)|mat[i+1]; 
     setlinestyle(4,p,1); 
     line(x+15,y,x,y); 
     y++; 
    } 
} 
void disp_str16(int x,int y,int color,unsigned char str[],int wd,int times) 
{unsigned char *p,*name; 
 char ch[2]; 
 int n=0,leng=strlen(str); 
 p=str;setcolor(color); 
 name=searchpath("MY_DOT.DOC"); 
 if(name==NULL) 
   {closegraph(); 
    printf("System error:can't find file MY_DOT.DOC\n"); 
    exit(1); 
   } 
 open_hzk(name); 
 while((*p!='\0')&&(n0xa0)&&(*(p+1)>0xa0)) 
        {disp_hz16(x,y,color,p);n=n+2;x=x+16*times+wd-1;p=p+2;} 
       else {ch[0]=*p;ch[1]='\0'; 
             outtextxy(x,y,ch); 
             n++;x=x+8*times-1+wd;p++; 
        	} 
fclose(hzk_p); 
} 
int Esc(void) 
{int *p,*m; 
 int x,y,k,key; 
 x=x1+20+l*3;y=(y1+y2)/2;k=0;key=0; 
 p=malloc(imagesize(0,0,32,21)); 
 if(p==NULL) { 
        closegraph();printf("no enough memory!");exit(1); 
        } 
 m=malloc(imagesize(x,y,x+116,y+56)); 
 if(p==NULL) { closegraph();printf("no enough memory!");exit(1);} 
 cur_help('E'); 
 getimage(x1,6,x1+32,27,p);getimage(x,y,x+116,y+56,m); 
 setfillstyle(1,CYAN);bar(x,y,x+116,y+56); 
 settextstyle(0,0,1); 
 disp_str16(x+28,y+8,RED,"ÍË   ³ö",0,1); 
 out(x,y,116,56); 
 disp_str16(x+12,y+32,BLUE,"ÊÇ        ·ñ",0,1); 
 putimage(x+4,y+28,p,XOR_PUT); 
 do {key=getch();if (key==0) key=300+getch(); 
     switch(key) 
       {case righ: 
        case left: Bar(k,p,x+4,y+28);k=(k+1)%2;Bar(k,p,x+4,y+28);break; 
        case 27:   k=1;break; 
        defaut:    break; 
       } 
     }while((key!=13)&&(key!=27)); 
 putimage(x,y,m,COPY_PUT); 
free(p);free(m); 
cur_help('P'); 
return(k); 
} 
void Bar(int k,int p[],int x,int y) 
{int h; 
int dx; 
 dx=75; 
 h=x+k*dx; 
 putimage(h,y,p,XOR_PUT); 
} 
void timetable(int x,int y) 
{int dx,dy; 
 setfillstyle(1,BROWN);bar(x,y,x+78,y+18);in(x-1,y-1,80,20); 
 y=y+5;dx=4;dy=4;       x=x+30; 
 ellipse(x,y,270,390,20,10); 
 line(x,y+10,x+dx,dy+y+10); 
 line(x,y+10,x+dx,y-dy-1+10); 
} 
void untimetable(int x,int y) 
{int dx,dy; 
 setfillstyle(1,BROWN);bar(x,y,x+78,y+18);in(x-1,y-1,80,20); 
 y=y+5;dx=4;dy=4;x=x+30; 
 ellipse(x+20,y,150,270,20,10); 
 line(x+20,y+10,x-dx+20,y+dy+10); 
 line(x+20,y+10,x-dx+20,y-dy+10); 
} 
void sound_on(int x,int y,int color) 
{setfillstyle(1,BROWN);bar(x,y,x+78,y+17); 
 sound(3000);my_delay(5);nosound(); 
 disp_str16(x+30,y,color,"¿ª",0,1); 
} 
void sound_off(int x,int y,int color) 
{setfillstyle(1,BROWN);bar(x,y,x+78,y+17); 
 disp_str16(x+30,y,color,"¹Ø",0,2); 
 } 
void DELAY(int k) 
{int i; 
 for(i=0;i>3)<<2)+((w+1)&7?4:0); 
 size=rsize*(h+1-times);p=map+4; 
 buff=malloc(rsize*times);if(buff==NULL){free(map);return;} 
 i=0; 
 memmove(buff,p,rsize*times);i++; 
 memmove(p,p+rsize*times,size); 
 memmove(p+size,buff,rsize*times); 
 putimage(x1,y1,map,COPY_PUT); 
 free(map);free(buff); 
} 
 
int save_scr(const char *fname,struct win window) 
{int i,k=1,ex,h; 
 FILE *fp; 
 char *buff; 
 unsigned int size; 
 ex=window.bx+window.dx; 
 h=(window.dy+1)/20; 
 fp=fopen(fname,"wb"); 
 if(fp==NULL) 
    { closegraph();printf("save_map error:");exit(0);} 
 size=imagesize(window.bx,window.by,ex,window.by+h);buff=malloc(size); 
 if(buff==NULL) 
    { 
      fclose(fp); 
      return(NULL); 
     } 
 for(i=0;i<20;i++) 
    { 
     getimage(window.bx,window.by+i*h,ex,window.by+(i+1)*h,buff); 
     if(fwrite(buff,1,size,fp)!=size) EXIT(2,"Write file Error1");} 
 fclose(fp); 
 free(buff); 
 return(k); 
} 
void restore_scr(const char *fig_name,struct win window) 
{int i; 
 FILE *fp; 
 char *buff,*ptr; 
 unsigned int size,h,ex; 
 ex=window.bx+window.dx; 
 h=(window.dy+1)/20; 
 ptr=searchpath(fig_name); 
 fp=fopen(ptr,"rb"); 
 if(fp==NULL) {closegraph();printf("error code:f1\n");getch();exit(1);} 
 size=imagesize(window.bx,window.by,ex,window.by+h); buff=malloc(size); 
 if(buff==NULL) 
    { closegraph();fclose(fp); 
     printf("error:file not find!(File May be deleted by another user)"); 
     getch(); exit(0); 
    } 
 for(i=0;i<20;i++) 
     {if(fread(buff,1,size,fp)!=size){closegraph();printf("error:fread err:\n");exit(1);} 
      putimage(window.bx,window.by+i*h,buff,COPY_PUT); 
     } 
 
 free(buff); 
 fclose(fp); 
} 
 
 
void cur_help(char ch) 
{int x,y,color; 
 x=23;y=y2+18;color=WHITE; 
 setfillstyle(1,7);bar(21,y2+6,599,getmaxy()-15); 
 in(19,y2+4,580,getmaxy()-y2-19); 
 settextstyle(2,0,6); 
 setcolor(WHITE); 
 switch(ch) 
       {case 'S':disp_str16(x,y,color,"<ÉÏϹâ±ê¼ü>-¸Ä±äÊý¾Ý  <»Ø³µ>-È·¶¨ -¿ªÊ¼",3,1); 
         break; 
       case 'P': disp_str16(x,y,color,"-¸Ä±äÉùÒô״̬  -ÖØÐ¿ªÊ¼ÏÂÒ»¾Ö  -Í˳öÓÎÏ· ",3,1); 
         break; 
       case 'E': disp_str16(x,y,color,"<¹â±ê¼ü>-Ñ¡Ôñ  -·µ»Ø",3,1);break; 
       case 'H': disp_str16(x,y,color,"-Í˳ö°ïÖú",3,1);break; 
       } 
} 
void disp_sound(int color,int x,int y) 
{switch(voice) 
      {case 1: sound_on(x,y,color);break; 
       case 0: sound_off(x,y,color);break; 
      } 
 in(x-1,y-1,80,20); 
} 
char *get_Author() 
{static char pass[15]; 
 int i; 
 pass[0]='Í'^0x55;pass[1]='õ'^0x55;pass[2]=' '^0x55;pass[3]='×'^0x55; pass[4]='æ'^0x55; 
 pass[5]=' '^0x55;pass[6]='¼'^0x55;pass[7]='ó'^0x55;pass[8]=' '^0x55; pass[9]='\0'^0x55; 
 pass[10]='\0'; 
 for(i=0;i<11;i++) pass[i]=pass[i]^0x55; 
 return(pass); 
} 
void face_1(void) 
{int color=RED; 
 struct WINHZ start; 
 setfillstyle(1,12); 
 bar(10,425,max_x-10,450); 
 disp_str16(164,430,14,"½­Î÷ʦ·¶´óѧÎïÀíϵÈí¼þÉè¼ÆÊÒÖÆ×÷",5,1); 
 settextstyle(2,0,7); 
 start.hx0=150; 
 start.hy0=300; 
 start.hb1=3; 
 start.hb2=3; 
 disp_hz24(start,color,"¶íÂÞ˹·½¿é"); 
 
/*start.hx0+=start.hb1; 
 start.hy0+=150; 
 start.hb1=2; 
 start.hb2=2; 
 disp_hz24(start,color,  "ÖÐÎİæ"  ); 
 
 start.hx0-=(start.hb1*2); 
 start.hy0+=start.hb2; 
 disp_hz24(start,color,"Ò»¾Å¾ÅÆßÄêÊ®ÔÂ"); 
 disp_str16(30,150,color,"      ¶íÂÞ˹·½¿é     ",24,1);*/ 
 
 disp_str16(60,350,color, "    ÖÐÎİæVer2.00    ",24,1); 
 disp_str16(120,380,color,"   Ò»¾Å¾ÅÆßÄêʮԠ   ",24,1); 
 
} 
 
void msec_delay(long us) 
{union REGS regs; 
 long d; 
 int low,high; 
 d=us*1000l; 
 low =d%0xffff; 
 high=d/0xffff; 
 regs.h.ah=0x86; 
 regs.x.dx=low; /*ÑÓʱֵµÄµÍ16λ*/ 
 regs.x.cx=high;/*ÑÓʱֵµÄ¸ß16λ*/ 
 int86(0x15,®s,®s); 
} 
void my_delay(int m_sec)/*m_sec ÊÇÒÔºÁÃëΪµ¥Î»¼ÆËã*/ 
{int i; 
 for(i=0;ii) i=4; 
          disp_str16(ex,ey+i*dy,fcolor,"¬õ",dw,times);break; 
       default  : break; 
      } 
    }while(13!=way_key); 
    in(win.bx-48,win.by+win.dy*(i+1)-8,win.dx-4,win.dy-4); 
    in(win.bx-47,win.by+win.dy*(i+1)-7,win.dx-4,win.dy-4); 
    my_delay(30); 
    out(win.bx-48,win.by+win.dy*(i+1)-8,win.dx-4,win.dy-4); 
    out(win.bx-47,win.by+win.dy*(i+1)-7,win.dx-4,win.dy-4); 
    my_delay(30); 
 return(i); 
} 
int get_key(struct window win) 
{int i=0; 
 int ex,ey,k=0,dd; 
 struct window temp; 
 ey=win.by+win.dy+20,ex=win.bx+win.dx; 
 win.by=win.by-60; 
 dd=6; 
 setlinestyle(2,0,1); 
 temp.bx=win.bx;temp.by=win.by;temp.dx=ex;temp.dy=ey; 
 do{ 
   k=(k+1)%dd; 
   win.bx=temp.bx-k;win.by=temp.by-k;ex=temp.dx+k;ey=temp.dy+k; 
  /* for(i=0;i<8;i++) 
   { 
    setcolor(0); 
    rectangle(win.bx-92-i*dd,win.by-i*dd+58,ex+i*dd+2,ey+win.dy*5+i*dd+1); 
    setcolor(15); 
    rectangle(win.bx-93-i*dd,win.by-i*dd+57,ex+i*dd+3,ey+win.dy*5+i*dd+2); 
    if(bioskey(1)) break; 
    my_delay(5); 
    }*/ 
    if(bioskey(1)) break; 
   }while(1); 
 return(must_get_key()); 
} 
 
 
int must_get_key(void) 
{int key; 
 key=getch(); 
 if(key==0) 
 key=300+getch(); 
 return(key); 
} 
int get_keyboard(int fist) 
{ 
 int char_key,status_key,key; 
 char_key=0; 
 status_key=get_key_status(); 
 if(0==status_key) 
    char_key=get_key_char(); 
 key=char_key+(status_key<<8); 
 if(!fist) key=getkey(key); 
 return(key); 
} 
int get_key_status() 
{ 
 unsigned int status,flag,re_value=0; 
 my_delay(5); 
 status=bioskey(2); 
 flag=(old_status^status)<<8;     /*Old_status Ϊȫ¾Ö±äÁ¿*/ 
 old_status=status&0xf0; 
 switch(flag) 
          { 
           case R_shift     :re_value=1<<0;break; 
           case L_shift     :re_value=1<<1;break; 
           case Ctrl        :re_value=1<<2;break; 
           case Alt         :re_value=1<<3;break; 
           case Scroll_Lock :re_value=1<<4;break; 
           case Num_Lock    :re_value=1<<5;break; 
       case Caps_Lock   :re_value=1<<6;break; 
       case Insert      :re_value=1<<7;break; 
           default          :re_value=0   ;break; 
      } 
 if(re_value==0) return(0); 
 my_delay(5); 
 return(re_value); 
} 
 
int get_key_char() 
{ 
 unsigned int key; 
 if(!bioskey(1)) return (0); 
 key=must_get_key(); 
 return(key); 
} 
void set_default_key() 
{ 
 move_down=DOWN; 
 move_left=LEFT; 
 move_right=RIGHT; 
 move_rotar=32; 
 
} 
 
void set_key_sub(int i,struct window win) 
{ 
 int bkcolor,dy; 
 dy=30; 
 win.bx=win.bx+50; 
 bkcolor=BROWN; 
 switch(i) 
  {case 0:  /*move_left=0;*/ move_left =set_new_key(win,i,bkcolor);break; 
   case 1:  /*move_right=0;*/move_right=set_new_key(win,i,bkcolor);break; 
   case 2:  /*move_rotar=0;*/move_rotar=set_new_key(win,i,bkcolor);break; 
   case 3:  /*move_down=0;*/ move_down =set_new_key(win,i,bkcolor);break; 
   case 4:      set_default_key(); 
        setfillstyle(1,BROWN); 
        bar(win.bx,win.by,win.bx+200,win.by+110); 
        outtextxy(win.bx,win.by,     "    Left"); 
        outtextxy(win.bx,win.by+1*dy,"    Right"); 
        outtextxy(win.bx,win.by+2*dy,"    Space"); 
        outtextxy(win.bx,win.by+3*dy,"    Down"); 
        break; 
   case 5:  break; 
   default: break; 
  } 
} 
int set_new_key(struct window win ,int i,char bcolor) 
{ 
 
 static char *defau[]={"    Left      ","   Right      ", 
               "    Space     ","   Down       ","          "}; 
 char str[15]; 
 int char_key,keytemp,color; 
 strcpy(defau[0],key2str(move_left)); 
 strcpy(defau[1],key2str(move_right)); 
 strcpy(defau[2],key2str(move_rotar)); 
 strcpy(defau[3],key2str(move_down)); 
 switch(i) 
 {case 0: keytemp=move_left; move_left=0;  break; 
  case 1: keytemp=move_right;move_right=0;break; 
  case 3: keytemp=move_down; move_down=0 ;break; 
  case 2: keytemp=move_rotar;move_rotar=0;break; 
  default:             break; 
 } 
 strcpy(str,defau[i]); 
 win.by=win.by+i*win.dy; 
 win.dx=150;win.dy=22; 
 color=14; 
 do{ 
    clear_win(win,bcolor); 
    DELAY(3); 
    char_key=get_keyboard(1); 
    if((char_key!=13)&&(char_key!=0)) 
      {int flag; 
       flag=if_useed(char_key);/*if have useed return not 0*/ 
       if(!flag) 
        {keytemp=char_key; 
         strcpy(str,key2str(char_key)); 
        } 
       } 
    show_win(win,color,str); 
    DELAY(3); 
   } 
 while(char_key!=13); 
 return(keytemp); 
} 
 
void clear_win(struct window win,int color) 
{ int tempcolor; 
  tempcolor=getcolor(); 
  setfillstyle(1,color); 
  bar(win.bx,win.by,win.bx+win.dx,win.by+win.dy); 
  setcolor(tempcolor); 
} 
 
void show_win(struct window win,int color,char *str) 
{int tempcolor; 
 tempcolor=getcolor(); 
 setcolor(color); 
 outtextxy(win.bx,win.by,str); 
 setcolor(tempcolor); 
} 
 
 
void set_key_menu(struct window win) 
{ 
 int color,wd,times,y,dy; 
 color=14; 
 y=0; 
 dy=30; 
 wd=0; 
 times=1; 
 win.bx=win.bx+15; 
 setfillstyle(1,BLUE); 
 bar(0,0,max_x,max_y); 
 setfillstyle(1,7);    bar(win.bx-16,win.by-16,win.bx+win.dx-6,win.by+win.dy-6); 
 setfillstyle(1,BROWN);bar(win.bx-36,win.by-36,win.bx+win.dx,win.by+win.dy); 
 settextstyle(2,0,7); 
 win.dy=dy; 
 disp_str16(win.bx,win.by,color,     "×óÒÆ",wd,times); 
 disp_str16(win.bx,win.by+1*dy,color,"ÓÒÒÆ",wd,times); 
 disp_str16(win.bx,win.by+2*dy,color,"Ðýת",wd,times); 
 disp_str16(win.bx,win.by+3*dy,color,"ÏÂÒÆ",wd,times); 
 outtextxy(win.bx+52, win.by,           "    Left"); 
 outtextxy(win.bx+52, win.by+1*dy,      "    Right"); 
 outtextxy(win.bx+52, win.by+2*dy,      "    Space"); 
 outtextxy(win.bx+52, win.by+3*dy,      "    Down"); 
 disp_str16(win.bx+54,win.by+4*dy,color,"      ĬÈÏÖµ",wd,times); 
 disp_str16(win.bx+54,win.by+5*dy,color,"      ·µ»Ø",wd,times); 
 do{ 
     y=bar_cursor_move(win.bx+30,win.by,dy,y); 
     if((5==y)||(-1==y)) break; 
     set_key_sub(y,win); 
   }while(5!=y); 
} 
char *key2str(unsigned key) 
{ static char *Fx[]={"     F1","     F2 ","     F3 ","     F4 ", 
             "     F5","     F6 ","     F7 ","     F8 ", 
             "     F9","     F10","     F11","     F12" 
             }; 
  static char str[13]; 
  static char *statusr[]={"  R_Shift ", "  L_Shift ","    Alt",   "    Ctrl", 
              "ScrollLock", "  NumLock", "  CapsLock","   Insert" 
             }; 
  {int i;for (i=0;i<13;i++) str[i]=32;} 
  switch(key) 
        {case 27     :strcpy(str,"     Esc  ")    ;break; 
         case 32     :strcpy(str,"    Space ")    ;break; 
         case TAB    :strcpy(str,"     Tab  ")    ;break; 
         case DELETE :strcpy(str,"   Delete ")    ;break; 
         case INSERT :strcpy(str,"   Insert ")    ;break; 
         case PrtScr :strcpy(str,"   PrtScr ")    ;break; 
         case HOME   :strcpy(str,"    Home  ")    ;break; 
         case END    :strcpy(str,"     End  ")    ;break; 
         case PgDn   :strcpy(str,"    PgDn  ")    ;break; 
         case PgUp   :strcpy(str,"    PgUp  ")    ;break; 
         case DOWN   :strcpy(str,"    Down  ")    ;break; 
         case UP     :strcpy(str,"     Up   ")    ;break; 
         case LEFT   :strcpy(str,"    Left  ")    ;break; 
         case RIGHT  :strcpy(str,"    Right ")    ;break; 
         case BackSpace 
                 :strcpy(str," BackSpace")    ;break; 
         default     :if ((key<371)&&(key>358))   {strcpy(str,Fx[key-359]);break;} 
                  if ((key<='9')&&(key>='0')) {str[5]=key;str[11]='\0'; break;} 
                  if ((toupper(key)<'Z')&&(toupper(key)>'A')) 
                 {str[5]=toupper(key);str[11]='\0';break;} 
                  if ((key<=0x8001l)&&(key>0x00ff)) 
                 {int t,p=0; 
                  key=key&0xff00; 
                  for (t=0x80;t>1;t=t/2) 
                      {if ((key>>8)%t==0) break; 
                       p++; 
                      } 
                  strcpy(str,statusr[7-p]);break; 
            	 } 
                  str[5]=key;str[11]='\0'; break; 
  } 
return(str); 
} 
int bar_cursor_move(int ex,int ey,int dy,int k) 
{ 
  char *buff; 
  int key; 
  int y=k,x=ex+20,y1=y*dy+ey; 
  if((buff=malloc(sizeof(0,0,150,32)))==0) 
    EXIT(0,"Haven't enough memory!"); 
  getimage(0,10,150,31, buff); 
  putimage(x,y1,buff,XOR_PUT); 
  do 
  {key=must_get_key(); 
   switch(key) 
   { 
   case TAB : 
   case DOWN:   putimage(x,y1,buff,XOR_PUT);y=(y+1)%6;y1=y*dy+ey; 
        putimage(x,y1,buff,XOR_PUT);break; 
   case UP  :   putimage(x,y1,buff,XOR_PUT);y=y-1;if(y<0) y=5;y1=y*dy+ey; 
        putimage(x,y1,buff,XOR_PUT);break; 
   case ESC :   putimage(x,y1,buff,XOR_PUT);free(buff);return(-1); 
   default  :   break; 
   } 
  } while(13!=key); 
  putimage(x,y1,buff,XOR_PUT); 
  free(buff); 
  return(y); 
} 
int if_useed(unsigned key) 
{if (key==move_left ) {putch(7);return(1);} 
 if (key==move_right) {putch(7);return(2);} 
 if (key==move_down ) {putch(7);return(3);} 
 if (key==move_rotar) {putch(7);return(4);} 
 return(0); 
} 
 
void infor(void) 
{int x1,y1,h,color,key; 
 x1=40,y1=10;h=20; 
 color=14; 
 setfillstyle(1,7);bar(x1-40,y1-8,x1+550,y1+450); 
 out(x1-25,y1,550,440); 
 settextstyle(2,0,7); 
 disp_str16(x1,y1+   h  ,color,"<Ò»>:±¾³ÌÐòÊÇÒ»¸öµ¥»úÊÔÓð汾, ÔÚ³ÌÐòÔËÐеÄÈκÎʱºò, ¶¼ÓÐÁªÏß°ï",1,1); 
 disp_str16(x1,y1+ 2*h+8,color,"     ÖúÐÅϢλÓÚÆÁÄ»µÄ×îµÍÐÐ, ÓÃÒÔ·½±ãÍæ¼ÒÄܸü¿ìµÄÕÆÎÕ±¾ÓÎÏ·µÄʹ",1,1); 
 disp_str16(x1,y1+ 3*h+8,color,"     Ó÷½·¨.",1,1); 
 disp_str16(x1,y1+ 4*h+8,color,"     ÁíÍâ, ¶ÔÓÚ²»Ï°¹ßÒÑĬÈϹ¦ÄܼüµÄÍæ¼Ò¿ÉÒÔËæÐÄËùÓûµÄ¶¨Òå×Ô¼ºËù",1,1); 
 disp_str16(x1,y1+ 5*h+8,color,"     ·½±ãµÄ¹¦Äܼü.",1,1); 
 disp_str16(x1,y1+ 6*h+8,color,"<¶þ>:",1,1); 
 disp_str16(x1,y1+ 7*h+8,color,"     ÉùÒô״̬: ΪÁ˲»Ó°Ïì±ðÈ˵ÄÕý³£¹¤×÷, ¶ÔÉùÒôµÄ״̬, ÄãÒ²¿ÉÒÔ",1,1); 
 disp_str16(x1,y1+ 8*h+8,color,"               ËæÊ±½øÐиıä.µ«ÉùÒô´¦ÓÚ´ò¿ª×´Ì¬Ê±»áÓ°ÏìÒÆ¶¯ËÙ¶È.",1,1); 
 disp_str16(x1,y1+ 9*h+8,color,"     ÒÆ¶¯ËÙ¶È: ÔÚ½øÈë <¿ªÊ¼ÓÎÏ·> ºó, Äã¿ÉÒÔ¸ù¾Ý×Ô¼ºµÄˮƽʹÓÃÉÏ",1,1); 
 disp_str16(x1,y1+10*h+8,color,"               Ϲâ±ê¼üÀ´¸Ä±äÆä´óС,·¶Î§ÊÇ´Ó0 µ½9 .",1,1); 
 disp_str16(x1,y1+11*h+8,color,"     Ðýת·½Ïò: »ýľ±äÐÎʱ, Òò¸÷È˶øÒË, ¿ÉÒÔÉè¶¨ÎªÄæÊ±Õë»ò˳ʱÕë",1,1); 
 disp_str16(x1,y1+12*h+8,color,"               ·½Ïò½øÐÐÐýת (Ò²ÊÇͨ¹ýʹÓÃÉÏϹâ±ê¼üÀ´½øÐиıä) .",1,1); 
 disp_str16(x1,y1+13*h+8,color,"<Èý>:",1,1); 
 disp_str16(x1,y1+14*h+8,color,"     ÈôÐèÒªÍøÂç°æ±¾ (º¬Ô´´úÂë) , »ò¶Ô±¾Èí¼þÓÐʲô½¨Òå»òÒâ¼ûÇëÓë",1,1); 
 disp_str16(x1,y1+15*h+8,color,"     ×÷ÕßÁªÏµ.",1,1); 
 disp_str16(x1,y1+16*h+8,color,"     ÁªÏµµØÖ·:     ½­Î÷ʦ·¶´óѧÎïÀíϵ",1,1); 
 disp_str16(x1,y1+17*h+8,color,"     ÁªÏµÈË  :",1,1); 
 disp_str16(x1+26*8,y1+17*h+8,color,get_Author(),1,1); 
 disp_str16(x1,y1+18*h+8,color,"     ÓÊÕþ±àÂë:          3 3 0 0 4 7",1,1); 
 disp_str16(x1,y1+19*h+8,color,"     ÁªÏµµç»°:    ( 0 7 9 1 ) 8 5 0 6 3 7 4",1,1); 
 do{ key=must_get_key(); 
   } 
 while(key!=27); 
} 
 
void help(void) 
{int seek,h=16,key,color=WHITE; 
 int intf=1,hh,y11,x11; 
 char m_down[30],m_left[30],m_right[30],m_rotar[30]; 
 struct win window; 
 char *temp="JIMUXXXXXX",*fname,tempname[15]; 
 strcpy(tempname,temp); 
 fname=mktemp(tempname); 
 m_down[0]=m_left[0]=m_right[0]=m_rotar[0]='\0'; 
 m_down[1]=m_left[1]=m_right[1]=m_rotar[1]='<'; 
 hh=h+5; 
 window.bx=120; 
 window.by=160; 
 window.dx=h*20; 
 window.dy=h*16; 
 seek=save_scr(fname,window); 
 intf=sopen(fname,O_RDWR,SH_DENYRW,S_IWRITE); 
 if(intf==-1){outtext("intf=-1");} 
 if(seek==NULL) return; 
 setfillstyle(1,7)   ;bar(window.bx+8,window.by+8, 
              window.bx+window.dx-20,window.by+window.dy-20); 
 setfillstyle(1,CYAN);bar(window.bx,window.by, 
              window.bx+window.dx-28,window.by+window.dy-28); 
 out(window.bx,window.by,window.dx-28,window.dy-28); 
 cur_help('H'); 
 settextstyle(2,0,7); 
 window.by=window.by; 
 window.bx=window.bx; 
 strcat(strcat(m_down, key2str(move_down )), "   »ýľ¼ÓËÙÏÂÒÆ"); 
 strcat(strcat(m_left, key2str(move_left )), "   »ýľÏò×óÒÆ¶¯"); 
 strcat(strcat(m_right,key2str(move_right)), "   »ýľÏòÓÒÒÆ¶¯"); 
 strcat(strcat(m_rotar,key2str(move_rotar)), "   »ýľÐýת±äÐÎ"); 
 settextstyle(2,0,7); 
 y11=window.by+18;x11=window.bx+8; 
 disp_str16(x11,    y11,     color,"     Esc        Í˳ö",3,1); 
 disp_str16(x11,    y11+1*hh,color,"     F1         °ïÖú ",3,1); 
 disp_str16(x11,    y11+2*hh,color,"     F2         ¸Ä±äÉùÒô",3,1); 
 disp_str16(x11,    y11+3*hh,color,"     F10        ÖØÐ¿ªÊ¼",3,1); 
 disp_str16(x11,    y11+4*hh,color,m_down, 5,1); 
 disp_str16(x11,    y11+5*hh,color,m_right,5,1); 
 disp_str16(x11,    y11+6*hh,color,m_left, 5,1); 
 disp_str16(x11,    y11+7*hh,color,m_rotar,5,1); 
 
 do{ 
    key=getch();if(key==0) key=300+getch(); 
   }while(key!=27); 
 
 close(intf); 
 restore_scr(fname,window); 
 unlink(fname); 
 cur_help('P'); 
} 
 
void hzfd24(struct WINHZ start,unsigned char hzmode[72],int color) 
{ 
 /* 16µãÕóºÍ24µãÕ󯽻¬·Å´óÏÔʾ³ÌÐò */ 
 int i,j,k,m,hx,hy; 
 hx=start.hx0;hy=start.hy0; 
 for(i=0;i<24;i++)      /*¿ØÖÆ24µãºº×ÖÐÐ*/ 
     { 
       for(j=0;j<24;j++) /*¿ØÖÆ24µãºº×ÖÁÐ*/ 
           { 
        if(hzmode[i*3+j/8]&(1<<(7-j%8))) 
           { 
             for(k=0;k<=start.hb1;k++) 
             for(m=0;m<=start.hb2;m++) 
                   { 
                 putpixel(start.hx0+i+k-1,start.hy0+j+m  ,color); 
                 putpixel(start.hx0+i+k+1,start.hy0+j+m  ,color); 
                 putpixel(start.hx0+i+k  ,start.hy0+j+m+1,color); 
                 putpixel(start.hx0+i+k  ,start.hy0+j+m-1,color); 
            	} 
           } 
         start.hy0+=start.hb2-1; 
        } 
     start.hy0=hy; 
     start.hx0+=start.hb1-1; 
       } 
     start.hx0=hx; 
     start.hy0=hy; 
    } 
void hzfd16(struct WINHZ start,unsigned char *hzmode,int color) 
{int i,j,k,m,hx,hy; 
 hx=start.hx0;hy=start.hy0; 
 for(i=0;i<16;i++)      /*¿ØÖÆ16µãºº×ÖÁÐ*/ 
    { 
      for(j=0;j<16;j++) /*¿ØÖÆ16µãºº×ÖÐÐ*/ 
     { 
      if(hzmode[i*2+j/8]&(1<<(7-j%8))) 
         { 
             for(k=0;k<=start.hb1;k++) 
             for(m=0;m<=start.hb2;m++) 
                { 
                 putpixel(start.hx0+j+k-1,start.hy0+i+m  ,color); 
                 putpixel(start.hx0+j+k+1,start.hy0+i+m  ,color); 
                 putpixel(start.hx0+j+k  ,start.hy0+i+m+1,color); 
                 putpixel(start.hx0+j+k  ,start.hy0+i+m-1,color); 
                } 
             } 
             start.hx0+=start.hb1-1; 
           } 
        start.hx0=hx; 
        start.hy0+=start.hb2-1; 
          } 
     start.hy0=hy; 
     start.hx0=hx; 
 } 
 
void disp_hz24(struct WINHZ start,int color,unsigned char hz[]) 
{FILE *fp; 
 int i; 
 unsigned char hzmode[72]; 
 unsigned long index; 
 fp=fopen("HZK24S","rb"); 
 if(!fp) 
   {fclose(fp);clrscr(); 
    closegraph(); 
    printf("\n Can't open file HZK24S !/n"); 
    getch(); 
    exit(1); 
   } 
 for(i=0;i