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

📄 6-3.c

📁 《C程序员成长攻略》-黎陡-源代码,书中所有源码
💻 C
📖 第 1 页 / 共 2 页
字号:

#include"dos.h"
#include"stdlib.h"
#include"stdio.h"
#include"graphics.h"
#include"conio.h"
#include"time.h"
#include"conio.h"

#define upkey 72
#define downkey 80
#define leftkey 75
#define rightkey 77
#define ESC 27
#define Enter 13
#define SPACE 32
#define N1 3
#define N2 4
#define LatticeAmount1 9      /*----------9格---------*/
#define LatticeAmount2 16     /*----------16格--------*/
#define exp 10                /*------最大路径深度-----*/
#define WIN_X 150            /*--------整体窗口左上角坐标-------*/
#define WIN_Y 20
#define WIN_LEN LatticeAmount1*LatticeAmount2*2 /*----主显示窗口边长------*/
#define FILE_L 60          /*-------------菜单宽度---------*/
#define FILE_H 20          /*-------------菜单高度---------*/
#define Dlg_LEN 50         /*--------对话框高度---------*/
#define Button_L 11        /*------默认按钮单位长度-----*/ 
#define BK_COLOR DARKGRAY  /*-------------背景颜色---------*/
#define WIN_COLOR WHITE    /*-----------窗口边框颜色-------*/
#define CHOIC_COLOR RED    /*----------选项条颜色----------*/
#define BLOCK_COLOR MAGENTA /*---标记的将要移入空格的相邻数字格颜色----*/
#define S_COLOR BLACK       /*--------空格颜色------------*/
int FLAG=0;
int ExitFlag=0;
int SlowShow=0;
int difficulty=16,n=4,X_0,Y_0;
/*---difficulty:难度; n:每行格子数;X_0,Y_0:空格所在行列位置---*/

typedef struct Lattice
{ 
	int data;
	int row,line;
	struct Lattice *prio,*next;
}; 
struct Lattcie *A[N2][N2];

struct CurState
{ 
	int state[LatticeAmount2];
	int deep,rule,blank;
}; 
struct CurState *infor;

struct Solution
{ 
	int deep;
	struct CurState S[50];
};
struct Solution result[10];
int Rp=0;
struct CurState Stack[50];
int first=-1;

/*---------------显示字符串-----------------------*/
Print(x,y,str)
char str[10];
{ 
	setcolor(WIN_COLOR);
	settextstyle(0,0,1);
	outtextxy(x,y,str);
}

/*---------------绘制背景初始框------------------------*/
void BGround()
{ 
	int i,flag=0; char ch;
	setfillstyle(1,BK_COLOR);
	bar3d(WIN_X,WIN_Y,WIN_X+WIN_LEN,WIN_Y+FILE_H+WIN_LEN,1,3);
	bar3d(WIN_X,WIN_Y+FILE_H+WIN_LEN,
		  WIN_X+WIN_LEN,
          WIN_Y+FILE_H+WIN_LEN+Dlg_LEN,1,3);
	setfillstyle(1,1);
	bar3d(WIN_X,WIN_Y,WIN_X+WIN_LEN,WIN_Y+FILE_H,0,3);
	line(WIN_X+FILE_L,WIN_Y,WIN_X+FILE_L,WIN_Y+FILE_H);
	Print(WIN_X+13,WIN_Y+8,"FILE       LIZHI  DESIGN  ");

	outtextxy(WIN_X+60,WIN_Y+FILE_H+WIN_LEN+20,"Fifteen-Moving");
	outtextxy(WIN_X+130,WIN_Y+FILE_H+WIN_LEN+35,"Edtion: 2004.6.");
	settextstyle(1,0,0);
	for(i=0;i<75;i++)
	{ 
		if(kbhit())
		{ 
			ch=getch();
			if(ch==ESC)
			{ 
				settextstyle(0,0,0);
				if(EXIT()) 
				{ 
					flag=1;
					return flag;
				}
				else 
					settextstyle(1,0,0);
			} 
		}
		Clear_BG();
		outtextxy(WIN_X+i,WIN_Y+FILE_H+50,"Welcome!");
		delay(5000);
	}
	settextstyle(0,0,0);
	delay(3000);
	outtextxy(WIN_X+20,WIN_Y+FILE_H+100,"Operate handbook:");
	delay(3000);
	outtextxy(WIN_X+30,WIN_Y+FILE_H+120,"* \"ESC\" to Exit.");
	delay(3000);
	outtextxy(WIN_X+30,WIN_Y+FILE_H+140,"* \"Ctrl+F\" to Show the Menu");
	delay(3000);
	outtextxy(WIN_X+30,WIN_Y+FILE_H+160,"* \"Up\" or \"Down\" to Choose Menu.");
	delay(3000);
	outtextxy(WIN_X+30,WIN_Y+FILE_H+180,"* \"Enter\" to Start");
	delay(3000);
	outtextxy(WIN_X+30,WIN_Y+FILE_H+200,"* \"Ctrl+H\" for help");
	return flag;
}

