エレベーターグラフ

by YAZUMA
♥4 | Line 269 | Modified 2010-06-22 20:39:39 | MIT License
play

ActionScript3 source code

/**
 * Copyright YAZUMA ( http://wonderfl.net/user/YAZUMA )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/zE0C
 */

<?xml version="1.0" encoding="utf-8"?>
<!-- forked from YAZUMA's エレベーター -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="712" height="489" minWidth="0" layout="absolute">
	<mx:Label text="(floor)" width="42" x="49" y="28" fontFamily="Times New Roman"/>
	<mx:LineChart id="chart" showDataTips="true" dataProvider="{chartData}" 
				  height="197" y="53" left="49" horizontalCenter="0" right="49">
		
		<mx:series>
			<mx:LineSeries xField="x" yField="value"/>
		</mx:series>
		
	</mx:LineChart>
	<mx:Label text="Elevator" y="255" fontWeight="bold" horizontalCenter="0" left="329" right="328"/>
	<mx:Label text="(number)" width="57" x="45" y="283" fontFamily="Times New Roman"/>
	<mx:LineChart id="chart2" showDataTips = "true" dataProvider="{chartData2}"
				  height="115" y="302" horizontalCenter="-159" left="45" right="363">
		<mx:series>
			<mx:LineSeries xField="x" yField="value"/>
		</mx:series>
	</mx:LineChart>
	<mx:Label text="Passenger" width="72" x="158" y="418" fontWeight="bold"/>
	<mx:ColumnChart id="columnchart1" showDataTips = "true" dataProvider="{chartData3}"
					height="115" y="302" horizontalCenter="155" left="359" right="49">
		<mx:series>
			<mx:ColumnSeries xField="x" yField="value"/>
		</mx:series>
	</mx:ColumnChart>
	<mx:Button label="スタート" click="timer()" top="452" verticalCenter="218" bottom="16" left="275" horizontalCenter="-44" right="363"/>
	<mx:Script>
		<![CDATA[
			import flash.events.TimerEvent;
			import flash.utils.Timer;
			
			import mx.charts.LinearAxis;
			import mx.charts.events.ChartItemEvent;
			import mx.collections.ArrayCollection;
			
			public var now_time:Number = 0;	//時間推移
			public var now_floor:Number = 1;	//現在のフロア
			public var must_floor:int = 1;	//行き先
			public var HEIGHT:Number = 0;	//高さ
			public var elevator_inner:int = 0;	//エレベータ搭乗者数
			public var waiter:int = 0;		//エレベータに乗り込む人数
			public var counter:int = 0;	//カウンタ
			public var elevator_in:Array = [21];//各階にいく人数 12だと12Fに行く人
			public var ele_in:Array = [12];
			public var start:Boolean = true;		//
			public var user:Boolean = false;		//使用者がいるかどうか
			public var must:Boolean = false;		//むかえに行く
			public var UpDown:Boolean = false;	//上か下か
			public var out_fin:Boolean = false;	
			public var in_fin:Boolean = false;	
			public var do_out:Boolean = false;
			public var do_in:Boolean = false;
			public var stop_checker:Boolean = false;	
			public var in_checker:Boolean = false;
			public var out_checker:Boolean = false;	
			public var through:int = 0;
			public var minuteTimer:Timer;
			public var timer_start:Boolean = false;
			//待ち人
			[Bindable] public var wait_person:ArrayCollection = new ArrayCollection(
				[ { before: 1, after: 20 } ]);
			// チャートのデータ
			[Bindable] public var chartData:ArrayCollection = new ArrayCollection(
				[ { x: 0, value: 1 } ]);
			[Bindable] public var chartData2:ArrayCollection = new ArrayCollection(
				[ { x: 0, value: 0 } ]);
			[Bindable] public var chartData3:ArrayCollection = new ArrayCollection(
				[ { x: 1, value: 0} ] );
			
			public function timer():void{
				if(timer_start == false){
					for(var ii:int = 0;ii < 101;ii++){
						elevator_in[ii] = 0;
					}
					for(var k:int = 0; k < 12; k++){
						ele_in[k] = 0;
					}
					for(var f:int = 2;f < 21; f++){
						chartData3.addItem({x: f, value: 0});
					}
					timer_start = true;
					minuteTimer = new Timer(50);		//(関数実行間隔、実行回数)
					minuteTimer.addEventListener(TimerEvent.TIMER,elevator_system);
					minuteTimer.start();
				}else{
					minuteTimer.start();
				}
			}
			private function elevator_system(event:TimerEvent):void{
				now_floor = (HEIGHT / 3.5) + 1;
				now_time += 0.5;
				if(now_time % 10 == 0)person_check();
				elevator_check();
				now_floor = (HEIGHT / 3.5) + 1;
				if(chartData.length == 241)chartData.removeItemAt(0);
				chartData.addItem({x: now_time,value: now_floor});
				if(chartData2.length == 241)chartData2.removeItemAt(0);
				chartData2.addItem({x: now_time, value: elevator_inner});
				for(var i:int = 0; i < 20; i++){
					var item:Object = chartData3.getItemAt(i);
					item.value = 0;
					chartData3.setItemAt(item, i);
				}
				for(var i2:int = 1; i2 < wait_person.length; i2++){
					var num:int = wait_person.getItemAt(i2).before;
					var item2:Object = chartData3.getItemAt(num - 1);
					item2.value++;
					chartData3.setItemAt(item2, num - 1);
				}
			}
			public function person_check():void{
				//Person Coming Soon...
				var j:int = Math.floor(Math.random()*(3 - 0 + 1)) + 0;
				if(j > 0){
					for(var n:int = 0;n < j; n++){
						var before_floor:int = Math.floor(Math.random()*(20 - 1 + 1)) + 1;
						do{
							var after_floor:int = Math.floor(Math.random()*(20 - 1 + 1)) + 1;
						}while(before_floor == after_floor);
						wait_person.addItem({before: before_floor, after: after_floor});
					}
				}
			}
			public function elevator_check():void{
				if(start == false){
					//エレベータを使う人がいないとき
					gotofloor1();
					if(wait_person.length > 1)start = true;
				}else{
					if(user == true){
						//エレベータ稼動中,人がエレベータ内にいる状態
						if(stop_checker == true){
							//止まる,もしくは止まるかどうかの判定
							stop_check();
							if(must_floor == now_floor){
								//user = false;
							}
							if(elevator_inner == 0)user = false;	//エレベータ内の人がいなくなれば、いったん終わり
							if(wait_person.length == 1 && elevator_inner == 0)start = false;	//さらに待っている人がいなければ1Fへ
						}else{
							//移動,各階で降りる人または上がる人がいないかチェックする
							UPorDOWN();
							if(HEIGHT % 3.5 == 0)stop_checker = true;
						}
					}else{
						if(must == false){
							//エレベータ待ちの人をチェックする
							if(wait_person.length == 1){
								//誰もイナイ
								start = false;
								gotofloor1();
							}else{
								//誰か使いたい
								must_floor = wait_person.getItemAt(1).before;
								must = true;
								if(must_floor == now_floor){
									must = false;
									user = true;
									stop_checker = true;
								}else{
									if(must_floor > now_floor)UpDown = true;
									else UpDown = false;
									must = true;
									UPorDOWN();
								}
							}
						}else{
							UPorDOWN();
							now_floor = (HEIGHT / 3.5) + 1;
							if(must_floor == now_floor){
								must = false;
								user = true;
								stop_checker = true;
							}
						}					
					}
				}
			}
			public function UPorDOWN():void{
				if(UpDown == true)HEIGHT += 0.5;
				else if(UpDown == false) HEIGHT -= 0.5;
			}
			public function gotofloor1():void{
				if(HEIGHT > 0)HEIGHT -= 0.5;
			}
			public function stop_check():void{
				//In, Out 統括関数
				if(out_checker == false)out_check();
				if(do_out == true && out_fin == false)out();
				if(in_checker == false && out_fin == true)in_check();
				if(do_in == true && out_fin == true)inn();
				if(out_fin == true && in_fin == true){
					stop_checker = false;
					in_checker = false;
					out_checker = false;
					do_out = false;
					do_in = false;
					out_fin = false;
					in_fin = false;
					if(through == 0)UPorDOWN();
					else through = 0;
				}
			}
			public function out_check():void{
				out_checker = true;
				if(elevator_in[now_floor] != 0){
					do_out = true;
					through++;
				}
				else out_fin = true;
			}
			public function out():void{
				counter++;
				if(counter == 6){
					counter = 0;
					elevator_inner--;
					elevator_in[now_floor]--;
					if(elevator_in[now_floor] == 0)out_fin = true;
				}
			}
			public function in_check():void{
				var k:int = 0;
				in_checker = true;
				for(var i:int = 1;i < wait_person.length;i++){
					if(elevator_inner == 0){
						if(wait_person.getItemAt(1).after > now_floor)UpDown = true;
						else UpDown = false;
						must_floor = wait_person.getItemAt(i).after;
					}
					if(elevator_inner < 12 && wait_person.getItemAt(i).before == now_floor){
						if(UpDown == true && wait_person.getItemAt(i).after > now_floor){
							waiter++;
							elevator_inner++;
							elevator_in[wait_person.getItemAt(i).after]++;
							if(must_floor < wait_person.getItemAt(i).after)must_floor = wait_person.getItemAt(i).after;
							ele_in[k]=i;
							k++;
							in_checker = true;
							do_in = true;
							through++;
						}else if(UpDown == false && wait_person.getItemAt(i).after < now_floor){
							waiter++;
							elevator_inner++;
							elevator_in[wait_person.getItemAt(i).after]++;
							if(must_floor > wait_person.getItemAt(i).after)must_floor = wait_person.getItemAt(i).after;
							ele_in[k]=i;
							k++;
							in_checker = true;
							do_in = true;
							through++;
						}
					}
				}
				if(waiter == 0){
					in_checker = true;
					do_in = false;
					in_fin = true;
				}else{
					//待ち配列から削除する
					for(var ii:int = waiter - 1; ii > 0;ii--){
						wait_person.removeItemAt(ele_in[ii]);
					}
				}
			}
			public function inn():void{
				counter++;
				if(counter == 4){
					counter = 0;
					waiter--;
					if(waiter == 0)in_fin = true;
				}
			}
			public function timer_stop():void{
				minuteTimer.stop();
			}
		]]>
	</mx:Script>
	<mx:Button label="ストップ" click="timer_stop()" horizontalCenter="38" right="281" left="357" top="452" verticalCenter="218" bottom="16"/>
	<mx:Label x="617" y="255" text="(second)" fontFamily="Times New Roman"/>
	<mx:Label x="303" y="418" text="(second)" fontFamily="Times New Roman"/>
	<mx:Label x="476" y="418" text="Waiting person" fontWeight="bold"/>
	<mx:Label x="627" y="418" text="(floor)" fontFamily="Times New Roman"/>
	<mx:Label x="357" y="283" text="(number)" fontFamily="Times New Roman"/>
	<mx:Label y="10" text="Elevator Simulator" left="292" horizontalCenter="-4" right="299" fontFamily="Times New Roman" fontWeight="bold" fontSize="18"/>
</mx:Application>