帮我搞个完整的C语言推箱子程序好吗

就是可以直接运行的

#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=0;i<10;i++) /*输出新地图(刷新地图)*/
{
gotoxy(10,5+i);
for(j=0;j<10;j++)
{
if(chMap[i][j]==0)
printf("#");
if(chMap[i][j]==1)
printf(" ");
if(chMap[i][j]==2)
printf("X");
}
}
j=0; /*判断是否所有箱子都在目标坐标上*/
for(i=0;i<4;i++)
if(chMap[Box[i].y-5][Box[i].x-10]==2)
j++;
if(j==4) /*如果所有箱子都就位输出"YOU WIN!"退出*/
{
clrscr();
printf("You Win!");
break;
}
for(i=0;i<4;i++) /*在起始(或移动后)的坐标输出箱子*/
{
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=0;i<4;i++) /*如果移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格*/
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();
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-01-13
# include "conio.h"
# include "graphics.h"

char map[12][19]={{'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'},
{'.','.','.','.','#','#','#','#','#','#','#','#','#','#','#','.','.','.','.'},
{'.','.','.','.','#',' ',' ',' ',' ','#',' ',' ',' ',' ','#','.','.','.','.'},
{'.','.','.','.','#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#','.','.','.','.'},
{'.','.','.','.','#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#','.','.','.','.'},
{'.','.','.','.','#','#','#','#','#',' ','#','#','#','#','#','.','.','.','.'},
{'.','.','.','.','.','.','.','#',' ',' ',' ','#','.','.','.','.','.','.','.'},
{'.','.','.','.','.','.','.','#',' ',' ',' ','#','.','.','.','.','.','.','.'},
{'.','.','.','.','.','.','.','#',' ',' ',' ','#','.','.','.','.','.','.','.'},
{'.','.','.','.','.','.','.','#',' ',' ',' ','#','.','.','.','.','.','.','.'},
{'.','.','.','.','.','.','.','#','#','#','#','#','.','.','.','.','.','.','.'},
{'.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'}
};

struct move_point
{
int x,y;
}man;

int num;
int step=0;
int xi=0,re=0;

void draw()
{
gotoxy(man.x,man.y);
printf("%c\b",2);
}

void clr()
{
gotoxy(man.x,man.y);
printf(" \b");
}

void drawmap()
{
int i,j;
gotoxy(0,0);
for(i=0;i<12;i++)
{for(j=0;j<19;j++)
printf("%c",map[i][j]);
printf("\n");
}
}

int BI(int x,int y)
{
if(map[y-1][x-1]=='#'||map[y-1][x-1]==15) return 1;
else return 0;
}

int XI_W(int x,int y)
{
if(map[y-1][x-1]==15&&BI(x,y-1)==0) {map[y-1][x-1]=' ';
map[y-2][x-1]=15;
xi=1;
gotoxy(x,y-1);
printf("%c",15);
return 0;
}
if(map[y-1][x-1]==' ') {xi=2;return 0;}
return 1;
}

int XI_A(int x,int y)
{
if(map[y-1][x-1]==15&&BI(x-1,y)==0) {map[y-1][x-1]=' ';
map[y-1][x-2]=15;
xi=1;
gotoxy(x-1,y);
printf("%c",15);
return 0;
}
if(map[y-1][x-1]==' ') {xi=2;return 0;}
return 1;
}

int XI_S(int x,int y)
{
if(map[y-1][x-1]==15&&BI(x,y+1)==0) {map[y-1][x-1]=' ';
map[y][x-1]=15;
xi=1;
gotoxy(x,y+1);
printf("%c",15);
return 0;
}
if(map[y-1][x-1]==' ') {xi=2;return 0;}
return 1;
}

int XI_D(int x,int y)
{
if(map[y-1][x-1]==15&&BI(x+1,y)==0) {map[y-1][x-1]=' ';
map[y-1][x]=15;
xi=1;
gotoxy(x+1,y);
printf("%c",15);
return 0;
}
if(map[y-1][x-1]==' ') {xi=2;return 0;}
return 1;
}

