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(&amt;grad,&amt;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)&amt;&amt;(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])&amt;&amt;(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])&amt;&amt;(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])&amt;&amt;(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]&amt;&amt;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)&amt;&amt;( (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<<s)-1)*100;
sprintf(d,">06u",ss);
setfillstyle(1,BROWN);bar(x1/2+30,(y1+y2)/2+56,x1/2+109,(y1+y2)/2+75);
in(x1/2+29,(y1+y2)/2+55,80,20);
setcolor(WHITE);
settextstyle(2,0,6);
outtextxy(x1/2+50,(y1+y2)/2+60,d);
}
int full(int d)
{int i,k;
i=5;k=0;
while((i<17)&amt;&amt;(board[d][i])) i++;
if (i>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;i<end_line;i++)
if(full(i)) {for(j=2;j<12;j++) {bar(bx+j*l,y1+(i+1)*h,bx+(j+1)*l,y1+i*h);
rectangle(bx+j*l,y1+(i+1)*h,bx+(j+1)*l,y1+i*h);
}
}
for(i=active.x;i<end_line;i++)
if(full(i)) {
for(p=i-1;p-2>0;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(&amt;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(&amt;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])&amt;&amt;(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')&amt;&amt;(n<leng))
if((*p>0xa0)&amt;&amt;(*(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)&amt;&amt;(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<k;i++)
{if(bioskey(1)) return;
else my_delay(1);
}
}
void ch_rotar(void)
{int key,x,y;
x=x1/2+30;y=(y1+y2)/2+89;
setlinestyle(0,0,1);
do {key=rotar_blink(ro_way,x,y);
switch(key)
{case down:
case up: ro_way=(ro_way+1)>2;break;
case F3:
default: break;
}
}while((key!=13)&amt;&amt;(key!=F3));
setcolor(WHITE);
if(ro_way) untimetable(x,y);
else timetable(x,y);
}
int rotar_blink(int k,int x,int y)
{int key;
do{ setcolor(WHITE);
switch(k)
{case 0: timetable(x,y);break;
case 1: untimetable(x,y);break;
}
my_delay(5);
setfillstyle(1,BROWN);bar(x,y,x+70,y+17);
my_delay(5);
}while(!bioskey(1));
key=getch();if(key==0) key=300+getch();
return(key);
}
disp_speed(int x,int y,int color)
{char ch[3];
sprintf(ch,">d",speed);
setcolor(color);settextstyle(2,0,7);
setfillstyle(1,BROWN);bar(x,y,x+78,y+18);
outtextxy(x+30,y,ch);in(x-1,y-1,80,20);
}
void check_speed(void)
{int x,y;
long k;
x=x1/2+30;y=(y1+y2)/2;
k=(int)ss/10000-(int)score_rem/10000;
if(k!=0) speed=(speed+1)>10;disp_speed(x,y,WHITE);
}
int Quit_if(void)
{int k;
k=Esc();
return(k);
}
void Quit_all_to_dos(void)
{int k=0;
if(k==0)
{cleardevice(); closegraph();textcolor(BLUE);
textbackground(WHITE);
cputs(" (C) Copyright 1997,10 All Rights Reserved, Wang Zhu_Jian. \r\n");
exit(0);
}
}
void trace(void)
{
/*void interrupt (*int_1)(),interrupt(*int_3)(),interrupt(*q)();
int far *p,far *m;
p=MK_FP(_psp,0x16);m=MK_FP(*p,0x16);
q=getvect(0x24);int_1=getvect(1);int_3=getvect(3);
setvect(1,q);setvect(3,q);setvect(0x1b,Break);setvect(0x23,Break);
textcolor(BLUE);textbackground(WHITE);
if(*m!=*p) EXIT(9,"ERROR code:9 (please connect with author!)");
setvect(1,int_1);setvect(3,int_3);*/
}
void interrupt far Break()
{}
curtian()
{int x,y,i,k,dx,dd;
x=getmaxx();y=getmaxy();dd=15;dx=x/(2*dd);
setfillstyle(1,BLUE);
outport(0x3c4,0x0302);
for(i=0;i<dx;i++)
{outport(0x3c4,0x0102);
bar(i*dd,0,i*dd+dd/2,430);
outport(0x3c4,0x0102);
bar(x-i*dd,0,x-i*dd-dd/2,y);
my_delay(1);
}
for(k=0;k<dx;k++)
{outport(0x3c4,0x0102);
bar(x/2-k*dd-3,0,x/2+k*dd,y);
DELAY(2);
my_delay(1);
}
outport(0x3c4,0x0f02);
setfillstyle(1,0);
for(k=0;k<dx;k++)
{bar(k*dx,0,k*dx+dx,y);
bar(x-k*dx,0,x-k*dx-dx,y);
DELAY(2);my_delay(1);
}
}
set_pal(struct palettetype p)
{p.colors[0]=0;
p.colors[1]=0x3cf; p.colors[3]=2;
p.colors[5]=4; p.colors[7]=0x14;
p.colors[9]=0x3c8; p.colors[11]=0x3a;
p.colors[13]=0x3c;p.colors[15]=0x3e;
setallpalette(&amt;p);
}
out(int x,int y,int dx,int dy)
{int x0,y0;
x0=x+dx;y0=y+dy;
setcolor(BLACK);
setlinestyle(0,0,1);
rectangle(x,y,x0,y0);
x++;y++;x0--;y0--;
line(x,y0,x0,y0);line(x0,y,x0,y0);
setcolor(WHITE);
line(x,y,x0,y);line(x,y,x,y0);
}
void disp_rotar(void)
{int x,y;
x=x1/2+30;y=(y1+y2)/2+90;
setfillstyle(1,BROWN);bar(x,y,x+80,y+16);
switch(ro_way)
{case 0:timetable(x,y-1);break;
case 1:untimetable(x,y-1);break;
}
}
void in(int x,int y,int dx,int dy)
{int x0,y0;
x0=x+dx;y0=y+dy;
setcolor(BLACK);setlinestyle(0,0,1);
line(x,y,x0,y);line(x,y,x,y0);
setcolor(WHITE);
line(x,y0,x0,y0);line(x0,y,x0,y0);
}
void play_time(int s_p)
{int hour,min,times,h,t_temp,x,y;
char ch[10],pattern[8]={0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa};
unsigned long t,dt;
times=2;
setfillpattern(pattern,CYAN);settextstyle(0,0,times);
h=8*times;setcolor(RED);
x=x1/2;y=(y1+y2)/2+150;
t=clock();dt=(t-start_time)/18.2;t_temp=sec;
hour=(dt/3600)>24;sec=dt>60;min=(dt>3600)/60;
if(t_temp!=sec) {bar(x,y-2*h,x+8*h,y-h);in(x-2,y-2*h-2,8*h+4,h+2);
sprintf(ch,">02d:>02d:>02d",hour,min,sec);
outtextxy(x,y-2*h,ch);
}
if(!s_p) scroll_up(x2+l,y2-h*7-6,7*l,6*h+2);
}
void scroll_up(int x1,int y1,int dx,int dy)
{char *p,*buff,*map;
unsigned rsize,w,h,size,x2,y2,times,i;
x2=x1+dx;y2=y1+dy;times=1;i=0;
map=malloc(imagesize(x1,y1,x2,y2));if(map==NULL) return;
getimage(x1,y1,x2,y2,map);
w=*((unsigned*)map);h=*((unsigned*)map+1);
rsize=(((w+1)>>3)<<2)+((w+1)&amt;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,"<ÉÏϹâ±ê¼ü>-¸Ä±äÊý¾Ý <»Ø³µ>-È·¶¨ <F3>-¿ªÊ¼",3,1);
break;
case 'P': disp_str16(x,y,color,"<F2>-¸Ä±äÉùÒô״̬ <F10>-ÖØÐ¿ªÊ¼ÏÂÒ»¾Ö <Esc>-Í˳öÓÎÏ· ",3,1);
break;
case 'E': disp_str16(x,y,color,"<¹â±ê¼ü>-Ñ¡Ôñ <Esc>-·µ»Ø",3,1);break;
case 'H': disp_str16(x,y,color,"<Esc>-Í˳ö°ïÖú",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,&amt;regs,&amt;regs);
}
void my_delay(int m_sec)/*m_sec ÊÇÒÔºÁÃëΪµ¥Î»¼ÆËã*/
{int i;
for(i=0;i<m_sec;i++)
msec_delay(10);
}
int exit_handler(void)
{char ch;
signal(SIGINT,SIG_IGN);
fflush(stdin );
printf("Crt_break occrred\a. Do you wish to exit this program:(Y or N)?");
ch=getch();if(ch==0) ch=300+getch();
if(toupper(ch)=='Y') exit(0);
signal(SIGINT,(void(cdecl*)(int))exit_handler);
return(0);
}
void EXIT(int code,char *str)
{closegraph();
printf(">s\n",str);
exit(code);
}
int main_menu(int k)
{int ex,ey,dw,times;
struct window win;
win.bx=250,win.by=100,win.dx=160,win.dy=40;
ey=win.by+win.dy+20,ex=win.bx+win.dx;
dw=0,times=1;
setfillstyle(1,7);
win.by=win.by-10;
bar(win.bx-90,win.by+10,ex,ey+win.dy*5);
setcolor(3);
setlinestyle(0,0,1);
rectangle(win.bx-89,win.by+11,ex-1,ey+win.dy*5-1);
setcolor(RED);
rectangle(win.bx-88,win.by+12,ex-2,ey+win.dy*5-2);
setlinestyle(0,0,3);
out(win.bx-48,win.by+win.dy*1+2,win.dx-2,win.dy-2);
out(win.bx-48,win.by+win.dy*2+2,win.dx-2,win.dy-2);
out(win.bx-48,win.by+win.dy*3+2,win.dx-2,win.dy-2);
out(win.bx-48,win.by+win.dy*4+2,win.dx-2,win.dy-2);
out(win.bx-48,win.by+win.dy*5+2,win.dx-2,win.dy-2);
win.by=win.by+10;
disp_str16(win.bx,win.by+win.dy*1,14,"×Ô¶¯ÑÝʾ",dw,times);
disp_str16(win.bx,win.by+win.dy*2,14,"ÓÎÏ·¿ªÊ¼",dw,times);
disp_str16(win.bx,win.by+win.dy*3,14,"ϵͳ˵Ã÷",dw,times);
disp_str16(win.bx,win.by+win.dy*4,14,"°´Å¥ÉèÖÃ",dw,times);
disp_str16(win.bx,win.by+win.dy*5,14,"Í˳öϵͳ",dw,times);
dw=main_menu_select(win.bx-30,win.by+win.dy,win.dy,k,7);
return(dw);
}
int main_menu_select(int ex,int ey,int dy,int i,int bcolor)
{
int way_key,fcolor,dw,times;
struct window win;
win.bx=250,win.by=100,win.dx=160,win.dy=40;
dw=0;times=1;
fcolor=RED;
disp_str16(ex,ey+i*dy,fcolor,"¬õ",dw,times);
do{
way_key=get_key(win);
switch(way_key)
{
case TAB :
case DOWN: disp_str16(ex,ey+i*dy,bcolor,"¬õ",dw,times);i=(i+1)>5;
disp_str16(ex,ey+i*dy,fcolor,"¬õ",dw,times);break;
case UP : disp_str16(ex,ey+i*dy,bcolor,"¬õ",dw,times);i=i-1;if(0>i) 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&amt;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)&amt;&amt;(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)&amt;&amt;(key>358)) {strcpy(str,Fx[key-359]);break;}
if ((key<='9')&amt;&amt;(key>='0')) {str[5]=key;str[11]='\0'; break;}
if ((toupper(key)<'Z')&amt;&amt;(toupper(key)>'A'))
{str[5]=toupper(key);str[11]='\0';break;}
if ((key<=0x8001l)&amt;&amt;(key>0x00ff))
{int t,p=0;
key=key&amt;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]&amt;(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]&amt;(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<strlen(hz)/2;i++)/*¼ÆË㺺×ÖÔÚ×Ö¿âÖеÄλÖò¢¶ÁÈ¡×ÖÄ£*/
{
(long)index=((hz[2*i]-0xb0)*94+hz[2*i+1]-0xa1);
(long)index=(long)index*72lu;
if (fseek(fp,index,SEEK_SET))
{
clrscr();
printf("\nReadFile Error!\n");
getch();
closegraph();
exit(1);
}
fread(hzmode,1,72,fp);
start.hx0=i*30*3+100;
start.hy0=150;
start.hb1=4;
start.hb2=3;
hzfd24(start,hzmode,color);
}
fclose(fp);
return;
}