WEB开发网
开发学院图形图像Flash Think in ActionScript 3.0Ⅲ 阅读

Think in ActionScript 3.0Ⅲ

 2009-05-30 12:07:59 来源:WEB开发网   
核心提示: 接下来定义三个变量分别表示圈内还剩多少人,所报的数是多少和数组下标,Think in ActionScript 3.0Ⅲ(4),下面 while 循环开始,只有圈内还有人(leftCount > 0)就进行循环,通过本节请大家认真体会面向对象的设计思想,一次学会,首先判断当前 in

接下来定义三个变量分别表示圈内还剩多少人,所报的数是多少和数组下标。

   下面 while 循环开始,只有圈内还有人(leftCount > 0)就进行循环,首先判断当前 index 所指的元素是否为真,如果是则报数加 1,再判断是不是加到 3 了,如果是则打印出当前的数组下标,再将该元素设为 false,剩余人数减1,下一次从新开始报数。

最后让数组下标加 1,当指到最后时,将数组下标置为 0,因为这是一个圈,要用循环的数组来表示。

8.4.3 出圈游戏 —— 面向对象(cirgame/ CircleGame2.as)

回顾上一个例子,在面向过程的程序中,明明是围成的一个圈儿,却要看成是一个数组;明明是一个个小孩儿却要看成是数组的一个个元素。这不就是为了让计算机看懂吗?但是,面向对象是更加接近人类的思维模式,我们在现实中看到的就是一个个小孩儿,怎么能说是数组?那么这一个个小孩儿就是一个个对象,他们都是 Kid。围成的这个圈,就是一个 KidCircle。很自然吧,比大自然还自然!下面来体会面向对象的设计思想:

package cirgame {
    public class CircleGame2 {
        public function CircleGame2() {
            var kc:KidCircle = new KidCircle(5);
            var countNum:int = 0;
            var k:Kid = kc.head;
           
            while (kc.count > 0) {
                countNum++;
                if (countNum == 3) {
                    trace(k.id + 1);
                    kc.remove(k);
                    countNum = 0;
                }
                k = k.right;
            }
           
        }
    }
}

// 每个 Kid 都有自己的 id,并且左右手还拉着其它的 Kid
class Kid {
    var id:uint;
    var left:Kid;
    var right:Kid;
}

// 这个圈子里可以加入或移除一些 Kid
class KidCircle {
    var count:uint = 0;
    var head:Kid;
    var rear:Kid;
   
    function KidCircle(n:uint) {
        for (var i = 0; i < n; i++) {
            var kid:Kid = new Kid();
            add(kid);
        }
    }
   
    function add(kid:Kid):void {
        kid.id = count;
        if (count == 0) {
            head = kid;
            rear = kid;
            kid.left = kid;
            kid.right = kid;
        } else {
            rear.right = kid;
            kid.left = rear;
            kid.right = head;
            head.left = kid;
            rear = kid;
        }
        count++;
    }
   
    function remove(kid:Kid):void {
        if (count <= 0) {
            return;
        } else if (count == 1) {
            head = rear = null;
        } else {
            kid.left.right = kid.right;
            kid.right.left = kid.left;
            if (kid == head) {
                head = kid.right;
            } else if (kid == rear) {
                rear = kid.left;
            }
        }
        count--;
    }
}

   这段程序中设计了两个类,代表两类客观事物 —— 小孩(Kid)和圈子(KidCircle)。从 8.4.1 的图中可以确切地看到。Kid 有三个属性:id 号、左手和右手,左手拉着一个 Kid,右手拉着一个 Kid,因此 left 和 right 存放两个 Kid 的引用。

下面是 KidCircle 类,代表围成的圈子,这个圈子可以加入或移除一些 Kid,因此有 add 和 remove 两个方法。head 和 rear 两个成员变量用于指向队首和队尾的两个 Kid,因为些添加的 Kid 要放在队尾(rear)的后面,因为这是一个圈子,所以还需要让队尾的小孩儿拉住队首(head)的小孩儿,因此需要保存这两个成员变量。

最后是测试类,主要的逻辑和前一个例子比较像,这里就不多解释了。

通过这个例子大家可以看出,我们无形之间就完成了一个数据结构 —— 双向循环链表。而前面面向过程的例子,实际上就是一个顺序的存储结构 —— 线性表。

后面,我会带大家写一个贪吃蛇的游戏,目的是学习面向对象编程的思想(并非该游戏本身),在贪吃蛇中我们就会运用到类似于单向链表的结构,如果双向链表掌握了,那么单向一定没问题。

通过本节请大家认真体会面向对象的设计思想。一次学会,终身受用。

上一页  1 2 3 4 

Tags:Think in ActionScript

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接