/**
* 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;
}
}