[MAPCOUNT]
map_count=8
[MAP1]
w=8
h=8
nest_count=4
l1=0 0 0 1 1 1 0 0
l2=0 0 0 1 3 1 0 0
l3=1 1 1 1 0 1 0 0
l4=1 3 2 0 2 1 1 1
l5=1 1 1 4 2 0 3 1
l6=0 0 1 2 1 1 1 1
l7=0 0 1 3 1 0 0 0
l8=0 0 1 1 1 0 0 0
[MAP2]
w=9
h=9
nest_count=3
l1=1 1 1 1 1 0 0 0 0
l2=1 4 0 0 1 0 0 0 0
l3=1 0 2 2 1 0 1 1 1
l4=1 0 2 0 1 0 1 3 1
l5=1 1 1 0 1 1 1 3 1
l6=0 1 1 0 0 0 0 3 1
l7=0 1 0 0 0 1 0 0 1
l8=0 1 0 0 0 1 1 1 1
l9=0 1 1 1 1 1 0 0 0
[MAP3]
w=10
h=7
nest_count=4
l1=0 1 1 1 1 1 1 1 0 0
l2=0 1 0 0 0 0 0 1 1 1
l3=1 1 2 1 1 1 0 0 0 1
l4=1 0 4 0 2 0 0 2 0 1
l5=1 0 3 3 1 0 2 0 1 1
l6=1 1 3 3 1 0 0 0 1 0
l7=0 1 1 1 1 1 1 1 1 0
[MAP4]
w=6
h=8
nest_count=5
l1=0 1 1 1 1 0
l2=1 1 0 0 1 0
l3=1 4 2 0 1 0
l4=1 1 2 0 1 1
l5=1 1 0 2 0 1
l6=1 3 2 0 0 1
l7=1 3 3 5 3 1
l8=1 1 1 1 1 1
//以上为地图数据文件,保存为boxdata.dat文件
//空:0 墙:1 箱子:3 巢:4 箱子与巢重合:5
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
#include <string.h>
typedef struct
{
int x
int y
} PT
int** s
PT man
PT* nest=NULL
PT prev
int nest_count=0
int map_count=0
int gate=1
int w,h
char work_dir[100]={'\0'}
char data_file[100]={'\0'}
void GetDataFromFile()
void GetIntFromLineString(char* ch, int len, int i)
void Draw()
bool is_Success()
int main()
{
printf("Loading...")
CONSOLE_CURSOR_INFO cci
cci.bVisible = FALSE
cci.dwSize = sizeof(cci)
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE)
SetConsoleCursorInfo(handle, &cci)
_getcwd(work_dir,100)
strcpy(data_file,work_dir)
strcat(data_file,"\\boxdata.dat")
if(access(data_file,0))
{
printf("Don't find map data file !")
getch()
exit(0)
}
while(1)
{
GetDataFromFile()
int sel=0
Draw()
while(1)
{
fflush(stdin)
sel=getch()
if(sel==224)
{
sel=getch()
prev=man
if(sel==77) //right
{
if(s[man.y][man.x+1]==2)
{
if(s[man.y][man.x+2]==0 || s[man.y][man.x+2]==3)
{
s[man.y][man.x+2]=2
s[man.y][man.x+1]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
else if(s[man.y][man.x+1]==0 || s[man.y][man.x+1]==3)
{
s[man.y][man.x+1]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
else if(sel==80) //down
{
if(s[man.y+1][man.x]==2)
{
if(s[man.y+2][man.x]==0 || s[man.y+2][man.x]==3)
{
s[man.y+2][man.x]=2
s[man.y+1][man.x]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
else if(s[man.y+1][man.x]==0 || s[man.y+1][man.x]==3)
{
s[man.y+1][man.x]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
else if(sel==72) //up
{
if(s[man.y-1][man.x]==2)
{
if(s[man.y-2][man.x]==0 || s[man.y-2][man.x]==3)
{
s[man.y-2][man.x]=2
s[man.y-1][man.x]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
else if(s[man.y-1][man.x]==0 || s[man.y-1][man.x]==3)
{
s[man.y-1][man.x]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
else if(sel==75) //left
{
if(s[man.y][man.x-1]==2)
{
if(s[man.y][man.x-2]==0 || s[man.y][man.x-2]==3)
{
s[man.y][man.x-2]=2
s[man.y][man.x-1]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
else if(s[man.y][man.x-1]==0 || s[man.y][man.x-1]==3)
{
s[man.y][man.x-1]=4
s[man.y][man.x]=0
}
else
{
continue
}
}
int i
for(i=0i<nest_counti++)
{
if(nest[i].x==prev.x && nest[i].y==prev.y)
{
s[prev.y][prev.x]=3
break
}
}
Draw()
if(is_Success()==true)
{
gate++
if(gate>map_count)
{
printf("\n\nmap is end!")
fflush(stdin)
getch()
exit(0)
}
break
}
}
else if(sel=='q' || sel=='Q')
{
exit(0)
}
else if(sel=='r' || sel=='R')
{
break
}
}
}
return 0
}
void GetDataFromFile()
{
int i
if(s!=NULL)
{
if(h!=0)
{
for(i=0i<hi++)
{
free(s+i)
}
free(s)
}
else
{
printf("fail")
getch()
exit(0)
}
}
if(nest!=NULL)
{
free(nest)
}
map_count=GetPrivateProfileInt("MAPCOUNT","map_count",0,data_file)
if(map_count<gate)
{
printf("gate finish!")
getch()
exit(0)
}
char section[20]={'\0'}
sprintf(section,"MAP%d",gate)
nest_count=GetPrivateProfileInt(section,"nest_count",0,data_file)
nest=(PT*)malloc(sizeof(PT)*nest_count)
w=GetPrivateProfileInt(section,"w",0,data_file)
h=GetPrivateProfileInt(section,"h",0,data_file)
if(w<5 || h<5 || nest_count<1)
{
printf("w or h or box_nest data error!")
getch()
exit(0)
}
s=(int**)malloc(sizeof(int*)*h)
for(i=0i<hi++)
{
*(s+i)=(int*)malloc(sizeof(int)*w)
}
char key[20]={'\0'}
char line[50]={'\0'}
int len
int j
for(i=0i<hi++)
{
memset(line,'\0',50)
sprintf(key,"l%d",i+1)
GetPrivateProfileString(section,key,"\0",line,50,data_file)
len=strlen(line)
if(len>0)
{
line[len++]=' '
line[len]='\0'
}
GetIntFromLineString(line,strlen(line),i)
}
len=0
for(i=0i<hi++)
{
for(j=0j<wj++)
{
if(s[i][j]==3)
{
nest[len].y=i
nest[len].x=j
len++
}
else if(s[i][j]==5)
{
nest[len].y=i
nest[len].x=j
len++
s[i][j]=2
}
}
}
}
void strmyncpy(char* source, char* target, int begin, int end)
{
int i=0
while(1)
{
if(source[begin]!=' ')
{
target[i]=source[begin]
}
i++
begin++
if(begin>end)
{
target[i]='\0'
break
}
}
}
void GetIntFromLineString(char* ch, int len, int i)
{
int j=0
char c[5]={'\0'}
int b=0,e=0
while(e<len)
{
if(ch[e]==' ')
{
memset(c,'\0',5)
strmyncpy(ch,c,b,e)
b=e+1
e++
s[i][j++]=atoi(c)
}
e++
}
}
void Draw()
{
int i,j,k
bool flag=false
system("cls")
printf("\n\n")
for(i=0i<hi++)
{
printf("\n\n")
for(j=0j<wj++)
{
if(s[i][j]==0)
{
printf(" ")
}
else if(s[i][j]==1)
{
printf(" ■ ")
}
else if(s[i][j]==2)
{
printf(" ★ ")
}
else if(s[i][j]==3)
{
printf(" ☆ ")
}
else if(s[i][j]==4)
{
printf(" ◎ ")
man.x=j
man.y=i
}
}
}
}
bool is_Success()
{
int i,j
for(i=0i<hi++)
{
for(j=0j<wj++)
{
if(s[i][j]==3)
{
return false
}
}
}
for(i=0i<nest_counti++)
{
if(man.x==nest[i].x && man.y==nest[i].y)
{
return false
}
}
return true
}
Here you are!编译通过。
/* 推箱子游戏 */
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>
#include <bios.h>
#include <alloc.h>
/* 定义二维数组ghouse来记录屏幕上各点的状态,
其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。 */
char ghouse[20][20]
/* 以下函数为直接写屏函数,很酷的函数哦!是我朋友告诉我的。 */
char far *screen=(char far* )0xb8000000
void putchxy(int y,int x,char ch,char fc,char bc)
{
screen[(x*160)+(y<<1)+0]=ch
screen[(x*160)+(y<<1)+1]=(bc*16)+fc
}
/* 定义判断是否胜利的数据结构 */
typedef struct winer {
int x,y
struct winer *p
}winer
/* 箱子位置的数据结构 */
typedef struct boxs {
int x,y
struct boxs *next
}boxs
/* 在特定的坐标上画墙壁并用数组记录状态的函数 */
void printwall(int x,int y)
{
putchxy(y-1,x-1,219,MAGENTA,BLACK)
ghouse[x][y]='w'
}
/* 在特定的坐标上画箱子并用数组记录状态的函数 */
void printbox(int x,int y)
{
putchxy(y-1,x-1,10,WHITE,BLACK)
ghouse[x][y]='b'
}
/* 在特定的坐标上画目的地并用数组记录状态的函数 */
void printwhither1(int x,int y,winer **win,winer **pw)
{
winer *qw
putchxy(y-1,x-1,'*',YELLOW,BLACK)
ghouse[x][y]='m'
if(*win==NULL)
{
*win=*pw=qw=(winer* )malloc(sizeof(winer))
(*pw)->x=x(*pw)->y=y(*pw)->p=NULL
}
else
{
qw=(winer* )malloc(sizeof(winer))
qw->x=xqw->y=y(*pw)->p=qw(*pw)=qwqw->p=NULL
}
}
/* 在特定的坐标上画目的地并用数组记录状态的函数 */
void printwhither(int x,int y)
{
putchxy(y-1,x-1,'*',YELLOW,BLACK)
ghouse[x][y]='m'
}
/* 在特定的坐标上画人的函数 */
void printman(int x,int y)
{
gotoxy(y,x)
_AL=02_CX=01_AH=0xa
geninterrupt(0x10)
}
/* 在特定的坐标上画箱子在目的地上并用数组记录状态的函数 */
void printboxin(int x,int y)
{
putchxy(y-1,x-1,10,YELLOW,BLACK)
ghouse[x][y]='i'
}
/* 初始化函数,初始化数组和屏幕 */
void init()
{
int i,j
system("cls")
for(i=0i<20i++)
for(j=0j<20j++)
ghouse[i][j]=0
_AL=3
_AH=0
geninterrupt(0x10)
gotoxy(40,4)
printf("Welcome to push box world!")
gotoxy(40,6)
printf("Press up,down,left,right to play.")
gotoxy(40,8)
printf("Press Esc to quit it.")
gotoxy(40,10)
printf("Press space to reset the game.")
gotoxy(40,12)
printf("April 30th 2004.")
}
/* 第一关的图象初始化 */
winer *inithouse1()
{
int x,y
winer *win=NULL,*pw
gotoxy(8,2)
printf("Level No.1")
for(x=1,y=5y<=9y++)
printwall(x+4,y+10)
for(y=5,x=2x<=5x++)
printwall(x+4,y+10)
for(y=9,x=2x<=5x++)
printwall(x+4,y+10)
for(y=1,x=3x<=8x++)
printwall(x+4,y+10)
for(x=3,y=3x<=5x++)
printwall(x+4,y+10)
for(x=5,y=8x<=9x++)
printwall(x+4,y+10)
for(x=7,y=4x<=9x++)
printwall(x+4,y+10)
for(x=9,y=5y<=7y++)
printwall(x+4,y+10)
for(x=8,y=2y<=3y++)
printwall(x+4,y+10)
printwall(5+4,4+10)
printwall(5+4,7+10)
printwall(3+4,2+10)
printbox(3+4,6+10)
printbox(3+4,7+10)
printbox(4+4,7+10)
printwhither1(4+4,2+10,&win,&pw)
printwhither1(5+4,2+10,&win,&pw)
printwhither1(6+4,2+10,&win,&pw)
printman(2+4,8+10)
return win
}
/* 第三关的图象初始化 */
winer *inithouse3()
{int x,y
winer *win=NULL,*pw
gotoxy(8,3)
printf("Level No.3")
for(x=1,y=2y<=8y++)
printwall(x+4,y+10)
for(x=2,y=2x<=4x++)
printwall(x+4,y+10)
for(x=4,y=1y<=3y++)
printwall(x+4,y+10)
for(x=5,y=1x<=8x++)
printwall(x+4,y+10)
for(x=8,y=2y<=5y++)
printwall(x+4,y+10)
for(x=5,y=5x<=7x++)
printwall(x+4,y+10)
for(x=7,y=6y<=9y++)
printwall(x+4,y+10)
for(x=3,y=9x<=6x++)
printwall(x+4,y+10)
for(x=3,y=6y<=8y++)
printwall(x+4,y+10)
printwall(2+4,8+10)
printwall(5+4,7+10)
printbox(6+4,3+10)
printbox(4+4,4+10)
printbox(5+4,6+10)
printwhither1(2+4,5+10,&win,&pw)
printwhither1(2+4,6+10,&win,&pw)
printwhither1(2+4,7+10,&win,&pw)
printman(2+4,4+10)
return win
}
/* 第二关的图象初始化 */
winer *inithouse2()
{int x,y
winer *win=NULL,*pw
gotoxy(8,2)
printf("Level No.2")
for(x=1,y=4y<=7y++)
printwall(x+4,y+10)
for(x=2,y=2y<=4y++)
printwall(x+4,y+10)
for(x=2,y=7x<=4x++)
printwall(x+4,y+10)
for(x=4,y=1x<=8x++)
printwall(x+4,y+10)
for(x=8,y=2y<=8y++)
printwall(x+4,y+10)
for(x=4,y=8x<=8x++)
printwall(x+4,y+10)
for(x=4,y=6x<=5x++)
printwall(x+4,y+10)
for(x=3,y=2x<=4x++)
printwall(x+4,y+10)
for(x=4,y=4x<=5x++)
printwall(x+4,y+10)
printwall(6+4,3+10)
printbox(3+4,5+10)
printbox(6+4,6+10)
printbox(7+4,3+10)
printwhither1(5+4,7+10,&win,&pw)
printwhither1(6+4,7+10,&win,&pw)
printwhither1(7+4,7+10,&win,&pw)
printman(2+4,6+10)
return win
}
/* 第四关的图象初始化 */
winer *inithouse4()
{int x,y
winer *win=NULL,*pw
gotoxy(8,2)
printf("Level No.4")
for(x=1,y=1y<=6y++)
printwall(x+4,y+10)
for(x=2,y=7y<=8y++)
printwall(x+4,y+10)
for(x=2,y=1x<=7x++)
printwall(x+4,y+10)
for(x=7,y=2y<=4y++)
printwall(x+4,y+10)
for(x=6,y=4y<=9y++)
printwall(x+4,y+10)
for(x=3,y=9x<=5x++)
printwall(x+4,y+10)
for(x=3,y=3y<=4y++)
printwall(x+4,y+10)
printwall(3+4,8+10)
printbox(3+4,5+10)
printbox(4+4,4+10)
printbox(4+4,6+10)
printbox(5+4,5+10)
printbox(5+4,3+10)
printwhither1(3+4,7+10,&win,&pw)
printwhither1(4+4,7+10,&win,&pw)
printwhither1(5+4,7+10,&win,&pw)
printwhither1(4+4,8+10,&win,&pw)
printwhither1(5+4,8+10,&win,&pw)
printman(2+4,2+10)
return win
}
/* 移动在空地上的箱子到空地上 */
movebox(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]=0printf(" ")
printbox(x-2,y)printman(x-1,y)
ghouse[x-2][y]='b'break
case 'd':ghouse[x+1][y]=0printf(" ")
printbox(x+2,y)printman(x+1,y)
ghouse[x+2][y]='b'break
case 'l':ghouse[x][y-1]=0printf(" ")
printbox(x,y-2)printman(x,y-1)
ghouse[x][y-2]='b'break
case 'r':ghouse[x][y+1]=0printf(" ")
printbox(x,y+2)printman(x,y+1)
ghouse[x][y+2]='b'break
default: break
}
}
/* 移动在目的地上的箱子到空地上 */
moveinbox(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]='m'printf(" ")
printbox(x-2,y)printman(x-1,y)
ghouse[x-2][y]='b'break
case 'd':ghouse[x+1][y]='m'printf(" ")
printbox(x+2,y)printman(x+1,y)
ghouse[x+2][y]='b'break
case 'l':ghouse[x][y-1]='m'printf(" ")
printbox(x,y-2)printman(x,y-1)
ghouse[x][y-2]='b'break
case 'r':ghouse[x][y+1]='m'printf(" ")
printbox(x,y+2)printman(x,y+1)
ghouse[x][y+2]='b'break
default: break
}
}
/* 移动在空地上的箱子到目的地上 */
moveboxin(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]=0printf(" ")
printboxin(x-2,y)printman(x-1,y)
ghouse[x-2][y]='i'break
case 'd':ghouse[x+1][y]=0printf(" ")
printboxin(x+2,y)printman(x+1,y)
ghouse[x+2][y]='i'break
case 'l':ghouse[x][y-1]=0printf(" ")
printboxin(x,y-2)printman(x,y-1)
ghouse[x][y-2]='i'break
case 'r':ghouse[x][y+1]=0printf(" ")
printboxin(x,y+2)printman(x,y+1)
ghouse[x][y+2]='i'break
default: break
}
}
/* 移动在目的地上的箱子到目的地 */
moveinboxin(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]='m'printf(" ")
printboxin(x-2,y)printman(x-1,y)
ghouse[x-2][y]='i'break
case 'd':ghouse[x+1][y]='m'printf(" ")
printboxin(x+2,y)printman(x+1,y)
ghouse[x+2][y]='i'break
case 'l':ghouse[x][y-1]='m'printf(" ")
printboxin(x,y-2)printman(x,y-1)
ghouse[x][y-2]='i'break
case 'r':ghouse[x][y+1]='m'printf(" ")
printboxin(x,y+2)printman(x,y+1)
ghouse[x][y+2]='i'break
default: break
}
}
/* 判断特定的坐标上的状态 */
int judge(int x,int y)
{int i
switch(ghouse[x][y])
{
case 0: i=1break
case 'w': i=0break
case 'b': i=2break
case 'i': i=4break
case 'm': i=3break
default: break
}
return i
}
/* 处理按下键盘后,人物移动的主函数 */
move(int x,int y,char a)
{switch(a)
{
case 'u':if(!judge(x-1,y)) {gotoxy(y,x)break}
else if(judge(x-1,y)==1||judge(x-1,y)==3)
{if(judge(x,y)==3)
{ printwhither(x,y)printman(x-1,y)break}
else
{printf(" ")printman(x-1,y)break}
}
else if(judge(x-1,y)==2)
{ if(judge(x-2,y)==1)
{movebox(x,y,'u')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)
}
else if(judge(x-2,y)==3)
{ moveboxin(x,y,'u')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)
}
else gotoxy(y,x)
break
}
else if(judge(x-1,y)==4)
{ if(judge(x-2,y)==1)
{moveinbox(x,y,'u')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)
}
else if(judge(x-2,y)==3)
{ moveinboxin(x,y,'u')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x-1)
}
else gotoxy(y,x)
break
}
case 'd':if(!judge(x+1,y)) {gotoxy(y,x)break}
else if(judge(x+1,y)==1||judge(x+1,y)==3)
{if(judge(x,y)==3)
{ printwhither(x,y)printman(x+1,y)break}
else
{printf(" ")printman(x+1,y)break}
}
else if(judge(x+1,y)==2)
{ if(judge(x+2,y)==1)
{movebox(x,y,'d')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)
}
else if(judge(x+2,y)==3)
{moveboxin(x,y,'d')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)
}
else gotoxy(y,x)
break
}
else if(judge(x+1,y)==4)
{ if(judge(x+2,y)==1)
{moveinbox(x,y,'d')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)
}
else if(judge(x+2,y)==3)
{moveinboxin(x,y,'d')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y,x+1)
}
else gotoxy(y,x)
break
}
case 'l':if(!judge(x,y-1)) {gotoxy(y,x)break}
else if(judge(x,y-1)==1||judge(x,y-1)==3)
{if(judge(x,y)==3)
{ printwhither(x,y)printman(x,y-1)break}
else
{printf(" ")printman(x,y-1)break}
}
else if(judge(x,y-1)==2)
{ if(judge(x,y-2)==1)
{movebox(x,y,'l')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)
}
else if(judge(x,y-2)==3)
{moveboxin(x,y,'l')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)
}
else gotoxy(y,x)
break
}
else if(judge(x,y-1)==4)
{ if(judge(x,y-2)==1)
{moveinbox(x,y,'l')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)
}
else if(judge(x,y-2)==3)
{moveinboxin(x,y,'l')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y-1,x)
}
else gotoxy(y,x)
break
}
case 'r':if(!judge(x,y+1)) {gotoxy(y,x)break}
else if(judge(x,y+1)==1||judge(x,y+1)==3)
{if(judge(x,y)==3)
{printwhither(x,y)printman(x,y+1)break}
else
{printf(" ")printman(x,y+1)break}
}
else if(judge(x,y+1)==2)
{ if(judge(x,y+2)==1)
{movebox(x,y,'r')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)
}
else if(judge(x,y+2)==3)
{moveboxin(x,y,'r')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)
}
else gotoxy(y,x)
break
}
else if(judge(x,y+1)==4)
{ if(judge(x,y+2)==1)
{moveinbox(x,y,'r')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)
}
else if(judge(x,y+2)==3)
{moveinboxin(x,y,'r')
if(judge(x,y)==3) printwhither(x,y)gotoxy(y+1,x)
}
else gotoxy(y,x)
break
}
default: break
}
}
/* 按下空格键后,回到本关开头的函数 */
void reset(int i)
{switch(i)
{
case 0: init()
inithouse1()break
case 1: init()
inithouse2()break
case 2: init()
inithouse3()break
case 3: init()
inithouse4()break
default:break
}
}
/* 主函数main */
main()
{int key,x,y,s,i=0
winer *win,*pw
_AL=3_AH=0
geninterrupt(0x10)
init()
win=inithouse1()
do{
_AH=3
geninterrupt(0x10)
x=_DH+1y=_DL+1
while(bioskey(1)==0)
key=bioskey(0)
switch(key)
{
case 0x4800:move(x,y,'u')break/* 按下向上键后 */
case 0x5000:move(x,y,'d')break/* 按下向下键后 */
case 0x4b00:move(x,y,'l')break/* 按下向左键后 */
case 0x4d00:move(x,y,'r')break/* 按下向右键后 */
case 0x3920:reset(i)break/* 按下空格键后 */
default:break
}
s=0
pw=win
while(pw)
{
if(ghouse[pw->x][pw->y]=='m') s++
pw=pw->p
}
if(s==0)
{
free(win)
gotoxy(25,2)
printf("Congratulate! You have passed Level %d!",i+1)
getch()
i++
switch(i)
{
case 1: init()
win=inithouse2()break
case 2: init()
win=inithouse3()break
case 3: init()
win=inithouse4()break
case 4: gotoxy(8,14)
printf("Great! You have passed all the levels! Press any key to quit!")
key=0x011bgetch()break
default: break
}
}
}while(key!=0x011b)
_AL=3
_AH=0
geninterrupt(0x10)
}
#include"stdio.h"#include"bios.h"
#define LEFT 75
#define RIGHT 77
#define UPPER 72
#define DOWN 80
#define ESC 27
struct Boxss/*定义箱子结构体,其中包含坐标属性*/
{
int x,y
}
union keyboard /*定义读取键盘码的共用体类型*/
{
unsigned int iKeyInfo
char chKeyBit[2]
}
int fnGetKey(void) /*定义读取键盘码的函数*/
{
union keyboard uniKey1 /*定义读取键盘码的共用体变量*/
while(bioskey(1)==0) /*检测用户是否按键*/
uniKey1.iKeyInfo=bioskey(0) /*读取按键信息*/
return(uniKey1.chKeyBit[0]==0?uniKey1.chKeyBit[1]:uniKey1.chKeyBit[0]) /*返回ASCII码或扩充码*/
}
void main()
{
int iKey,x=11,y=6,tx=11,ty=6 /*x,y为人物移动后坐标,tx,ty为人物移动前坐标*/
struct Boxss Box[4] /*定义箱子数量*/
int chMap[10][10]={ /*用二维数组定义地图*/
{0,0,0,0,0,0,0,0,0,0}, /*0表示墙1表示路2表示目标*/
{0,1,0,0,0,0,1,1,1,0},
{0,1,0,2,0,0,1,0,1,0},
{0,1,0,1,0,0,1,0,1,0},
{0,1,1,1,0,0,1,0,1,0},
{0,1,0,0,0,0,1,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,0,1,0,0,0,0,2,0},
{0,2,0,1,1,1,1,2,0,0},
{0,0,0,0,0,0,0,0,0,0},
}
int i,j
Box[0].x=13 /*定义箱子的坐标属性*/
Box[1].x=11
Box[2].x=14
Box[3].x=18
Box[0].y=8
Box[1].y=7
Box[2].y=13
Box[3].y=7
while(1) /*反复进行求移动的坐标运算*/
{
for(i=0i<10i++) /*输出新地图(刷新地图)*/
{
gotoxy(10,5+i)
for(j=0j<10j++)
{
if(chMap[i][j]==0)
printf("#")
if(chMap[i][j]==1)
printf(" ")
if(chMap[i][j]==2)
printf("X")
}
}
j=0 /*判断是否所有箱子都在目标坐标上*/
for(i=0i<4i++)
if(chMap[Box[i].y-5][Box[i].x-10]==2)
j++
if(j==4) /*如果所有箱子都就位输出"YOU WIN!"退出*/
{
clrscr()
printf("You Win!")
break
}
for(i=0i<4i++) /*在起始(或移动后)的坐标输出箱子*/
{
gotoxy(Box[i].x,Box[i].y)
printf("0")
}
gotoxy(x,y) /*在起始(或移动后)的坐标输出人*/
printf("*\b")
tx=x /*记录本次移动前的坐标*/
ty=y
iKey=fnGetKey()
if(iKey==LEFT&&chMap[y-5][x-1-10]!=0) /*按读取的按键信息改变坐标如果改变的坐标和墙(0)重合则不改变*/
x--
if(iKey==RIGHT&&chMap[y-5][x+1-10]!=0)
x++
if(iKey==UPPER&&chMap[y-1-5][x-10]!=0)
y--
if(iKey==DOWN&&chMap[y+1-5][x-10]!=0)
y++ /*输入ESC退出并输出"YOU LOST"*/
if(iKey==ESC)
{
clrscr()
printf("You Lost")
break
}
for(i=0i<4i++) /*如果移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格*/
if(Box[i].x==x&&Box[i].y==y)
{
Box[i].x+=(x-tx)
Box[i].y+=(y-ty)
if(chMap[Box[i].y-5][Box[i].x-10]==0) /*如果移动后的箱子坐标会出现在墙上,则使箱子坐标和人坐标都返回移动前的值*/
{
Box[i].x-=(x-tx)
Box[i].y-=(y-ty)
x=tx
y=ty
}
break
}
clrscr()
}
getch()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)