In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: 関数を中断したい

ゲームのAIを作りたいのですが、制限時間があるとします。
選択時間内に_thinkが終わらなかった場合
とりあえずその時点でのselectionが参照されるようになっていますが、
もう考え続けないでいいのに考え続けてしまいます。
40行目の位置から_think関数を止めたいのですが、可能でしょうか?

イベントを投げているので、思考処理はいわゆる非同期処理だと言う前提で回答します。
関数の実行中にその関数を止めたいということであればフラグを使うしかないと思います。
また、フラグを使うとコードが煩雑になるので自分ならThreadを利用すると思います。
Get Adobe Flash player
by imajuk 28 Jun 2010

    Talk

    enecre at 28 Jun 2010 04:29
    ありがとうございます!今まで(理由もなく)スルーしていたTreadの使い方もよくわかりました(*´ω`*)参考にします!!
    Embed
/**
 * Copyright imajuk ( http://wonderfl.net/user/imajuk )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/ltXK
 */

// forked from enecre's 関数を中断したい
/*
    ゲームのAIを作りたいのですが、制限時間があるとします。
    選択時間内に_thinkが終わらなかった場合
    とりあえずその時点でのselectionが参照されるようになっていますが、
    もう考え続けないでいいのに考え続けてしまいます。
    40行目の位置から_think関数を止めたいのですが、可能でしょうか?
    
    イベントを投げているので、思考処理はいわゆる非同期処理だと言う前提で回答します。
    関数の実行中にその関数を止めたいということであればフラグを使うしかないと思います。
    また、フラグを使うとコードが煩雑になるので自分ならThreadを利用すると思います。
    
*/

package {
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.display.Sprite;
    public class FlashTest extends Sprite {
        public function FlashTest() {
            // write as3 code here..
            var tf:TextField = new TextField();
            addChild(tf);

            var moja:Ai = new Ai();
            moja.addEventListener("complete",function():void{
              tf.text = String(moja.selection);  
            });
            moja.think();
        }
    }
}
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
class Ai extends EventDispatcher{
    private var _timer:Timer;
    private var _selection:int;
    public function get selection():int{return _selection;}
    public function set selection(value:int):void{_selection = value;};
    function Ai(){}
    public function think():void{
        //_timer = new Timer(5000,1);
        //_timer.addEventListener(TimerEvent.TIMER,function():void{
        //    dispatchEvent(new Event("complete"));
            // ここで_think関数を止めたい
        //});
        //_timer.start();
       
        var aiThread:AIThread = new AIThread(this);
        aiThread.start();
        
        //_think();
    }
    
    //private function _think():void{
        /*
            ここで考える、時間がかかるかもしれない
        */
       // _selection = 3;
      //  _timer.stop();
     //   dispatchEvent(new Event("complete"));
    //}
    
}

import org.libspark.thread.Thread;

class AIThread extends Thread
{
    private var thinking:ThinkThread;
    private var ai:Ai;

    function AIThread(ai:Ai)
    {
        super();
        this.ai = ai;
    }
    
    override protected function run():void
    {
        if (isInterrupted) return;        
        
        thinking = new ThinkThread(ai);  
        thinking.start();      

        wait(5000);        
        next(timeOver);
    }
    
    private function timeOver():void
    {
        thinking.interrupt();
        ai.dispatchEvent(new Event("complete"));
    }
}

/**
 * 考えるThread
 * 終わったらAiインスタンスのセッター経由で結果が通知される
*/
class ThinkThread extends Thread
{
    private var ai:Ai;
    private var result:int;

    function ThinkThread(ai:Ai)
    {
        super();
        this.ai = ai;
    }

    override protected function run():void
    {
        if (isInterrupted) return;        
        
        next(algorismA);
    }
    
    private function algorismA():void
    {
        if (isInterrupted) return;        
        //考え中...
        next(algorismB);        
    }

    private function algorismB():void
    {
        if (isInterrupted) return;        
        //考え中...
        next(algorismC);     
    }
    
    private function algorismC():void
    {
        if (isInterrupted) return;        
        //考え中...
        //考え終わった
        result = 3;
    }

    override protected function finalize():void
    {
        ai.selection = result;
        ai.dispatchEvent(new Event("complete"));
    }

}