怪物链表的优化
怪物对象(int hp,int level)由怪物管理类(list<Monster*>Monsterlist,list<Monster*>Dead_Monsterlist,)调用怪物工厂类的创建方法创建,存放到怪物管理类中的怪物链表
Monsterlist(活动链表)中,调用怪物管理类中的自动掉血方法(AutoloseHP()),当血量为0时从活动链表中删除,并放入Dead_list中;给活动链表设置了怪物数量的最小(m_Min)
和最大值(m_Max),当活动链表的大小小于m_Min时随机从死亡链表中拿出(rand() % (m_Max - m_Min - 1) + m_Min - len)个怪物并重新赋值hp和level,存进Monsterlist中,并删
除死亡链表中的这些元素;在运行时会达到平衡,不会再调用新的内存,也不会因删除节点导致内存碎片的产生。
while (true) { manage->AddListsToMin(); manage->Render(); manage->AutoLoseHP(); manage->DelMonster(); cout << endl; manage->RenderDeadlist(); Sleep(2000); }
第一次实现当中出现的问题:
1.原本Dead_list没有元素,那么如果随机产生的怪物数量大于Dead_list接收Monsterlist已死亡中的个数该怎么解决?
2.第一次运行时,每次重新生成的怪物都是原本的等级和血量,个数也和原始的Monsterlist一样,但经过检查发现,Deadlist中并没有元素
3.修改之后运行发现,死亡一个怪物,进行删除时出现异常
1 1 void MonsterManage::AutoLoseHP() 2 2 { 3 3 list<Monster*>::iterator it = m_MonstList.begin(); 4 4 while( it != m_MonstList.end()) 5 5 { 6 6 (*it)->loseHp(10); 7 7 if ((*it)->GetHp() == 0); 8 8 { 9 9 cout << "怪物已死亡" << endl; 10 10 m_MonstList.remove(*it);//出现异常 11 11 m_MonstList_Dead.push_back(*it); 12 12 13 13 } 14 14 it++; 15 15 16 16 } 17 17 }错误代码
第二次实现解决的问题:
1.通过随机产生的怪物数量大于Dead_List中的个数,则申请新的内存,创建新的怪物对象后插入Monsterlist中,这样还是可以达到理想的平衡状态
2.缺少循环条件,导致血量没有减少到0
3.使用remove方法时,已经将迭代器it指向的内容删除,t指向非法的内存,此时再存入Dead_list时就会报错;
解决方法:先将死亡的对象存入Dead_list,然后使用erase方法(erase删除传入的迭代器位置的元素,并返回下一个迭代器)代替remove删除对象,这样既可以避免存入死亡链表的是非法迭代器,也可以将迭代器自动偏移
1 void MonsterManage::DelMonster() 2 { 3 list<Monster*>::iterator it= m_MonstList.begin(); 4 for (; it != m_MonstList.end(); ) 5 { 6 if ((*it)->GetHp() == 0) 7 { 8 /*cout << "怪物等级:" << (*it)->GetLV() << "血量:" << (*it)->GetHp() << endl;*/ 9 m_MonstList_Dead.push_back(*it); 10 it=m_MonstList.erase(it); 11 } 12 } 13 }View Code
至此,怪物链表的池技术简单实现已经基本完成;实现的比较粗糙,现阶段没有应用价值,只是借此对池技术的原理有一个大致了解,希望有对此理解更深的大佬指导指导;