Gốc > Tổng hợp > Giao lưu, giải trí >

(test) code AS2 của bài toán tháp Hanoi (bản đơn giản)

var disk_count:Number = 4;
var column_pos:Array = [80, 235, 390];
var column:Array = [[], [], []];
var stack:Array = [];
var y_top:Number = 100;
var y_bottom:Number = 350;
var curr_step:Number = 0;
var itv:Number = 0;

function init():Void {
    var disk_holder_mc:MovieClip = this.createEmptyMovieClip("holder", 0);
    var dscale:Number = (30 + disk_count * 3) / (disk_count - 1);
    for (var i:Number = 0; i < disk_count; ++i) {
        var mc:MovieClip = disk_holder_mc.createEmptyMovieClip("disk" + i, i);
        column[0][i] = mc;
        mc.lineStyle(1, 0xFF6600);
        mc.beginFill(0xFF0000);
        mc.moveTo(-50, -5);
        mc.lineTo(50, -5);
        mc.lineTo(50, 5);
        mc.lineTo(-50, 5);
        mc.lineTo(-50, -5);
        mc.endFill();
        mc._xscale = 100 - i * dscale;
        mc._x = column_pos[0];
        mc._y = y_bottom - i * mc._height;
    }
}

function calculate(count:Number, src:Number, target:Number, temp:Number):Void {
    if (count <= 0) return;
    calculate(count - 1, src, temp, target);
    stack.push({s: src, t: target });
    calculate(count - 1, temp, target, src);
}

function moveDisk(mc:MovieClip, src:Number, target:Number):Void {
    clearInterval(itv);
    var attr:Array = [null, "_y", "_x", "_y"];
    var val:Array = [null, y_top, column_pos[target], y_bottom - column[target].length * mc._height];
    if (++curr_step < 4) {
        itv = setInterval(moveMc, 50, mc, attr[curr_step], val[curr_step], src, target);
    } else {
        column[target].push(column[src].pop());
        startNewMovement();
    }
}

function moveMc(mc:MovieClip, attr:String, destination:Number, src:Number, target:Number):Void {
    mc[attr]+= (destination - mc[attr]) / 4;
    if (Math.abs(mc[attr] - destination) < 2) {
        mc[attr] = destination;
        moveDisk(mc, src, target);
    }
}

function startNewMovement():Void {
    if (stack.length == 0) return;
    var m:Object = stack.pop();
    curr_step = 0;
    moveDisk(column[m.s][column[m.s].length - 1], m.s, m.t);
}

function start():Void {
    init();
    calculate(disk_count, 0, 2, 1);
    stack.reverse();
    startNewMovement();
}

start();
 
Copy & Paste -> Run

Nhắn tin cho tác giả
Nguyễn Anh Tuấn @ 18:08 20/08/2009
Số lượt xem: 1931
Số lượt thích: 0 người
Avatar
anh Quảng lọc hết mấy cái syntax highlight của em rồi :((
 
Gửi ý kiến