Programa

 

#include <graphics.h>
#include <math.h>
//#include <stdlib.h>
//#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
//#include <ctype.h>


int port=0x379;

int pos=1;

void pantalla();

void out(int port, int n)
{
asm MOV DX, port
asm MOV AX, n
asm OUT DX, AX
delay(100);
}


int in(int port)
{
asm MOV DX, port
asm IN AL, DX
return(_AL);
}


int recibir()
{
int dato;
dato=in(port);
return (dato);
}

void edificio()
{
setcolor(WHITE);
outtextxy(420,50, " EDIFICIO ");
outtextxy(420,180, " Piso tres ");
outtextxy(420,310, " Piso dos ");
outtextxy(420,440, " Piso uno ");
rectangle(420,60,570,450);
rectangle(420,190,570,450);
rectangle(420,320,570,450);

}

void mensaje(int pos)
{
outtextxy(350, 460, " Precione ENTER para continuar... ");
getch();
setfillstyle(1,BLACK);
bar(1,1,630,470);
setcolor(WHITE);
rectangle(410,10,580,470);
rectangle(410,30,580,470);
edificio();
if(pos==1)
{
setfillstyle(1,RED);
bar(420,320,570,450);
}
if(pos==2)
{
setfillstyle(1,RED);
bar(420,190,570,320);
}
if(pos==3)
{
setfillstyle(1,RED);
bar(420,60,570,190);
}
edificio();
}


void cer_puerta(int yi,int yf)
{
int x=425;
int y=565;
setcolor(8);
do
{
setcolor(YELLOW);
outtextxy(53,373, " Cerrando puerta ");
setfillstyle(1,RED);
bar(420,yi,x,yf);
setfillstyle(1,RED);
bar(y,yi,570,yf);
delay(100);
x=x+5;
y=y-5;
}
while(x!=500 || y!=490);
setfillstyle(1,YELLOW);
bar(495,yi,495,yf);
setcolor(8);
}


void abre_puerta(int yi,int yf)
{
int x=495;
int y=495;
do
{
setcolor(YELLOW);
outtextxy(53,373, " Abriendo puerta ");
setfillstyle(1,7);
bar(x,yi,495,yf);
setfillstyle(1,7);
bar(495,yi,y,yf);
delay(100);
x=x-5;
y=y+5;
}
while(x!=420 || y!=570);
setcolor(8);
}

suba(int yi,int yf,int giro)
{
int n=2;
int cont=3;
int port=0x378;
do
{
setcolor(YELLOW);
outtextxy(300,yf, " Subiendo ");
outtextxy(420,180, " Piso tres ");
outtextxy(420,310, " Piso dos ");
outtextxy(420,440, " Piso uno ");
rectangle(420,60,570,450);
rectangle(420,190,570,450);
rectangle(420,320,570,450);
if(giro!=0)
{
while(cont!=-1)
{
n=pow(n,cont);
out(port,n);
n=2;
cont--;
}
giro--;
cont=3;
}
setfillstyle(1,RED);
bar(420,yi-5,570,yi-135);
if(yf>yi+130)
{
goto fuera;
}
else
{
delay(100);
setfillstyle(1,BLACK);
bar(420,yi,570,yi-5);
}
fuera:
delay(100);
yi=yi-5;
}
while(yi-130!=yf);
setfillstyle(1,BLACK);
bar(300,yf,400,yf+10);
setcolor(8);
edificio();
delay(500);
abre_puerta(yi,yf);
setfillstyle(1,BLACK);
bar(53,373,230,380);
delay(800);
cer_puerta(yi,yf);
edificio();
setfillstyle(1,BLACK);
bar(53,373,230,380);
setcolor(YELLOW);
outtextxy(53,373, " Puerta cerrada ");
giro=0;
}
baja(int yi,int yf,int giro)
{
int n=2;
int cont=0;
int port=0x378;
do
{
outtextxy(300,yf, " Bajando ");
outtextxy(420,50, " EDIFICIO ");
outtextxy(420,180, " Piso tres ");
outtextxy(420,310, " Piso dos ");
outtextxy(420,440, " Piso uno ");
rectangle(420,60,570,450);
rectangle(420,190,570,450);
rectangle(420,320,570,450);
if(giro!=0)
{
while(cont!=4)
{
n=pow(n,cont);
out(port,n);
cont++;
n=2;
}
giro--;
cont=0;
}
setfillstyle(1,RED);
bar(420,yi+5,570,yi+135);
if(yi>yf-130)
{
goto fuera;
}
else
{
delay(100);
setfillstyle(1,BLACK);
bar(420,yi,570,yi+5);
}
fuera:
delay(100);
yi=yi+5;
}
while(yf-130!=yi);
setfillstyle(1,BLACK);
bar(300,yf,400,yf+10);
setcolor(8);
edificio();
delay(500);
abre_puerta(yi,yf);
setfillstyle(1,BLACK);
bar(53,373,230,380);
delay(800);
cer_puerta(yi,yf);
edificio();
setfillstyle(1,BLACK);
bar(53,373,230,380);
setcolor(YELLOW);
outtextxy(53,373, " Puerta cerrada ");
giro=0;
}

