LightsOut X

by Nos_lkSsvOhB
こっちに移行しました

説明:丸っぽいやつをどちらか一色に揃えてください

Instruction : Change all panels in the same color.
・Random Start : Standard mode. (Always solved)
・Setting Problem : Set the Problem by yourself, and solve.(Not always solved)

 Imitated : http://www.gamedesign.jp/flash/tacoyaki/tacoyaki.html
♥0 | Line 500 | Modified 2014-08-28 22:36:56 | MIT License
play

ActionScript3 source code

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

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    [SWF(backgroundColor="#ffffff",width="465",height="465",frameRate="30")]
    
    public class Main extends Sprite
    {
        private var opening:Sprite;
        
        public function Main():void
        {
            if (stage)
                init();
            else
                addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // initialization
            opening = new StartUp(this);
        }
    }
}

class PublicStatic
{
    public static var n:int;
}

import flash.display.*;
import flash.text.*;
import com.bit101.components.*;
import flash.events.Event;

class StartUp extends Sprite
{
    private var nInit:int = 4;
    private var bg1Sp:Sprite;
    private var title:TextField;
    private var titleTF:TextFormat;
    private var nSlider:HUISlider;
    private var randomStartButton:PushButton;
    private var setProblemButton:PushButton;
    
    public function StartUp(parent:Sprite)
    {
        super();
        parent.addChild(this);
        init();
    }
    
    private function init():void
    {
        parent.addChild(this);
        
        //set background1
        bg1Sp = new Sprite();
        bg1Sp.graphics.beginFill(0xd6d6d6);
        bg1Sp.graphics.drawRect(0, 50, 465, 365);
        bg1Sp.graphics.endFill();
        this.addChild(bg1Sp);
        
        //set text
        titleTF = new TextFormat();
        titleTF.font = "_sans";
        titleTF.size = 40;
        titleTF.color = 0xff6600;
        title = new TextField();
        with (title)
        {
            x = 120;
            y = 80;
            width = 465;
            height = 100;
            defaultTextFormat = titleTF;
            text = "LightsOut X";
        }
        this.addChild(title);
        
        //set slider
        nSlider = new HUISlider(this, 60, 180, "n×n", sliderOnChange);
        if (PublicStatic.n)
        {
            nSlider.value = PublicStatic.n;
        }
        else
        {
            nSlider.value = nInit;
            PublicStatic.n = nInit;
        }
        nSlider.maximum = 8;
        nSlider.minimum = 3;
        nSlider.labelPrecision = 0;
        nSlider.scaleX = 2;
        nSlider.scaleY = 2;
        
        //set random start button
        randomStartButton = new PushButton(this, 130, 250, "", buttonOnClick);
        randomStartButton.label = "Random Start";
        randomStartButton.scaleX = 2;
        randomStartButton.scaleY = 2;
        
        //set problem start button
        setProblemButton = new PushButton(this, 130, 320, "", buttonOnClick);
        setProblemButton.label = "Setting Problem";
        setProblemButton.scaleX = 2;
        setProblemButton.scaleY = 2;
    }
    
    private function sliderOnChange(e:Event):void
    {
        PublicStatic.n = Math.round(nSlider.value);
    }
    
    private function buttonOnClick(e:Event):void
    {
        var parentSp:Sprite = parent as Sprite;
        //remove this scene
        parent.removeChild(this);
        recurRemoveChild(this);
        
        switch (e.target.label)
        {
            case "Random Start": 
                //start game
                var startGame:Game = new Game(parentSp);
                break;
            case "Setting Problem": 
                //start setting 
                var startSetting:SetProblem = new SetProblem(parentSp);
                break;
        }
    }
    
    private function recurRemoveChild(sp:Sprite):void
    {
        while (sp && sp.numChildren > 0)
        {
            recurRemoveChild(sp.getChildAt(sp.numChildren - 1) as Sprite);
            sp.removeChildAt(sp.numChildren - 1);
        }
        sp = null;
    }
}

import flash.display.*;
import flash.events.*;
import flash.text.*;
import com.bit101.components.*;

class SetProblem extends Sprite
{
    private var n:int;
    private var lis:Array;
    private var sp:Vector.<Lights>;
    
    private var resetButton:PushButton;
    private var homeButton:PushButton;
    
    public function SetProblem(parent:Sprite)
    {
        super();
        parent.addChild(this);
        init();
    }
    
    private function init():void
    {
//            n = int(Math.random() * 6 + 3);
        n = PublicStatic.n;
        sp = new Vector.<Lights>();
        lis = new Array();
        Param.xOffset = (stage.stageWidth - (n - 1) * (2 * Param.r + Param.span)) / 2;
        Param.yOffset = (stage.stageHeight - (n - 1) * (2 * Param.r + Param.span)) / 2;
        for (var j:int = 0; j < n; j++)
        {
            lis[j] = new Array();
            for (var i:int = 0; i < n; i++)
            {
                var p:int = j * n + i;
                sp[p] = new Lights(j, i, this);
                sp[p].addEventListener(MouseEvent.CLICK, onClick);
                lis[j][i] = 0;
            }
        }
        
        //set try Button
        resetButton = new PushButton(this, 20, 430, "", tryOnClick);
        resetButton.label = "  try!  ";
        resetButton.scaleX = 1.5;
        resetButton.scaleY = 1.5;
        
        //set home Button
        homeButton = new PushButton(this, 280, 430, "", homeOnClick);
        homeButton.label = "home";
        homeButton.scaleX = 1.5;
        homeButton.scaleY = 1.5;
        
        start();
    }
    
