
#include <dos.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <bios.h>
#include <alloc.h>
typedef struct winer
{
int x,y
struct winer *p
}winer
char status [20][20]
char far *printScreen=(char far* )0xB8000000
void putoutChar(int y,int x,char ch,char fc,char bc)
void printWall(int x, int y)
void printBox(int x, int y)
void printBoxDes(int x, int y)
void printDestination(int x, int y)
void printDestination1(int x,int y,winer **win,winer **pw)
void printMan(int x, int y)
void init()
winer *initStep1()
winer *initStep2()
winer *initStep3()
winer *initStep4()
void moveBoxSpacetoSpace(int x ,int y, char a)
void moveBoxDestoSpace(int x ,int y, char a)
void moveBoxSpacetoDes(int x, int y, char a)
void moveBoxDestoDes(int x, int y, char a)
int judge(int x, int y)
void move(int x, int y, char a)
void reset(int i)
void putoutChar(int y,int x,char ch,char fc,char bc)
{
printScreen[(x*160)+(y<<1)+0]=ch
printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc
}
void printWall(int x,int y)
{
putoutChar(y-1,x-1,219,GREEN,BLACK)
status[x][y]='w'
}
void printBox(int x,int y)
{
putoutChar(y-1,x-1,10,WHITE,BLACK)
status[x][y]='b'
}
void printDestination1(int x,int y,winer **win,winer **pw)
{
winer *qw
putoutChar(y-1,x-1,003,YELLOW,BLACK)
status[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=x
qw->y=y
(*pw)->p=qw
(*pw)=qwqw->p=NULL
}
}
void printDestination(int x,int y)
{
putoutChar(y-1,x-1,003,YELLOW,BLACK)
status[x][y]='m'
}
void printMan(int x,int y)
{
gotoxy(y,x)
_AL=02
_CX=01
_AH=0xa
geninterrupt(0x10)
}
void printBoxDes(int x,int y)
{
putoutChar(y-1,x-1,10,YELLOW,BLACK)
status[x][y]='i'
}
void init()
{
int i,j
for(i=0i<20i++)
for(j=0j<20j++)
status[i][j]=0
_AL=3
_AH=0
geninterrupt(0x10)
gotoxy(41,4)
printf(" --------- up")
gotoxy(41,6)
printf(" --------- down")
gotoxy(41,8)
printf(" --------- left")
gotoxy(41,10)
printf(" --------- right")
gotoxy(40,12)
printf("Space ----- reset")
gotoxy(40,14)
printf("Esc ------- quit")
gotoxy(18,24)
printf("CopyRight: 2008 LuoFuxing")
gotoxy(40,4)
_CX=01
_AH=0xa
_AL=24
geninterrupt(0x10)
gotoxy(40,6)
_CX=01
_AH=0xa
_AL=25
geninterrupt(0x10)
gotoxy(40,8)
_CX=01
_AH=0xa
_AL=27
geninterrupt(0x10)
gotoxy(40,10)
_CX=01
_AH=0xa
_AL=26
geninterrupt(0x10)
}
winer *initStep1()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(25,2)
printf("Level 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)
printDestination1(4+4,2+10,&win,&pw)
printDestination1(5+4,2+10,&win,&pw)
printDestination1(6+4,2+10,&win,&pw)
printMan(2+4,8+10)
return win
}
winer *initStep2()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(25,2)
printf("Level 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)
printDestination1(5+4,7+10,&win,&pw)
printDestination1(6+4,7+10,&win,&pw)
printDestination1(7+4,7+10,&win,&pw)
printMan(2+4,6+10)
return win
}
winer *initStep3()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(25,2)
printf("Level 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)
printDestination1(2+4,5+10,&win,&pw)
printDestination1(2+4,6+10,&win,&pw)
printDestination1(2+4,7+10,&win,&pw)
printMan(2+4,4+10)
return win
}
winer *initStep4()
{
int x
int y
winer *win=NULL
winer *pw
gotoxy(23,2)
printf("The Last Level")
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)
printDestination1(3+4,7+10,&win,&pw)
printDestination1(4+4,7+10,&win,&pw)
printDestination1(5+4,7+10,&win,&pw)
printDestination1(4+4,8+10,&win,&pw)
printDestination1(5+4,8+10,&win,&pw)
printMan(2+4,2+10)
return win
}
void moveBoxSpacetoSpace(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]=0
printf(" ")
printBox(x-2,y)
printMan(x-1,y)
status[x-2][y]='b'
break
case 'd':
status[x+1][y]=0
printf(" ")
printBox(x+2,y)
printMan(x+1,y)
status[x+2][y]='b'
break
case 'l':
status[x][y-1]=0
printf(" ")
printBox(x,y-2)
printMan(x,y-1)
status[x][y-2]='b'
break
case 'r':
status[x][y+1]=0
printf(" ")
printBox(x,y+2)
printMan(x,y+1)
status[x][y+2]='b'
break
default:
break
}
}
void moveBoxDestoSpace(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]='m'
printf(" ")
printBox(x-2,y)
printMan(x-1,y)
status[x-2][y]='b'
break
case 'd':
status[x+1][y]='m'
printf(" ")
printBox(x+2,y)
printMan(x+1,y)
status[x+2][y]='b'
break
case 'l':
status[x][y-1]='m'
printf(" ")
printBox(x,y-2)
printMan(x,y-1)
status[x][y-2]='b'
break
case 'r':
status[x][y+1]='m'
printf(" ")
printBox(x,y+2)
printMan(x,y+1)
status[x][y+2]='b'
break
default:
break
}
}
void moveBoxSpacetoDes(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]=0
printf(" ")
printBoxDes(x-2,y)
printMan(x-1,y)
status[x-2][y]='i'
break
case 'd':
status[x+1][y]=0
printf(" ")
printBoxDes(x+2,y)
printMan(x+1,y)
status[x+2][y]='i'
break
case 'l':
status[x][y-1]=0
printf(" ")
printBoxDes(x,y-2)
printMan(x,y-1)
status[x][y-2]='i'
break
case 'r':
status[x][y+1]=0
printf(" ")
printBoxDes(x,y+2)
printMan(x,y+1)
status[x][y+2]='i'
break
default:
break
}
}
void moveBoxDestoDes(int x,int y,char a)
{
switch(a)
{
case 'u':
status[x-1][y]='m'
printf(" ")
printBoxDes(x-2,y)
printMan(x-1,y)
status[x-2][y]='i'
break
case 'd':
status[x+1][y]='m'
printf(" ")
printBoxDes(x+2,y)
printMan(x+1,y)
status[x+2][y]='i'
break
case 'l':
status[x][y-1]='m'
printf(" ")
printBoxDes(x,y-2)
printMan(x,y-1)
status[x][y-2]='i'
break
case 'r':
status[x][y+1]='m'
printf(" ")
printBoxDes(x,y+2)
printMan(x,y+1)
status[x][y+2]='i'
break
default:
break
}
}
int judge(int x,int y)
{
int i
switch(status[x][y])
{
case 0:
i=1
break
case 'w':
i=0
break
case 'b':
i=2
break
case 'i':
i=4
break
case 'm':
i=3
break
default:
break
}
return i
}
void 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)
{
printDestination(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)
{
moveBoxSpacetoSpace(x,y,'u')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x-1)
}
else if(judge(x-2,y)==3)
{
moveBoxSpacetoDes(x,y,'u')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x-1)
}
else
gotoxy(y,x)
break
}
else if(judge(x-1,y)==4)
{
if(judge(x-2,y)==1)
{
moveBoxDestoSpace(x,y,'u')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x-1)
}
else if(judge(x-2,y)==3)
{
moveBoxDestoDes(x,y,'u')
if(judge(x,y)==3)
printDestination(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)
{
printDestination(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)
{
moveBoxSpacetoSpace(x,y,'d')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x+1)
}
else if(judge(x+2,y)==3)
{
moveBoxSpacetoDes(x,y,'d')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x+1)
}
else
gotoxy(y,x)
break
}
else if(judge(x+1,y)==4)
{
if(judge(x+2,y)==1)
{
moveBoxDestoSpace(x,y,'d')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y,x+1)
}
else if(judge(x+2,y)==3)
{
moveBoxDestoDes(x,y,'d')
if(judge(x,y)==3)
printDestination(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)
{
printDestination(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)
{
moveBoxSpacetoSpace(x,y,'l')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y-1,x)
}
else if(judge(x,y-2)==3)
{
moveBoxSpacetoDes(x,y,'l')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y-1,x)
}
else
gotoxy(y,x)
break
}
else if(judge(x,y-1)==4)
{
if(judge(x,y-2)==1)
{
moveBoxDestoSpace(x,y,'l')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y-1,x)
}
else if(judge(x,y-2)==3)
{
moveBoxDestoDes(x,y,'l')
if(judge(x,y)==3)
printDestination(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)
{
printDestination(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)
{
moveBoxSpacetoSpace(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else if(judge(x,y+2)==3)
{
moveBoxSpacetoDes(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else
gotoxy(y,x)
break
}
else if(judge(x,y+1)==4)
{
if(judge(x,y+2)==1)
{
moveBoxDestoSpace(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else if(judge(x,y+2)==3)
{
moveBoxDestoDes(x,y,'r')
if(judge(x,y)==3)
printDestination(x,y)
gotoxy(y+1,x)
}
else
gotoxy(y,x)
break
}
default:
break
}
}
void reset(int i)
{
switch(i)
{
case 0:
init()
initStep1()
break
case 1:
init()
initStep2()
break
case 2:
init()
initStep3()
break
case 3:
init()
initStep4()
break
default:
break
}
}
void main()
{
int key
int x
int y
int s
int i=0
winer *win
winer *pw
_AL=3
_AH=0
geninterrupt(0x10)
init()
win=initStep1()
do{
_AH=3
geninterrupt(0x10)
x=_DH+1
y=_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(status[pw->x][pw->y]=='m')
s++
pw=pw->p
}
if(s==0)
{
free(win)
gotoxy(15,20)
printf("congratulate! You have done this step!")
getch()
i++
switch(i)
{
case 1:
init()
win=initStep2()
break
case 2:
init()
win=initStep3()
break
case 3:
init()
win=initStep4()
break
case 4:
gotoxy(15,21)
printf("Congratulation! \n")
gotoxy(15,22)
printf("You have done all the steps, You are very clever!")
key=0x011b
getch()
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条)