void cambio(int piso,int giro)
{ int yi,yf;
if(piso==1)
{
if(pos==2)
{
yi=190;
yf=450;
giro=48;
baja(yi,yf,giro);
}
if(pos==3)
{
yi=60;
yf=450;
giro=96;
baja(yi,yf,giro);
}
}
if(piso==2)
{
if(pos==3)
{
yi=60;
yf=320;
giro=48;
baja(yi,yf,giro);
}
if(pos==1)
{
yi=450;
yf=190;
giro=48;
suba(yi,yf,giro);
}
}
if(piso==3)
{
if(pos==2)
{
yi=320;
yf=60;
giro=48;
suba(yi,yf,giro);
}
if(pos==1)
{
yi=450;
yf=60;
giro=96;
suba(yi,yf,giro);
}
}
}

void pis(int piso,int giro)
{
if(piso==1 && pos==2)
{
cambio(piso,giro);
pos=1;
}
if(piso==1 && pos==3)
{
cambio(piso,giro);
pos=1;
}
if(piso==2 && pos==1)
{
cambio(piso,giro);
pos=2;
}
if(piso==2 && pos==3)
{
cambio(piso,giro);
pos=2;
}
if(piso==3 && pos==1)
{
cambio(piso,giro);
pos=3;
}
if(piso==3 && pos==2)
{
cambio(piso,giro);
pos=3;
}
}

void menu()
{
int piso,giro;
int port=0x379;
while(pos != 0)
{
nuevo:
gotoxy(5,5);
printf("LLamada del ascensor");
gotoxy(5,6);
printf("(presione enter)... ");
setfillstyle(1,BLACK);
bar(191,3,270,100);
setfillstyle(1,BLACK);
bar(53,373,230,380);
getch();

giro=recibir();
delay(200);
if(giro==8)
{
piso=1;
pis(piso,giro);
}
if(giro==16)
{
piso=2;
pis(piso,giro);
}
if(giro==32)
{
piso=3;
pis(piso,giro);
}

if(giro==24)
{
if(pos==1)
{
abre_puerta(450,320);
cer_puerta(450,320);
pis(2,8);
}
if(pos==2)
{
abre_puerta(320,190);
cer_puerta(320,190);
pis(1,8);
}
if(pos==3)
{
pis(2,8);
pis(1,8);
}
}
if(giro==40)
{
if(pos==1)
{
abre_puerta(450,320);
cer_puerta(450,320);
pis(3,16);
goto fin;
}
if(pos==2)
{
pis(1,8);
pis(3,32);
goto fin;
}
if(pos==3)
{
abre_puerta(190,60);
cer_puerta(190,60);
pis(1,32);
}
fin:
}
gotoxy(5,5);
printf("Ingrese piso al que desea ir");
gotoxy(5,6);
printf("(para salir ingrese cero): ");
setfillstyle(1,BLACK);
bar(53,373,230,380);
fflush(stdin);//libera el buffer de input de teclado
scanf("%d",&piso);
if(piso<0 || piso >3)
{
clearviewport();
setcolor(YELLOW);
outtextxy(200,225,"Debe ingresar un numero de piso valido");
outtextxy(200,235,"(˘ 0 para salir del programa)");
mensaje(pos);
}
if(piso==pos)
{
clearviewport();
setcolor(YELLOW);
outtextxy(236,225, "NO PUEDE ELEGIR ESTE PISO ... ");
mensaje(pos);
goto nuevo;
}
switch(piso)
{
case 1:pis(piso,giro);
//piso=pos;
break;
case 2:pis(piso,giro);
//piso=pos;
break;
case 3:pis(piso,giro);
//piso=pos;
break;
case 0:exit(0);
break;
}
}
}

void pantalla()
{
rectangle(410,10,580,470);
rectangle(410,30,580,470);
edificio();
setfillstyle(1,RED);
bar(420,320,570,450);
edificio();
menu();
}

void main()
{
/* Inicializacion de las funciones gr ficas*/
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "c:/tc/bgi/");
clearviewport();
setbkcolor(BLACK); /*establecer fondo de color azul*/
pantalla();
closegraph(); /*cierre de las funciones gr ficas*/
}