/*---------清除显示子窗口--------------------*/
Clear_BG()
{ 
	setfillstyle(1,BK_COLOR);
	bar(WIN_X+1,WIN_Y+FILE_H+1,
		WIN_X+WIN_LEN-1,
		WIN_Y+FILE_H+WIN_LEN-1);
}
/*---------清除底端对话框---------------------*/
Clear_Dlg()
{ 
	setfillstyle(1,BK_COLOR);
	bar(WIN_X+1,WIN_Y+FILE_H+WIN_LEN+1,
		WIN_X+WIN_LEN-1,
		WIN_Y+FILE_H+WIN_LEN+Dlg_LEN-1);
}

/*-----------绘制按钮-----------------------*/
Button(color1,color2, str, len)  
char str[10];
{ 
	int x,y;
	int i;
	char ch[10];
	x=WIN_X+WIN_LEN/2;
	y=WIN_Y+FILE_H+WIN_LEN+Dlg_LEN/2;
	setcolor(color1);
	for(i=0;i<3;i++)
	{ 
		line(x-len*2-i,y-len-i,x+len*2+i,y-len-i);
		line(x+len*2+i,y-len-i,x+len*2+i,y+len-i);
	}
	setcolor(color2);
	for(i=0;i<2;i++)
	{ 
		line(x-len*2+i,y-len,x-len*2+i,y+len);
		line(x-len*2,y+len-i,x+len*2,y+len-i);   
	}
	setcolor(15);
	outtextxy(x-17,y-3,str);
}

/*------------用户按键退出效果函数------*/
int EXIT()
{ 
	int flag=0;
	char ch;
	Clear_Dlg();
	Button(15,3,"EXIT",Button_L);
	while(1)
	{
		if(kbhit())
		{
			ch=getch();
			if(ch==ESC)
			{ 
				Clear_Dlg(); 
				break;
			}
			else
			if(ch==Enter)
			{ 
				Clear_Dlg();
				Button(15,3,"EXIT",Button_L+2);
				delay(10000);
				Clear_Dlg();
				Button(15,3,"EXIT",Button_L);
				delay(30000);
				flag=1;
				Clear_Dlg();
				break;
			}
		} 
	}
	return flag;
}

C_PLAY()      /*--------"PLAY"选项-----------*/
{ 
	rectangle(WIN_X,WIN_Y+FILE_H,  WIN_X+FILE_L,WIN_Y+FILE_H*2);
	Print(WIN_X+13,WIN_Y+FILE_H+8,"PLAY");
}

C_SHOW()     /*--------"SHOW"选项-----------*/
{ 
	rectangle(WIN_X,WIN_Y+FILE_H*2,WIN_X+FILE_L,WIN_Y+FILE_H*3);
	Print(WIN_X+13,WIN_Y+FILE_H*2+8,"SHOW");
}

C_CHOOSE()   /*--------"CHOOSE"选项-----------*/
{ 
	rectangle(WIN_X,WIN_Y+FILE_H*3,WIN_X+FILE_L,WIN_Y+FILE_H*4);
	Print(WIN_X+13,WIN_Y+FILE_H*3+8,"CHOIC");
}

C_EXIT()       /*--------"EXIT"选项-----------*/
{ 
	rectangle(WIN_X,WIN_Y+FILE_H*4,WIN_X+FILE_L,WIN_Y+FILE_H*5);
	Print(WIN_X+13,WIN_Y+FILE_H*4+8,"EXIT");
}

C_9()  /*-级联菜单中的"9"格选项,其位置紧挨主菜单"CHOOSE"选项右边-*/
{ 
	rectangle(WIN_X+FILE_L,
		WIN_Y+FILE_H*3,
		WIN_X+FILE_L*2,
		WIN_Y+FILE_H*4);
	Print(WIN_X+FILE_L+13,WIN_Y+FILE_H*3+8,"9");
}

C_16()         /*--------级联菜单中的"16"格选项-----------*/
{ 
	rectangle(WIN_X+FILE_L,
		WIN_Y+FILE_H*4,
		WIN_X+FILE_L*2,
		WIN_Y+FILE_H*5);
	Print(WIN_X+13,WIN_Y+FILE_H*3+8,"CHOIC");
	Print(WIN_X+FILE_L+13,WIN_Y+FILE_H*4+8,"16");
}

/*----------依次调用各选项绘制函数,绘制主下拉菜单---------------------*/
MENU1()
{   
	setcolor(WIN_COLOR);
	C_PLAY(); 
	delay(3000); 
	C_SHOW();
	delay(3000);
	C_CHOOSE();
	delay(3000);
	C_EXIT();
}

/*--------------绘制二级菜单---------------------------*/
MENU2()
{   
	setcolor(WIN_COLOR);
	C_9();
	delay(3000);
	C_16();
}

/*-------------绘制选项滚动条----------------------------*/
CHOIC(int x,int y,int color)
{  
	setfillstyle(1,color);
	bar(x+1,y+1,x+FILE_L-1,y+FILE_H-1); 
}

/*----------清除主下拉菜单----------------------*/
Clear_FILE1()
{ 
	setfillstyle(1,BK_COLOR);
	bar(WIN_X+1,WIN_Y+FILE_H+1,WIN_X+FILE_L,WIN_Y+FILE_H*5);
}

