#using using namespace System; using namespace System::Collections; __gc class BattleObject { private: static int nextID = 1; unsigned int priority; unsigned int objID; protected: static DateTime dtm; static Random *rnd = new Random( (int)dtm.Now.Ticks ); int rand(int max) { return rnd->Next(max)+1; }; public: BattleObject() : objID(nextID++), priority(rand(100)) {}; __property unsigned int get_ID() { return objID; }; __property unsigned int get_Priority() { return priority; }; // structure for comparing BattleObject elements __gc struct BOComparer : IComparer { int Compare(Object *a, Object *b) { BattleObject *left = dynamic_cast(a); BattleObject *right = dynamic_cast(b); return -(left->Priority - right->Priority); } }; }; __gc class BOQueue { private: ArrayList *pq; public: BOQueue() { pq = new ArrayList(); }; void push(BattleObject *b) { pq->Add(b); pq->Sort( new BattleObject::BOComparer() ); }; void add(BattleObject *b) { push(b); }; __property int get_Count() { return pq->Count; }; int size() { return pq->Count; }; __property BattleObject* get_Item(int i) { return dynamic_cast(pq->Item[i]); }; void remove(int ind) { pq->RemoveAt(ind); }; void remove(BattleObject *b) { pq->Remove(b); }; BattleObject* pop() { BattleObject *b = dynamic_cast(pq->Item[0]); pq->RemoveAt(0); return b; }; }; void main() { int i; BOQueue *pq = new BOQueue(); BattleObject *robot; for(i=0;i<10;i++) pq->add( new BattleObject() ); Console::WriteLine(S"Initial queue:"); for(i=0;isize();i++) Console::WriteLine(S"Robot: ID({0}) PR({1})", pq->Item[i]->ID.ToString(), pq->Item[i]->Priority.ToString()); Console::WriteLine(S"--------------"); Console::WriteLine(S"After removing two elements array:"); pq->remove(5); robot = pq->Item[7]; pq->remove(robot); for(i=0;iCount;i++) Console::WriteLine(S"Robot: ID({0}) PR({1})", pq->Item[i]->ID.ToString(), pq->Item[i]->Priority.ToString()); Console::WriteLine(S"--------------"); for(i=0;iCount;i++){ if( i%2 ) pq->remove(i); } for(i=0;iCount;i++) Console::WriteLine(S"Robot: ID({0}) PR({1})", pq->Item[i]->ID.ToString(), pq->Item[i]->Priority.ToString()); Console::WriteLine(S"Robot queue has {0} elements", pq->Count.ToString()); }