    private function start(e:Event = null):void
    {
        this.addEventListener(Event.ENTER_FRAME, onEnter);
    }
    
    private function onEnter(e:Event = null):void
    {
        for (var j:int = 0; j < n; j++)
        {
            for (var i:int = 0; i < n; i++)
            {
                var p:int = j * n + i;
                sp[p].changeColor(lis[j][i]);
            }
        }
    }
    
    public function onClick(e:MouseEvent = null):void
    {
        var index:Array = e.target.name.split("_");
        change(index[0], index[1]);
    }
    
    private function change(j:int, i:int):void
    {
        lis[j][i] ^= 1;
    }
    
    private function tryOnClick(e:Event = null):void
    {
        var parentSp:Sprite = parent as Sprite;
        //remove this scene
        parent.removeChild(this);
        recurRemoveChild(this);
        var newGame:Game = new Game(parentSp, String(lis));
    }
    
    private function homeOnClick(e:Event = null):void
    {
        var parentSp:Sprite = parent as Sprite;
        //remove this scene
        parent.removeChild(this);
        recurRemoveChild(this);
        var newGame:StartUp = new StartUp(parentSp);
    }
    
    private function recurRemoveChild(sp:Sprite):void
    {
        while (sp != null && sp.numChildren > 0)
        {
            recurRemoveChild(sp.getChildAt(sp.numChildren - 1) as Sprite);
            sp.removeChildAt(sp.numChildren - 1);
        }
        sp = null;
    }
}

import flash.display.*;
import flash.events.*;
import flash.text.*;
import com.bit101.components.*;

class Game extends Sprite
{
    private var n:int;
    private var lis:Array;
    private var tempLis:String;
    private var ans1:Array;
    private var ans0:Array;
    private var ans1Str:String;
    private var ans0Str:String;
    private var sp:Vector.<Lights>;
    private var inArr:Array;
    private var setTempLis:String;
    
    private var clearTF:TextFormat = new TextFormat();
    private var clearText:TextField = new TextField();
    private var invTF:TextFormat = new TextFormat();
    private var invText:TextField = new TextField();
    private var resetButton:PushButton;
    private var homeButton:PushButton;
    
    public function Game(parent:Sprite, setLis:String = null)
    {
        super();
        parent.addChild(this);
        if (setLis != null)
            setTempLis = setLis;
        init();
    }
    
    private function init():void
    {
//            n = int(Math.random() * 6 + 3);
        n = PublicStatic.n;
        sp = new Vector.<Lights>();
        lis = new Array();
        ans1 = new Array();
        ans0 = new Array();
        inArr = new Array(n * n);
        Param.xOffset = (stage.stageWidth - (n - 1) * (2 * Param.r + Param.span)) / 2;
        Param.yOffset = (stage.stageHeight - (n - 1) * (2 * Param.r + Param.span)) / 2;
        for (var j:int = 0; j < n; j++)
        {
            lis[j] = new Array();
            for (var i:int = 0; i < n; i++)
            {
                var p:int = j * n + i;
                sp[p] = new Lights(j, i, this);
                sp[p].addEventListener(MouseEvent.CLICK, onClick);
                lis[j][i] = 0;
                ans1[p] = 1;
                ans0[p] = 0;
                //investigate
                inArr[p] = 0;
            }
        }
        ans0Str = String(ans0);
        ans1Str = String(ans1);
        
        //set reset Button
        resetButton = new PushButton(this, 40, 430, "", resetOnClick);
        resetButton.label = "reset";
        resetButton.scaleX = 1.5;
        resetButton.scaleY = 1.5;
        
        //set home Button
        homeButton = new PushButton(this, 280, 430, "", homeOnClick);
        homeButton.label = "home";
        homeButton.scaleX = 1.5;
        homeButton.scaleY = 1.5;
        
        shuffle();
        //List str set
        if (setTempLis != null)
        {
            tempLis = setTempLis;
            str2DimArr(setTempLis);
                //no set
        }
        else
        {
            tempLis = String(lis);
            //investigate
            for (var c:int = 0; c < inArr.length; c++)
                inArr[c] = 0;
        }
        start();
    }
    
    private function start(e:Event = null):void
    {
        trace("-------");
        this.addEventListener(Event.ENTER_FRAME, onEnter);
    }
    
    private function onEnter(e:Event = null):void
    {
        for (var j:int = 0; j < n; j++)
        {
            for (var i:int = 0; i < n; i++)
            {
                var p:int = j * n + i;
                sp[p].changeColor(lis[j][i]);
            }
        }
        if (String(lis) == ans1Str || String(lis) == ans0Str)
        {
            finished();
        }
    }
    
