お客さんが来店する処理について、備忘の為にまとめました。
来店/退店の流れ
来店/退店の流れを書き出してみると、概ね以下のようになるのでは、と思いました。
お客さんが発生する部分と、お客さんに対応する部分(来店/退店)との間に、行列があるイメージです。
開店
開店前はチラシを見たり噂を聞きつけたり、またはいつものお店に何か用事が合って来客します。
※処理
ニーズの生成(開店後の来店):T1
開店時以外にも、お店が閉店するまでには、様々な用事でお客さんが来ます。このタイミングがタイマT1
です。
行列
開店前だったり、お店のオペレーション能力を超えてお客さんが来たときは、お店の前やレジの前に行列ができます。
来店/退店
行列の先頭にいるお客さんは、お店からの応対を受けることができます。これが来店/退店処理です。
お店が閑散とした状態(一時的な待ち):T2
もしお客さんが集まる速さよりお店のオペレーションが早ければ、お店は一時的に閑散とした状態(というか待ち)になります。この場合、店の奥でくつろいでいたり、居眠りしていない限りは、お客さんを発見し次第応対できます。これがタイマT2
です。
閉店:T3
24時間営業でない限り、または24時間営業でも時々は、開店から一定時間経過後に閉店を迎えます。閉店までに買い物ができなかったお客さんは、一度家に帰って、また明日なり他の日なりに来店するでしょう。もしかしたら競合のお店に行ってしまうかもしれません。
実装例
ここまでの処理をまとめると、下のようなコードになるのではと思いました。
開店前処理
void GameStart() { for( i = 0; i < 開店時生成最大; i++ ){ お客さん生成(); } ニーズ生成タイマON(); }
お客さんの発生
Queue<お客> 行列 = new Queue<お客>(); void お客さん生成() { お客さん = ニーズ生成(); if( どの店に入るか() == 自分の店 ){ // 行列に並ぶ 行列.Enqueue( お客さん ); } }
来店~退店
void 来店処理( お客さん ) { // Yes/Noボタン有効化 } void YESボタン() { 退店処理(); } void 退店処理() { // Yes/Noボタン無効化 退店処理開始(); // 退店処理タイマ } void 来客確認() { if( 行列.Peek() ){ お客さん = 行列.Dequeue(); 来店処理( お客さん ); } }
タイマ
void Update() { foreach( タイマ ){ if( タイマーON ){ タイマ処理(); } } }
タイマ タイムアウト処理
void T1_ニーズ生成タイマ_タイムアウト() { // 店の傾向、市場傾向などから for( i = 0; i < タイマタイムアウト時生成最大; i++ ){ お客さん生成(); } } void T2_来客監視タイマ_タイムアウト() { if( !接客中 ){ 来客確認(); } } void T3_閉店タイマ_タイムアウト() { 行列.Clear(); } void 退店処理タイマタイムアウト処理() { // タイマ処理と同じ 来客確認(); }