flash on 2009-9-10

by uwi
♥0 | Line 139 | Modified 2009-09-10 16:27:01 | MIT License
play

ActionScript3 source code

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

package {
    import flash.display.*;
    import flash.text.TextField;
    public class Nikaku extends Sprite {
        private var _tf : TextField;
        private var _f : Array;
        private var _t : Array;
        private var _w : int;
        private var _h : int;
        private var _n : int;
        
        private var _ftop : Number;
        private var _fbottom : Number;
        private var _fleft : Number;
        private var _fright : Number;
        
        private var _bmd : BitmapData;
        private var _bmp : Bitmap;
        
        public function Nikaku() {
            addChild(_tf = new TextField());
            _tf.width = 300;
            _tf.height = 300;
            
            init(10, 10, 2);
            initIF();
            
            p();
            
            _tf.appendText("" + areErasable(0, 0, 3, 0));
            
            /*
            // TODO 手で解けるようにする
            
            
            // TODO アルゴリズム完成
            algo();
            */
        }
        
        private function initIF() : void
        {
            _bmd = new BitmapData(20 * _h, 20 * _w, false, 0x000000);
            _bmp = new Bitmap(_bmd);
            addChild(_bmp);
            
            var canvas : Sprite = new Sprite();
            var tf : TextField = new TextField();
            canvas.addChild(tf);
            tf.autoSize = "center";
            tf.text = "5";
            tf.x = 10 - tf.width / 2;
            tf.y = 10 - tf.height / 2;
            
            with(canvas.graphics){
                lineStyle(1, 0xffffff);
                beginFill(0x9999ff);
                drawRoundRect(0, 0, 20, 20, 5, 5);
                endFill();
            }
            
            _bmd.lock();
            _bmd.draw(canvas);
            _bmd.unlock();
        }
        
        /*
        private function algo() : Boolean
        {
            var i : int, j : int;
            var ct : Array = new Array(_n + 1);
            for(i = 0;i < _n + 1;i++)ct[i] = [];
            for(i = 1;i <= _w;i++){
                for(j = 1;j <= _h;j++){
                    if(_f[i][j] > 0)ct[_f[i][j]].push([i - 1, j - 1]);
                }
            }
            
            // TODO 各数字で、2対以上あれば削除可能なら分岐、1対あれば優先削除
        }
        */
        
        private function areErasable(ax : int, ay : int, bx : int, by : int) : Array
        {
            if(_f[ax + 1][ay + 1] != _f[bx + 1][by + 1])return ["ほったらけ"]; 
            
            var i : int, j : int, k : int;
            for(i = 0;i < _h + 2;i++){
                for(j = 0;j < _w + 2;j++){
                    _t[i][j] = null;
                }
            }
            _t[ax + 1][ay + 1] = [-1, -1];
            
            do{
                var changed : Boolean = false;
                for(i = 0;i < _w + 2;i++){
                    for(j = 0;j < _h + 2;j++){
                        if(_t[i][j] != null){
                            for(k = 0;k < 4;k++){
                                var xx : int = i + DIR[k][0];
                                var yy : int = j + DIR[k][1];
                                if(xx == bx + 1 && yy == by + 1){
                                    _tf.appendText("キテマスヨー");
                                    var ret : Array = [k];
                                    var x : int = i;
                                    var y : int = j;
                                    while(x != ax + 1 || y != ay + 1){
                                        var kk : int = _t[x][y][1];
                                        ret.unshift(kk);
                                        x -= DIR[kk][0];
                                        y -= DIR[kk][1];
                                    }
                                    return ret;
                                }
                                var nturn : int = _t[i][j][0] + (k == _t[i][j][1] ? 0 : 1);
                                if(nturn <= 2 &&
                                  xx >= 0 && xx <= _w + 2 && 
                                  yy >= 0 && yy <= _h + 2 &&
                                  _f[xx][yy] == 0 && 
                                  (_t[xx][yy] == null || _t[xx][yy][0] > nturn)){
                                    _t[xx][yy] = [nturn, k];
                                    changed = true;
                                }
                            }
                        }
                    }
                }
            }while(changed)
            
            return [];
        }
        
        private static const DIR : Array = [[0, 1], [1, 0], [0, -1], [-1, 0]];
        
        private function p() : void
        {
            var s : String = "";
            for(var i : int = 0;i < _w + 2;i++){
                for(var j : int = 0;j < _h + 2;j++){
                    s += _f[j][i] + " ";
                }
                s += "\n";
            }
            _tf.text = s;
        }
        
        private function init(w : int, h : int, dup : int) : void
        {
            _w = w;
            _h = h;
            
            var i : int, j : int;
            _f = new Array(h + 2);
            _t = new Array(h + 2);
            for(i = 0;i < h + 2;i++){
                _f[i] = new Array(w + 2);
                for(j = 0;j < w + 2;j++){
                    _f[i][j] = 0;
                }
                _t[i] = new Array(w + 2);
            }
            
            _n = w * h / 2 / dup;
            var x : int, y : int;
            x = y = 0;
            outer: for(i = 0;i < _n;i++){
                for(j = 0;j < dup * 2;j++){
                    _f[x + 1][y + 1] = i + 1;
                    x++;
                    if(x == w){
                        y++;
                        x = 0;
                        if(y == h){
                            break outer;
                        }
                    }
                }
            }
            
            /*
            // shuffle
            for(i = 0;i < w * h - 1;i++){
                j = Math.random() * (w * h - i - 1) + i + 1;
                var d : int = _f[i / w + 1][i % w + 1];
                _f[i / w + 1][i % w + 1] = _f[j / w + 1][j % w + 1];
                _f[j / w + 1][j % w + 1] = d;
            }
            */
        }
    }
}