📄 guide.h
字号:
#include<math.h>
#define N 10
#define COLOR_Init 89
#define COLOR 2
#define COLOR_Go 6
#define SCOLOR 255
#define CHAR_HEIGHT 8
#define CHAR_WIDTH 8
#define END -1
#define DELAY_TIME 8
int CFlag=0,VaFlag=0,VbFlag=0;
int fnum=0,snum=0;
int x1,y1,x2,y2;
int A[N+1][N+1],C[N+1][N+1],P[N+1][N+1],pa[N+1],D[N][N];
int Pos_x1[N+1],Pos_y1[N+1],Pos_x2[N+1],Pos_y2[N+1];
int Middle_x[N+1],Middle_y[N+1];
int index,indexprove;
int max=0;
int vted[N];
int pass[N];
struct node{ int e;
struct node *next;
};
int shortlen=0;
int shortest[N];
unsigned char far *rom_char_set=(char far *)0xF000FA6EL;
typedef struct Button{
int num;
int x1;
int y1;
int x2;
int y2;
void (*Btn_Down)(struct Button *Btn_Down);
struct Button *next;
}btn,*btnp;
btnp head,pre,now;
///////////////////=========图形函数============/////////////
void Blit_Char(int xc,int yc,char c,int color,int trans_flag)
{
int offset,x,y;
char far *work_char;
unsigned char bit_mask=0x80;
work_char=rom_char_set+c*CHAR_HEIGHT;
offset=(yc<<8)+(yc<<6)+xc;
for(y=0;y<CHAR_HEIGHT;y++)
{
bit_mask=0x80;
for(x=0;x<CHAR_WIDTH;x++)
{
if((*work_char&bit_mask))
video_buffer[offset+x]=color;
else if(!trans_flag)
video_buffer[offset+x]=0;
bit_mask=(bit_mask>>1);
}
offset+=SCREEN_WIDTH;
work_char++;
}
}
void Blit_String(int x,int y,int color,char *string,int trans_flag)
{
int index;
for(index=0;string[index]!=0;index++)
{
Blit_Char(x+(index<<3),y,string[index],color,trans_flag);
}
}
void H_Line(int x1,int x2,int y,unsigned int color)
{ int i;
for(i=x1;i<=x2;i++)
video_buffer[((y<<8)+(y<<6))+i]=color;
}
void Fill_Rectangle(int x1,int y1,int x2,int y2,int color)
{
int i;
for(i=y1;i<=y2;i++)
{
H_Line(x1,x2,i,color);
}
}
void Bline(int x0,int y0,int x1,int y1,unsigned char color)
{
int dx,dy,x_inc,y_inc,error=0,index;
unsigned char far *vb_start=video_buffer;
vb_start=vb_start+((unsigned int )y0<<6)+((unsigned int)y0<<8)+(unsigned int)x0;
dx=x1-x0;
dy=y1-y0;
if(dx>=0)
{x_inc=1;
}
else
{
x_inc=-1;
dx=-dx;
}
if(dy>=0)
{y_inc=320;
}
else
{y_inc=-320;
dy=-dy;
}
if(dx>dy)
{
for(index=0;index<=dx;index++)
{
*vb_start=color;
error+=dy;
if(error>dx)
{error-=dx;
vb_start+=y_inc;
}
vb_start+=x_inc;
}
}
else
{
for(index=0;index<=dy;index++)
{*vb_start=color;
error+=dx;
if(error>0)
{error-=dy;
vb_start+=x_inc;
}
vb_start+=y_inc;
}
}
}
/////////////////////=========声音函数========///////////////////
void Sound(int freq)
{
asm{
mov al, 0B6h
out 43h, al
mov dx, 12h
mov ax, 34DEh
div freq
out 42h, al
mov al, ah
out 42h, al
in al, 61h
or al, 3
out 61h, al
}
}
void Nosound(void)
{
asm{
in al, 61h
and al, 252
out 61h, al
}
}
void Delay(int clicks)
{
unsigned int far *clock=(unsigned int far *)0x0000046CL;
unsigned int now;
now=*clock;
while(abs(*clock-now)<clicks){}
}
void Sound_All(int freq,int clicks)
{
Sound(freq);
Delay(clicks);
Nosound();
}
////////////////////////============算法函数==========///////////////
void dfs(int s,int t,int d)
{ int v,i,len;
len=0;
vted[s]=1;
d=d+1;
pass[d]=s;
if((s==t)&&(d>=max))
{ if(d==max)
{ for(i=0;i<=d;i++)
{ if(i!=d)
len=len+D[pass[i]][pass[i+1]];
}
if(len<shortlen)
{ shortlen=len;
for(i=0;i<=d;i++)
{ shortest[i]=pass[i];
}
}
}
else
{ for(i=0;i<=d;i++)
{ shortest[i]=pass[i];
if(i!=d)shortlen=shortlen+D[pass[i]][pass[i+1]];
}
max=d;
}
}
for(i=0;i<=N-1;i++)
{ if(D[s][i]!=420*(N-1))
break;
}
while(i<=N-1)
{ v=i;
if(vted[v]==0)
dfs(v,t,d);
for(i=v+1;i<=N-1;i++)
{ if(D[s][i]!=420*(N-1))
break;
}
}
vted[s]=0;
d=d-1;
}
void Floyd()
{
int i,j,k;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{A[i][j]=C[i][j]; P[i][j]=0;}
for(k=1;k<=N;k++)
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(A[i][k]+A[k][j]<A[i][j])
{A[i][j]=A[i][k]+A[k][j]; P[i][j]=k;}
}
void path(int i,int j)
{ int k;
k=P[i][j];
if( k!=0)
{ path(i,k);
pa[index++]=k;
path(k,j);
}
}
////////////////////////========初始化函数=======///////////////
void Init_Array()
{ int i,j;
/////////////////初始化景点坐标/////////////
Pos_x1[1]=43;Pos_x1[2]=225;Pos_x1[3]=66;
Pos_x1[4]=139;Pos_x1[5]=175;Pos_x1[6]=29;
Pos_x1[7]=66;Pos_x1[8]=139;Pos_x1[9]=16;Pos_x1[10]=174;
Pos_y1[1]=19;Pos_y1[2]=20;Pos_y1[3]=47;
Pos_y1[4]=62;Pos_y1[5]=47;Pos_y1[6]=98;
Pos_y1[7]=98;Pos_y1[8]=99;Pos_y1[9]=177;Pos_y1[10]=142;
Pos_x2[1]=89;Pos_x2[2]=261;Pos_x2[3]=106;
Pos_x2[4]=161;Pos_x2[5]=196;Pos_x2[6]=53;
Pos_x2[7]=90;Pos_x2[8]=161;Pos_x2[9]=57;Pos_x2[10]=197;
Pos_y2[1]=38;Pos_y2[2]=38;Pos_y2[3]=67;
Pos_y2[4]=90;Pos_y2[5]=72;Pos_y2[6]=135;
Pos_y2[7]=133;Pos_y2[8]=130;Pos_y2[9]=192;Pos_y2[10]=162;
/////////////////初始化焦点坐标///////////////
Middle_x[1]=62;Middle_x[2]=243;Middle_x[3]=85;
Middle_x[4]=159;Middle_x[5]=178;Middle_x[6]=51;
Middle_x[7]=78;Middle_x[8]=159;Middle_x[9]=58;Middle_x[10]=177;
Middle_y[1]=36;Middle_y[2]=20;Middle_y[3]=65;
Middle_y[4]=76;Middle_y[5]=60;Middle_y[6]=116;
Middle_y[7]=131;Middle_y[8]=114;Middle_y[9]=178;Middle_y[10]=142;
//////////////////初始化权值////////////////////////////
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
C[i][j]=420*(N-1);
for(i=0;i<=N;i++)
C[i][i]=0;
C[1][2]=C[2][1]=420; C[1][3]=C[3][1]=120; C[1][6]=C[6][1]=240;
C[2][5]=C[5][2]=240; C[2][10]=C[10][2]=432; C[3][4]=C[4][3]=138;
C[3][5]=C[5][3]=160; C[3][6]=C[6][3]=144; C[3][7]=C[7][3]=162;
C[4][5]=C[5][4]=48; C[4][8]=C[8][4]=138; C[5][10]=C[10][5]=228;
C[6][7]=C[7][6]=48; C[6][9]=C[9][6]=108; C[7][8]=C[8][7]=120;
C[7][9]=C[9][7]=102; C[8][10]=C[10][8]=60; C[9][10]=C[10][9]=240;
for(i=0;i<=N-1;i++)
for(j=0;j<=N-1;j++)
D[i][j]=C[i+1][j+1];
}
void Init_Path()
{ Bline(Middle_x[1],Middle_y[1],Middle_x[2],Middle_y[2],COLOR_Init);
Bline(Middle_x[1],Middle_y[1],Middle_x[3],Middle_y[3],COLOR_Init);
Bline(Middle_x[1],Middle_y[1],Middle_x[6],Middle_y[6],COLOR_Init);
Bline(Middle_x[5],Middle_y[5],Middle_x[2],Middle_y[2],COLOR_Init);
Bline(Middle_x[3],Middle_y[3],Middle_x[5],Middle_y[5],COLOR_Init);
Bline(Middle_x[3],Middle_y[3],Middle_x[4],Middle_y[4],COLOR_Init);
Bline(Middle_x[4],Middle_y[4],Middle_x[5],Middle_y[5],COLOR_Init);
Bline(Middle_x[4],Middle_y[4],Middle_x[8],Middle_y[8],COLOR_Init);
Bline(Middle_x[3],Middle_y[3],Middle_x[7],Middle_y[7],COLOR_Init);
Bline(Middle_x[3],Middle_y[3],Middle_x[6],Middle_y[6],COLOR_Init);
Bline(Middle_x[9],Middle_y[9],Middle_x[10],Middle_y[10],COLOR_Init);
Bline(Middle_x[7],Middle_y[7],Middle_x[6],Middle_y[6],COLOR_Init);
Bline(Middle_x[7],Middle_y[7],Middle_x[9],Middle_y[9],COLOR_Init);
Bline(Middle_x[7],Middle_y[7],Middle_x[8],Middle_y[8],COLOR_Init);
Bline(Middle_x[9],Middle_y[9],Middle_x[6],Middle_y[6],COLOR_Init);
Bline(Middle_x[8],Middle_y[8],Middle_x[10],Middle_y[10],COLOR_Init);
Bline(Middle_x[5],Middle_y[5],Middle_x[10],Middle_y[10],COLOR_Init);
Bline(Middle_x[2],Middle_y[2],Middle_x[10],Middle_y[10],COLOR_Init);
}
void Init(btnp button,int num,int x1,int y1,int x2,int y2,void(* Btn_Down)(btnp))
{ button->num=num;
button->x1=x1;
button->x2=x2;
button->y1=y1;
button->y2=y2;
button->Btn_Down=Btn_Down;
}
void Init_String()
{ Blit_String(65,25,15,"1",1); Blit_String(242,25,15,"2",1);
Blit_String(86,51,15,"3",1); Blit_String(149,74,15,"4",1);
Blit_String(184,54,15,"5",1);Blit_String(41,109,15,"6",1);
Blit_String(78,109,15,"7",1);Blit_String(149,107,15,"8",1);
Blit_String(36,180,15,"9",1);Blit_String(182,148,15,"10",1);
Blit_String(89,180,15,"SET",1);Blit_String(138,180,15,"GO",1);
Blit_String(179,180,15,"ALL",1);
Blit_String(29,155,SCOLOR,"108",1);Blit_String(140,30,SCOLOR,"420",1);
Blit_String(68,81,SCOLOR,"144",1);Blit_String(30,69,SCOLOR,"240",1);
Blit_String(67,56,SCOLOR,"120",1);
Blit_String(123,157,SCOLOR,"240",1);Blit_String(70,149,SCOLOR,"102",1);
Blit_String(123,50,SCOLOR,"160",1);
Blit_String(99,108,SCOLOR,"120",1);Blit_String(175,79,SCOLOR,"228",1);
Blit_String(113,75,SCOLOR,"138",1);
Blit_String(145,65,SCOLOR,"48",1);Blit_String(67,115,SCOLOR,"162",1);
Blit_String(55,124,SCOLOR,"48",1);
Blit_String(183,116,SCOLOR,"432",1);Blit_String(158,129,SCOLOR,"60",1);
Blit_String(205,40,SCOLOR,"240",1);Blit_String(142,98,SCOLOR,"138",1);
}
///////////////////////////========释放内存========//////////////////
void dispose()
{ while(head->next!=NULL)
{ now=head->next;
free(head);
head=now;
}
free(head);
}
///////////////////////////========事件处理函数=====//////////////////
void VBtn_Down(btnp bp)
{ int x1,y1,x2,y2;
x1=bp->x2-6;
x2=bp->x2;
y1=bp->y1;
y2=bp->y1+6;
if(CFlag==1)
{ Sound_All(400,4);
if(VaFlag==0)
{ VaFlag=1;
fnum=bp->num;
Fill_Rectangle(x1,y1,x2,y2,COLOR);
}
else if(VaFlag==1&&VbFlag==0&&bp->num!=fnum)
{ VbFlag=1;
snum=bp->num;
Fill_Rectangle(x1,y1,x2,y2,COLOR);
}
}
}
void EBtn_Down(btnp bp)
{ Sound_All(400,4);
dispose();
Set_Video_Mode(TEXT_MODE);
exit(0);
}
void CBtn_Down(btnp bp)
{ pcx_picture objects_pcx;
CFlag=1; VaFlag=0; VbFlag=0; fnum=0; snum=0;
Fill_Screen(0);
PCX_Load_Screen("hit.pcx",(pcx_picture_ptr)&objects_pcx,1);
Init_String();
Init_Path();
Sound_All(400,4);
}
void GBtn_Down(btnp bp)
{ int first,second,i;
if(VaFlag==1&&VbFlag==1&&CFlag==1)
{ CFlag=0;
index=1;
i=1;
path(fnum,snum);
pa[index]=END;
second=fnum;
while(pa[i]!=END)
{ first=second;
second=pa[i];
Bline(Middle_x[first],Middle_y[first],Middle_x[second],Middle_y[second],COLOR_Go);
Bline(Middle_x[first]+1,Middle_y[first]+1,Middle_x[second]+1,Middle_y[second]+1,COLOR_Go);
i++;
Sound_All(300,4);
}
Bline(Middle_x[second],Middle_y[second],Middle_x[snum],Middle_y[snum],COLOR_Go);
Bline(Middle_x[second]+1,Middle_y[second]+1,Middle_x[snum]+1,Middle_y[snum]+1,COLOR_Go);
Sound_All(300,4);
}
}
void ABtn_Down(btnp bp)
{ int first,second,i;
if(VaFlag==1&&VbFlag==1&&CFlag==1)
{ CFlag=0; max=0;
shortlen=0;
for(i=0;i<=N-1;i++)
{shortest[i]=-1;
pass[i]=-1;
vted[i]=0;}
dfs(fnum-1,snum-1,-1);
second=fnum;
i=1;
while(shortest[i+1]!=-1&&i<N-1)
{ first=second;
second=shortest[i]+1;
Bline(Middle_x[first],Middle_y[first],Middle_x[second],Middle_y[second],COLOR_Go);
Bline(Middle_x[first]+1,Middle_y[first]+1,Middle_x[second]+1,Middle_y[second]+1,COLOR_Go);
i++;
Sound_All(300,4);
}
Bline(Middle_x[second],Middle_y[second],Middle_x[snum],Middle_y[snum],COLOR_Go);
Bline(Middle_x[second]+1,Middle_y[second]+1,Middle_x[snum]+1,Middle_y[snum]+1,COLOR_Go);
Sound_All(300,4);
}
}
void HBtn_Down(btnp bp)
{ pcx_picture objects_pcx;
sprite small;
int xmouse,ymouse,xmouse_old,ymouse_old,btnmouse;
Sound_All(400,4);
PCX_Load_Screen("mouse.pcx",(pcx_picture_ptr)&objects_pcx,1);
Sprite_Init_Size((sprite_ptr)&small,0,0,0,0,0,0,8,4,1);
PCX_Grab_Bitmap_Size_Screen((pcx_picture_ptr)&objects_pcx,(sprite_ptr)&small,0,0,0,8,4);
Fill_Screen(0);
PCX_Load_Screen("help.pcx",(pcx_picture_ptr)&objects_pcx,1);
Behind_Sprite_Size((sprite_ptr)&small,8,4);
btnmouse=0;
while(1)
{ Squeeze_Mouse(MOUSE_BUTT_POS,&xmouse,&ymouse,&btnmouse);//取鼠标位置
if(btnmouse==1||btnmouse==2)
{Fill_Screen(0);
PCX_Load_Screen("hit.pcx",(pcx_picture_ptr)&objects_pcx,1);
Init_Path();
Init_String();
CFlag=1; VaFlag=0; VbFlag=0; fnum=0; snum=0;
return 1;
}
if(xmouse!=xmouse_old||ymouse!=ymouse_old) //判断是否移动过鼠标
{
Erase_Sprite_Size((sprite_ptr)&small,8,4);//显示小图片后背景内容
small.x=xmouse/2;
small.y=ymouse;
Behind_Sprite_Size((sprite_ptr)&small,8,4);//保存小图片后背景内容
Draw_Sprite_Size((sprite_ptr)&small,8,4);//显示小图片于鼠标位置
xmouse_old=xmouse;
ymouse_old=ymouse;
}
}
}
void Init_All()
{ int i;
Init_Array();
Init_String();
Init_Path();
Floyd();
CFlag=1; VaFlag=0; VbFlag=0; fnum=0; snum=0;
now=pre=(btnp)malloc(sizeof(btn));
head=now;
Init(now,11,81,175,117,192,CBtn_Down);
now=(btnp)malloc(sizeof(btn));
pre->next=now;
pre=now;
Init(now,12,128,175,164,192,GBtn_Down);
now=(btnp)malloc(sizeof(btn));
pre->next=now;
pre=now;
Init(now,13,307,2,317,12,EBtn_Down);
now=(btnp)malloc(sizeof(btn));
pre->next=now;
pre=now;
Init(now,14,172,175,207,192,ABtn_Down);
now=(btnp)malloc(sizeof(btn));
pre->next=now;
pre=now;
Init(now,15,279,1,306,11,HBtn_Down);
for(i=1;i<=N;i++)
{ now=(btnp)malloc(sizeof(btn));
pre->next=now;
pre=now;
Init(now,i,Pos_x1[i],Pos_y1[i],Pos_x2[i],Pos_y2[i],VBtn_Down);
}
pre->next=NULL;
}
///////////////======事件检测函数======/////////////////
void Judge()
{
int xmouse,ymouse,xmouse_old,ymouse_old,btnmouse;
static int btn=-1;
btnp test;
sprite small;
while(1)
{
Squeeze_Mouse(MOUSE_BUTT_POS,&xmouse,&ymouse,&btnmouse);
if(btnmouse==btn)
return;
else
btn=btnmouse;
xmouse=xmouse/2;
ymouse=ymouse;
if(btnmouse==1)
{ if(head!=NULL)
{
test=head;
if((xmouse>=test->x1&&xmouse<=test->x2)&&(ymouse>=test->y1&&ymouse<=test->y2))
{ Squeeze_Mouse(MOUSE_HIDE,0,0,0);
test->Btn_Down(test);
Squeeze_Mouse(MOUSE_SHOW,0,0,0);
}
do{
test=test->next;
if((xmouse>=test->x1&&xmouse<=test->x2)&&(ymouse>=test->y1&&ymouse<=test->y2))
{ Squeeze_Mouse(MOUSE_HIDE,0,0,0);
test->Btn_Down(test);
Squeeze_Mouse(MOUSE_SHOW,0,0,0);
}
}while(test->next!=NULL);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -