U E D R , A S I H C RSS

Bus Simulation/태훈zyint

comment

시간이 무한히 지나면 10대의 버스가 몰려가는 현상이 발견된다-_-
원래 이런건지 아니면 버그인지는 모르겠따;

STL을 이용하고 함수별로 나누는 리팩토링이 필요하다 -ㅅ-

태훈아 너무 빨리 짜는거 아냐 ㅋㅋ 담에는 어떤 숙제를 내야 할지 ㅎㅎ - 상협
- ㅇㅅㅇ;;;; 아잉;;

main.cpp

#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);  
} 


class.h

class BusType
{
public:
	


	int BusLanelength() { return busStation[BusStationNo-1]; } // 버스 노선의 총 길이를 알아 냄 
	int BusStationPos(int i) { return busStation[i]; }         // 버스 정류장의 위치 반환
	int getBusPos() { return buspos; } // 버스의 현재 위치 
	int pastTime(int sec) { return CurrentMinute += sec; }
	void start() { movingbus=true;} // 버스를 움직이게 한다. 첫 출발할때!
	double movebus(double sec = timerate) {  // 버스를 sec초 동안 버스를 움직이고, 현재위치 반환
		if (!ismove()) return -1; //운행중이지 않을 &#46468;에는 움직이지 않는다.

		buspos += (sec/3600.0)*KilloPerHour_Bus; //위치를 이동시키고
		
		//버스가 모든 노선을 다돌았을 경우 처음으로 이동시킨다.
		while(buspos > BusLanelength() + BusStationNo+1) buspos -= BusLanelength() + BusStationNo +1;
		pastTime(sec); //시간 지연시키기
		return buspos;
	} 
	int isstation(){  //현재 버스가 있는 위치가 버스 정류장이면 TRUE
		int i=0;
		while(getBusPos() != busStation[i]+i+1 && i<= BusStationNo-1){
			i++;
		}
		if(BusStationNo-1 < i) return -1; //버스정류장이 아닐경우 
		return i;
	}

	bool ismove() { return movingbus; }      // 현재 운행중인가?

	BusType()
	{
		KilloPerHour_Bus   = 50.0;    //버스의 속도 Km/h 
		MeterPerMinute_Bus = KilloPerHour_Bus * ( 1000.0 / 60.0 );  //버스의 속도 m/m 
		BusCapacity = 50;             //버스 한대에 탈 수 있는 최대 사람수 

        busStation[0]=4;  //시작 지점부터 각 버스 정류장 까지의 길이, 단위는 Km 
        busStation[1]=8; 
        busStation[2]=16; 
        busStation[3]=20; 
        busStation[4]=24; 
        busStation[5]=28; 
        busStation[6]=36; 
        busStation[7]=40; 
        busStation[8]=44; 
        busStation[9]=52; 

		CurrentMinute = 0;    //현재 흐르 시간 sec
		buspos = 0;
		movingbus=false; // 현재 운행중인가?
		passengers=0;
	}
	
	int getBusCapacity() { return BusCapacity;}
	int getPassengers(int n=0) { return passengers+=n; }

private:
	double MeterPerMinute_Bus;    //버스의 속도 m/m 
    double KilloPerHour_Bus;      //버스의 속도 Km/h 


    int BusCapacity;              //버스 한대에 탈 수 있는 최대 사람수  
    int busStation[BusStationNo]; //10개의 버스 정류장, 버스 정류장의 위치를 나타낸다  
    long CurrentMinute;           //현재 흐르 시간   sec
    long DueMinute;               //몇초 후의 상황을 볼것인지 입력 받는 값 
    //Bus buses[BusNo];           //10 대의 버스들이 운행된다.  
	int passengers;               //현재 버스에 타고있는 승객의 숫자

	double buspos; // 버스의 현재 위치
	bool movingbus; // 현재 운행중인가?
};

function.h

#include <stdlib.h>
#include <time.h>

int zrnd(int start,int end)
{
	int r;
	srand(time(NULL));
	
	r = rand()%(end-start+1) + start;
	return r;
}

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:39
Processing time 0.0147 sec