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

📄 puzzle.c

📁 经典迷宫算法
💻 C
字号:
/*       puzzle.c
  Author: zmofun 1999.12.7
  All rights is reserved.    */
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include<stdlib.h>

#define PSTARTX 30
#define PSTARTY  6
#define PWIDTH   20
#define PHEIGHT  11

puzzlemain()
{
	char scrbuff[1000];
	gettext(PSTARTX, PSTARTY, PSTARTX+PWIDTH, PSTARTY+PHEIGHT, scrbuff);
	
	play();

	puttext(PSTARTX, PSTARTY, PSTARTX+PWIDTH, PSTARTY+PHEIGHT, scrbuff);
	
}

ispass(int num[4][4])
{
	int i, j;
	for(i = 0; i < 4; i++)
		for(j = 0; j < 4; j++)
			if (num[i][j]!=i*4+j+1)
				return 0;
	return 1;
}

beep(int d)
{
	char originalbits, bits;
	bits = originalbits = inportb(0x61);
	outportb(0x61, bits&0xfc);
	outportb(0x43, 0xb6);

	outportb(0x42, 989);
	outportb(0x42, 5);
	outportb(0x61, bits|3);
	delay(d);
	outportb(0x61, bits & 0xfc);
	outportb(0x61, originalbits);
}

move(int direct, int *l, int *c, int num[4][4])
{
	static char *str[16]={" 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9",
	   "10", "11", "12", "13", "14", "15", "  "};
	int pass = 0;
	int t;
	setscrcolor(BLUE, WHITE);
	switch(direct)
	{
	case 1:
			if ((*l >= 0) && (*l <= 2))
			{ 
				*l = *l + 1;
				t = num[*l][*c];
				num[*l][*c] = num[*l-1][*c];
				num[*l-1][*c] = t;
				putsxy(PSTARTX + 3 + (*c) * 4, PSTARTY + 2 + (*l) * 2, str[num[*l][*c] - 1]);
				putsxy(PSTARTX + 3 + (*c) * 4, PSTARTY + 2 + (*l-1) * 2, str[num[*l-1][*c] - 1]);
				beep(500);
				if (ispass(num))
					pass = 1;
			}
			else
				beep(5000);
			break;
	case 2:
			if ((*c >= 0) && (*c <= 2))
			{ 
				*c = *c + 1;
				t = num[*l][*c];
				num[*l][*c] = num[*l][*c - 1];
				num[*l][*c - 1] = t;
				putsxy(PSTARTX + 3 + (*c) * 4, PSTARTY + 2 + (*l) * 2, str[num[*l][*c] - 1]);
				putsxy(PSTARTX + 3 + (*c-1) * 4, PSTARTY + 2 + (*l) * 2, str[num[*l][*c - 1] - 1]);
				beep(500);
				if (ispass(num))
					pass = 1;
			}
			else
				beep(5000);
			break;
	case 3:
			if ((*c <= 3) && (*c > 0))
			{
				*c = *c - 1;
				t = num[*l][*c];
				num[*l][*c] = num[*l][*c + 1];
				num[*l][*c + 1] = t;
				putsxy(PSTARTX + 3 + (*c) * 4, PSTARTY + 2 + (*l) * 2,str[num[*l][*c] - 1]);
				putsxy(PSTARTX + 3 + (*c + 1) * 4, PSTARTY + 2 + (*l) * 2, str[num[*l][*c + 1] - 1]);
				beep(500);
				if(ispass(num))
					pass = 1;
			}
			else 
				beep(5000);
			break;
	case 4:
			if ((*l <= 3) && (*l > 0))
			{
				*l = *l - 1;
				t = num[*l][*c];
				num[*l][*c] = num[*l + 1][*c];
				num[*l + 1][*c] = t;
				putsxy(PSTARTX + 3 + (*c) * 4, PSTARTY + 2 + (*l) * 2, str[num[*l][*c] - 1]);
				putsxy(PSTARTX + 3 + (*c) * 4, PSTARTY + 2 + (*l + 1) * 2, str[num[*l + 1][*c] - 1]);
				beep(500);
				if(ispass(num))
					pass = 1;
			}
			else 
				beep(5000);
			break;
    }
	return pass;
}

