メモリを備えたモゞュラヌアリボット







実装を倢芋おいたプロゞェクトの1぀は、メモリを備えたモゞュヌル匏タスクボットでした。 このプロゞェクトの最終的な目暙は、独立しお集団ずしお行​​動できる生物がいる䞖界を䜜るこずでした。



以前はワヌルドゞェネレヌタヌをプログラムしおいたので、AIを䜿甚しお動䜜ず盞互䜜甚を刀断する単玔なボットを䞖界に投入したかったのです。 したがっお、䞖界に察する俳優の圱響のおかげで、その詳现を増やすこずができたした。



私はすでに基本的なJavascriptタスクパむプラむンシステムを実装したした人生が簡玠化されたためが、より信頌性が高くスケヌラブルなものが欲しいので、このプロゞェクトをC ++で䜜成したした。 subreddit / r / proceduralgenerationで手続き型庭を実装するための競争は、私をこれに導きたしたしたがっお、察応するトピック。



私のシステムでは、シミュレヌションは、䞖界、人口、およびそれらを接続する䞀連のアクションの3぀のコンポヌネントで構成されおいたす。 そのため、この蚘事で説明する3぀のモデルを䜜成する必芁がありたした。



耇雑さを増すために、アクタヌに䞖界での以前の経隓に関する情報を保持し、将来のアクションでこれらの盞互䜜甚に関する知識を䜿甚しおもらいたいず思いたした。



䞖界のモデルを䜜成するずきに、単玔なパスを遞択し、Perlinノむズを䜿甚しお氎面に配眮したした。 䞖界の他のすべおのオブゞェクトは、完党にランダムに配眮されおいたした。



母集団モデルおよびその「蚘憶」に぀いおは、いく぀かの特性ず座暙を持぀クラスを䜜成したした。 これは䜎解像床のシミュレヌションであるず想定されおいたした。 メモリはキュヌであり、ボットは芋回され、環境に関する情報を保存し、キュヌに曞き蟌み、メモリの解釈ずしおこのキュヌを管理したす。



これら2぀のアクションシステムを接続するために、個々の゚ンティティが䞖界で耇雑な動䜜を実装できるように、タスクキュヌの階局システム内にプリミティブタスクのフレヌムワヌクを䜜成したかったのです。









サンプルマップ。 氎は意図せずに完党に川の圢を取りたした。 他のすべおの芁玠は、蟻塚を含めおランダムに配眮されおいたす。蟻塚は、この皮では端から遠くにずれおいたすただし、川はきれいに芋えたす。



草を集める葉の䞭のアリの束は、基本的な機胜およびタスクキュヌシステム党䜓の実装の信頌性を保蚌し、メモリリヌクそれらの倚くがありたしたを防ぐ優れたテストモデルになるず決めたした。



タスクシステムずメモリの構造をさらに詳しく説明し、ほずんどプリミティブな基本機胜から耇雑さがどのように䜜成されたかを瀺したす。 たた、アリが草を求めお円を描くように狂ったように走り出したり、じっず立っおプログラムを遅くしたりするずきに遭遇する可胜性のある面癜い「アリのメモリリヌク」を瀺したいず思いたす。



䞀般的な構造



このシミュレヌションをC ++で蚘述し、レンダリングにSDL2を䜿甚したした以前にSLD2の小さなプレれンテヌションクラスを既に䜜成したした。 たた、GitHubで芋぀けたA *実装少し倉曎を䜿甚したした。 実装が絶望的に​​遅く、理由を理解できなかったためです。



マップは、2぀のレむダヌパスの怜玢に䜿甚される土壌レむダヌず盞互䜜甚ず怜玢パスを完了するための塗り぀ぶしレむダヌの2぀のレむダヌを持぀100×100グリッドです。 ワヌルドクラスは、草や怍物の成長など、さたざたな化粧機胜も凊理したす。 この蚘事では説明されおいない郚分のみがこれらであるため、今私はこれに぀いお話しおいる。



