forked from: Blackjack

by raa forked from Blackjack (diff: 1)
昨日に続いてカードゲーム
色々怪しいので後で見直す。
♥0 | Line 266 | Modified 2016-01-10 10:19:32 | MIT License
play

ActionScript3 source code

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

// forked from 178ep3's Blackjack
//昨日に続いてカードゲーム
//色々怪しいので後で見直す。

package
{
    import caurina.transitions.Tweener;
    
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;

    [SWF(backgroundColor=0x009900, frameRate=30)]
    public class BlackJack extends Sprite
    {
        private var _kindList:Array = ["Spade","Clover","Dia","Heart"];
        private var _cardList:Array = [];
        private var _myCard:Array = [];
        private var _dealerCard:Array = [];
        private var _myNum:uint=0;
        private var _dealerNum:uint=0;
        
        private var _cardStg:Sprite;
        private var _hitBtn:SampleBtn;
        private var _standBtn:SampleBtn;
        
        private var _jTf:TextField;
        
        private var _coin:int=100;
        private var _floatCoin:uint=0;
        private var _coinTf:TextField;
        
        public function BlackJack()
        {
            if(stage)init();
            else addEventListener(Event.ADDED_TO_STAGE,init);
        }
        
        private function init():void
        {
            removeEventListener(Event.ADDED_TO_STAGE,init);
            
            _coinTf = addChild(new TextField())as TextField;
            _coinTf.text = "POINT : " + _coin.toString();
            _coinTf.selectable = false;
            _coinTf.autoSize = TextFieldAutoSize.LEFT;
            _coinTf.x = 20;
            _coinTf.y = 190;
            
            _hitBtn = addChild(new SampleBtn("HIT"))as SampleBtn;
            _standBtn = addChild(new SampleBtn("STAND"))as SampleBtn;
            _hitBtn.y = _standBtn.y = stage.stageHeight*0.5-20;
            _hitBtn.x = 20;
            _standBtn.x = 60;
            _hitBtn.addEventListener(MouseEvent.CLICK,function():void{addCard(_myCard);});
            _standBtn.addEventListener(MouseEvent.CLICK,dealerAdd);
            
            gameStart();
        }
        
        private function gameStart():void
        {
            _cardStg = addChild(new Sprite())as Sprite;
            _hitBtn.visible = _standBtn.visible = true;
            var i:uint,q:uint;
            for(q=0; q<4; q++)
            {
                for(i=1; i<14; i++)
                {
                    var card:Card = new Card(_kindList[q],i);
                    card.x = (320-card.width)*0.5;
                    card.y = (465-card.height)*0.5;
                    _cardList.push(card);
                }
            }
            
            for(i=0; i<100; i++)
            {
                var sc:Card = _cardList.shift();
                _cardList.splice(Math.random()*52,0,sc);
            }
            
            
            for(i=0; i<2; i++)
            {
                Tweener.addTween(this,{time:i*0.2,onComplete:addCard,onCompleteParams:[_myCard]});
                Tweener.addTween(this,{time:i*0.2,onComplete:addCard,onCompleteParams:[_dealerCard,1-i]});
            }
            autoJudge(true);
        }
        
        private function dealerAdd(e:MouseEvent=null):void
        {
            _dealerCard[1].onCard();
            _hitBtn.visible = _standBtn.visible = false;
            addCard(_dealerCard);
            if(_dealerNum<16)Tweener.addTween(this,{time:0.1,onComplete:function():void{dealerAdd();}});
            else if(_dealerNum<22)judge();
        }
        
        private function addCard(list:Array,flg:uint=1):void
        {
            var card:Card = _cardList.shift();
            list.push(card);
            _cardStg.addChild(card);
            if(flg==0)card.offCard();
            var toX:uint = list.length * 60 -50;
            var toY:uint;
            if(list===_myCard)toY = 355;
            else toY = 10;
            
            Tweener.addTween(card,{time:0.2,x:toX,y:toY,transition:"linear"});
            
            cardCount(list);
        }
        
        private function cardCount(list:Array):void
        {
            var i:uint=0;
            var count:uint=0;
            var A:Boolean = false;
            for(i=0; i<list.length; i++)
            {
                count += list[i].num;
                if(list[i].num==11)A=true;
            }
            if(count>21 && A)count-=10;
            
            if(list===_myCard)_myNum = count;
            else _dealerNum = count;
            
            autoJudge();
        }
        
        private function autoJudge(first:Boolean=false):void
        {
            if(_myNum>21)win(1);
            else if(_dealerNum>21)win(0);
            else if(_myNum==21 && first)win(3);
        }
        
        private function judge():void
        {
            if(_myNum>_dealerNum)win(0);
            else if(_myNum==_dealerNum)win(2);
            else win(1);
        }
        
        private function win(out:uint):void
        {
            _hitBtn.visible = _standBtn.visible = false;
            _dealerCard[1].onCard();
            Tweener.addTween(this,{time:0.2,onComplete:fin});
            function fin():void
            {
                var str:String;
                if(out==0)
                {
                    str = "You Win !";
                    _coin+=(10+_floatCoin);
                    _floatCoin = 0;
                }
                else if(out==1)
                {
                    str = "You lose...";
                    _coin-=10;
                    _floatCoin = 0;
                }
                else if(out==3)
                {
                    str = "You Win !";
                    _coin+=(20+_floatCoin);
                    _floatCoin = 0;
                }
                else
                {
                    str = "Draw";
                    _floatCoin += 20;
                }
                
                _coinTf.text = "POINT : " + _coin.toString();
                _jTf = addChild(new TextField())as TextField;
                _jTf.defaultTextFormat = new TextFormat("_ゴシック",20);
                _jTf.text = str;
                _jTf.autoSize = TextFieldAutoSize.LEFT;
                _jTf.selectable = false;
                _jTf.x = 160 - _jTf.width*0.5;
                _jTf.y = stage.stageHeight*0.5 - _jTf.height*0.5-50;
                
                if(_coin>10)
                {
                    var re:SampleBtn = addChild(new SampleBtn("Next Game"))as SampleBtn;
                    re.x = 160 - re.width*0.5;
                    re.y = 200;
                    re.addEventListener(MouseEvent.CLICK,restart);
                    function restart(e:MouseEvent):void
                    {
                        re.removeEventListener(MouseEvent.CLICK,restart);
                        _cardList = [];
                        _myCard = [];
                        _dealerCard = [];
                        _floatCoin = 0;
                        _myNum = _dealerNum = 0;
                        removeChild(_cardStg);
                        _cardStg = null;
                        removeChild(_jTf);
                        removeChild(re);
                        gameStart();
                    }
                }
                else
                {
                    _jTf.text = "GAME OVER";
                }
            }
        }
    }
}

    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.text.TextFormat;

class Card extends Sprite
{
    private var _tf:TextField;
    private var _kind:String;
    private var _num:uint;
    
    public function Card(kind:String,num:uint)
    {
        _kind = kind;
        _num = num;
        
        this.graphics.beginFill(0xffffff);
        this.graphics.lineStyle(1);
        this.graphics.drawRect(0,0,50,80);
        this.graphics.endFill();
        
        var color:uint = 0;
        if(_kind=="Dia" || _kind=="Heart")color=0xff0000;
        
        _tf = addChild(new TextField())as TextField;
        _tf.defaultTextFormat = new TextFormat("_ゴシック",12,color);
        _tf.autoSize = TextFieldAutoSize.CENTER;
        _tf.selectable = false;
        
        _tf.defaultTextFormat =  new TextFormat("_ゴシック",30,color);
        
        if(_kind=="Spade") _tf.text = "♠ \n";
        else if(_kind=="Clover") _tf.text = "♣ \n";
        else if(_kind=="Dia") _tf.text = "♦ \n";
        else if(_kind=="Heart")_tf.text = "♥ \n";
        
        _tf.defaultTextFormat =  new TextFormat("_ゴシック",12,color);
        
        if(_num==1) _tf.appendText("A");
        else if(_num==11) _tf.appendText("XI");
        else if(_num==12) _tf.appendText("XⅡ");
        else if(_num==13) _tf.appendText("XⅢ");
        else _tf.appendText(_num.toString());
        
        if(_num>10)_num=10;
        else if(_num==1)_num=11;
        
        _tf.x = 25 - _tf.width*0.5;
        _tf.y = 40 - _tf.height*0.5;
    }
    
    public function onCard():void
    {
        _tf.visible = true;
    }
    
    public function offCard():void
    {
        _tf.visible = false;
    }
    
    public function get kind():String
    {
        return _kind;
    }
    
    public function get num():uint
    {
        return _num;
    }
}

class SampleBtn extends Sprite
{
    private var _tf:TextField;
    
    public function SampleBtn(value:String="")
    {
        _tf = addChild(new TextField())as TextField;
        _tf.autoSize = TextFieldAutoSize.LEFT;
        _tf.selectable = false;
        _tf.text = value;
        _tf.x = _tf.y = 5;
        
        this.graphics.lineStyle(1);
        this.graphics.beginFill(0xffffff);
        this.graphics.drawRect(0,0,_tf.width+10 , _tf.height+10);
        this.graphics.endFill();
        this.mouseChildren = false;
        this.buttonMode = true;
    }
}