
Текст программы:
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<process.h>
COORD Vlevo (COORD pk,int dx); //Движение человека влево на dx клеток
COORD VpravoE (COORD pk,int dx); //Движение человека вправо со случайной скоростью
COORD Vverh (COORD pk,int dy); //Движение человека вверх
COORD Vniz (COORD pk,int dy); //Движение человека вниз
COORD VverhL (COORD pk,int dx); //Движение человека вверх на лифте
COORD VnizL (COORD pk,int dx); //Движение человека вниз по лестнице
DWORD WINAPI Chel(); //подпрограмма для нитей-"людей"
HANDLE hout, //хэндл вывода на экран
hCheli[10], //хэндлы нитей-"людей"
hOch[15]; //хэндлы семафоров "стоячей очереди"
int par[3]={1,1,1}, //состояния трёх мест в лифте на 1-ом этаже(1-свободен, 0-занят)
ar[3]={1,1,1}, //состояния трёх мест в лифте на др этажах(1-свободен, 0-занят)
step=100; //шаг(скорость челов)
int S; //кол-во людей
int main ()
{
int y,i;
DWORD kl;
COORD k;
randomize();
clrscr(); //очистка экрана
hout=GetStdHandle(STD_OUTPUT_HANDLE); //хэндл экрана консоли
for (i=1;i<40;i++) //Рисуем стены
{k.X=i; k.Y=9;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=13;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=17;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=21;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=25;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=29;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=33;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=37;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=41;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=0;i<40;i++) //Рисуем стены
{k.X=i; k.Y=45;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=10;i<50;i++)
{k.X=0; k.Y=i; //Рисуем стены
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=10;i<50;i++)
{k.X=40; k.Y=i; //Рисуем стены
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=18;i<50;i++)
{k.X=32; k.Y=i; //Рисуем лестницу
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=19;i<48;i=i+4) //Рисуем лестницу
{k.X=33; k.Y=i;
WriteConsoleOutputCharacter(hout,"_______",7,k,NULL);}
for (i=24;i<26;i++)
{k.X=32; k.Y=i; //проход в лестнице
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
for (i=32;i<34;i++)
{k.X=32; k.Y=i; //проход в лестнице
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
for (i=40;i<42;i++)
{k.X=32; k.Y=i; //проход в лестнице
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
for (i=48;i<50;i++)
{k.X=32; k.Y=i; //проход в лестнице
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
for (i=1;i<40;i++) //Рисуем стены
{k.X=i; k.Y=49;
WriteConsoleOutputCharacter(hout,"_",1,k,NULL);}
for (i=26;i<30;i++)
{k.X=i; k.Y=49; //проход в стене
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
for (i=10;i<14;i++)
{k.X=3; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=10;i<11;i++)
{k.X=6; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=10;i<14;i++)
{k.X=9; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=18;i<22;i++)
{k.X=3; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=18;i<22;i++)
{k.X=6; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=18;i<22;i++)
{k.X=9; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=26;i<30;i++)
{k.X=3; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=26;i<30;i++)
{k.X=6; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=26;i<30;i++)
{k.X=9; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=34;i<38;i++)
{k.X=3; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=34;i<38;i++)
{k.X=6; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=34;i<38;i++)
{k.X=9; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=42;i<46;i++)
{k.X=3; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=42;i<46;i++)
{k.X=6; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
for (i=42;i<46;i++)
{k.X=9; k.Y=i; //Рисуем лифт
WriteConsoleOutputCharacter(hout,"|",1,k,NULL);}
k.X=4; k.Y=11; //Надпись закрыто на лифте этажа 5
WriteConsoleOutputCharacter(hout,"CLOSE",5,k,NULL);
k.X=6; k.Y=12; //Рисуем лифт
WriteConsoleOutputCharacter(hout," ",1,k,NULL);
k.X=4; k.Y=19; //Надпись закрыто на лифте этажа 4
WriteConsoleOutputCharacter(hout,"CLOSE",5,k,NULL);
k.X=6; k.Y=20; //Рисуем лифт
WriteConsoleOutputCharacter(hout," ",1,k,NULL);
k.X=4; k.Y=27; //Надпись закрыто на лифте этажа 3
WriteConsoleOutputCharacter(hout,"CLOSE",5,k,NULL);
k.X=6; k.Y=28; //Рисуем лифт
WriteConsoleOutputCharacter(hout," ",1,k,NULL);
k.X=4; k.Y=35; //Надпись закрыто на лифте этажа 3
WriteConsoleOutputCharacter(hout,"CLOSE",5,k,NULL);
k.X=6; k.Y=36; //Рисуем лифт
WriteConsoleOutputCharacter(hout," ",1,k,NULL);
k.X=4; k.Y=43; //Надпись закрыто на лифте этажа 1
WriteConsoleOutputCharacter(hout,"CLOSE",5,k,NULL);
k.X=6; k.Y=44; //Рисуем лифт
WriteConsoleOutputCharacter(hout," ",1,k,NULL);
do
{
k.X=40; k.Y=1; //усанавливаем позицию для
SetConsoleCursorPosition(hout,k) ; //надписи
printf (" Vvedite chislo lydey do 10 "); //Введите число людей
scanf("%d",&S); //сканируем число
for (i=0;i<15;i++) //создание семафора очереди
hOch[i]=CreateMutex(NULL,NULL,NULL);
for(i=0;i<S;i++) //запуск нитей-"людей"
{
hCheli[i]=CreateThread(NULL,4096,Chel,NULL,NULL,&kl);
Sleep(500);
}
}
while(S>0); //для бесконечной работы проги
for(i=0;i<15;i++)
CloseHandle(hOch[i]); //закрытие хэндла очереди
return 0;
}
/*********************LUDI*********************/
DWORD WINAPI Chel()
{
COORD k,pk,p; //координаты для перемещения людей
byte qw;
int num=0,o,q,i;
int w,e,r,z,s,d,f,x,c,v,lo; //для проверки выхода из лифта
for (i=4;i<9;i++) //Открываем лифт на 1-ом
{p.X=i; p.Y=43;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=42;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=45;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
pk.X=26; pk.Y=50; //координаты появления челов
pk=Vverh(pk,4); //челы идут вверх
pk=Vlevo(pk,2);
for (i=13;i>=0;i--) //устанавливаем очередь перед лифтом
{
WaitForSingleObject(hOch[i],INFINITE); //попытка продвинуться по очереди
pk=Vlevo(pk,1);
ReleaseMutex(hOch[i+1]); //освобождение предыдущего места в очереди
}
while(!num) //чел ждет
{ //освобождения одного из 3 мест в лифте
if (par[0]==1) {num=3; par[0]--; ar[2]--;break;}
if (par[1]==1) {num=1; par[1]--; ar[0]--;break;}
if (par[2]==1) {num=2; par[2]--; ar[1]--;break;}
}
qw=2*num;
p.X=0; p.Y=0;
pk=Vlevo(pk,qw);
ReleaseMutex(hOch[0]); //освобождаем последнее место в очреди
pk=Vverh(pk,2); //заходим в лифт
Sleep(2000);
/*----------Закрываем лифт на 1-ом -----------*/
p.X=4; p.Y=42;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=43;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=44;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=45;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*------------------2 этаж-------------------*/
Sleep(2000);
if (num==3) //описываем движения для человека занявшего 1-место
{
/*----------Открываем лифт на 2-ом-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=35;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=34;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=37;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 2-oy etaj
r=random(5); //proverka na vihod
if (r==1) //если выходит
{
pk=Vniz(pk,num+1); //выходим из лифта
ar[num-1]++; //освободаем место в лифте на др.этажах
pk=VpravoE(pk,qw+18); //далее выводи человека из здания
/*----------Закрываем лифт на 2-ом -----------*/ //закрываем лифт если выходим
p.X=4; p.Y=34;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=35;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=36;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=37;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
pk=VpravoE(pk,6);
pk=VnizL(pk,4); //спуск по лестнице
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (r!=1) //если человек не выходит из лифта то едим на 3-ий
{
Sleep(3000);
/*----------Закрываем лифт на 2-ом -----------*/ //т.к. мы не вышли то лифт нужно закрыть
p.X=4; p.Y=34;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=35;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=36;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=37;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 3-eм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=27;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=26;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=29;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000); //всё тоже самое только для 3-го этажа
pk=VverhL(pk,1); //vverh na 3-iy etaj
w=random(4); //proverka na vihod
if (w==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 3-ом -----------*/
p.X=4; p.Y=26;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=27;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=28;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=29;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
pk=VpravoE(pk,6);
pk=VnizL(pk,8);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (w!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 3-ом -----------*/
p.X=4; p.Y=26;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=27;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=28;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=29;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 4-oм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=19;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=18;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=21;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 4-iy etaj
e=random(3); //proverka na vihod
if (e==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 4-ом -----------*/
p.X=4; p.Y=18;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=19;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=20;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=21;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
pk=VpravoE(pk,6);
pk=VnizL(pk,12);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (e!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 4-ом -----------*/
p.X=4; p.Y=18;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=19;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=20;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=21;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 5-oм-----------*/
for (i=4;i<9;i++) //на 5-ом проверки на выход нет, т.к. чел должен всяко выйти
{p.X=i; p.Y=11;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=10;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=13;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 5-iy etaj
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 5-ом -----------*/
p.X=4; p.Y=10;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=11;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=12;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=13;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
// Sleep(1000);
pk=VpravoE(pk,6);
pk=VnizL(pk,16);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
}
}
}
if (num==1) //всё тоже самое только для 2-ого места в лифте
{
/*----------Открываем лифт на 2-ом-----------*/
for (i=4;i<9;i++)
{k.X=i; k.Y=35;
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
k.X=6; k.Y=34;
WriteConsoleOutputCharacter(hout," ",1,k,NULL);
for (i=4;i<9;i++)
{k.X=i; k.Y=37;
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 2-oy etaj
s=random(5); //proverka na vihod
//s=1;
if (s==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 2-ом -----------*/
p.X=4; p.Y=34;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=35;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=36;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=37;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(500);
pk=Vniz(pk,2);
pk=VpravoE(pk,6);
pk=VnizL(pk,4);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (s!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 2-ом -----------*/
p.X=4; p.Y=34;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=35;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=36;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=37;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 3-eм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=27;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=26;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=29;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 3-iy etaj
d=random(4); //proverka na vihod
if (d==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 3-ом -----------*/
p.X=4; p.Y=26;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=27;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=28;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=29;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(500);
pk=Vniz(pk,2);
pk=VpravoE(pk,6);
pk=VnizL(pk,8);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (d!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 3-ом -----------*/
p.X=4; p.Y=26;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=27;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=28;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=29;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 4-oм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=19;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=18;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=21;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 4-iy etaj
f=random(3); //proverka na vihod
if (f==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 4-ом -----------*/
p.X=4; p.Y=18;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=19;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=20;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=21;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(500);
pk=Vniz(pk,2);
pk=VpravoE(pk,6);
pk=VnizL(pk,12);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (f!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 4-ом -----------*/
p.X=4; p.Y=18;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=19;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=20;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=21;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 5-oм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=11;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=10;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=13;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 5-iy etaj
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 5-ом -----------*/
p.X=4; p.Y=10;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=11;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=12;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=13;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(500);
pk=Vniz(pk,2);
pk=VpravoE(pk,6);
pk=VnizL(pk,16);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
}
}
}
if (num==2) //всё тоже самое только для 3-го места в лифте
{
/*----------Открываем лифт на 2-ом-----------*/
for (i=4;i<9;i++)
{k.X=i; k.Y=35;
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
k.X=6; k.Y=34;
WriteConsoleOutputCharacter(hout," ",1,k,NULL);
for (i=4;i<9;i++)
{k.X=i; k.Y=37;
WriteConsoleOutputCharacter(hout," ",1,k,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 2-oy etaj
z=random(5); //proverka na vihod
//z=1;
if (z==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 2-ом -----------*/
p.X=4; p.Y=34;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=35;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=36;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=37;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(1000);
pk=Vniz(pk,1);
pk=VpravoE(pk,6);
pk=VnizL(pk,4);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (z!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 2-ом -----------*/
p.X=4; p.Y=34;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=35;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=36;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=37;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 3-eм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=27;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=26;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=29;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 3-iy etaj
x=random(4); //proverka na vihod
if (x==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 3-ом -----------*/
p.X=4; p.Y=26;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=27;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=28;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=29;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(1000);
pk=Vniz(pk,1);
pk=VpravoE(pk,6);
pk=VnizL(pk,8);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (x!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 3-ом -----------*/
p.X=4; p.Y=26;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=27;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=28;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=29;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 4-oм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=19;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=18;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=21;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 4-iy etaj
c=random(3); //proverka na vihod
if (c==1)
{
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 4-ом -----------*/
p.X=4; p.Y=18;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=19;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=20;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=21;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(1000);
pk=Vniz(pk,1);
pk=VpravoE(pk,6);
pk=VnizL(pk,12);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
if (c!=1)
{
Sleep(3000);
/*----------Закрываем лифт на 4-ом -----------*/
p.X=4; p.Y=18;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=19;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=20;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=21;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
/*----------Открываем лифт на 5-oм-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=11;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=10;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=13;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
Sleep(1000);
pk=VverhL(pk,1); //vverh na 5-iy etaj
pk=Vniz(pk,num+1);
ar[num-1]++;
pk=VpravoE(pk,qw+18);
/*----------Закрываем лифт на 5-ом -----------*/
p.X=4; p.Y=10;
WriteConsoleOutputCharacter(hout," | ",5,p,NULL);
p.X=4; p.Y=11;
WriteConsoleOutputCharacter(hout,"CLOSE",5,p,NULL);
p.X=4; p.Y=12;
WriteConsoleOutputCharacter(hout," ",5,p,NULL);
p.X=4; p.Y=13;
WriteConsoleOutputCharacter(hout,"__|__",5,p,NULL);
/*-------------------------------------------*/
Sleep(1000);
pk=Vniz(pk,1);
pk=VpravoE(pk,6);
pk=VnizL(pk,16);
pk=Vlevo(pk,6);
pk=Vniz(pk,6);
}
}
}
}
if ((ar[0]==1) && (ar[1]==1) && (ar[2]==1)) //если лифт пустой, то ...
{
/*----------Открываем лифт на 1-ом-----------*/
for (i=4;i<9;i++)
{p.X=i; p.Y=43;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
p.X=6; p.Y=42;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);
for (i=4;i<9;i++)
{p.X=i; p.Y=45;
WriteConsoleOutputCharacter(hout," ",1,p,NULL);}
/*-------------------------------------------*/
par[0]=1; //освобождаем все 3 места в лифте на 1этаже
par[1]=1;
par[2]=1;
step=100; //устанавливаем изначальную скорость
}
return(0);
}
/*********************VLEVO*********************/
//Процедура рисования движущегося влево К
//pk-текущие координаты, dx-кол-во шагов
COORD Vlevo(COORD pk,int dx)
{int d=0;
while (d!=dx)
{d++;
WriteConsoleOutputCharacter(hout," ",1,pk,NULL);
pk.X--;
WriteConsoleOutputCharacter(hout,"*",1,pk,NULL);
Sleep(step);
}
return pk; //возврат новых координат студента
}
/*********************VPRAVOE*********************/
//движение со случ. скоростью
COORD VpravoE(COORD pk,int dx)
{int d=0;
while (d!=dx)
{d++;
step=random(50)+100;
WriteConsoleOutputCharacter(hout," ",1,pk,NULL);
pk.X++;
WriteConsoleOutputCharacter(hout,"*",1,pk,NULL);
Sleep(step);
}
return pk;
}
/*********************VVERH*********************/
COORD Vverh(COORD pk,int dy)
{int d=0;
while (d!=dy)
{d++;
WriteConsoleOutputCharacter(hout," ",1,pk,NULL);
pk.Y--;
WriteConsoleOutputCharacter(hout,"*",1,pk,NULL);
Sleep(step);
}
return pk;
}
/*********************VVERHL*********************/
//движение вверх по лифту
COORD VverhL(COORD pk,int dy)
{int d=0;
while (d!=dy)
{d++;
pk.Y=pk.Y-8;
WriteConsoleOutputCharacter(hout,"*",1,pk,NULL);
//Sleep(step);
}
return pk;
}
/*********************VNIZ*********************/
COORD Vniz(COORD pk,int dy)
{int d=0;
while (d!=dy)
{
d++;
WriteConsoleOutputCharacter(hout," ",1,pk,NULL);
pk.Y++;
WriteConsoleOutputCharacter(hout,"*",1,pk,NULL);
Sleep(step);
}
return pk;
}
/*********************VNIZL*********************/
//движение вниз по лестнице
COORD VnizL(COORD pk,int dy)
{int d=0;
while (d!=dy)
{
d++;
WriteConsoleOutputCharacter(hout," ",1,pk,NULL);
pk.Y=pk.Y+2;
WriteConsoleOutputCharacter(hout,"*",1,pk,NULL);
Sleep(step);
}
return pk;
}
Литература
-
Флоренсов А.Н. Операционные системы для программиста: Учеб. пособие. Омск: Изд-во ОмГТУ, 2005. 240 с.