📄 dianti.txt
字号:
仿真电梯系统
#include"stdio.h"
#include"bios.h"
#include"ctype.h"
#include"dos.h"
#include"time.h"
#include"graphics.h"
#include"stdlib.h"
#include"conio.h"
#include"malloc.h"
#include"string.h"
#define ENTER 0x1c0d
#define DOWN 0x5000
#define UP 0x4800
int keyx=120,keyy=180;
time_t first; /**/
int key;
int POSETION; /*电梯位置*/
int PAUSE; /*是否停止(1:停;2:不停)*/
int DIRECTION; /*运行方向(1:向下;2:向上;0:无方向)*/
int AIMFLOOR; /*目标楼层*/
int EXIT=0; /*是否退出(0:不退出;1:退出)*/
int size;
int K1;
int K2;
void *buf;
struct req {int callin[10];
int callup[10];
int calldown[10];
}request;
int arw[18][16]=
{{10,180,10,170,5,170,15,165,25,170,20,170,20,180,10,180}
,{10,190,10,200,5,200,15,205,25,200,20,200,20,190,10,190}
,{140,10,140,15,135,15,145,20,155,15,150,15,150,10,140,10}
,{140,45,140,40,135,40,145,35,155,40,150,40,150,45,140,45}
,{140,55,140,60,135,60,145,65,155,60,150,60,150,55,140,55}
,{140,80,140,75,135,75,145,70,155,75,150,75,150,80,140,80}
,{140,90,140,95,135,95,145,100,155,95,150,95,150,90,140,90}
,{140,115,140,110,135,110,145,105,155,110,150,110,150,115,140,115}
,{140,125,140,130,135,130,145,135,155,130,150,130,150,125,140,125}
,{140,150,140,145,135,145,145,140,155,145,150,145,150,150,140,150}
,{140,160,140,165,135,165,145,170,155,165,150,165,150,160,140,160}
,{140,185,140,180,135,180,145,175,155,180,150,180,150,185,140,185}
,{140,195,140,200,135,200,145,205,155,200,150,200,150,195,140,195}
,{140,220,140,215,135,215,145,210,155,215,150,215,150,220,140,220}
,{140,230,140,235,135,235,145,240,155,235,150,235,150,230,140,230}
,{140,255,140,250,135,250,145,245,155,250,150,250,150,255,140,255}
,{140,265,140,270,135,270,145,275,155,270,150,270,150,265,140,265}
,{140,300,140,295,135,295,145,290,155,295,150,295,150,300,140,300}
};
int arr_upcoordinate[9][2]={{0,0},{145,295},{145,250},{145,215},{145,180},{145,145},{145,110},{145,75},{145,40}};
int arr_downcoordinate[10][2]={{0,0},{0,0},{145,270},{145,235},{145,200},{145,165},{145,130},{145,95},{145,60},{145,15}};
int arr_instructioncoordinate[2][2]={{15,170},{15,200}};
Initialize();
Lift_status();
Lift_status_xl();
Input();
Input_xl();
Tactics();
Tactics_xl();
void drawarrow();
void drawfloor();
void drawinlift();
void drawlift();
void directionlight_control();
void instructionlight_control();
void movelift();
void buttonon_control();
void buttonoff_control();
void Output();
void drawball(int,int,int);
void menu();
void drawball(int x,int y,int color)
{
setcolor(color);
circle(x,y,10);
setfillstyle(SOLID_FILL,color);
floodfill(x,y,color);
}
Initialize() /*初始化*/
{
int i;
int gdriver=DETECT,gmode,errorcode;
POSETION=10; /*电梯位置为一层*/
PAUSE=0; /*不停止*/
DIRECTION=2; /*方向向上*/
AIMFLOOR=10;
K1=1;
K2=1;
for(i=0;i<10;i++) /*无呼叫*/
{
request.callin[i]=0;
request.callup[i]=0;
request.calldown[i]=0;
}
initgraph(&gdriver,&gmode,"");
errorcode=graphresult();
if(errorcode!=grOk)
{
printf("Graphics error: %s\n",grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
cleardevice();
setbkcolor(BLACK);
drawlift();
size=imagesize(60, 280, 120, 310);
buf=malloc(size);
getimage(60,280,120,310,buf);
putimage(60,280,buf,COPY_PUT);
drawinlift();
drawarrow();
drawfloor();
drawlift();
directionlight_control();
instructionlight_control();
}
Input() /*输入(顺便服务)*/
{
int m,n,o,a;
char b;
if(PAUSE==0)sleep(1); /*未到达目标楼层,停一秒*/
if(PAUSE==1)sleep(5); /*到达目标楼层,停五秒*/
while(1)
{
a=bioskey(1); /*等待输入*/
if(a==0)goto p; /*若无输入,跳出循环*/
if(a!=0) /*若有输入,继续*/
{
b=getch(); /*将刚输入的字符保存*/
if(b==27){EXIT=1;break;} /*判断是否退出*/
if(b>='1'&&b<='9') /*判断是否为电梯内呼叫*/
{
n=b-48;
request.callin[n]=1; /*记录对应楼层呼叫*/
}
if(POSETION%10!=0&&(n==POSETION/10||n==(POSETION/10+1)))
request.callin[n]=2; /*安全策略,若电梯与呼叫位置相隔不到一层,暂时不响应*/
switch(b) /*判断是否为电梯外向上呼叫*/
{
case 'q':m=1;request.callup[m]=1;break;
case 'w':m=2;request.callup[m]=1;break;
case 'e':m=3;request.callup[m]=1;break;
case 'r':m=4;request.callup[m]=1;break;
case 't':m=5;request.callup[m]=1;break;
case 'y':m=6;request.callup[m]=1;break;
case 'u':m=7;request.callup[m]=1;break;
case 'i':m=8;request.callup[m]=1;break;
}
if(POSETION%10!=0&&(m==POSETION/10||m==(POSETION/10+1)))
request.callup[m]=2;
switch(b) /*判断是否为电梯外向下呼叫*/
{
case 'a':o=2;request.calldown[o]=1;break;
case 's':o=3;request.calldown[o]=1;break;
case 'd':o=4;request.calldown[o]=1;break;
case 'f':o=5;request.calldown[o]=1;break;
case 'g':o=6;request.calldown[o]=1;break;
case 'h':o=7;request.calldown[o]=1;break;
case 'j':o=8;request.calldown[o]=1;break;
case 'k':o=9;request.calldown[o]=1;break;
}
if(POSETION%10!=0&&(o==POSETION/10||o==(POSETION/10+1)))
request.calldown[o]=2;
}
}
p:;
}
Input_xl() /*输入(先来先服务)*/
{
int m,n,o,a;
char b;
if(PAUSE==0)sleep(1);
if(PAUSE==1)sleep(5);
while(1)
{
a=bioskey(1);
if(a==0)goto p;
if(a!=0)
{
b=getch();
if(b==27){EXIT=1;break;}
if(b>='1'&&b<='9')
{
n=b-48;
request.callin[n]=K1++;
}
switch(b)
{
case 'q':m=1;request.callup[m]=K1++;break;
case 'w':m=2;request.callup[m]=K1++;break;
case 'e':m=3;request.callup[m]=K1++;break;
case 'r':m=4;request.callup[m]=K1++;break;
case 't':m=5;request.callup[m]=K1++;break;
case 'y':m=6;request.callup[m]=K1++;break;
case 'u':m=7;request.callup[m]=K1++;break;
case 'i':m=8;request.callup[m]=K1++;break;
}
switch(b)
{
case 'a':o=2;request.calldown[o]=K1++;break;
case 's':o=3;request.calldown[o]=K1++;break;
case 'd':o=4;request.calldown[o]=K1++;break;
case 'f':o=5;request.calldown[o]=K1++;break;
case 'g':o=6;request.calldown[o]=K1++;break;
case 'h':o=7;request.calldown[o]=K1++;break;
case 'j':o=8;request.calldown[o]=K1++;break;
case 'k':o=9;request.calldown[o]=K1++;break;
}
}
}
p:;
}
Lift_status() /*电梯状态(顺便服务)*/
{
int i;
Tactics(); /*执行策略*/
if(AIMFLOOR==10)goto p; /*若无请求,跳出*/
if((AIMFLOOR==POSETION/10)&&(POSETION%10==0))goto change; /*若当前为目标楼层,跳过改变位置*/
if(DIRECTION==2) POSETION+=2; /*改变电梯位置*/
if(DIRECTION==1) POSETION-=2;
change: if((AIMFLOOR==POSETION/10)&&(POSETION%10==0)) /*判断是否到达目标楼层*/
{
request.callin[AIMFLOOR]=0; /*删除已完成的请求*/
if(DIRECTION==2)
{
request.callup[AIMFLOOR]=0;
if(request.calldown[AIMFLOOR]==1) /*判断当前楼层是否有向下请求*/
{
Tactics();
request.calldown[POSETION/10]=0;
if((AIMFLOOR>POSETION/10)&&(AIMFLOOR<10))request.calldown[POSETION/10]=1; /*判断但前楼层之上是否还有请求*/
}
}
if(DIRECTION==1)
{
request.calldown[AIMFLOOR]=0;
if(request.callup[AIMFLOOR]==1)
{
Tactics();
request.callup[POSETION/10]=0;
if((AIMFLOOR<POSETION/10)&&(AIMFLOOR>0))request.callup[POSETION/10]=1;
}
}
PAUSE=1; /*暂停*/
save();
for(i=1;i<10;i++) /*到达目标楼层后,响应因安全策略暂时未被响应的呼叫*/
{
if(request.callin[i]==2)request.callin[i]=1;
if(request.callup[i]==2)request.callup[i]=1;
if(request.calldown[i]==2)request.calldown[i]=1;
}
}
else PAUSE=0;
p:;
}
Lift_status_xl() /*电梯状态(先来现服务)*/
{
int i;
Tactics_xl(); /*执行策略*/
if(AIMFLOOR==10)goto p; /*若无请求,跳出*/
if(DIRECTION==0)goto o; /*若无方向,跳过改变位置*/
if(DIRECTION==2) POSETION+=2; /*改变电梯位置*/
if(DIRECTION==1) POSETION-=2;
o: if((AIMFLOOR==POSETION/10)&&(POSETION%10==0))
{ PAUSE=1; /*若到达目标楼层,暂停*/ save();}
else PAUSE=0;
p:;
}
void drawarrow()
{
int i;
setcolor(RED);
for(i=0;i<18;i++)
drawpoly(8,arw[i]);
}
void drawfloor()
{
int i;
setcolor(RED);
line(55,0,55,320);
line(125,0,125,320);
line(55,320,125,320);
for(i=0;i<9;i++)
rectangle(60,35*i,120,30+35*i);
}
void drawinlift()
{
int m;
setcolor(WHITE);
rectangle(200,20,250,320);
setfillstyle(SOLID_FILL,GREEN);
bar(210,40,220,70);bar(230,40,240,70);
setcolor(RED);
rectangle(210,90,220,110);
rectangle(230,90,240,110);
rectangle(210,130,220,150);
rectangle(230,130,240,150);
rectangle(210,170,220,190);
rectangle(230,170,240,190);
rectangle(210,210,220,230);
rectangle(230,210,240,230);
rectangle(210,250,220,270);
setcolor(GREEN);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
outtextxy(212,100,"1");
outtextxy(232,100,"2");
outtextxy(212,140,"3");
outtextxy(232,140,"4");
outtextxy(212,180,"5");
outtextxy(232,180,"6");
outtextxy(212,220,"7");
outtextxy(232,220,"8");
outtextxy(212,260,"9");
outtextxy(282,80,"CALLIN: ");
outtextxy(282,100,"1-1 2-2 3-3 4-4 5-5 6-6 7-7 8-8 9-9");
outtextxy(282,140,"CALLUP:");
outtextxy(282,160,"q-1 w-2 e-3 r-4 t-5 y-6 u-7 i-8");
outtextxy(282,200,"CALLDOWN:");
outtextxy(282,220,"a-2 s-3 d-4 f-5 g-6 h-7 j-8 k-9");
outtextxy(282,260,"ESC---back to menu");
setcolor(YELLOW);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
switch(AIMFLOOR)
{
case 1:outtextxy(212,50,"1");break;
case 2:outtextxy(212,50,"2");break;
case 3:outtextxy(212,50,"3");break;
case 4:outtextxy(212,50,"4");break;
case 5:outtextxy(212,50,"5");break;
case 6:outtextxy(212,50,"6");break;
case 7:outtextxy(212,50,"7");break;
case 8:outtextxy(212,50,"8");break;
case 9:outtextxy(212,50,"9");break;
case 10:setfillstyle(SOLID_FILL,GREEN);floodfill(212,50,GREEN);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -