Strong3*3

by YAZUMA forked from 3*3 (diff: 201)
♥0 | Line 542 | Modified 2010-07-09 09:36:16 | MIT License
play

ActionScript3 source code

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

// forked from YAZUMA's 3*3
// forked from YAZUMA's 3*3
package {
    import flash.display.*;
    import flash.text.*;
    import flash.events.*;
   import fl.controls.*;
    import flash.utils.Timer;
    import mx.collections.ArrayCollection;
    [SWF(backgroundColor=0xffffff,width=361,height=450,frameRate=60)]
    
    public class sp extends Sprite {
        public var s0:Sprite = new Sprite;    //マス作成
        public var s:Sprite=new Sprite;    //マス目作成
        public var s1:Sprite = new Sprite;    //○×
        public var s2:Sprite = new Sprite;    //WinLoseDraw
        public var s3:Sprite = new Sprite;
        private var result_tf:TextField = new TextField();
        private var HW:int = 360;            //範囲
        private var square:int = 3;            //マスの数
        public var remain:int = square*square;    //残りのマスの数
        private var used:Array = [(square * square) + 1];    //各マスを使用したか
        private var WinLose:Array = [(square * square) + 1];    //○か×か
        private var Win:int = 0;
        private var Lose:int = 0;
        private var Draw_num:int = 0;
        public var jadgement:Boolean = false;  //勝敗がついたか
        public var HardMode:Boolean = false;    //Hardモード
        public var tf:TextField = new TextField();
        public var tf2:TextField = new TextField();
        public var tf4:TextField = new TextField();
        public var timer:Timer = new Timer(1000, 1);
        [Bindable] public var data:ArrayCollection = new ArrayCollection(
                [ { xy: 0, WinLose: 0} ]);
        //private var display:BitmapData = new BitmapData(600, 300, false, 0xffffff);
        public function sp():void{
           initition();
        }
        private function initition():void{
           for(var u:int = 1;u < square*square + 1;u++){
               used[u] = false;
           }
           for(u = 1;u < square*square+1;u++){
               WinLose[u] = 0;
           }
            s0.buttonMode = true;
            s0.graphics.beginFill(0xffffff);
            s0.graphics.drawRect(0, 0, HW, HW);
            s0.addEventListener(MouseEvent.CLICK, s_click);
            addChild(s0);
            tf4.background = true;
            tf4.width = 120;
            tf4.height = 120;
            tf4.x = 350;
            tf4.y = 380;
            tf4.defaultTextFormat = new TextFormat("_typeWriter", 60, 0x191970, true);
            tf4.text = "";
            addChild(tf4);
            s.graphics.lineStyle(3, 0x990000, .75);
            s.graphics.beginFill(0x00FF00);
            s.graphics.moveTo(0, 0); 
            s.graphics.lineTo(0, HW);
            s.graphics.moveTo(0, 0); 
            s.graphics.lineTo(HW, 0);
            s.graphics.moveTo(HW, 0);
            s.graphics.lineTo(HW, HW);
            s.graphics.moveTo(0, HW); 
            s.graphics.lineTo(HW, HW);
            HW /= square;
            for(var i:int = 0;i < square + 1;i++){
                s.graphics.moveTo(HW * i, 0); 
                s.graphics.lineTo(HW * i, 360);
                s.graphics.moveTo(0, HW * i); 
                s.graphics.lineTo(360, HW * i);
            }
            addChild(s);
            //↑ 升作成
            tf.background = true;
            tf.defaultTextFormat = new TextFormat("_typeWriter", 15, 0xee4000, true);
            tf.width = 200;
            tf.x = 120;
            tf.y = 370;
            tf.text = "Mode : Normal";
            addChild(tf);
            tf2.background = true;
            tf2.defaultTextFormat = new TextFormat("_typeWriter", 11, 0xff6a6a, true);
            tf2.width = 200;
            tf2.x = 104;
            tf2.y = 390;
            tf2.text = "Win: "+Win+" Lose: "+Lose+" Draw: "+Draw_num;
            addChild(tf2);
            var button:CustomSimpleButton = new CustomSimpleButton(265, 370, 268, 375, "Clear");
            button.addEventListener(MouseEvent.CLICK, buttonClick);
            addChild(button);
            var button2:CustomSimpleButton = new CustomSimpleButton(30, 370, 40, 375, "Mode");
            button2.addEventListener(MouseEvent.CLICK, buttonClick2);
            addChild(button2);
            var tf3:TextField = new TextField();
            tf3.defaultTextFormat = new TextFormat("", 20, 0x0, true);
            tf3.autoSize = "left";
            addChild(tf3);
            var button3:CustomSimpleButton = new CustomSimpleButton(30, 370, 40, 375, "Game Change");
            timer.addEventListener(TimerEvent.TIMER, Count_num);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, Time_out);
            if(Math.floor(Math.random()*(1-0+1)) == 0){
                var xy:int = decide_npc_hand();
                npc_hand(xy);
            }
        }
        private function Count_num(e:TimerEvent):void{
            if(jadgement == true){
                timer.reset();
                tf4.text = "";
            }
            tf4.text = ""+(timer.repeatCount-timer.currentCount);
        }
        private function Time_out(e:TimerEvent):void{
            var jadge_result:int;
            tf4.text = "";
            timer.reset();
            do{
                var hand:int = Math.floor(Math.random()*(square*square-1+1))+1;
            }while(used[hand] == true && remain > 0);
            var s_x:int = int(hand % square);
            if(s_x == 0)s_x = square;
            var s_y:int = int(hand - s_x + square) / square;
            if(jadgement == false)user_hand(s_x, s_y, hand);
            jadge_result = jadge();
            hand = decide_npc_hand();
            if(remain > 0 && jadgement == false)npc_hand(hand);
            jadge_result = jadge();
            if(jadgement == true)result_word(jadge_result);
            
        }
        private function buttonClick(e:MouseEvent):void{
            var button:Button = e.target as Button;
            init();
        }
        private function buttonClick2(e:MouseEvent):void{
            var button:Button = e.target as Button;
            Win = 0;
            Lose = 0;
            Draw_num = 0;
            tf2.text = "Win: "+Win+" Lose: "+Lose+" Draw: "+Draw_num;
            if(tf.text == "Mode : Wonder"){               
                tf.text = "Mode : Normal";
            }else if(tf.text == "Mode : Normal"){
                tf.text = "Mode : Hard";               
            }else if(tf.text == "Mode : Hard"){
                tf.text = "Mode : Wonder";
            }
            init();
        }
        public function s_click(evt:MouseEvent):void{
            if(jadgement == false){
                var x:int= int(mouseX);
                var y:int = int(mouseY);
                var xy:int = 0;
                var mas:int = 0;
                var jadge_result:int;
                x /= HW;
                x++;
                y /= HW;
                y++;
                mas = square * (y-1) + x;
                if(used[mas] == false){
                        timer.reset();              
                    user_hand(x, y, mas);
                    jadge_result = jadge();
                    xy = decide_npc_hand();
                    if(remain > 0 && jadgement == false)npc_hand(xy);
                    jadge_result = jadge();
                    if(jadgement == true)result_word(jadge_result);
                }
            }
        }//s_click
        public function user_hand(x:int, y:int, mas:int):void{
            s1.graphics.lineStyle(2, 0xff8c00);
            s1.graphics.beginFill(0xff8c00, 1);
            s1.graphics.drawCircle(HW*(2*x-1)/2, HW*(2*y-1)/2,(HW -int(HW/6))/ 2);
            s1.graphics.endFill();
            addChild(s1);
            used[mas] = true;
            remain--;
            WinLose[mas] = 1;
        }//user_hand
        public function npc_hand(xy:int):void{
            var x:int = int(xy % square);
            if(x == 0)x = square;
            var y:int = int(xy - x + square) / square;
            var hw:int = int(HW / 6);
            s1.graphics.lineStyle(7, 0x9acd32);
            s1.graphics.beginFill(0xb3ee3a, 1);
            s1.graphics.moveTo(hw+HW*(x-1), hw+HW*(y-1));
            s1.graphics.lineTo(HW*x-hw, HW*y-hw);
            s1.graphics.moveTo(hw+HW*(x-1), HW*y-hw);
            s1.graphics.lineTo(HW*x-hw, hw+HW*(y-1));
            s1.graphics.endFill();
            addChild(s1);
            used[xy] = true;
            remain--;
            WinLose[xy] = -1;
            if(tf.text == "Mode : Wonder"){
                tf4.text = "1";
                timer.start();
            }
        }//npc_hand
        public function decide_npc_hand():int{
            var xy:int = 0;
            if(tf.text == "Mode : Normal"){
                do{
                    xy = Math.floor(Math.random()*(square*square-1+1))+1;
                }while(used[xy] == true && remain > 0);
            }else if(tf.text == "Mode : Hard"){
                xy = HARD();
            }else if(tf.text == "Mode : Wonder"){
                if(Math.floor(Math.random()*(2-0+1)) > 0)xy = HARD();
                else{
                    do{
                        xy = Math.floor(Math.random()*(square*square-1+1))+1;
                    }while(used[xy] == true && remain > 0);   
                }
            }
            return xy;
        }//decide_npc_hand
        public function WONDER(_xy:int, _WinLose:int):void{
            data.addItem({xy: _xy, WinLose: _WinLose});
            if(data.length >= 8){
                used[data.getItemAt(1).xy] = false;
                WinLose[data.getItemAt(1).WinLose] = 0;
                data.removeItemAt(1);
                removeChild(s1);
                for(var n:int = 1;n < data.length-1;n++){
                    if(data.getItemAt(n).WinLose == 1){
                        var x:int = int(data.getItemAt(n).xy % square);
                        if(x == 0)x = square;
                        var y:int = int(data.getItemAt(n).xy - x + square) / square;
                        s1.graphics.lineStyle(2, 0xff8c00);
                        s1.graphics.beginFill(0xff8c00, 1);
                        s1.graphics.drawCircle(HW*(2*x-1)/2, HW*(2*y-1)/2,(HW -int(HW/6))/ 2);
                        s1.graphics.endFill();
                        addChild(s1); 
                    }else if(data.getItemAt(n).WinLose == -1){
                        x = int(data.getItemAt(n).xy % square);
                        if(x == 0)x = square;
                        y = int(data.getItemAt(n).xy - x + square) / square;
                        var hw:int = int(HW / 6); 
                        s1.graphics.lineStyle(7, 0x9acd32);
                        s1.graphics.beginFill(0xb3ee3a, 1);
                        s1.graphics.moveTo(hw+HW*(x-1), hw+HW*(y-1));
                        s1.graphics.lineTo(HW*x-hw, HW*y-hw);
                        s1.graphics.moveTo(hw+HW*(x-1), HW*y-hw);
                        s1.graphics.lineTo(HW*x-hw, hw+HW*(y-1));
                        s1.graphics.endFill();
                        addChild(s1);
                    }
                }
            }
        }//WONDER
        public function HARD():int{
            //WinLose[1to9]
            var reach:Boolean = false;
            var reach_num:int = square - 1;
            var reach1:int = 0;//よこ
            var reach2:int = 0;//たて
            var reach3:int = 0;//みぎななめ
            var reach4:int = 0;//ひだりななめ
            for(var i:int = 0; i < square;i++){
                for(var i2:int = 1;i2 <= square;i2++){
                    reach1 += WinLose[i2 + i * square];
                    reach2 += WinLose[i + 1 + (i2-1)*square];
                    if(i + 1 + (i2-1)*(square+1) <= square*square)reach3 += WinLose[i + 1 + (i2-1)*(square+1)];
                    var jn:int = i + 1 + (i2-1)*(square-1);
                    if(jn <= square*square){
                        var x:int = int(jn % square);
                        if(x == 0)x = square;
                        var y:int = int(jn - x + square) / square;
                        if(x*y >= square && x*y < square*(square-1))reach4 += WinLose[jn];
                        else {
                           reach4 = square*square;                       
                        }
                    }
                }
                var my_reach_check:int = myreach();
                if(my_reach_check != 0)return my_reach_check;
                if(reach1==reach_num||reach2==reach_num||reach3==reach_num||reach4==reach_num){
                   if(reach1 == reach_num){
                        for(var i3:int = 1;i3 <= square;i3++){
                            if(used[i3 + i * square] == false){
                                return i3 + i * square;
                            }
                        }
                    }if(reach2 == reach_num){
                        for(i3 = 1;i3 <= square;i3++){
                            if(used[i + 1 + (i3-1)*square] == false){
                                return i + 1 + (i3-1)*square;
                            }
                        }
                    }if(reach3 == reach_num){
                        for(i3 = 1;i3 <= square;i3++){
                            if(used[i + 1 + (i3-1)*(square+1)] == false && i + 1 + (i3-1)*(square+1) <= square*square){
                                return i + 1 + (i3-1)*(square+1);
                            }
                        }
                    }if(reach4 == reach_num){
                        for(i3 = 1;i3 <= square;i3++){
                            if(used[i + 1 + (i3-1)*(square-1)] == false){
                                return i + 1 + (i3-1)*(square-1);
                            }
                        }
                    }
                }
                reach1 = 0;
                reach2 = 0;
                reach3 = 0;
                reach4 = 0;
            }

            if(remain == 9)xy = 5;
            if(remain < 9){
                var count:int = 0;
                if(used[5]== true){
                    do{
                        xy = Math.floor(Math.random()*(3-0+1));
                        xy *= square;
                        if(xy == 0)xy = 1;
                        if(xy == 6)xy++;
                        count++;                    
                    }while(used[xy] == true && count < 30);
                    if(count == 30){
                        do{
                            var xy:int = Math.floor(Math.random()*(square*square-1+1))+1;
                        }while(used[xy] == true && remain > 0);
                    }
                }else xy = 5;
            }
            if(remain == 6){
                var num:int = WinLose[1]+WinLose[3]+WinLose[7]+WinLose[9];
                if(num == 2){
                    do{
                        xy = Math.floor(Math.random()*(4-1+1))+1;
                    }while(used[xy] == true);
                    xy *= 2;
                }else if(num == 1 && WinLose[5] != 1){
                    if(WinLose[2] == 1 || WinLose[8] ==1){
                        if(WinLose[1] == 1)xy = 7;
                        if(WinLose[3] == 1)xy = 9;
                        if(WinLose[7] == 1)xy = 1;
                        if(WinLose[9] == 1)xy = 3;
                    }else{
                        if(WinLose[1] == 1)xy = 3;
                        if(WinLose[3] == 1)xy = 1;
                        if(WinLose[7] == 1)xy = 9;
                        if(WinLose[9] == 1)xy = 7;
                    }
                }
            }
            return xy;
        }//HARD
        public function myreach():int{
            var reach_num:int = square - 1;
            var reach1:int = 0;//よこ
            var reach2:int = 0;//たて
            var reach3:int = 0;//みぎななめ
            var reach4:int = 0;//ひだりななめ
            var return_num:int = 0;
            for(var i:int = 0; i < square;i++){
                for(var i2:int = 1;i2 <= square;i2++){
                    reach1 += WinLose[i2 + i * square];
                    reach2 += WinLose[i + 1 + (i2-1)*square];
                    if(i + 1 + (i2-1)*(square+1) <= square*square)reach3 += WinLose[i + 1 + (i2-1)*(square+1)];
                    var jn:int = i + 1 + (i2-1)*(square-1);
                    if(jn <= square*square){
                        var x:int = int(jn % square);
                        if(x == 0)x = square;
                        var y:int = int(jn - x + square) / square;
                        if(x*y >= square && x*y < square*(square-1))reach4 += WinLose[jn];
                        else {
                           reach4 = square*square;                       
                        }
                    }
                }
                
                     if(reach1 == -reach_num){
                        for(var i3:int = 1;i3 <= square;i3++){
                            if(used[i3 + i * square] == false){
                                return i3 + i * square;
                            }
                        }
                    }if(reach2 == -reach_num){
                        for(i3 = 1;i3 <= square;i3++){
                            if(used[i + 1 + (i3-1)*square] == false){
                                return i + 1 + (i3-1)*square;
                            }
                        }
                    }if(reach3 == -reach_num){
                        for(i3 = 1;i3 <= square;i3++){
                            if(used[i + 1 + (i3-1)*(square+1)] == false && i + 1 + (i3-1)*(square+1) <= square*square){
                                return i + 1 + (i3-1)*(square+1);
                            }
                        }
                    }if(reach4 == -reach_num){
                        for(i3 = 1;i3 <= square;i3++){
                            if(used[i + 1 + (i3-1)*(square-1)] == false){
                                return i + 1 + (i3-1)*(square-1);
                            }
                        }
                    }
                reach1 = 0;
                reach2 = 0;
                reach3 = 0;
                reach4 = 0;
            }
            return 0;
        }//myreach
        public function jadge():int{
            //横(+1),縦(+square),斜め(+square+1)に対して判定を行う
            var result:int = 0;        //勝ち負け
            var jadge_num1:int = 0;  //横
            var jadge_num2:int = 0;  //縦
            var jadge_num3:int = 0;  //右斜め
            var jadge_num4:int = 0;  //左斜め
            //i:y, i2:x
            for(var i:int = 0;i < square;i++){
                for(var i2:int = 1;i2 <= square;i2++){
                    jadge_num1 += WinLose[i2 + i * square];
                    jadge_num2 += WinLose[i + 1 + (i2-1)*square];
                    if(i + 1 + (i2-1)*(square+1) <= square*square)jadge_num3 += WinLose[i + 1 + (i2-1)*(square+1)];
                    var jn:int = i + 1 + (i2-1)*(square-1);
                    if(jn <= square*square){
                        var x:int = int(jn % square);
                        if(x == 0)x = square;
                        var y:int = int(jn - x + square) / square;
                        if(x*y >= square && x*y < square*(square-1))jadge_num4 += WinLose[jn];
                        else jadge_num4 = square*square;
                    }
                    //if((i + 1 + (i2-1)*(square-1)) % square != 0)jadge_num4 += WinLose[i + 1 + (i2-1)*(square-1)];
                    //if((i + 1 + (i2-1)*(square-1)) == square)jadge_num4 += WinLose[i + 1 + (i2-1)*(square-1)];
                    
                    if(jadge_num1 == square || jadge_num1 == -square
                     ||jadge_num2 == square || jadge_num2 == -square
                     ||jadge_num3 == square || jadge_num3 == -square
                     ||jadge_num4 == square || jadge_num4 == -square){
                        jadgement = true;
                        if(jadge_num1 == square || jadge_num2 == square || jadge_num3 == square || jadge_num4 == square)
                            result = 2;
                        else result = 1;
                        return result;
                    }
                }
                jadge_num1 = 0;
                jadge_num2 = 0;
                jadge_num3 = 0;
                jadge_num4 = 0;
            }
            if(remain == 0)jadgement = true;
            return 0;
        } //jadge
        public function result_word(result_num:int):void{
            var text_format:TextFormat=new TextFormat("Arial",42,0x1e90ff,true,null,null,null,null,TextFormatAlign.JUSTIFY);
            result_tf.z = -500;
            if(result_num == 2){
                result_tf.text = "Win!";
                Win++;                
            }else if(result_num == 1){
                result_tf.text = "Lose";                
                Lose++;
            }else{
                result_tf.text = "Draw";
                Draw_num++;
            }
            tf2.text = "Win: "+Win+" Lose: "+Lose+" Draw: "+Draw_num;
            result_tf.width = 150; //表示テキスト横幅
            result_tf.height = 90;   //表示テキスト縦幅
            result_tf.x = 135;         //表示テキスト横位置
            result_tf.y = 165;         //表示テキスト縦位置
            result_tf.wordWrap= true
            result_tf.multiline = true;
            result_tf.textColor = 0xff0000;
            result_tf.autoSize=TextFieldAutoSize.LEFT;
            result_tf.setTextFormat(text_format);
            s2.addChild(result_tf);
            addChild(s2);      //追加
            this.addEventListener(Event.ENTER_FRAME, watch);
        }//result_word
        private function watch(e:Event):void{
            if(result_tf.z < -100)result_tf.z +=2;
        }
        public function init():void{
            s1.graphics.clear();
            if(jadgement == true)s2.removeChild(result_tf);
            jadgement = false;
            for(var u:int = 1;u < square*square + 1;u++){
               used[u] = false;
           }
           for(u = 1;u < square*square+1;u++){
               WinLose[u] = 0;
           }
           remain = square*square;
           tf4.text = "";
           timer.reset();
           for(var n:int = 1; n < data.length;n++){
               data.removeItemAt(n);
           }
           if(Math.floor(Math.random()*(1-0+1)) == 0){
                var xy:int = decide_npc_hand();
                npc_hand(xy);
                /*if(tf.text == "Mode : Wonder"){
                    tf4.text = "3";
                    timer.start();
                }*/
            }
        }//init
    }
}