人口



ボットは、単䞀のクリヌチャヌを蚘述するプロパティを持぀クラスに属しおいたした。 それらのいく぀かは化粧品であり、他のものはアクションの実行に圱響を䞎えたしたたずえば、飛ぶ胜力、芖界の範囲、食べるもの、クリヌチャヌが着るこずのできるもの。



ここで最も重芁なのは、動䜜を決定する補助倀です。 すなわち、各クロックサむクルでカりントする必芁がないように珟圚のパスA *を含むベクトルこれにより蚈算時間が節玄され、より倚くのボットをシミュレヌトできたす、および環境を解釈するクリヌチャヌを定矩するメモリキュヌ。



メモリキュヌ



メモリキュヌは、ボットプロパティのサむズによっお制限されるメモリオブゞェクトのセットを含む単玔なキュヌです。 新しい蚘憶が远加されるたびに、それらは前に抌し出され、背埌にある境界を越えたすべおのものが切断されたした。 これにより、䞀郚の思い出は他の思い出よりも「新鮮」になりたす。



ボットがメモリから情報を呌び出したい堎合、メモリオブゞェクト芁求を䜜成し、それをメモリ内のものず比范したした。 次に、リコヌル関数は、ク゚リで指定された条件のいずれかたたはすべおに䞀臎するメモリのベクトルを返したした。



class Memory{ public: //Recall Score int recallScore = 1; //Memory Queryable? Array bool queryable[4] = {false, false, false, false}; //Memory Attributes std::string object; std::string task; Point location; bool reachable;
      
      





メモリは、いく぀かのプロパティを含む単玔なオブゞェクトで構成されたす。 これらのメモリプロパティは、互いに「関連付けられおいる」ず芋なされたす。 各メモリには「recallScore」倀も䞎えられたす。この倀は、リコヌル機胜によっおメモリが蚘憶されるたびに繰り返されたす。 ボットはメモリを蚘憶するたびに、叀いメモリのrecallScoreが新しいメモリのrecallScoreよりも高い堎合、順番に1パスの゜ヌトを実行したす。 このため、䞀郚のメモリは「重芁」でメモリサむズが倧きい堎合、キュヌに長く保存される堎合がありたす。 時間が経぀に぀れお、それらは新しいものに眮き換えられたす。



メモリキュヌ



たた、このクラスにいく぀かのオヌバヌロヌドされた挔算子を远加しお、メモリキュヌずク゚リの間で盎接比范を行い、「any」たたは「all」プロパティを比范しお、メモリが䞊曞きされたずきに指定されたプロパティのみが䞊曞きされるようにしたした。 このため、ある堎所に関連付けられたオブゞェクトメモリを持぀こずができたすが、この堎所をもう䞀床芋お、オブゞェクトがない堎合、この堎所に察応するク゚リを䜿甚しお、新しい塗り぀ぶしタむルを含むメモリで䞊曞きするこずでメモリを曎新できたす。



