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

📄 guide.h

📁 用c语言实现的导游图
💻 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 + -