📄 c语言编写的推箱子程序.txt
字号:
#include "stdio.h"
#include "graphics.h"
#include "alloc.h"
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_HOME 0x4700
#define VK_END 0x4f00
#define VK_SPACE 0x3920
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d
#define spread 20
#define VK_R 0x1372
/*定义主数据结构*/
struct Map
{
int path[19][19];/*包含每张地图的路径,(0空白(2墙(3箱子(4目的地(5工人(6已完成的箱子
X轴在前Y在后*/
int NUM;/*关卡编号*/
int Condition; /*胜利条件*/
struct Map *next;/*指向下一个节点*/
};
/*函数说明*/
/*画图函数各有三个参数(宽度(X(Y*/
void LineWall(int x,int y); /*画墙壁*/
void LineBox(int x,int y); /*画木箱*/
void LineWorker(int x,int y); /*画工人*/
void LineEnd(int x,int y); /*画木箱的目的地*/
void LineHatchway(int x,int y); /*画地板*/
void LineEndBox(int x,int y);/*画推好的箱子*/
/*逻辑判断函数*/
int MayMove(int key,struct Map *head);/*判断是否可以移动,参数是用户按下的键值
返回值(1代表可以,0代表不可以)*/
int Victoryed(struct Map *P);/*判断是否获胜返回值(0代表没有,1代表获胜)*/
void FormatPath(int key,struct Map *point);/*更改当前布局的值,2个参数分别是用户按下的键值和当前关卡的指针*/
void Format(struct Map *point);/*画当前布局一个参数,当前关卡的指针*/
/*初始化函数*/
void CreateRole();/*创建任务*/
/*全局变量*/
int IsVictory=0;/*判断是否胜利*/
int WorkerX;/*当前工人位置横向的值*/
int WorkerY;/*当前工人位置竖向的值*/
struct Map *head,*Dp;
void format1(s,x,y)
{
setfillstyle(SOLID_FILL,YELLOW);
bar(x,y,x+(s-1),y+s-1);
}
void main()
{
int InputKey=0;/*获取用户的按键*/
int IsMove;/*判断是否可以移动*/
int IsVoc;/*判断是否获胜*/
int gdriver=DETECT,gmode;
/*初始化任务*/
ReStart:
CreateRole();
initgraph(&gdriver,&gmode,"C:\Win-TC");/*进入图形模式*/
Format(Dp);
while(InputKey!=VK_ESC)
{
outtextxy(20,20,"Enter \"R\" to restart!");
InputKey=bioskey(0);
if(InputKey==VK_R)/*重新开始*/
goto ReStart;
/*判断是否可以移动*/
IsMove=MayMove(InputKey,Dp);
if(IsMove)/*可以移动*/
{
FormatPath(InputKey,Dp);/*更改当前地图发生变动的值*/
cleardevice();
Format(Dp);
IsVoc=Victoryed(Dp);/*判断是否获胜*/
if(IsVoc)/*获胜*/
{
outtextxy(290,170,"Victory!");
}
else
{
IsVictory=0;
continue;
}
}
else
continue;
}
closegraph();
}
void CreateRole()
{
int x,y;
Dp=(struct Map *)malloc(sizeof(struct Map));
head=Dp;
for(x=0;x<19;x++)
for(y=0;y<19;y++)
{
if((x>=3&&x<=14)&&(y==6))
Dp->path[x][y]=2;
else if(x==3&&(y>=7&&y<=11))
Dp->path[x][y]=2;
else if((x>=4&&x<=14)&&y==11)
Dp->path[x][y]=2;
else if(x==14&&(y>=7&&y<=10))
Dp->path[x][y]=2;
else if((x>=7&&x<=10)&&(y>=7&&y<=8))
Dp->path[x][y]=2;
else if((x>=6&&x<=10)&&y==9)
Dp->path[x][y]=4;
else
Dp->path[x][y]=0;
}
Dp->path[4][7]=2;
Dp->path[5][8]=3;
Dp->path[6][9]=3;
Dp->path[4][10]=2;
Dp->path[9][10]=2;
Dp->path[13][10]=2;
Dp->path[11][8]=3;
Dp->path[12][9]=3;
Dp->path[11][10]=5;
Dp->NUM=1;
Dp->Condition=4;
WorkerX=11;
WorkerY=10;
}
void Format(struct Map *Point)
{
int x,y;
int LineX,LineY;
int style;
LineX=139;
LineY=59;
for(y=0;y<19;y++)
{
for(x=0;x<19;x++)
{
&
nbsp; style=Point->path[x][y];
if(style==6)
IsVictory+=1;
switch(style)
{
case 2:LineWall(LineX,LineY);break;
case 3:LineBox(LineX,LineY);break;
case 4:LineEnd(LineX,LineY);break;
case 5:LineWorker(LineX,LineY);break;
case 6:LineEndBox(LineX,LineY);break;
}
LineX+=20;
}
LineY+=20;
LineX=139;
}
}
void FormatPath(int Key,struct Map *Point)
{
int style,style1,style2;
style=Point->path[WorkerX][WorkerY];
switch(Key)
{
case VK_UP:
{
style1=Point->path[WorkerX][WorkerY-1];
style2=Point->path[WorkerX][WorkerY-2];
if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
Point->path[WorkerX][WorkerY-2]=3;
else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
Point->path[WorkerX][WorkerY-2]=6;
else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
Point->path[WorkerX][WorkerY-2]=6;
else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
Point->path[WorkerX][WorkerY-2]=3;
Point->path[WorkerX][WorkerY-1]=5;
Point->path[WorkerX][WorkerY]=0;
WorkerY--;
break;
}
case VK_DOWN:
{
style1=Point->path[WorkerX][WorkerY+1];
style2=Point->path[WorkerX][WorkerY+2];
if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
Point->path[WorkerX][WorkerY+2]=3;
else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
Point->path[WorkerX][WorkerY+2]=6;
else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
Point->path[WorkerX][WorkerY+2]=6;
else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
Point->path[WorkerX][WorkerY+2]=3;
Point->path[WorkerX][WorkerY+1]=5;
Point->path[WorkerX][WorkerY]=0;
WorkerY++;
break;
}
case VK_LEFT:
{
style1=Point->path[WorkerX-1][WorkerY];
style2=Point->path[WorkerX-2][WorkerY];
if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
Point->path[WorkerX-2][WorkerY]=3;
else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
Point->path[WorkerX-2][WorkerY]=6;
else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
Point->path[WorkerX-2][WorkerY]=6;
else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
Point->path[WorkerX-2][WorkerY]=3;
Point->path[WorkerX-1][WorkerY]=5;
Point->path[WorkerX][WorkerY]=0;
WorkerX--;
break;
}
case VK_RIGHT:
{
style1=Point->path[WorkerX+1][WorkerY];
style2=Point->path[WorkerX+2][WorkerY];
&
nbsp; if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
Point->path[WorkerX+2][WorkerY]=3;
else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
Point->path[WorkerX+2][WorkerY]=6;
else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
Point->path[WorkerX+2][WorkerY]=6;
else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
Point->path[WorkerX+2][WorkerY]=3;
Point->path[WorkerX+1][WorkerY]=5;
Point->path[WorkerX][WorkerY]=0;
WorkerX++;
break;
}
}
style1=9;
for(style=7;style<11;style++)
{
if(Point->path[style][style1]!=5&&Point->path[style][style1]!=6)
Point->path[style][style1]=4;
}
}
int Victoryed(struct Map *P)
{
if(IsVictory==P->Condition)
return(1);
return(0);
}
int MayMove(int key,struct Map *head)
{
int style,style1,style2;
switch(key)
{
case VK_UP:
{
style=head->path[WorkerX][WorkerY];
style1=head->path[WorkerX][WorkerY-1];
style2=head->path[WorkerX][WorkerY-2];
break;
}
case VK_DOWN:
{
style=head->path[WorkerX][WorkerY];
style1=head->path[WorkerX][WorkerY+1];
style2=head->path[WorkerX][WorkerY+2];
break;
}
case VK_LEFT:
{
style=head->path[WorkerX][WorkerY];
style1=head->path[WorkerX-1][WorkerY];
style2=head->path[WorkerX-2][WorkerY];
break;
}
case VK_RIGHT:
{
style=head->path[WorkerX][WorkerY];
style1=head->path[WorkerX+1][WorkerY];
style2=head->path[WorkerX+2][WorkerY];
break;
}
default:return(0);break;
}
if(style1==0 || style1==4)/*旁边没有箱子*/
return(1);
else if((style1==3)&&(style2==0 || style2==4))/*旁边有一只箱子且箱子后面是空地或目的地*/
return(1);
else if((style1==6)&&(style2==0 || style2==4))/*旁边是一只已推好的箱子且后面是空白或目的地*/
return(1);
else
return(0);
}
void LineWall(int x,int y)
{
setfillstyle(SOLID_FILL,RED);
bar(x,y,x+spread-1,y+spread-1);
}
void LineBox(int x,int y)
{
setfillstyle(INTERLEAVE_FILL,YELLOW);
bar(x,y,x+spread-1,y+spread-1);
}
void LineWorker(int x,int y)
{
setfillstyle(LTSLASH_FILL,BLUE);
fillellipse(x+10,y+10,spread/4,spread/2);
}
void LineEnd(int x,int y)
{
circle(x+10,y+10,(spread-1)/2);
}
void LineHatchway(int x,int y)/*本来是用来画地板的后来*/
{
}
void LineEndBox(int x,int y)
{
setfillstyle(INTERLEAVE_FILL,YELLOW);
bar(x,y,x+spread-1,y+spread-1);
circle(x+10,y+10,(spread-1)/2);
}
文章出处:http://www.diybl.com/course/3_program/c/cyxibch/2007213/21234_3.html
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -