📄 puzzle.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 + -