www.pudn.com > dos_mine.zip > MINE.C


#include "time.h" 
#include "mouse.h" 
#include "stdlib.h" 
#include "graphics.h" 
 
#define  F2        60 
#define  ESC       27 
#define  MAX       50 
#define  MENU_NUM  2 
 
int Length1[MENU_NUM]={70,70}; 
int Length2[MENU_NUM]={120,90}; 
int LineNumber[MENU_NUM]={5,2}; 
int XNum=8,YNum=8; 
int MineRemain; 
int Length,Width; 
int BeginX0,BeginY0; 
int MenuY0; 
int DoubleLine=0; 
void *wp=0; 
 
main() 
{ 
  start_graph(); 
  display_menu(); 
  closegraph(); 
} 
 
 
display_cry_face(int x,int y) 
{ 
  setfillstyle(1,7); 
  bar(x-12,y-11,x+12,y+11); 
  setcolor(0); 
  setfillstyle(1,14); 
  fillellipse(x,y,9,9); 
  line(x-5,y-4,x-3,y-2); 
  line(x-5,y-2,x-3,y-4); 
  line(x+5,y-4,x+3,y-2); 
  line(x+5,y-2,x+3,y-4); 
  arc(x,y+7,30,150,6); 
} 
 
 
display_normal_face(int x,int y) 
{ 
  setfillstyle(1,7); 
  bar(x-12,y-11,x+12,y+11); 
  setcolor(0); 
  setfillstyle(1,14); 
  fillellipse(x,y,9,9); 
  setfillstyle(1,0); 
  fillellipse(x-4,y-3,1,1); 
  fillellipse(x+4,y-3,1,1); 
  arc(x,y-1,210,330,6); 
} 
 
 
display_success_face(int x,int y) 
{ 
  setfillstyle(1,7); 
  bar(x-12,y-11,x+12,y+11); 
  setcolor(0); 
  setfillstyle(1,14); 
  fillellipse(x,y,9,9); 
  setfillstyle(1,0); 
  fillellipse(x-4,y-2,2,1); 
  fillellipse(x+4,y-2,2,1); 
  arc(x,y,210,330,6); 
  arc(x,y+6,30,150,3); 
  arc(x,y+5,30,150,10); 
  setfillstyle(1,6); 
  floodfill(x,y-8,0); 
} 
 
 
display_error(int x,int y,int LEN) 
{ 
  setcolor(1); 
  setlinestyle(0,0,3); 
  line(x-LEN/4-1,y-LEN/4-1,x+LEN/4,y+LEN/4); 
  line(x-LEN/4-1,y+LEN/4,x+LEN/4,y-LEN/4-1); 
  setlinestyle(0,0,1); 
} 
 
 
display_flag(int x,int y,int LEN) 
{ 
  setcolor(4); 
  setfillstyle(1,4); 
  line(x-LEN/5,y-LEN/3,x-LEN/5,y+LEN/3); 
  line(x-LEN/5,y-LEN/3,x+LEN/5,y); 
  line(x-LEN/5,y,      x+LEN/5,y); 
  floodfill(x,y-1,4); 
} 
 
 
display_mine(int x,int y,int LEN) 
{ 
  int r1=LEN*2/9,r2=LEN/3; 
  x--,y--; 
  setcolor(0); 
  setfillstyle(1,0); 
  line(x-r1,y-r1,x+r1,y+r1); 
  line(x-r1,y+r1,x+r1,y-r1); 
  line(x,y-r2,x,y+r2); 
  line(x-r2,y,x+r2,y); 
  fillellipse(x,y,LEN/5,LEN/5); 
  setfillstyle(1,15); 
  fillellipse(x-LEN/12,y-LEN/12,LEN/10,LEN/10); 
} 
 
 
display_mine_num(int new_x1,int number) 
{ 
  char char_count[10]; 
  sprintf(char_count,"%d",number); 
  setcolor(0); 
  setfillstyle(1,7); 
  bar(new_x1+10,MenuY0+38,new_x1+48,MenuY0+53); 
  outtextxy(new_x1+29,MenuY0+46,char_count); 
} 
 
 
display_second_num(int new_x2,int number) 
{ 
  char char_second[10]; 
  sprintf(char_second,"%d",number); 
  setcolor(0); 
  setfillstyle(1,7); 
  close_mouse(); 
  bar(new_x2-10,MenuY0+38,new_x2-48,MenuY0+53); 
  outtextxy(new_x2-29,MenuY0+46,char_second); 
  show_mouse(); 
} 
 
 
display_menu() 
{ 
  int i,j,k=0; 
  int MouseKeyState=0; 
  int Menu1State=0,Menu2State=0; 
  int new_x1,new_y1,new_x2,new_y2; 
  int LEN=16; 
  int exist=detect_mouse(); 
  int success; 
  int release=1; 
  int owndefine=0; 
  int mine_num=10,count; 
  int timeflag,second_number; 
  int code[MAX][MAX],uncovered[MAX][MAX]; 
  static int Line,Col; 
  long time=0; 
  char *name1[]={"Class","Help"}; 
  char name2[10][10][20]; 
  strcpy(name2[0][0],"Easy"); 
  strcpy(name2[0][1],"Normal"); 
  strcpy(name2[0][2],"Hard"); 
  strcpy(name2[0][3],"Own Define"); 
  strcpy(name2[0][4],"Double Line"); 
  strcpy(name2[1][0],"Help"); 
  strcpy(name2[1][1],"About"); 
START: 
  Length=XNum*LEN+20; 
  Width=YNum*LEN+116; 
  BeginX0=(640-Length)/2; 
  BeginY0=(480-Width)/2; 
  MenuY0=BeginY0+30; 
  new_x1=BeginX0+Length/2-LEN*XNum/2; 
  new_y1=MenuY0+Width/2-LEN*YNum/2+20; 
  new_x2=new_x1+LEN*XNum; 
  new_y2=new_y1+LEN*YNum; 
  display_background(); 
  display_head(); 
  display_first_menu(-1,name1); 
  display_window(new_x1+1,MenuY0+29,new_x2-1,MenuY0+62,0); 
  display_window(new_x1+9,MenuY0+37,new_x1+49,MenuY0+54,0); 
  display_window(new_x2-49,MenuY0+37,new_x2-9,MenuY0+54,0); 
  display_window(BeginX0+Length/2-13,MenuY0+33,BeginX0+Length/2+13,MenuY0+57,1); 
  display_window(new_x1-1,new_y1-1,new_x2,new_y2,0); 
  display_window(new_x1,MenuY0+28,new_x2,MenuY0+63,0); 
  if (DoubleLine) 
      display_window(new_x1-2,new_y1-2,new_x2+1,new_y2+1,0); 
  settextjustify(1,1); 
RESTART: 
  count=0; 
  success=0; 
  timeflag=0; 
  second_number=0; 
  MineRemain=XNum*YNum; 
  display_normal_face(BeginX0+Length/2,MenuY0+45); 
  display_mine_num(new_x1,mine_num-count); 
  display_second_num(new_x2,0); 
  init_landmine(code,uncovered,mine_num,new_x1,new_y1,new_x2,new_y2,LEN); 
  if(!exist) 
    { 
      printf("Mouse not found!"); 
      getch(); 
      closegraph(); 
      exit(81); 
    } 
  show_mouse(); 
  do 
    { 
      if (timeflag&&!success&&!Menu1State) 
	{ 
	  if(((biostime(0,0)-time)/18.2)>=1) 
	    { 
	      time=biostime(0,0); 
	      second_number++; 
	      display_second_num(new_x2,second_number); 
	    } 
	} 
      MouseKeyState=read_mouse(); 
      if (MouseKeyState==0&&release==0) 
	 release=1; 
      if (MouseKeyState==1&&mouse_inbox(BeginX0+Length-20,BeginY0+5, 
					BeginX0+Length-6 ,BeginY0+19)) 
	{ 
	  closegraph(); 
	  exit(0); 
	} 
      if (MouseKeyState==1&&!Menu1State&& 
	  mouse_inbox(BeginX0+Length/2-12,MenuY0+34, 
		      BeginX0+Length/2+12,MenuY0+56)) 
	{ 
	  close_mouse(); 
	  display_window(BeginX0+Length/2-13,MenuY0+33, 
			 BeginX0+Length/2+13,MenuY0+57,0); 
	  show_mouse(); 
	  while(read_mouse()!=0); 
	  close_mouse(); 
	  display_window(BeginX0+Length/2-13,MenuY0+33, 
			 BeginX0+Length/2+13,MenuY0+57,1); 
	  goto RESTART; 
	} 
      if (mouse_inbox(total_length(0),MenuY0, 
		      total_length(MENU_NUM)-3,MenuY0+21)&&!Menu1State) 
	for (i=0;i14) 
			 result=change_state( 
				total_length(0)+Length2[0]+1  ,MenuY0+20*3+25, 
				total_length(0)+Length2[0]+146,MenuY0+20*3+118, 
				mine_num); 
		       else 
			 result=change_state( 
				total_length(0)+15  ,MenuY0+20*4+25, 
				total_length(0)+160,MenuY0+20*4+118,mine_num); 
		       if (result>0) 
			 { 
			   mine_num=result; 
			   owndefine=1; 
			 } 
		       else 
			 { 
			   while(read_mouse()!=0); 
			   MouseKeyState=0; 
			 } 
		       break; 
		  case 4: 
		       result=1; 
		       if (DoubleLine) 
			 { 
			   DoubleLine=0; 
			   strcpy(name2[0][4],"Double Line"); 
			 } 
		       else 
			   { ::strcpy 
			   DoubleLine=1; 
			   strcpy(name2[0][4],"Single Line"); 
			 } 
		       while(read_mouse()!=0); 
		       break; 
		} 
	      while(read_mouse()!=0); 
	      if (result>0) 
		{ 
		  close_mouse(); 
		  clear_first_menu(Col); 
		  clear_second_menu(Col,-1); 
		  display_first_menu(-1,name1); 
		  Menu1State=Menu2State=0; 
		  goto START; 
		} 
	    } 
	  else 
	    { 
	      int  mid=(new_x1+new_x2)/2; 
	      close_mouse(); 
	      clear_first_menu(Col); 
	      clear_second_menu(Col,-1); 
	      display_first_menu(-1,name1); 
	      Menu1State=Menu2State=0; 
	      show_mouse(); 
	      if (Line==0) 
		 display_help(mid-80,MenuY0+90,mid+80,MenuY0+190,0); 
	      else 
		 display_help(mid-70,MenuY0+80,mid+70,MenuY0+220,1); 
	      while(read_mouse()!=0); 
	      MouseKeyState=0; 
	    } 
	} 
      if (MouseKeyState!=0&&!success&&!Menu1State) 
	{ 
	  i=j=0; 
	  if(!timeflag) 
	    { 
	      timeflag=1; 
	      time=biostime(0,0); 
	    } 
	  if (MouseX0-new_x1>=0) 
	     i=(MouseX0-new_x1)/LEN+1; 
	  if (MouseY0-new_y1>=0) 
	     j=(MouseY0-new_y1)/LEN+1; 
	  if (MouseKeyState==1&&!uncovered[i][j]&&i>0&&i<=XNum&&j>0&&j<=YNum) 
	     success=hit_left_key(i,j,code,uncovered,new_x1,new_y1,LEN); 
	  if (MouseKeyState==3&&uncovered[i][j]==1&&i>0&&i<=XNum&&j>0&&j<=YNum) 
	     success=hit_double_key(i,j,code,uncovered,new_x1,new_y1,LEN); 
	  if (MouseKeyState==2&&uncovered[i][j]!=1&& 
	      i>0&&i<=XNum&&j>0&&j<=YNum&&release) 
	    { 
	      release=0; 
	      count=hit_right_key(i,j,uncovered,new_x1,new_y1,LEN,count,mine_num); 
	    } 
	} 
      if (mine_num-count==MineRemain&&!success) 
	{ 
	  success=1; 
	  for (i=1;i<=XNum;i++) 
	    for (j=1;j<=YNum;j++) 
	      if (code[i][j]!=9&&uncovered[i][j]==2) 
		{ 
		  success=-1; 
		  break; 
		} 
	} 
      if (success==1) 
	{ 
	  close_mouse(); 
	  for (i=1;i<=XNum;i++) 
	    for (j=1;j<=YNum;j++) 
	      if (code[i][j]==9&&uncovered[i][j]==0) 
		 display_flag(new_x1+LEN*(i-0.5), 
			      new_y1+LEN*(j-0.5),LEN); 
	  display_mine_num(new_x1,0); 
	  display_success_face(BeginX0+Length/2,MenuY0+45); 
	  show_mouse(); 
	  success=2; 
	} 
      if (success==-1) 
	{ 
	  setcolor(0); 
	  close_mouse(); 
	  for(i=1;i<=XNum;i++) 
	    for(j=0;j<=YNum;j++) 
	      { 
		if (code[i][j]==9&&uncovered[i][j]!=2) 
		    display_mine(new_x1+LEN*(i-0.5), 
				 new_y1+LEN*(j-0.5),LEN); 
		if (code[i][j]!=9&&uncovered[i][j]==2) 
		  { 
		    setcolor(4); 
		    display_error(new_x1+LEN*(i-0.5), 
				  new_y1+LEN*(j-0.5),LEN); 
		    setcolor(0); 
		  } 
	      } 
	  display_cry_face(BeginX0+Length/2,MenuY0+45); 
	  show_mouse(); 
	  success=2; 
	} 
      if (bioskey(1)) 
	{ 
	  k=bioskey(0); 
	  k=k&0x00ff?k&0x00ff:k>>8; 
	  if(k==F2) 
	    { 
	      close_mouse(); 
	      goto RESTART; 
	    } 
	} 
    } 
  while(k!=ESC); 
} 
 
 
hit_left_key(i,j,code,uncovered,new_x1,new_y1,LEN) 
int i,j,code[][MAX],uncovered[][MAX],new_x1,new_y1,LEN; 
{ 
  if (code[i][j]==9) 
    { 
      close_mouse(); 
      setfillstyle(1,4); 
      bar(new_x1+LEN*(i-1),new_y1+LEN*(j-1),new_x1+LEN*i-1,new_y1+LEN*j-1); 
      setcolor(1); 
      setlinestyle(4,0x5555,1); 
      line(new_x1+LEN*i-1,new_y1+LEN*j-1,new_x1+LEN*i-1,new_y1+LEN*(j-1)-1); 
      line(new_x1+LEN*i-1,new_y1+LEN*j-1,new_x1+LEN*(i-1)-1,new_y1+LEN*j-1); 
      setlinestyle(0,0,1); 
      show_mouse(); 
      return -1; 
    } 
  else 
    { 
      if (code[i][j]!=0) 
	 display(i,j,code,uncovered,new_x1,new_y1,LEN); 
      else 
	 uncover9(i,j,code,uncovered,new_x1,new_y1,LEN); 
    } 
  return 0; 
} 
 
 
hit_double_key(i,j,code,uncovered,new_x1,new_y1,LEN) 
int i,j,code[][MAX],uncovered[][MAX],new_x1,new_y1,LEN; 
{ 
  int k,m,mine=0; 
  for(k=i-1;k<=i+1;k++) 
     for(m=j-1;m<=j+1;m++) 
       if (uncovered[k][m]==2) 
	  mine++; 
  if (code[i][j]==mine) 
    { 
      for(k=i-1;k<=i+1;k++) 
	 for(m=j-1;m<=j+1;m++) 
	    if (code[k][m]!=9&&uncovered[k][m]==2) 
	       return -1; 
      uncover9(i,j,code,uncovered,new_x1,new_y1,LEN); 
    } 
  else 
     display_around8(i,j,code,uncovered,new_x1,new_y1,LEN); 
  return 0; 
} 
 
 
hit_right_key(i,j,uncovered,new_x1,new_y1,LEN,count,mine_num) 
int i,j,uncovered[][MAX],new_x1,new_y1,LEN,count,mine_num; 
{ 
  close_mouse(); 
  if (uncovered[i][j]==0) 
    { 
      uncovered[i][j]=2; 
      display_flag(new_x1+LEN*(i-0.5),new_y1+LEN*(j-0.5),LEN); 
      count++; 
      MineRemain--; 
    } 
  else 
    { 
      uncovered[i][j]=0; 
      setfillstyle(1,7); 
      if (DoubleLine) 
	 bar(new_x1+LEN*(i-1)+2,new_y1+LEN*(j-1)+2, 
	     new_x1+LEN*i-3,new_y1+LEN*j-3); 
      else 
	 bar(new_x1+LEN*(i-1)+1,new_y1+LEN*(j-1)+1, 
	     new_x1+LEN*i-2,new_y1+LEN*j-2); 
      count--; 
      MineRemain++; 
    } 
  show_mouse(); 
  display_mine_num(new_x1,mine_num-count); 
  return count; 
} 
 
 
int display(i,j,code,uncovered,new_x1,new_y1,LEN) 
int i,j,code[][MAX],uncovered[][MAX],new_x1,new_y1,LEN; 
{ 
  close_mouse(); 
  setcolor(7); 
  rectangle(new_x1+LEN*(i-1),new_y1+LEN*(j-1),new_x1+LEN*i-1,new_y1+LEN*j-1); 
  if (DoubleLine) 
     rectangle(new_x1+LEN*(i-1)+1,new_y1+LEN*(j-1)+1, 
	       new_x1+LEN*i-2,new_y1+LEN*j-2); 
  if (code[i][j]>0) 
    { 
      char name[10]; 
      if(code[i][j]<3) 
	 setcolor(code[i][j]*7-6); 
      else 
	 setcolor(code[i][j]*2-2); 
      itoa(code[i][j],name,10); 
      outtextxy(new_x1+LEN*(i-0.5),new_y1+LEN*(j-0.5),name); 
    } 
  setcolor(1); 
  setlinestyle(4,0x5555,1); 
  line(new_x1+LEN*i-1,new_y1+LEN*j-1, 
       new_x1+LEN*i-1,new_y1+LEN*(j-1)-1); 
  line(new_x1+LEN*i-1,new_y1+LEN*j-1, 
       new_x1+LEN*(i-1)-1,new_y1+LEN*j-1); 
  show_mouse(); 
  setlinestyle(0,0,1); 
  uncovered[i][j]=1; 
  MineRemain--; 
  return 0; 
} 
 
 
int uncover9(i,j,code,uncovered,new_x1,new_y1,LEN) 
int i,j,code[][MAX],uncovered[][MAX],new_x1,new_y1,LEN; 
{ 
  int k,m; 
  if (!uncovered[i][j]) 
     display(i,j,code,uncovered,new_x1,new_y1,LEN); 
  for (k=i-1;k<=i+1;k++) 
    for (m=j-1;m<=j+1;m++) 
      if (!uncovered[k][m]&&code[k][m]!=0&&k>0&&k<=XNum&&m>0&&m<=YNum) 
	 display(k,m,code,uncovered,new_x1,new_y1,LEN); 
  for (k=i-1;k<=i+1;k++) 
    for (m=j-1;m<=j+1;m++) 
      if (code[k][m]==0&&!uncovered[k][m]&&k>0&&k<=XNum&&m>0&&m<=YNum) 
	 uncover9(k,m,code,uncovered,new_x1,new_y1,LEN); 
  return 0; 
} 
 
 
change_state(x1,y1,x2,y2,mine_num) 
int x1,y1,x2,y2,mine_num; 
{ 
  int MouseKeyState; 
  int release=1; 
  int effective=0; 
  int save_xnum=XNum,save_ynum=YNum; 
  char char_xnum[10],char_ynum[10],char_mine[10]; 
  void *w; 
  w=malloc(imagesize(x1,y1,x2,y2)); 
  getimage(x1,y1,x2,y2,w); 
  setfillstyle(1,7); 
  close_mouse(); 
  bar(x1,y1,x2,y2); 
  display_window(x1,y1,x2,y2,1); 
  display_window(x1+69,y1+8,x2-10,y1+22,0); 
  display_window(x1+77,y1+44,x2-36,y1+58,0); 
  setcolor(0); 
  outtextxy(x1+42,y1+15,"Number: "); 
  outtextxy(x1+42,y1+51,"MineNum:"); 
  sprintf(char_xnum,"%d",XNum); 
  sprintf(char_ynum,"%d",YNum); 
  sprintf(char_mine,"%d",mine_num); 
  outtextxy(x1+102,y1+16,"X"); 
  outtextxy(x1+83,y1+16,char_xnum); 
  outtextxy(x1+120,y1+16,char_ynum); 
  outtextxy(x1+93,y1+52,char_mine); 
  display_window(x1+72,y1+24 ,x1+83 ,y1+36,1); 
  display_window(x1+85,y1+24 ,x1+96 ,y1+36,1); 
  display_window(x1+109,y1+24,x1+120,y1+36,1); 
  display_window(x1+122,y1+24,x1+133,y1+36,1); 
  display_window(x2-34,y1+45 ,x2-23 ,y1+57,1); 
  display_window(x2-21,y1+45 ,x2-10 ,y1+57,1); 
  setcolor(0); 
  outtextxy(x1+77 ,y1+31,"\30"); 
  outtextxy(x1+90 ,y1+31,"\31"); 
  outtextxy(x1+114,y1+31,"\30"); 
  outtextxy(x1+127,y1+31,"\31"); 
  outtextxy(x2-29 ,y1+52,"\30"); 
  outtextxy(x2-16 ,y1+52,"\31"); 
  display_window(x1+10,y2-26,x1+66,y2-8,1); 
  display_window(x2-66,y2-26,x2-10,y2-8,1); 
  setcolor(0); 
  outtextxy(x1+38,y2-16,"Cancel"); 
  outtextxy(x2-38,y2-16,"OK"); 
  show_mouse(); 
  do 
    { 
      MouseKeyState=read_mouse(); 
      if (MouseKeyState==0&&release==0) 
	 release=1; 
      if (MouseKeyState==1||MouseKeyState==2) 
	{ 
	  if (release&&mouse_inbox(x1+72,y1+24,x1+83,y1+36)) 
	    { 
	      if (XNum<38&&MouseKeyState==1) 
		 XNum++; 
	      else if (XNum<29&&MouseKeyState==2) 
		 XNum+=10; 
	      sprintf(char_xnum,"%d",XNum); 
	      setfillstyle(1,7); 
	      display_bottom(x1+72,y1+24,x1+83,y1+36,0); 
	      setcolor(0); 
	      bar(x1+73,y1+11,x1+93,y1+21); 
	      outtextxy(x1+83,y1+16,char_xnum); 
	      show_mouse(); 
	      release=0; 
	    } 
	  if (release&&mouse_inbox(x1+85,y1+24,x1+96,y1+36)) 
	    { 
 
	      if (XNum>8&&MouseKeyState==1) 
		 XNum--; 
	      else if (XNum>17&&MouseKeyState==2) 
		 XNum-=10; 
	      sprintf(char_xnum,"%d",XNum); 
	      setfillstyle(1,7); 
	      display_bottom(x1+85,y1+24,x1+96,y1+36,0); 
	      setcolor(0); 
	      bar(x1+73,y1+11,x1+93,y1+21); 
	      outtextxy(x1+83,y1+16,char_xnum); 
	      show_mouse(); 
	      release=0; 
	    } 
	  if (release&&mouse_inbox(x1+109,y1+24,x1+120,y1+36)) 
	    { 
	      if (YNum<23&&MouseKeyState==1) 
		 YNum++; 
	      else if (YNum<14&&MouseKeyState==2) 
		 YNum+=10; 
	      sprintf(char_ynum,"%d",YNum); 
	      setfillstyle(1,7); 
	      display_bottom(x1+109,y1+24,x1+120,y1+36,0); 
	      setcolor(0); 
	      bar(x1+110,y1+11,x1+130,y1+21); 
	      outtextxy(x1+120,y1+16,char_ynum); 
	      show_mouse(); 
	      release=0; 
	    } 
	  if (release&&mouse_inbox(x1+122,y1+24,x1+133,y1+36)) 
	    { 
	      if (YNum>8&&MouseKeyState==1) 
		 YNum--; 
	      else if (YNum>17&&MouseKeyState==2) 
		 YNum-=10; 
	      sprintf(char_ynum,"%d",YNum); 
	      setfillstyle(1,7); 
	      display_bottom(x1+122,y1+24,x1+133,y1+36,0); 
	      setcolor(0); 
	      bar(x1+110,y1+11,x1+130,y1+21); 
	      outtextxy(x1+120,y1+16,char_ynum); 
	      show_mouse(); 
	      release=0; 
	    } 
	  if (release&&mouse_inbox(x2-34,y1+45,x2-23,y1+57)) 
	    { 
	      if (mine_num<499&&MouseKeyState==1) 
		 mine_num++; 
	      else if (mine_num<480&&MouseKeyState==2) 
		 mine_num+=20; 
	      sprintf(char_mine,"%d",mine_num); 
	      setfillstyle(1,7); 
	      display_bottom(x2-34,y1+45,x2-23,y1+57,0); 
	      setcolor(0); 
	      bar(x1+80,y1+47,x1+106,y1+57); 
	      outtextxy(x1+93,y1+52,char_mine); 
	      show_mouse(); 
	      release=0; 
	    } 
	  if (release&&mouse_inbox(x2-21,y1+45,x2-10,y1+57)) 
	    { 
	      if (mine_num>3&&MouseKeyState==1) 
		 mine_num--; 
	      else if (mine_num>22&&MouseKeyState==2) 
		 mine_num-=20; 
	      sprintf(char_mine,"%d",mine_num); 
	      setfillstyle(1,7); 
	      display_bottom(x2-21,y1+45,x2-10 ,y1+57,0); 
	      setcolor(0); 
	      bar(x1+80,y1+47,x1+106,y1+57); 
	      outtextxy(x1+93,y1+52,char_mine); 
	      show_mouse(); 
	      release=0; 
	    } 
	  if ((mouse_inbox(x1+10,y2-26,x1+70,y2-8)||!mouse_inbox(x1,y1,x2,y2)) 
	     &&MouseKeyState==1) 
	    { 
	      effective=-1; 
	      XNum=save_xnum; 
	      YNum=save_ynum; 
	      if(mouse_inbox(x1+10,y2-26,x1+66,y2-8)) 
		{ 
		  display_bottom(x1+10,y2-26,x1+66,y2-8,0); 
		  show_mouse(); 
	       } 
	    } 
	  if (mouse_inbox(x2-66,y2-26,x2-10,y2-8)&&MouseKeyState==1) 
	    { 
	      effective=1; 
	      display_bottom(x2-66,y2-26,x2-10,y2-8,0); 
	      show_mouse(); 
	    } 
	} 
    } 
  while(!effective); 
  if (mine_numXNum*YNum/2) 
      mine_num=XNum*YNum/2; 
  close_mouse(); 
  putimage(x1,y1,w,COPY_PUT); 
  show_mouse(); 
  free(w); 
  return effective*mine_num; 
} 
 
 
display_around8(i,j,code,uncovered,new_x1,new_y1,LEN) 
int i,j,code[][MAX],uncovered[][MAX],new_x1,new_y1,LEN; 
{ 
  int k,m,cheat=0; 
  close_mouse(); 
  if((bioskey(2)&4)==4&&(bioskey(2)&8)==8) 
     cheat=1; 
  for(k=i-1;k<=i+1;k++) 
    for(m=j-1;m<=j+1;m++) 
      if(uncovered[k][m]==0&&k>0&&k<=XNum&&m>0&&m<=YNum) 
	{ 
	  if(cheat==1&&code[k][m]==9) 
	     display_mine(new_x1+LEN*(k-0.5),new_y1+LEN*(m-0.5),LEN); 
	  setcolor(7); 
	  rectangle(new_x1+LEN*(k-1),new_y1+LEN*(m-1), 
		    new_x1+LEN*k-1,new_y1+LEN*m-1); 
	  if (DoubleLine) 
	     rectangle(new_x1+LEN*(k-1)+1,new_y1+LEN*(m-1)+1, 
		       new_x1+LEN*k-2,new_y1+LEN*m-2); 
	  setcolor(1); 
	  setlinestyle(4,0x5555,1); 
	  line(new_x1+LEN*k-1,new_y1+LEN*m-1, 
	       new_x1+LEN*k-1,new_y1+LEN*(m-1)-1); 
	  line(new_x1+LEN*k-1,new_y1+LEN*m-1, 
	       new_x1+LEN*(k-1)-1,new_y1+LEN*m-1); 
	  setlinestyle(0,0,1); 
	} 
  show_mouse(); 
  while(read_mouse()!=0); 
  close_mouse(); 
  for(k=i-1;k<=i+1;k++) 
    for(m=j-1;m<=j+1;m++) 
      if(uncovered[k][m]==0&&k>0&&k<=XNum&&m>0&&m<=YNum) 
	{ 
	  if(cheat==1&&code[k][m]==9) 
	    { 
	      setfillstyle(1,7); 
	      bar(new_x1+LEN*(k-1),new_y1+LEN*(m-1), 
		  new_x1+LEN*k-1,new_y1+LEN*m-1); 
	    } 
	  display_window(new_x1+LEN*(k-1),new_y1+LEN*(m-1), 
			 new_x1+LEN*k-1,new_y1+LEN*m-1,1); 
	  if (DoubleLine) 
	     display_window(new_x1+LEN*(k-1)+1,new_y1+LEN*(m-1)+1, 
			    new_x1+LEN*k-2,new_y1+LEN*m-2,1); 
	} 
  show_mouse(); 
} 
 
 
display_background() 
{ 
  register i,j; 
  setfillstyle(1,7); 
  bar(0,0,639,479); 
  for(i=0;i<640;i+=3) 
    for(j=0;j<480;j+=3) 
      putpixel(i,j,random(7)); 
} 
 
 
display_bottom(int x1,int y1,int x2,int y2) 
{ 
  close_mouse(); 
  display_window(x1,y1,x2,y2,0); 
  show_mouse(); 
  while(read_mouse()!=0); 
  close_mouse(); 
  display_window(x1,y1,x2,y2,1); 
} 
 
 
display_help(int x1,int y1,int x2,int y2,int key) 
{ 
  void *w; 
  int k; 
  w=malloc(imagesize(x1,y1,x2,y2)); 
  getimage(x1,y1,x2,y2,w); 
  setfillstyle(1,7); 
  close_mouse(); 
  bar(x1,y1,x2,y2); 
  display_window(x1,y1,x2,y2,1); 
  setfillstyle(1,1); 
  bar(x1+3,y1+3,x2-3,y1+21); 
  setfillstyle(1,7); 
  bar(x2-20,y1+5,x2-6,y1+19); 
  display_window(x2-20,y1+5,x2-6,y1+19,1); 
  setcolor(0); 
  outtextxy(x2-13,y1+13,"X"); 
  setcolor(15); 
  if (key==0) 
    { 
      outtextxy(x1+24,y1+13,"Help"); 
      setcolor(1); 
      outtextxy(319,y1+47,"I can\'t help you!"); 
      setcolor(0); 
      outtextxy(319,y1+75,"Sorry!"); 
    } 
  else 
    { 
      outtextxy(x1+28,y1+13,"About"); 
      setcolor(0); 
      outtextxy(319,y1+40,"CopyRight by: "); 
      setcolor(1); 
      outtextxy(319,y1+70,"Zoumai"); 
      setcolor(4); 
      outtextxy(319,y1+100,"1999-3-20   "); 
      outtextxy(319,y1+120,"       in XUT"); 
    } 
  show_mouse(); 
  do 
    { 
      if (bioskey(1)) 
	{ 
	  k=bioskey(0); 
	  k=k&0x00ff?k&0x00ff:k>>8; 
	} 
    } 
  while((read_mouse()!=1||!mouse_inbox(x2-20,y1+5,x2-6,y1+19))&&k!=ESC); 
  close_mouse(); 
  putimage(x1,y1,w,COPY_PUT); 
  show_mouse(); 
  free(w); 
} 
 
 
display_window(int x1,int y1,int x2,int y2,int key) 
{ 
  if (key==1) 
     setcolor(15); 
  else 
     setcolor(0); 
  line(x1,y1,x1,y2); 
  line(x1,y1,x2,y1); 
  if (key==1) 
     setcolor(0); 
  else 
     setcolor(15); 
  line(x2,y2,x1+1,y2); 
  line(x2,y2,x2,y1); 
} 
 
 
init_landmine(code,uncovered,mine_num,new_x1,new_y1,new_x2,new_y2,LEN) 
int code[][MAX],uncovered[][MAX],mine_num,new_x1,new_y1,new_x2,new_y2,LEN; 
{ 
  int i,j,a,b; 
  int count=0; 
  randomize(); 
  for (i=0;i<=XNum+1;i++) 
    for (j=0;j<=YNum+1;j++) 
      { 
	code[i][j]=0; 
	uncovered[i][j]=0; 
      } 
  while(count-1) 
    { 
      setcolor(15); 
      setfillstyle(1,1); 
      bar(total_length(num),MenuY0,total_length(num+1)-3,MenuY0+20); 
      outtextxy(total_length(num)+Length1[num]/2-1,MenuY0+11,name[num]); 
    } 
  return 0; 
} 
 
 
display_second_menu(int num1,int num2,char name[][10][20],int flag) 
{ 
  int i; 
  settextjustify(0,2); 
  if (flag) 
    { 
      free(wp); 
      wp=malloc(imagesize( 
	 total_length(num1)              ,MenuY0+22, 
	 total_length(num1)+Length2[num1],MenuY0+20*LineNumber[num1]+26)); 
      getimage( 
	 total_length(num1)              ,MenuY0+22, 
	 total_length(num1)+Length2[num1],MenuY0+20*LineNumber[num1]+26,wp); 
      setfillstyle(1,7); 
      bar( 
	 total_length(num1)              ,MenuY0+22, 
	 total_length(num1)+Length2[num1],MenuY0+20*LineNumber[num1]+26); 
      display_window( 
	 total_length(num1)              ,MenuY0+22, 
	 total_length(num1)+Length2[num1],MenuY0+20*LineNumber[num1]+26,1); 
     } 
  setcolor(0); 
  for (i=0;i-1) 
    { 
      setcolor(15); 
      setfillstyle(1,1); 
      bar(total_length(num1)+3              ,MenuY0+num2*20+25, 
	  total_length(num1)+Length2[num1]-3,MenuY0+(num2+1)*20+23); 
      outtextxy(total_length(num1)+7,MenuY0+num2*20+31,name[num1][num2]); 
    } 
  return 0; 
} 
 
 
clear_first_menu(int Col) 
{ 
  setfillstyle(1,7); 
  bar(total_length(Col),MenuY0,total_length(Col+1)-3,MenuY0+20); 
} 
 
 
clear_second_menu(int Col,int Line) 
{ 
  if (Line<0) 
     putimage(total_length(Col),MenuY0+22,wp,COPY_PUT); 
  else 
    { 
      setfillstyle(1,7); 
      bar(total_length(Col)+3             ,MenuY0+Line*20+23, 
	  total_length(Col)+Length2[Col]-3,MenuY0+(Line+1)*20+23); 
    } 
  return 0; 
} 
 
 
int total_length(int num) 
{ 
  int i,total=BeginX0+8; 
  for (i=0;i