/*-----------清除二级下拉菜单----------------------*/
Clear_FILE2()
{ 
	setfillstyle(1,BK_COLOR);
	bar(WIN_X+FILE_L+1,WIN_Y+FILE_H*3,WIN_X+FILE_L*2,WIN_Y+FILE_H*5);
}

/*----------弹出主下拉菜单,并调用函数F1_CHOOSE(),进行菜单选择------*/
F_SHOW()
{ 
	char ch;
	int c_x,c_y;
	BGround();
	while(1)
	{ 
		if(ExitFlag==1) 
			break; 
		if(kbhit())  
		{ 
			ch=getch();
			if(ch==ESC) 
			{ 
				if(EXIT()) 
					break; 
			}
			else
			if(ch==33)   
			{ 
				Clear_BG();
				Clear_Dlg();
				c_x=WIN_X; 
				c_y=WIN_Y+FILE_H; 
				CHOIC(WIN_X,WIN_Y+FILE_H,CHOIC_COLOR);
				MENU1();  
				c_y=F1_CHOOSE();
			}
		}
	}
}

/*进行主菜单选择,在其中调用 F2_CHOOSE()进行二级菜单选择。函数返回选项条所在y坐标值*/
int F1_CHOOSE()
{  
	char ch,i;
	int c_x=WIN_X,c_y=WIN_Y+FILE_H;

Repeat:   
	while(1)
	{ 
		if(kbhit())
		{ 
			ch=getch();
			if(ch==ESC)
			{ 
				Clear_BG(); 
				goto EXIT;
			}
			else
			if(ch==Enter)
				break;
			else
			if(ch==upkey)
			{ 
				CHOIC(c_x,c_y,BK_COLOR);
				if(c_y==WIN_Y+FILE_H)
				{ 
					c_y=WIN_Y+FILE_H*4;
					C_PLAY();
				}
				else 
					c_y-=FILE_H;
				CHOIC(c_x,c_y,CHOIC_COLOR);
				C_PLAY();
				C_SHOW();
				C_CHOOSE();
				C_EXIT();  
			}
			else
			if(ch==downkey)
			{ 
				CHOIC(c_x,c_y,BK_COLOR);
				if(c_y==WIN_Y+FILE_H*4)
				{ 
					c_y=WIN_Y+FILE_H;   
					C_EXIT();
                }
				else 
					c_y+=FILE_H;
                CHOIC(c_x,c_y,CHOIC_COLOR);
				C_PLAY();
                C_SHOW();
                C_CHOOSE();  
				C_EXIT();
             }
        }
	}

	switch(c_y)
	{ 
	case WIN_Y+FILE_H:
		Clear_BG();
		/*在此添加用户游戏模块*/
		Clear_BG();
		break;
	case WIN_Y+FILE_H*2:
		RepeatShow:
		Clear_BG();
		randomize();
		init_A();
		view();
		find_0(&X_0,&Y_0);
		Button(15,3,"Start",Button_L); /*显示开始按钮*/
		while(1)
		{
			if(kbhit())
			{
				ch=getch();
				if(ch==ESC)  /*如果用户此时按ESC键,则取消开始按钮*/
				{ 
					if(EXIT())
					{ 
						Clear_BG();
						Clear_Dlg();
						break; 
					}
					else 
						Button(15,3,"Start",Button_L);
				}
				if(ch==Enter)  /*如果此时按Enter键,则进行最优路径搜索*/
				{  
					Clear_Dlg();
					Button(15,3,"Start",Button_L+2);
					delay(10000);
					Clear_Dlg();
					Button(15,3,"Start",Button_L);
					delay(10000);
					Clear_Dlg();
					Show();

					while(1)
					{ 
						kbhit();
						ch=getch();
						Clear_Dlg();
						if(ch==ESC)
						{ 
							if(EXIT())
							{
								Clear_BG();
								Clear_Dlg();
								return; 
							}
							else 
								Button(15,3,"Again",Button_L);
						}
						else 
							Button(15,3,"Again",Button_L);
						kbhit();
						ch=getch();
						if(ch==ESC)
						{ 
							if(EXIT())
							{
								Clear_BG();
								Clear_Dlg();
								return; 
							}
							else 
                                Button(15,3,"Again",Button_L);
						}
						if(ch==Enter)
						{ 
							Clear_Dlg();
							Button(15,3,"Again",Button_L+2);
							delay(10000);
							Clear_Dlg();
							Button(15,3,"Again",Button_L);
							sleep(1);
							Clear_Dlg();
							goto RepeatShow;
						}
					}
				}
			} 
		}
		break;

    case WIN_Y+FILE_H*3:
		F2_CHOOSE(); /*调用F2_CHOOSE()进行子菜单选择*/
		goto Repeat; /*返回到主下拉菜单弹出时界面,重新选择主菜单*/

    case WIN_Y+FILE_H*4:
		Clear_BG();
		ExitFlag=EXIT();  /*--将退出模块函数值赋给全局退出标志--*/
		break;
    default: 
		break;
	};

⌨️ 快捷键说明

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