ArrayList

يستخدم البرنامج java.util.ArrayList، وهو كائن يشبه المصفوفات. بل هو مجموعة (collection)، ما يعني أنه كائن يحتوي على كائنات أخرى. توفر Java مجموعات أخرى بقدرات متفاوتة، لكن لاستخدام GridWorld سنحتاج إلى ArrayList فقط.
لترى مثالاً، نزل http://thinklikecs.webs.com/resources/code/BlueBug.java و http://thinklikecs.webs.com/resource...BugRunner.java. الحشرة الزرقاء (BlueBug) هي حشرة تتحرك عشوائياً وتبحث عن الصخور. إذا حثرت على صخرة، ستلونها بالأزرق.
إليك كيفية عملها. عند استدعاء act، تعطي الحشرة الزرقاء موقعها ومرجعاً للشبكة:
Location loc = getLocation();
Grid<Actor> grid = getGrid();
النوع بين قوسي الزاوية (<>) هو معامل نوع (type parameter) يحدد محتويات الشبكة (grid). بكلمات أخرى، grid ليست مجرد كائن من نوع Grid، بل هي Grid تحتوي على Actors.
الخطوة التالية هي معرفة جيران الموقع الحالي. توفر Grid عملية تفعل ذلك:
ArrayList<Actor> neighbors = grid.getNeighbors(loc);
القيمة المعادة من getNeighbors هي ArrayList من Actors. تعيد عملية size طول ArrayList، وتختار get عنصراً. لذا يمكننا طباعة الجيران كما يلي:
كود:
for (int i=0; i<neighbors.size(); i++) {
   Actor actor = neighbors.get(i);
   System.out.println(actor);
}
إن المرور على ArrayList هو عملية شائعة لدرجة وجود تعليمة خاصة بها. لذا يمكننا أن نكتب:
كود:
for (Actor actor: neighbors) {
   System.out.println(actor);
}
نعلم أن الجيران هم Actors، لكننا لا نعرف نوعهم: قد يكونوا من النوع Bug، أو Rock، الخ. حتى نميز الصخور، سنستعمل عامل instanceof، الذي يتحقق من انتماء كائن ما إلى صنف معين.
كود:
for (Actor actor: neighbors) {
   if (actor instanceof Rock) {
      actor.setColor(Color.blue);
   }
}
حتى نتمكن من تشغيل كل هذا علينا استيراد الأصناف التي استخدمناها:
كود:
import info.gridworld.actor.Actor;
import info.gridworld.actor.Bug;
import info.gridworld.actor.Rock;
import info.gridworld.grid.Grid;
import info.gridworld.grid.Location;
import java.awt.Color;
import java.util.ArrayList;
تمرين 16.1 ابدأ مع نسخة من BlueBug.java، اكتب تعريف صنف لنوع جديد من الحشرات التي تبحث عن الأزهار وتأكلها. يمكنك "أكل" الأزهار باستدعاء removeSelfFromGrid عليها.