package com.huangwei;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.util.*;
/*仿真类,模拟车库的情况*/
public class Emulator {
ArrayList<Car> car_wait_list; //车库外等待进入车库的汽车队列
int place_num; //单排的停车位
int employe_num; //公司员工数;
Car_Park park; //停车场
ArrayList<Car> illegal_car; //车库外的非法车队列
ArrayList<Car> temp_road;
ArrayList<Car> temp_array;
Car temp_entrance=null;
/*构造函数*/
public Emulator(int n,int e){
park=new Car_Park(n,e);
place_num=n;
employe_num=e;
car_wait_list=new ArrayList<Car>(5);
temp_road=new ArrayList<Car>();
temp_array=new ArrayList<Car>();
illegal_car=new ArrayList<Car>();
}
/*随机参数新汽车*/
public void create_car(){
Random random =new Random();
int i=random.nextInt(6);
if(i!=3)
return ;
Random random1 = new Random();
int id=random1.nextInt(employe_num+20); //随机产生ID号
Random random2=new Random();
int time=random2.nextInt(300); //随机产生停车时间
Car new_car=new Car(id,time);
if(car_wait_list.size()<5)
car_wait_list.add(new_car);
}
/*对两排停车位中的车进行处理*/
public void place_array_solve(){
for(int index=0;index<park.get_array_length();index++){
if( park.get_array_A_state(index)==true ){
Car car=park.get_array_A_car(index);
if(car.get_remain_time() >0 && car.get_position().top_Y==2) //停车时间未到,继续停车
car.decrease_stay_time();
else if(car.get_remain_time()>0 && car.get_position().top_Y==1){
car.run_up();
park.set_road_state(car.get_position().right_X);
}
else if(car.get_remain_time()==0){ //停车时间到,准备出库
int pos_x=car.get_position().right_X;
if(park.get_road_state(pos_x)==false){
park.car_get_out_array_A(index);
car.run_down();
park.set_road_state(pos_x);
temp_array.add(car);
}
}
}
if( park.get_array_B_state(index)==true ){
Car car=park.get_array_B_car(index);
if(car.get_remain_time()>0&&car.get_position().top_Y==-2)
car.decrease_stay_time();
else if(car.get_remain_time()>0 && car.get_position().top_Y==-1){
car.run_down();
park.set_road_state(car.get_position().right_X);
}
else if(car.get_remain_time()==0){
int pos_x=car.get_position().right_X;
if(park.get_road_state(pos_x)==false ){
park.car_get_out_array_B(index);
car.run_up();
park.set_road_state(pos_x);
temp_array.add(car);
}
}
}
}
}
/*对出口处的车进行处理*/
public void exit_solve(Car car){
Position pos=car.get_position();
if(pos.right_X==park.get_exit_pos().right_X){
if(car.check_state()==true /*&& park.check.get_exit_state()==0*/){ //没有经过出库检查
if(park.check.car_check_out(car)==1 )//检查合法
{ car.get_checked();
// System.out.print("check");
}
else {
//System.out.println("uncheck");
}
}
//else if(car.check_state()==true &&park.check.get_exit_state()>0)
// park.check.down_exit_rail();
else if(car.check_state()==false){ //经过出库检查
if(park.check.get_exit_state()<2) //出库栏杆没有完全抬起,则抬起栏杆
park.check.up_exit_rail();
else {
park.set_road_state(car.get_position().right_X-1);
car.run_ahead();
park.set_road_state(car.get_position().right_X);
}
}
}
else if(pos.right_X>park.get_exit_pos().right_X){
park.set_road_state(car.get_position().right_X-1);
car.run_ahead();
park.set_road_state(car.get_position().right_X);
temp_road.add(car);
park.check.car_out(car);
}
}
/*对行车道上的车进行处理*/
public void road_array_solve(){
if(park.car_road.size()<=0){
park.check.down_exit_rail();
return ;
}
int index=0;
if(park.car_road.size()>0){
Car head_car=park.car_road.get(0);
if(head_car.get_position().right_X < park.get_exit_pos().right_X)
park.check.down_exit_rail();
}
for(index=0;index<park.car_road.size();++index){
Car car=park.car_road.get(index);
Position pos=car.get_position();
if(car.get_remain_time()==0){ //该车停车时间为0
if(pos.top_Y > 0 && park.get_road_state(pos.right_X+1)==false){
car.run_down();
car.run_ahead();
park.set_road_state(car.get_position().right_X);
}
else if(pos.top_Y<0&&park.get_road_state(pos.right_X+1)==false){
car.run_up();
car.run_ahead();
park.set_road_state(car.get_position().right_X);
}
else if(pos.top_Y==0){
if(pos.right_X <park.get_exit_pos().right_X && park.get_road_state(pos.right_X+1)==false){
park.set_road_state(car.get_position().right_X-1);
car.run_ahead();
park.set_road_state(car.get_position().right_X);
}
else if(pos.right_X>= park.get_exit_pos().right_X )
exit_solve(car);
}
}
else if(car.get_remain_time()>0 ){
if(pos.top_Y==0){
if(pos.right_X>=2 && park.get_array_A_state(pos.right_X-2)==false){//判断与车斗位置对于的停车位是否为空
park.car_get_in_array_A(pos.right_X-2, car);
car.run_up();
park.set_road_state(pos.right_X-1);
temp_road.add(car);
}
else if(pos.right_X>=2 &&park.get_array_B_state(pos.right_X-2)==false ){
park.car_get_in_array_B(pos.right_X-2, car);
car.run_down();
park.set_road_state(pos.right_X-1);
temp_road.add(car);
}
else{
if(park.get_road_state(pos.right_X+1)==false) //继续前进
{
park.set_road_state(car.get_position().right_X-1);
car.run_ahead();
park.set_road_state(car.get_position().right_X);
}
}
}
}
}//for end
}//road_array_solve结束
/*对入口处的车进行处理*/
public int entranc_solve(){
if(illegal_car.size()>0){
Car car=illegal_car.get(0);
car.run_down();
park.set_road_state(0);
illegal_car.remove(0);
}
if(car_wait_list.size()==0 ){
if(park.get_road_state(park.get_entrance_pos().right_X)==false)
park.check.down_entrance_rail();
return 0;
}
Car head_car=car_wait_list.get(0);
if(head_car.get_position().right_X<park.get_entrance_pos().right_X
&&park.get_road_state(park.get_entrance_pos().right_X)==false ){
park.check.down_entrance_rail();
head_car.run_ahead();
park.set_road_state(park.get_entrance_pos().right_X);
return 0;
}
else if(head_car.get_position().right_X==park.get_entrance_pos().right_X){
if(head_car.check_state()==false /*&&park.check.get_extrance_state()==0*/){
if(park.check.car_check_in(head_car)==1){ //检验合法
head_car.get_checked();
return 0;
}
else if(park.check.car_check_in(head_car)==0) //车库已满
{ park.check.down_entrance_rail();
return 0;
}
else if(park.check.car_check_in(head_car)==-1){ //非法车
park.check.down_entrance_rail();
head_car.run_down();
car_wait_list.remove(0);
illegal_car.add(head_car);
return -1;
}
}
//else if(head_car.check_state()==false &&park.check.get_extrance_state()>0)
// park.check.down_entrance_rail();
else if(head_car.check_state()==true &&park.check.get_extrance_state()<2){
park.check.up_entrance_rail();
return 0;
}
else if(head_car.check_state()==true &&park.check.get_extrance_state()==2
&&park.get_road_state(head_car.get_position().right_X+1)==false ){
park.set_road_state(head_car.get_position().right_X-1);
head_car.run_ahead();
park.set_road_state(head_car.get_position().right_X);
park.check.car_in(head_car);
temp_entrance=head_car;
car_wait_list.remove(0);
return 0;
}
}
return 0;
}//entrance_solve 结束
public void adjust_car(){
park.car_road.removeAll(temp_road);