import flash.display.Sprite;
import flash.display.DisplayObject;
import flash.display.Shape;
import flash.display.SimpleButton;

class CustomSimpleButton extends SimpleButton {
    private var upColor:uint   = 0xff8c00;
    private var overColor:uint = 0xff4500;
    private var downColor:uint = 0x8b3626;
    private var size:uint      = 70;

    public function CustomSimpleButton(x:int, y:int, xx:int, yy:int, name:String) {
        downState      = new ButtonDisplayState(downColor, size, x, y, xx, yy, name);
        overState      = new ButtonDisplayState(overColor, size, x, y, xx, yy, name);
        upState        = new ButtonDisplayState(upColor, size, x, y, xx, yy, name);
        hitTestState   = new ButtonDisplayState(upColor, size, x, y, xx, yy, name);
        hitTestState.x = -(size / 10);
        hitTestState.y = hitTestState.x;
        useHandCursor  = true;
    }
}

import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFormat;

class ButtonDisplayState extends Sprite {
    private var bgColor:uint;
    private var size:uint;

    public function ButtonDisplayState(bgColor:uint, size:uint, x:int, y:int, xx:int, yy:int, name:String) {
        this.bgColor = bgColor;
        this.size    = size;
        draw(x, y, xx, yy, name);
    }

    private function draw(x:int, y:int, xx:int, yy:int, name:String):void {
        graphics.lineStyle(2, bgColor);
        graphics.beginFill(0xffffff);
        graphics.drawRoundRect(x, y, size, size/2, 15);
        graphics.endFill();
        
        var tf:TextField = new TextField();
        tf.defaultTextFormat = new TextFormat("_typeWriter", 20, bgColor, true);
        tf.text = name;
        tf.autoSize = "left";
        tf.x = xx;
        tf.y = yy;
        tf.selectable = false;
        addChild(tf);

    }
}

Forked