void draw_des()
{
num=6;
if(map[6][10]==' ') gotoxy(11,7),printf("+");else num--;
if(map[7][10]==' ') gotoxy(11,8),printf("+");else num--;
if(map[8][10]==' ') gotoxy(11,9),printf("+");else num--;
if(map[9][10]==' ') gotoxy(11,10),printf("+");else num--;
if(map[8][8]==' ') gotoxy(9,9),printf("+");else num--;
if(map[8][9]==' ') gotoxy(10,9),printf("+");else num--;
if(num==0) gotoxy(23,12),printf("You are very clever!"),getch(),exit(0);
}

void draw_step()
{
gotoxy(38,6);
printf("%d",step);
}

void draw_biaoge()
{
line(170,0,170,200);
line(0,200,340,200);
line(170,60,340,60);
line(340,0,340,200);
line(0,205,345,205);
line(345,0,345,205);
line(165,0,165,200);
line(260,60,260,160);
line(170,5,340,5);
line(170,160,340,160);
}

void FAN()
{
switch(re)
{case 1:clr();man.y++;draw();if(xi==1)
{map[man.y-3][man.x-1]=' ';
map[man.y-2][man.x-1]=15;
gotoxy(man.x,man.y-2);
printf(" ");
gotoxy(man.x,man.y-1);
printf("%c\b",15);
}
break;
case 2:clr();man.x++;draw();if(xi==1)
{map[man.y-1][man.x-3]=' ';
map[man.y-1][man.x-2]=15;
gotoxy(man.x-2,man.y);
printf(" ");
gotoxy(man.x-1,man.y);
printf("%c\b",15);
}
break;
case 3:clr();man.y--;draw();if(xi==1)
{map[man.y+1][man.x-1]=' ';
map[man.y][man.x-1]=15;
gotoxy(man.x,man.y+2);
printf(" ");
gotoxy(man.x,man.y+1);
printf("%c\b",15);
}
break;
case 4:clr();man.x--;draw();if(xi==1)
{map[man.y-1][man.x+1]=' ';
map[man.y-1][man.x]=15;
gotoxy(man.x+2,man.y);
printf(" ");
gotoxy(man.x+1,man.y);
printf("%c\b",15);
}
break;
}
re=0;
xi=0;
}

main()
{
int driver=DETECT,mode;
char ch;
man.x=12;
man.y=4;
map[3][6]=15;
map[3][7]=15;
map[3][8]=15;
map[3][9]=15;
map[3][10]=15;
map[3][12]=15;

clr();
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
setbkcolor(GREEN);
drawmap();
draw_des();
draw_step();
draw();
draw_biaoge();

gotoxy(25,5);
printf("w:UP");
gotoxy(25,6);
printf("a:LEFT");
gotoxy(25,7);
printf("s:DOWN");
gotoxy(25,8);
printf("d:RIGHT");
gotoxy(25,9);
printf("r:QUIT");
gotoxy(25,10);
printf("f:REGRET");
gotoxy(35,5);
printf("step:");
gotoxy(27,3);
printf("BAN YUN GONG");

for(;;)
{
if(kbhit())
{
ch=getch();
if(ch=='r') break;
switch(ch)
{
case 'w':if(XI_W(man.x,man.y-1)==1) break;
clr();
step++;
man.y--;
re=1;
draw_des();
draw_step();
draw();
break;
case 'a':if(XI_A(man.x-1,man.y)==1) break;
clr();
step++;
man.x--;
re=2;
draw_des();
draw_step();
draw();
break;
case 's':if(XI_S(man.x,man.y+1)==1) break;
clr();
step++;
man.y++;
re=3;
draw_des();
draw_step();
draw();
break;
case 'd':if(XI_D(man.x+1,man.y)==1) break;
clr();
step++;
man.x++;
re=4;
draw_des();
draw_step();
draw();
break;
case 'f':if(re==0) break;
else FAN();break;
default:break;
}
}
}
}
相似回答