flash on 2009-9-10
♥0 |
Line 139 |
Modified 2009-09-10 16:27:01 |
MIT License
archived:2017-03-30 04:49:48
ActionScript3 source code
/**
* Copyright uwi ( http://wonderfl.net/user/uwi )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/9c8s
*/
package {
import flash.display.*;
import flash.text.TextField;
public class Nikaku extends Sprite {
private var _tf : TextField;
private var _f : Array;
private var _t : Array;
private var _w : int;
private var _h : int;
private var _n : int;
private var _ftop : Number;
private var _fbottom : Number;
private var _fleft : Number;
private var _fright : Number;
private var _bmd : BitmapData;
private var _bmp : Bitmap;
public function Nikaku() {
addChild(_tf = new TextField());
_tf.width = 300;
_tf.height = 300;
init(10, 10, 2);
initIF();
p();
_tf.appendText("" + areErasable(0, 0, 3, 0));
/*
// TODO 手で解けるようにする
// TODO アルゴリズム完成
algo();
*/
}
private function initIF() : void
{
_bmd = new BitmapData(20 * _h, 20 * _w, false, 0x000000);
_bmp = new Bitmap(_bmd);
addChild(_bmp);
var canvas : Sprite = new Sprite();
var tf : TextField = new TextField();
canvas.addChild(tf);
tf.autoSize = "center";
tf.text = "5";
tf.x = 10 - tf.width / 2;
tf.y = 10 - tf.height / 2;
with(canvas.graphics){
lineStyle(1, 0xffffff);
beginFill(0x9999ff);
drawRoundRect(0, 0, 20, 20, 5, 5);
endFill();
}
_bmd.lock();
_bmd.draw(canvas);
_bmd.unlock();
}
/*
private function algo() : Boolean
{
var i : int, j : int;
var ct : Array = new Array(_n + 1);
for(i = 0;i < _n + 1;i++)ct[i] = [];
for(i = 1;i <= _w;i++){
for(j = 1;j <= _h;j++){
if(_f[i][j] > 0)ct[_f[i][j]].push([i - 1, j - 1]);
}
}
// TODO 各数字で、2対以上あれば削除可能なら分岐、1対あれば優先削除
}
*/
private function areErasable(ax : int, ay : int, bx : int, by : int) : Array
{
if(_f[ax + 1][ay + 1] != _f[bx + 1][by + 1])return ["ほったらけ"];
var i : int, j : int, k : int;
for(i = 0;i < _h + 2;i++){
for(j = 0;j < _w + 2;j++){
_t[i][j] = null;
}
}
_t[ax + 1][ay + 1] = [-1, -1];
do{
var changed : Boolean = false;
for(i = 0;i < _w + 2;i++){
for(j = 0;j < _h + 2;j++){
if(_t[i][j] != null){
for(k = 0;k < 4;k++){
var xx : int = i + DIR[k][0];
var yy : int = j + DIR[k][1];
if(xx == bx + 1 && yy == by + 1){
_tf.appendText("キテマスヨー");
var ret : Array = [k];
var x : int = i;
var y : int = j;
while(x != ax + 1 || y != ay + 1){
var kk : int = _t[x][y][1];
ret.unshift(kk);
x -= DIR[kk][0];
y -= DIR[kk][1];
}
return ret;
}
var nturn : int = _t[i][j][0] + (k == _t[i][j][1] ? 0 : 1);
if(nturn <= 2 &&
xx >= 0 && xx <= _w + 2 &&
yy >= 0 && yy <= _h + 2 &&
_f[xx][yy] == 0 &&
(_t[xx][yy] == null || _t[xx][yy][0] > nturn)){
_t[xx][yy] = [nturn, k];
changed = true;
}
}
}
}
}
}while(changed)
return [];
}
private static const DIR : Array = [[0, 1], [1, 0], [0, -1], [-1, 0]];
private function p() : void
{
var s : String = "";
for(var i : int = 0;i < _w + 2;i++){
for(var j : int = 0;j < _h + 2;j++){
s += _f[j][i] + " ";
}
s += "\n";
}
_tf.text = s;
}
private function init(w : int, h : int, dup : int) : void
{
_w = w;
_h = h;
var i : int, j : int;
_f = new Array(h + 2);
_t = new Array(h + 2);
for(i = 0;i < h + 2;i++){
_f[i] = new Array(w + 2);
for(j = 0;j < w + 2;j++){
_f[i][j] = 0;
}
_t[i] = new Array(w + 2);
}
_n = w * h / 2 / dup;
var x : int, y : int;
x = y = 0;
outer: for(i = 0;i < _n;i++){
for(j = 0;j < dup * 2;j++){
_f[x + 1][y + 1] = i + 1;
x++;
if(x == w){
y++;
x = 0;
if(y == h){
break outer;
}
}
}
}
/*
// shuffle
for(i = 0;i < w * h - 1;i++){
j = Math.random() * (w * h - i - 1) + i + 1;
var d : int = _f[i / w + 1][i % w + 1];
_f[i / w + 1][i % w + 1] = _f[j / w + 1][j % w + 1];
_f[j / w + 1][j % w + 1] = d;
}
*/
}
}
}