用visual C++6.0编写一个推箱子程序

用visual C++6.0编写一个推箱子程序,第1张

给你一个TC版本的吧,VC版本的CSDN上可以下载:

#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()

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/10968756.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-12
下一篇2023-05-12

发表评论

登录后才能评论

评论列表(0条)

    保存