forked from: MineSweeper

by vuja22 forked from MineSweeper (diff: 1)
shift + click  Flg
click Open
♥0 | Line 240 | Modified 2016-01-26 02:03:07 | MIT License
play

ActionScript3 source code

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

// forked from 178ep3's MineSweeper
//    shift + click  Flg
//    click Open
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;
    import flash.utils.Timer;

    public class Minesweeper extends Sprite
    {
        private const num:int = 16;
        private const bomb:int = 40;
        private var _cellCount:uint=num*num;
        
        private var _cellList:Array = [];
        private var _numList:Array = [];
        private var _mineList:Array = [];
        private var _time:Timer;
        private var _timeCount:uint;
        private var _timeTf:TextField;
        private var _bombCount:uint=0;
        private var _bombTf:TextField;
        
        public function Minesweeper()
        {
            if(stage)init();
            else addEventListener(Event.ADDED_TO_STAGE,init);
        }
        
        private function init(e:Event=null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);
            var i:int,q:int,n:int,m:int;
            for(i=0; i<num; i++)
            {
                var list:Array = [];
                for(q=0; q<num; q++)
                {
                    var cell:Cell = addChild(new Cell())as Cell;
                    cell._i = i;
                    cell._q = q;
                    cell.addEventListener("OUT",gameOver);
                    cell.addEventListener("OPEN",open);
                    cell.addEventListener("OPEN_COUNT",openCount);
                    cell.addEventListener("FLG",MineCount);
                    list.push(cell);
                    cell.x = q*28;
                    cell.y = i*28;
                }
                _cellList.push(list);
            }
            i=0;
            while(i<bomb)
            {
                n = Math.random()*num;
                q = Math.random()*num;
                if(!_cellList[n][q].bomb)
                {
                    _cellList[n][q].bomb = true;
                    _mineList.push(_cellList[n][q]);
                    i++;
                }
            }
            
            for(i=0; i<num; i++)
            {
                for(q=0; q<num; q++)
                {
                    var count:uint=0;
                    for(n=-1; n<2; n++)
                    {
                        for(m=-1; m<2; m++)
                        {
                            if((i+n>=0 && q+m>=0) && (i+n<num && q+m<num))
                            {
                                if(n==0 && m==0)count = count;
                                else if(_cellList[i+n][q+m].bomb)count++;
                            }
                        }
                    }
                    _cellList[i][q]._num = count;
                }
            }
            
            _timeTf = addChild(new TextField())as TextField;
            _timeTf.text = "TIME: 0";
            _timeTf.autoSize = TextFieldAutoSize.LEFT;
            _timeTf.x=5;
            _timeTf.y = 452;
            
            _bombTf = addChild(new TextField())as TextField;
            _bombTf.text = "MINE: 0/" + bomb.toString();;
            _bombTf.autoSize = TextFieldAutoSize.LEFT;
            _bombTf.x=100;
            _bombTf.y = 452;
            
            _time = new Timer(1000);
            _time.addEventListener(TimerEvent.TIMER,timeCount);
            _time.start();
            
            function timeCount(e:TimerEvent):void
            {
                _timeCount++;
                _timeTf.text = "TIME: "+_timeCount.toString();
            }
        }
        
        private function open(e:Event):void
        {
            var i:int,q:int,n:int,m:int;
            i = e.currentTarget._i;
            q = e.currentTarget._q;
            for(n=-1; n<2; n++)
            {
                for(m=-1; m<2; m++)
                {
                    if((i+n>=0 && q+m>=0) && (i+n<num && q+m<num))
                    {
                        if(n!=0 || m!=0)
                        {
                            var cell:Cell = _cellList[i+n][q+m];
                            if(cell.flg && !cell.bomb) cell.click();
                        }
                    }
                }
            }
            _cellCount--;
            if(_cellCount==bomb) End("CLEAR!! "+_timeTf.text);
        }
        
        private function openCount(e:Event):void
        {
            _cellCount--;
            if(_cellCount==bomb) End("CLEAR!! "+_timeTf.text);
        }
        
        private function MineCount(e:Event):void
        {
            if(e.target._sFlg) _bombCount++;
            else _bombCount--;
            
            _bombTf.text = "MINE: " + _bombCount.toString() + "/" + bomb.toString();
            if(_bombCount==bomb)  clearJ();
            else if(_cellCount==bomb) End("CLEAR!! "+_timeTf.text);
        }
        
        private function clearJ():void
        {
            var clearFlg:Boolean=true;
            var i:uint=0;
            for(i=0; i<bomb; i++)
            {
                if(!_mineList[i]._sFlg)clearFlg=false;
            }
            if(clearFlg)End("CLEAR!! "+_timeTf.text);
        }
        
        private function gameOver(e:Event):void
        {
            var i:uint,q:uint;
            for(i=0; i<num; i++)
            {
                for(q=0; q<num; q++)
                {
                    _cellList[i][q].click(null,true);
                }
            }
            End("GAME OVER");
        }
        
        private function End(str:String):void
        {
            var caver:Sprite = addChild(new Sprite())as Sprite;
            caver.graphics.beginFill(0xffffff,0.3);
            caver.graphics.drawRect(0,0,465,465);
            caver.graphics.endFill();
            _time.stop();
            var tf:TextField = addChild(new TextField())as TextField;
            tf.autoSize = TextFieldAutoSize.LEFT;
            tf.defaultTextFormat = new TextFormat("_ゴシック",20,0,true);
            tf.text = str
            tf.selectable = false;
            tf.x = stage.stageWidth*0.5 - tf.width*0.5;
            tf.y = stage.stageHeight*0.5 - tf.height*0.5;
        }
    }
}
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.text.TextFieldAutoSize;

class Cell extends Sprite
{
    private var _tf:TextField;
    public var _num:uint=0;
    public var bomb:Boolean = false;
    public var flg:Boolean = true;
    public var _sFlg:Boolean = false;
    public var _i:uint;
    public var _q:uint;
    
    public function Cell()
    {
        draw();
        addEventListener(MouseEvent.CLICK,click);
        this.buttonMode = true;
    }
    
    private function draw(color:uint=0xcccccc):void
    {
        this.graphics.clear();
        this.graphics.beginFill(color);
        this.graphics.lineStyle(1,0xaaaaaa);
        this.graphics.drawRect(0,0,28,28);
        this.graphics.endFill();
    }
    
    public function click(e:MouseEvent = null , end:Boolean=false):void
    {
        removeEventListener(MouseEvent.CLICK,click);
        flg = false;
        if(e && e.shiftKey)
        {
            if(_sFlg) draw();
            else draw(0x0000ff);
            _sFlg = !_sFlg;
            dispatchEvent(new Event("FLG"));
            flg = true;
            addEventListener(MouseEvent.CLICK,click);
        }
        else if(bomb)
        {
            draw(0xff0000);
            if(!end)dispatchEvent(new Event("OUT"));
        }
        else
        {
            this.buttonMode = false;
            draw(0xdddddd);
            if(_num!=0)
            {
                _tf = addChild(new TextField())as TextField;
                _tf.selectable = false;
                _tf.text = _num.toString();
                _tf.autoSize = TextFieldAutoSize.LEFT;
                _tf.x = 14 - _tf.width*0.5;
                _tf.y = 14 - _tf.height*0.5;
                if(!end)dispatchEvent(new Event("OPEN_COUNT"));
            }
            else
            {
                if(!end)dispatchEvent(new Event("OPEN"));
            }
        }
    }
}