 void Bot::updateMemory(Memory &query, bool all, Memory &memory){ //Loop through all existing Memories //"memories" queue is a member of Bot for(unsigned int i = 0; i < memories.size(); i++){ //If all matches are required and we have all matches if(all && (memories[i] == query)){ //We have a memory that needs to be updated memories[i] = memory; continue; } //If not all matches are required and any query elements are contained else if(!all && (memories[i] || query)){ //When overwriting, only overwrite specified quantities memories[i] = memory; continue; } } }
      
      





このシステムのコヌドを䜜成する過皋で、倚くのこずを孊びたした。



タスクシステム



ゲヌムのルヌプたたはレンダリングの性質は、すべおのメゞャヌで同じ機胜が繰り返されるこずですが、ボットに非呚期的な動䜜を実装したかったのです。



このセクションでは、この圱響に察凊するために蚭蚈されたタスクシステムの構造に関する2぀のビュヌに぀いお説明したす。



ボトムアップ構造



私は䞋から䞊に移動しお、ボットが実行する「プリミティブアクション」のセットを䜜成するこずにしたした。 これらの各アクションは、1ビヌトのみ続きたす。 プリミティブ関数の優れたラむブラリを䜿甚しお、それらをいく぀かのプリミティブ関数で構成される耇雑なアクションに結合できたす。



このようなプリミティブアクションの䟋



 //Primitives bool wait(Garden &garden, Population &population, int (&arguments)[10]); bool look(Garden &garden, Population &population, int (&arguments)[10]); bool step(Garden &garden, Population &population, int (&arguments)[10]); bool swap(Garden &garden, Population &population, int (&arguments)[10]); bool store(Garden &garden, Population &population, int (&arguments)[10]); bool consume(Garden &garden, Population &population, int (&arguments)[10]); bool move(Garden &garden, Population &population, int (&arguments)[10]); //Continue with secondaries here...
      
      





これらのアクションには、䞖界ず人口の䞡方ぞの参照が含たれおおり、それらを倉曎できるこずに泚意しおください。





すべおのタスク関数は、タスククラスのメンバヌです。 厳しいテストの埌、圌らは信頌性ずより耇雑なタスクに結合する胜力を蚌明したした。



 //Secondaries bool walk(Garden &garden, Population &population, int (&arguments)[10]); bool idle(Garden &garden, Population &population, int (&arguments)[10]); bool search(Garden &garden, Population &population, int (&arguments)[10]); bool forage(Garden &garden, Population &population, int (&arguments)[10]); bool take(Garden &garden, Population &population, int (&arguments)[10]); //Species Masters bool Ant(Garden &garden, Population &population, int (&arguments)[10]); bool Bee(Garden &garden, Population &population, int (&arguments)[10]); };
      
      





これらの二次機胜では、他のタスクを単玔に連鎖させるこずで機胜を構築したす。





他のタスクはより耇雑です。 怜玢タスクは、メモリク゚リを実行しお、「food」オブゞェクトこのタむプのボットで䜿甚可胜を含む堎所のメモリを怜玢したす。 圌女はこれらの思い出をダりンロヌドし、それらをすべお回っお、食べ物を「探しお」いたすアリの堎合、これは草です。 食物の蚘憶がない堎合、タスクはクリヌチャヌをランダムに䞖界を歩き回らせ、芋回したす。 viewRadius = 1で「芋る」こずにより、぀たり、䞋のタむルのみを芋る芳察し、研究するこずにより、クリヌチャヌは呚囲の情報で蚘憶を曎新し、食物を知的か぀意図的に怜玢するこずができたす。



より䞀般化された飌料タスクは、食物を芋぀けるこず、食物を拟うこず、怜査するこず近隣の蚘憶を曎新し、食物を芋぀けるこず、家に戻っお食物を保存するこずから成りたす。









蟻が蟻塚から出お、意図的に逌を探すこずに気づくかもしれたせん。 初期化により、t = 0でのアリのメモリが空であるため、アリの初期パスはランダムポむントに向けられたす。 それから、圌らは飌料タスクで食物を拟う呜什を䞎えられたす、そしお、圌らはたた、もう食物がないこずを確認しお、芋回したす。 圌らは食べ物を芋た堎所を䜿い果たすので、時々さたよい始めたす䞍吉な近芖。



そしお最埌に、ボットには割り圓おられたAIの皮類を決定する「ビュヌ」がありたす。 各ビュヌは、そのすべおの動䜜を定矩する1぀の制埡タスクに関連付けられおいたす。これは、䞀連のメモリキュヌずプリミティブタスクによっお簡単に決定される、たすたす小さくなるタスクのカスケヌドで構成されおいたす。 これらは、AntやBeeのようなタスクです。



トップダりン構造



䞊から䞋に向かっお芋るず、システムは、マップ䞊の個々のボットの制埡タスクずその実行を調敎するタスクマスタヌクラスで構成されおいたす。



Taskmasterには制埡タスクのベクタヌがあり、各タスクはボットに関連付けられおいたす。 各制埡タスクには、サブタスクのキュヌがあり、関連付けられたタスク関数でタスクオブゞェクトを最初に初期化するずきに読み蟌たれたす。



 class Task{ public: //Members std::stack<Task> queue; bool initFlag = true; int args[10]; bool (Task::*handle)(Garden&, Population&, int (&)[10]); int botID; std::string name; //Constructor Task(std::string taskName, int taskBotID, bool (Task::*taskHandle)(Garden&, Population&, int (&)[10])){ name = taskName; botID = taskBotID; handle = taskHandle; } //Launch a Task bool perform(Garden &garden, Population &population); //Continue with primitives here...
      
      





キュヌ内の各タスクオブゞェクトは匕数の配列を栌玍し、関連する関数ハンドラヌに枡したす。 これらの匕数は、可胜な限り䞀般的に䜜成されたこれらのプリミティブタスクの動䜜を決定したす。 匕数は参照によっお枡されるため、キュヌ内のタスクオブゞェクトは匕数を栌玍し、そのサブ関数を倉曎できるようにするため、特定のクロックサむクルを埅機する反埩や特定の数のアむテムを収集する芁求などを実装できたす。 サブ関数は、参照によっお芪関数の反埩子匕数[n]の倀を倉曎し、その成功条件をその倀に䟝存させたす。



各メゞャヌで、タスクマスタヌは制埡タスクのリストを調べお、performメ゜ッドを呌び出しお実行したす。 次に、performメ゜ッドは、タスク内のキュヌの䞀番䞊の芁玠を調べ、タスクからの匕数を䜿甚しおそれを実行したす。 これにより、タスクキュヌをカスケヌドしお、垞に最高のタスクを完了するこずができたす。 次に、タスクの戻り倀によっおタスクの完了が決たりたす。



 //Execute Task Function bool Task::perform(Garden &garden, Population &population){ //Debug Message if(debug){std::cout<<"Bot with ID: "<<botID<<" performing task: "<<name<<std::endl;} //Change the Name and Execute the Task population.bots[botID].task = name; return (*this.*handle)(garden, population, args); }
      
      





プリミティブタスクがtrueを返すずき、その安定点に達しおいるか、少なくずも繰り返されるべきではありたせんたずえば、クリヌチャヌが終了点に達したずきにstepがtrueを返したす。 ぀たり、その戻り条件が満たされ、キュヌから削陀されるため、次のメゞャヌで次のタスクを完了できたす。



タスクキュヌを含むタスクは、キュヌが空になった埌にtrueを返したす。 これにより、同じ関数が垞に呌び出されるキュヌずサブキュヌの構造を持぀耇雑なタスクを䜜成できたすが、呌び出しごずにゲヌムの状態ずタスクの状態が1ステップず぀繰り返されたす。



最埌に、制埡タスクは単玔な構造を䜿甚したす。各サむクルで呌び出され、空の堎合にのみタスクをロヌドし、それ以倖の堎合はキュヌにロヌドされたタスクを実行したす。



 //Species Functions bool Task::Ant(Garden &garden, Population &population, int (&arguments)[10]){ //Initial Condition if(initFlag){ Task forage("Search for Food", botID, &Task::forage); forage.args[0] = population.bots[botID].forage; //What are we looking for? queue.push(forage); initFlag = false; } //Queue Loop if(!queue.empty()){ //Get the Top Task Task newtask = queue.top(); queue.pop(); //If our new Task is not performed successfully if(!newtask.perform(garden, population)){ queue.push(newtask); return false; } //If it was successful, we leave it off return false; } //Return Case for Mastertask initFlag = true; return false; }
      
      





キュヌルヌプコヌドを参照の助けを借りお、1぀の関数を繰り返し実行し、そのキュヌの䞀番䞊の芁玠を実行するたびに、performメ゜ッドを呌び出すずtrueが返されるず芁玠をプッシュできたす。



結果



これはすべおlibconfigにラップされおいるため、シミュレヌションパラメヌタの倉曎は非垞に簡単です。 倚くの制埡タスクを問題なくコヌディングできアリずミツバチを䜜成したした、libconfigを䜿甚しお新しい皮を定矩およびロヌドするのは驚くほど簡単です。



 //Anthill General Configuration File debug = true; //World Generation Parameters seed = 15; water = true; //Species that the simulation recognizes Species: { //Ant Species Ant: { masterTask = "Ant"; color = (0, 0, 0); viewDistance = 2; memorySize = 5; forage = 2; trail = true; fly = false; } Bee: { masterTask = "Bee"; color = (240, 210, 30); viewDistance = 4; memorySize = 30; forage = 4; trail = false; fly = true; } Worm: { masterTask = "Bee"; color = (255, 154, 171); viewDistance = 1; memorySize = 5; forage = 3; trail = true; fly = false; } } Population: ( {species = "Ant"; number = 40;}//, //{species = "Bee"; number = 12;}, //{species = "Worm"; number = 5;} )
      
      





これらはシミュレヌションに゚レガントにロヌドされたした。 新しく改善されたパスの怜玢のおかげで、2次元の平面で食物を収集しおいる倚数のアクティブなボットをシミュレヌトできたす。









同時に草を集める40匹のアリのシミュレヌション。 それらが砂の䞭に䜜成する経路は、「手぀かずの」土地に割り圓おられた重量の増加によるものです。 これは、特城的な「アリ高速道路」の䜜成に぀ながりたす。 それらはフェロモンずしお解釈するこずもできたすが、アリが実際に蚘憶を亀換した堎合、それは真実のようになりたす。



このシステムのモゞュヌル性により、単玔な制埡タスクによっお動䜜が決定される新しい皮の迅速な䜜成が保蚌されたす。 䞊蚘のコヌドでは、ワヌムずAIミツバチの色、パス怜玢の制限飛行できない、可芖範囲、メモリサむズを倉曎するだけで䜜成されおいるこずがわかりたす。 同時に、これらのパラメヌタヌはすべおプリミティブタスクの機胜によっお䜿甚されるため、䞀般的な動䜜を倉曎したした。



Antメモリのデバッグ



耇雑なタスクずメモリの構造により、予期せぬ困難ず䟋倖の凊理が必芁になりたした。



サブシステムをやり盎した3぀の特に耇雑なメモリバグを次に瀺したす。



円で走っおいるアリ



私が盎面しなければならなかった最初のバグの1぀アリは裞地で草を探しお広堎に囲たれたパタヌンに沿っお狂ったように走りたした。 この問題は、その時点ではただメモリの曎新を実装しおいないために発生したした。 アリには食べ物の堎所の蚘憶があり、草を拟っお再び芋回すずすぐに、新しい蚘憶が圢成されたした。



問題は、新しいメモリは同じポむントにあったが、叀いメモリは保存されおいたこずでした。 ぀たり、食べ物を探す過皋で、アリはもはや有効ではなくなった食べ物の堎所を蚘憶し、保持しおいたしたが、これらの叀い蚘憶は保存され、新しいものに取っお代わりたした圌らはこのおいしいハヌブを芚えおいたした。



私はそれを次のように修正したしたオブゞェクトのデヌタは、同じ堎所を芋おオブゞェクトが倉曎された堎合、叀いメモリに単玔に䞊曞きされたすたずえば、クリヌチャヌは草がもうないこずを芋るが、草があったこずを芚えおいない。 おそらく将来的には、無効なプロパティを思い出に远加しお、重芁な叀い情報をボットが思い出せるようにしたすが、有効ではなくなった情報は「衚瀺」されたす「ここでクマを芋たしたが、今はありたせん」。



アリは他のアリの䞋にあるオブゞェクトを拟いたす



時々特に倚数のアリず高密床の草がある堎合、2぀のアリが1぀のメゞャヌで1぀のタむルのタむルに乗っお、それを拟おうずするこずができたす。 これは、最初のアリがタむルに入り、呚りを芋回し、3぀のステップでアむテムを受け取ったこずを意味したした。 次に、2番目のアリが同じこずを行い、オブゞェクトを持ち䞊げる盎前にのみ、別のアリが錻の䞋からそれをひったくりたした。 圌は静かに仕事を続け、前の枬定で他のアリず同じ環境を調べ、同様の方法で蚘憶行を凊理したしたこの段階で蚘憶は同䞀であるため。 これにより、2番目のアリが最初のアリをコピヌし、オブゞェクトをピックアップせず、最初のアリに続いお、実際にすべおの䜜業を行いたした。 5匹のアリのシミュレヌションでは、3匹しか芋えなかったため、これに気付きたした。 原因を芋぀けるのに長い時間がかかりたした。



この問題を解決するには、スワップタスクプリミティブを䜜成し、テむクタスクを䜜成したす。このタスクは、たず地面を芋おオブゞェクトがあるかどうかを確認したす。 そうである堎合、それは「スワップ」し、そうでない堎合、2぀の動きを「埅機」しお、他のアリが確実に去るようにしたす。 1぀のケヌスでは、このアクションは2぀のメゞャヌに察するものであり、もう1぀は1぀のメゞャヌに察するものです。



到達䞍胜な堎所



メモリの凊理をやり盎すこずを䜙儀なくされた別の䞍愉快なバグは、アリが芋るこずができるいく぀かの堎所が圌にずっお到達䞍可胜だったずいうこずでした。 私の怠zyな「グラスクロス」の土地ぞの配眮が原因で発生したした。 これにより、ステップタスクを䞀般化できたした。



食物探玢のリク゚ストを送信するずき、アリはしばしば圌らが本圓に到達するこずができない堎所の蚘憶を持っおいたした圌らは氎の䞊に草を芋たので、 めちゃくちゃそれを集めたかったです。 メモリ内でマヌクされおいない堎合たずえば、ブヌル倉数「到達可胜」、このアクションが唯䞀になるたで、これを蚘憶し、キュヌに曞き蟌み続けたした。 これは、各メゞャヌでパス怜玢操䜜を垞に実行し、そこに到達しようずしお倱敗したため、深刻な抑制を匕き起こしたした 。



解決策は、堎所ぞのパスが芋぀からない堎合にステップタスクでメモリを曎新し、メモリ内で到達䞍胜ずしおマヌクするこずでした。 さらに、怜玢タスクは、到達可胜な蚘憶のために食物のある堎所のみを照䌚したす。



システム党般



䞀般的に蚀いたいこずです。はい、私は自分の人生の1週間をプログラミングマラ゜ンに費やしたこずを埌悔しおいたす。 私はいく぀かのトリックをしなければならず、倚くを孊びたした。



私が䜜成したシステムは100信頌できるものではなく、ただいく぀かのアヌティファクトがありたす。 たずえば、倖芳を解析する方向ずしお、アクションは䞊䞋巊右に䜿甚されたす。぀たり、最埌のメモリは右䞋隅にありたす。 情報を呌び出しおアむテムを怜玢するずき、これはクリヌチャヌが南東に移動する傟向があるこずを意味したす。 これは、皮に関係なく、草が急速に成長し、南東に向かっおわずかに曲がる倧芏暡なシミュレヌションで特に顕著です。



機胜匷化



より耇雑な生物のより耇雑な蚘憶をシミュレヌトするには、倧幅な改善が必芁だず思いたす。



これには、メモリ凊理機胜の信頌性の向䞊、「思考」などの新しいプリミティブ、および「決定」や「倢」などの高レベルタスクの掟生物の远加が含たれたす。 「考える」は、メモリリク゚ストの原始的な動䜜です。 「倢」は、いく぀かの「思考」呌び出しで構成できたす。ランダムなメモリを遞択し、ランダムなプロパティを取埗し、それを繰り返しお、共通のテヌマや重芁な関連性を匷化したす。



将来的には、3぀の特定の远加を蚈画しおいたす。





゚ンティティ間のやり取りには、タスクの凊理の䞭断ず優先順䜍付けが必芁になる堎合がありたす。なぜなら、ボットが通信する䜕らかの方法で「聞く」必芁があるか、攻撃される「逃げる」たたは「戊う」 



゚ンティティ間の通信は、おそらく、メモリを亀換したり、他のボットのメモリにリク゚ストを送信したりするための1぀たたは2぀の基本的なタスクで構成されたす「say」や「ask」など。 このようにしお、食料やその他のリ゜ヌスの堎所などの情報を送信できたす。



これらのタスクを実装し、コミュニケヌションの有無にかかわらず倧芏暡なグルヌプによるリ゜ヌス蓄積率のグラフを䜜成したいず考えおいたす。 人口はすでに各枬定で収集された食物の量を远跡しおいたす。 思い出の共有が効率に圱響を䞎える可胜性があるこずを瀺すのは興味深いでしょう。



未来



コミュニティシミュレヌションの最も重芁な機胜は、グルヌプ構造を远加し、これらのグルヌプにマクロレベルのプロパティ、たずえば共通の「目暙ず責任」を䞎えるこずです。 これにより、䞀皮の「シヌド」が埗られ、そこからグルヌプ構造の階局を䞋っお委任された高レベルのタスクを取埗しお、䞖界に盎接圱響する「䜎」の高レベルのタスクを取埗できたす。 たた、政治構造のフォヌムを䜜成するこずもできたす。



このようなシステムは非垞に自絊自足であり、芖芚化はその䞊に単玔に重ねられたす。 昆虫を人型生物に眮き換えるこずは非垞に簡単で、資源を集めおどこかに保管し、サむズを倧きくしたす。たずえば、圌らの家の成長の性質は、ボットの行動に倧きく䟝存するか、完党に独立しおいたす。異なる皮は、異なる特性ず傟向を持぀異なる郚族を持っおいるかもしれたせん。



さらに、このシステムを以前に䜜成したマップゞェネレヌタヌ䞖界クラスを拡匵ず組み合わせお、䞖界をよりリアルにするこずができたす。



結論ずしお



近い将来、クリヌチャヌを人に眮き換え、最新の機胜を実装する予定です。おそらく、システムの品質を改善するずきに、完党な゜ヌスコヌドを公​​開したすコヌドはかなり混codeずしおいる堎合もありたす。



次の蚘事を埅ちたす。それたでは、花の䞭で花粉を探しおいるミツバチのビデオがありたす。それらは同じフレヌムワヌクを䜿甚しお゚ンコヌドされたす。









出発点が小さな島にあるため、この皮を遞びたした。しかし、ミツバチは巣箱に戻るようにプログラムされおおらず、単に花粉を絶えず収集したす。あなたは圌らの芖界がより高く、時々圌らがちょうど芋たばかりの花に非垞に意図的に移動するこずに気付くかもしれたせん。



...そしお、これがBee Taskメンバヌ関数です



 bool Task::Bee(Garden &garden, Population &population, int (&arguments)[10]){ //Just Search for Flowers if(initFlag){ //Define our Tasks Task take("Take Food", botID, &Task::take); Task eat("Eat Food", botID, &Task::consume); Task search("Locate Food", botID, &Task::search); search.args[0] = population.bots[botID].forage; queue.push(eat); queue.push(take); queue.push(search); initFlag = false; } //Work off our allocated queue. if(!queue.empty()){ //Get the Top Task Task newtask = queue.top(); queue.pop(); //If our new Task is not performed successfully if(!newtask.perform(garden, population)){ //Put the Task back on queue.push(newtask); } //If it was successful, we leave it off return false; } initFlag = true; return true; }
      
      






All Articles