play()
{
	int key;
	int exitgame = 0;
	int l, c;
	static char *str[16] = {" 1", " 2", " 3", " 4", " 5", " 6", " 7", " 8", " 9",
							"10", "11", "12", "13", "14", "15", "  "};
	static int num[4][4];
	drawframe(num, str, &l, &c);
	while(!exitgame)
	{
		while(bioskey(1) == 0);
		key = bioskey(0);
    switch(key)
      {
	case UPA:
	  if(move(1,&l,&c,num))
	   {
	    if(!getyesno("    Passed! Play again?"))
	      exitgame=1;
	    else
	      drawframe(num,str,&l,&c);
	   }
	  break;
	case DOWNA:
	  if(move(4,&l,&c,num))
	   {
	    if(!getyesno("    Passed! Play again?"))
	      exitgame=1;
	    else
	      drawframe(num,str,&l,&c);
	   }
	  break;
	case LEFTA:
	  if(move(2,&l,&c,num))
	   {
	    if(!getyesno("    Passed! Play again?"))
	      exitgame=1;
	    else
	      drawframe(num,str,&l,&c);
	   }
	  break;
	case RIGHTA:
	  if(move(3,&l,&c,num))
	   {
	    if(!getyesno("    Passed! Play again?"))
	      exitgame=1;
	    else
	      drawframe(num,str,&l,&c);
	   }
	  break;
	case RETURN:
	  break;
	case ESC:
	  if(!getyesno("  Do you want play again?"))
	    exitgame=1;
	  else
	    drawframe(num,str,&l,&c);
	  break;
	default:
	  break;
       }
    }
}
getyesno(char *s)
{
   int key=0;
   int yesno=1;
   char buff[400];
   gettext(25,8,55,13,buff);
   setscrcolor(BLUE,WHITE);
   box(25,8,30,5);
   putsxy(27,9,s);
   setscrcolor(RED,YELLOW);
   putsxy(32,11,"Yes");
   setscrcolor(LIGHTGRAY,WHITE);
   putsxy(45,11,"No");
   while(key!=RETURN)
     {
       while(bioskey(1)==0);
       key=bioskey(0);
       switch(key)
	 {
	   case LEFTA:
	   case RIGHTA:
	     if (yesno)
	       {
		 yesno=0;
		 setscrcolor(LIGHTGRAY,WHITE);
		 putsxy(32,11,"Yes");
		 setscrcolor(RED,YELLOW);
		 putsxy(45,11,"No");
	       }
	     else
	       {
		 yesno=1;
		 setscrcolor(RED,YELLOW);
		 putsxy(32,11,"Yes");
		 setscrcolor(LIGHTGRAY,WHITE);
		 putsxy(45,11,"No");
	       }
	     break;
	   default:
	     break;
	 }
     }
   puttext(25,8,55,13,buff);
   return yesno;
}
initnumber(int num[4][4],int *l,int *c)
{
  int i,j,t;
  int n[20][16]={
  {1,6,2,3,5,13,4,8,16,10,14,7,9,15,11,12},
  {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},
  {1,16,2,3,5,6,7,4,9,10,11,8,13,14,15,12},
  {2,3,7,16,6,11,14,4,1,10,13,8,5,9,15,12},
  {10,16,15,7,8,2,3,4,1,6,11,12,9,5,13,14},
  {8,3,15,2,13,6,1,14,10,5,11,7,4,9,16,12},
  {9,10,5,6,15,14,1,3,11,13,2,4,16,7,12,8},
  {5,6,1,2,10,4,14,3,9,13,12,8,15,11,16,7},
  {13,6,14,2,1,5,7,4,10,15,12,3,16,9,11,8},
  {6,2,3,8,1,14,13,12,9,4,11,16,5,10,7,15},
  {2,3,8,7,6,9,15,4,1,13,10,12,5,14,16,11},
  {3,2,8,12,1,11,13,15,5,6,16,7,9,10,14,4}
  };
  t=random(12);
  for(i=0;i<4;i++)
    for(j=0;j<4;j++)
      {
	num[i][j]=n[t][i*4+j];
	if (num[i][j]==16)
	  *l=i,*c=j;
      }
}
drawframe(int num[4][4],char *str[16],int *l,int *c)
{
  int i,j;
  setscrcolor(LIGHTGRAY,GREEN);
  initnumber(num,l,c);
  box(PSTARTX,PSTARTY,PWIDTH,PHEIGHT);
  setscrcolor(BLUE,YELLOW);
  for(i=0;i<4;i++)
    for(j=0;j<4;j++)
      putsxy(PSTARTX+3+j*4,PSTARTY+2+i*2,str[num[i][j]-1]);
}

⌨️ 快捷键说明

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