#include <iostream>
#include <fstream>
#include <vector>
#include <windows.h> //sleep
#include <string>
#include <conio.h>
const int BusStationNo = 10; // 버스 정류장의 개수
const int BusNo = 10; // 버스의 대수
const long timerate = 1*60; // 시뮬레이터 할 때 한번 실행할 때마다 지나가는 시간
#include "class.h"
#include "function.h"
using namespace std;
void gotoxy(int x, int y);
int main()
{
BusType bus[BusNo]; //버스
int MinuteOfInterval=12*60; //버스 배차 간격 sec
long waitingPeopleInBusStation[BusStationNo] = {0,0,}; //각 정류장에서 기다리는 사람수
int IncreasePerMinute_People = 4; //버스 정류장에 사람들이 1분당 증가하는 정도
int ridingSecond = 2; //1사람이 버스에 타는데 걸리는 시간(초)
int LastMovingBusIndex=-1; //마지막 움직이기 시작한 버스의 인덱스
int LastMovingBusStartTime= -1 * MinuteOfInterval;
int i,j; //iterator
long Now=0;
while(1)
{
Now += timerate;
//버스 정류장 정보 화면에 표시하기
cout << endl << " ";
for(i=0,j=0;i<=bus->BusLanelength();++i) {
if(bus->BusStationPos(j)==i) {
gotoxy(i+j+2,1);
waitingPeopleInBusStation[j]+= timerate * (IncreasePerMinute_People/60.0);
cout << waitingPeopleInBusStation[j] ;
gotoxy(i+j+2,2);
cout << "*";
j++;
}
if(i<bus->BusLanelength()) cout << "-";
}
gotoxy(1,BusNo+3);
for(i=0;i<=bus->BusLanelength()+BusStationNo;++i ) cout<< "-";
cout << endl;
//버스 운행 시작하기, 배차간격 고려
if(bus[LastMovingBusIndex+1].ismove()==false && LastMovingBusIndex+1 <= BusNo
&& Now - LastMovingBusStartTime >= MinuteOfInterval) {
bus[LastMovingBusIndex+1].start();
LastMovingBusStartTime=Now;
LastMovingBusIndex++;
}
//버스 위치 표시하기
for(i=0;i<BusNo;++i) {
if(bus[i].isstation() != -1 ){ //버스 정류장일경우
int withdraw = zrnd(0,bus[i].getPassengers()); // 내리는 사람의 숫자
int cangetno = bus[i].getBusCapacity() - bus[i].getPassengers(); //버스에 태울수 있는 사람의 숫자
long& stationno = waitingPeopleInBusStation[bus[i].isstation()]; //버스 정류장에 있는 사람의 숫자
int ride_no =0;
//버스에서 내리기
bus[i].getPassengers(-1 * withdraw);
cangetno += withdraw;
//버스에 타기
if(stationno < cangetno){ // 태울수 있는 사람의 숫자가 더 많을 경우
ride_no=stationno;
while(timerate - ride_no * ridingSecond < 0)
ride_no--;
bus[i].getPassengers(ride_no);
waitingPeopleInBusStation[bus[i].isstation()]=stationno-ride_no;
} else { //탈수있는 사람수보다 정류장에 사람이 더 많을 경우
ride_no=cangetno;
while(timerate - ride_no * ridingSecond < 0)
ride_no--;
bus[i].getPassengers(ride_no);
stationno -= ride_no;
}
gotoxy(bus[i].getBusPos()+1,1);
cout << stationno << " ";
bus[i].movebus(timerate - ride_no * ridingSecond);
} else{ //버스 정류장이 아닐경우
bus[i].movebus();
}
gotoxy(bus[i].getBusPos()+1,i+3);
cout << i;
gotoxy(bus[i].getBusPos()+1,BusNo+4);
cout << i << endl;
}
//버스 위치 숫자 출력
for(i=0;i<BusNo;++i)
cout << i << ":" << bus[i].getBusPos() << "," << bus[i].isstation() << ", 승객수:" << bus[i].getPassengers() <<endl;
cout << Now;
//Sleep(100);
//ESC누르면 탈출
//if(getch()==27) break;
system("cls");
}
return 0;
}
void gotoxy(int x, int y)
{
COORD Pos = {x - 1, y - 1};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}