    public function onClick(e:MouseEvent = null):void
    {
        var index:Array = e.target.name.split("_");
        change(index[0], index[1]);
    }
    
    private function finished():void
    {
        this.removeEventListener(Event.ENTER_FRAME, onEnter);
        
        //clear text
        clearTF.font = "_sans";
        clearTF.size = 60;
        clearTF.color = 0xcc4444;
        clearTF.bold = true;
        
        with (clearText)
        {
            x = 140;
            y = 180;
            width = 465;
            height = 100;
            defaultTextFormat = clearTF;
            text = "Clear!!";
            selectable = false;
        }
        this.addChild(clearText);
        
        //investigate text
        invTF.font = "_sans";
        invTF.size = 10;
        invTF.color = 0xffffff;
        
        with (invText)
        {
            x = 455;
            y = 10;
            width = 200;
            height = 200;
            defaultTextFormat = invTF;
            text = "";
        }
        this.addChild(invText);
        
        //investigate
        var str:String = "";
        for (var i:int = 0; i < n * n; i++)
        {
            str += inArr[i] + " ";
            if (i % n == n - 1)
            {
                trace(str);
                invText.appendText(str + "\n");
                str = "";
            }
        }
    }
    
    private function shuffle():void
    {
        var rj:int, ri:int;
        var rn:int = int(Math.random() * n * n / 2 + n * n / 2);
        for (var i:int = 0; i < rn; i++)
        {
            rj = int(Math.random() * n);
            ri = int(Math.random() * n);
            change(rj, ri);
        }
    }
    
    private function change(j:int, i:int):void
    {
        var pj:int = j;
        var pi1:int = i;
        var pi2:int = i;
        
        lis[j][i] ^= 1;
        //investigate
        inArr[j * n + i] ^= 1;
        
        pj = j - 1;
        pi1 = i - 1;
        pi2 = i + 1;
        while (pj >= 0)
        {
            if (pi1 >= 0)
            {
                lis[pj][pi1] ^= 1;
            }
            if (pi2 < n)
            {
                lis[pj][pi2] ^= 1;
            }
            pj--;
            pi1--;
            pi2++;
        }
        pj = j + 1;
        pi1 = i - 1;
        pi2 = i + 1;
        while (pj < n)
        {
            if (pi1 >= 0)
            {
                lis[pj][pi1] ^= 1;
            }
            if (pi2 < n)
            {
                lis[pj][pi2] ^= 1;
            }
            pj++;
            pi1--;
            pi2++;
        }
    }
    
    private function resetOnClick(e:Event = null):void
    {
        if (clearText.parent)
        {
            this.removeChild(clearText);
            this.removeChild(invText);
        }
        str2DimArr(tempLis);
        start();
    }
    
    private function homeOnClick(e:Event = null):void
    {
        var parentSp:Sprite = parent as Sprite;
        //remove this scene
        parent.removeChild(this);
        recurRemoveChild(this);
        var newGame:StartUp = new StartUp(parentSp);
    }
    
    private function recurRemoveChild(sp:Sprite):void
    {
        while (sp != null && sp.numChildren > 0)
        {
            recurRemoveChild(sp.getChildAt(sp.numChildren - 1) as Sprite);
            sp.removeChildAt(sp.numChildren - 1);
        }
        sp = null;
    }
    
    private function str2DimArr(str:String):void
    {
        var tempArr:Array = str.split(",");
        for (var j:int = 0, c:int = 0; j < n; j++)
        {
            for (var i:int = 0; i < n; i++)
            {
                lis[j][i] = tempArr[c];
                //investigate
                inArr[c] = 0;
                c++;
            }
        }
    }
}

class Param
{
    //public static var colorFace:uint = 0xFF1721;
    public static var colorFace:uint = 0xff7822;
    public static var colorBack:uint = 0xffffff;
    public static var span:int = 10;
    public static var r:int = 20;
    public static var xOffset:int = 20;
    public static var yOffset:int = 20;
}

import flash.display.Sprite;

class Lights extends Sprite
{
    //0:back , 1:face
    private var faceState:int = 0;
    
    public function Lights(j:int, i:int, parent:Sprite):void
    {
        super();
        graphics.lineStyle(1, 0x000000, 0.7);
        graphics.beginFill(Param.colorBack, 1);
        graphics.drawCircle(0, 0, Param.r);
        graphics.endFill();
        x = Param.xOffset + (2 * Param.r + Param.span) * i;
        y = Param.yOffset + (2 * Param.r + Param.span) * j;
        name = "" + j + "_" + i;
        buttonMode = true;
        parent.addChild(this);
    }
    
    public function changeColor(color1or0:int):void
    {
        if (color1or0 != faceState)
        {
            graphics.clear();
            graphics.lineStyle(1, 0x000000, 0.7);
            if (color1or0 == 0)
            {
                graphics.beginFill(Param.colorBack, 1);
            }
            else
            {
                graphics.beginFill(Param.colorFace, 1);
            }
            graphics.drawCircle(0, 0, Param.r);
            graphics.endFill();
        }
        faceState = color1or0;
    }
}