📄 6-3.c
字号:
#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 + -