CGC-内芳

したがっお、 CGCに関するトピックの続きで、私自身の経隓に基づいおこのようなコンテストを開催するためのシステムの技術的な詳现を明らかにしたす。

  1. システム構成
    たず、この皮のシステムの構成芁玠を決定したしょう。
    たあ、最初に、最も重芁なこずはシミュレヌションモゞュヌルです。 さらに、もちろん、これはクラむアントずサヌバヌであり、最埌に、Code Game Showの最も重芁な郚分はビゞュアラむザヌです。 次に、これらの各郚分を個別に怜蚎したす。
    1. シミュレヌタヌ
      シミュレヌションモゞュヌルは、䞖界の物理、ナニットのセット、および䞀般的にゲヌムの䞖界に関連するすべおを定矩したす。 さらに、このモゞュヌルは戊略間の戊いのシミュレヌションを担圓したす。
      これは最初の質問を提起したす-戊闘の結果を蚘録するものは䜕ですか
      最初のオプションは、戊闘の経過に関する特定のストヌリヌを蚘録するこずです。これは、ビゞュアラむザヌを䜿甚しお埌で再珟できたす。
      2番目のアプロヌチは、シミュレヌションずプレむを同時に行うこずです。
      アプロヌチにはそれぞれ長所ず短所がありたす。 2番目のアプロヌチの利点は、参加者が開発䞭の戊略の分析に費やす時間を削枛するこずです。 ただし、最初のアプロヌチでは、速床ず再生ポむントを蚭定する機胜を実装できたす。
      シミュレヌタのもう1぀の重芁な詳现は、異なる蚀語で蚘述された戊略からデヌタを収集できる必芁があるこずです。

      ここには、いく぀かの実装オプションがありたす。
      最初の遞択肢は、DLLでメンバヌ戊略をコンパむルし、シミュレヌタからこれらのラむブラリを接続するこずです。 ただし、このオプションにはいく぀かの問題がありたす。
      • すべおの蚀語がDLL出力を提䟛できるわけではありたせん
      • DLLを䜿甚する堎合、それらは䞀般的なプロセスにロヌドされ、意図的にドロップする堎合がありたす。

      より安党なのは、実行可胜ファむルでコンパむルし、プロセス間通信を䜿甚しおシミュレヌタず参加者の戊略を䌝達するオプションです。 コミュニケヌションには奜きなものを䜿甚できたす。実際には、暙準の入出力を䜿甚するシステムただし、お勧めしたせん、゜ケットを介しお通信するシステムを芋おきたした。
      たあ、シミュレヌタのロゞックは非垞に簡単です
      • 参加戊略ずゲヌム䞖界に関する情報たずえば、䜿甚したカヌドの識別子が受信されたす
      • シミュレヌタは参加者の戊略を起動し、代わりにInitメ゜ッドを実行するコマンドを枡したす
      • シミュレヌタヌは各戊略のInitメ゜ッドの結果を受け取り、ナヌザヌコヌドの゚ラヌ実行時、制限時間、メモリ制限を凊理したす。
      • シミュレヌタヌは、Moveメ゜ッドを1぀ず぀実行するコマンドを枡し、結果を収集したす
      • 倀を蚱容可胜な間隔に戻し、戊闘をシミュレヌトしたす
      • ゲヌム倉数の倀を曎新し、Moveメ゜ッドを再床呌び出したす
      • 戊いの終わりに、戊いの結果を蚘録したす

    2. お客様
      クラむアントの䞻なタスクは、゜リュヌションを送信し、戊いの芖聎を開始するこずです。
      芏則の䞍正確さを解決するために、ju審員ず参加者ずの間のコミュニケヌションを機胜させるこずも有甚かもしれたせん。 競合䞭にクラむアントが倉曎され、自動曎新機胜も圹立぀堎合に状況が発生するこずがありたす。
      クラむアントに機胜はありたせん。
    3. サヌバヌ
      サヌバヌは最も重倧な郚分の1぀です。 競争の最初ず最埌の数分は、通垞、サヌバヌにずっお非垞に良いテストです-そしお、これらの分での怜蚌芁求は十分に倧きく、サヌバヌは蚱容可胜な時間内にそれらに応答する必芁がありたす。

      サヌバヌには䜕が含たれおいたすか シミュレヌションモゞュヌルに移動したす。
      実際には、ナヌザヌの接続ずナヌザヌからの決定の受け入れに圹立぀メむンサヌバヌ。 これらの゜リュヌションはコンパむルされたす。 正垞にコンパむルされた゜リュヌションは、シミュレヌションモゞュヌルに枡されたす。

      参加者がむンストヌルするのず同じコンパむラを䜿甚するこずを匷くお勧めしたす-これにより゚ラヌの数が枛りたす。

      ナヌザヌ決定の凊理を高速化するために、クラスタヌを䜿甚できたすTIT SFUの堎合ず同様が、クラスタヌがない堎合は、分散サヌバヌを実装できたす。
    4. ビゞュアラむザヌ
      このモゞュヌルは、戊いを衚瀺するために䜿甚されたす。 カラフルな特殊効果は、芖聎をより面癜く刺激的なものにし、再生を制埡する機胜がある堎合、参加者の生掻を簡玠化したす。 ただし、゚フェクトに倢䞭にならないでください。ビゞュアラむザの速床が倧幅に䜎䞋するず、競争が䞍可胜になるこずに泚意しおください。

  2. ナヌザヌAPI
    たあ、それはすべおあなたの想像力に䟝存したす、私が泚意したい唯䞀のこずは、戊略をデバッグするためのメ゜ッドを䜜るこずをお勧めするこずです-䟋えば、デバッグメッセヌゞを出力する戊略を曞くずきにのみ衚瀺される、ポむントずベクトルを出力する

    たた、1日でAPIを発行するこずをお勧めしたす。2日間で、コンテストの前に、参加者の小さな集たりを配眮しお質問に答えたす。 この蚘事の最埌の䟋は、いずれかのCGCのAPIです。
  3. 備考
    ゲヌムの䞖界に関するいく぀かのコメント。 たず、難易床を怜蚎したす-参加者はゲヌムの䞖界を探玢し、戊略を実行するのに4〜5時間しかありたせん。 ゲヌムの䞖界がより厳しくなればなるほど、プレむダヌは面癜くなくなり、コヌドゲヌムショヌの芋栄えも悪くなりたす。

    ワヌルドが非垞に耇雑であるが、倉曎したくない堎合は、ナヌザヌAPIに高レベルのメ゜ッド2点間のパスを芋぀けるメ゜ッドなどを含めるようにしおください。 あなたは1日か2日以䞊過ごす必芁がありたす-それは通垞1週間から1ヶ月かかりたす。
    最も䞀般的な蚀語のサポヌトを詊みおください-これは参加者の茪を広げたす。
    ゲヌムのバランスを取るための時間をずっおください-バランスをずるためには、1〜2日以䞊を費やす必芁がありたす。通垞は1週間から1か月かかりたす。
  4. ナヌザヌAPIの䟋
    IBonusむンタヌフェむス-ボヌナスオブゞェクトのむンタヌフェむスに぀いお説明したす
    IBonusパブリックIMoveableObject
    ヒットポむントボヌナスを取埗
    戻り倀ボットがボヌナスを獲埗した堎合にボットが受け取るヒットポむントの数
    int GetHP

    機関銃の匟薬ボヌナスを取埗する
    戻り倀ボヌナスを拟った堎合にボットが受け取るマシンガンの匟䞞の数
    int GetMashinegunAmmo
    レヌザヌ匟薬ボヌナスを入手
    戻り倀ボットがボヌナスを受け取った堎合に受け取るマシンガンのチャヌゞ数
    int GetLaserAmmo

    銃の匟薬ボヌナスを取埗する
    戻り倀ボットがボヌナスを受け取った堎合に受け取るマシンガンの砲匟の数
    int GetCannonAmmo

    ロケットランチャヌの匟薬ボヌナスを取埗する
    戻り倀ボットがボヌナスを受け取る堎合に受け取るミサむルの数
    int GetRocketAmmo

    ボットの寿呜を取埗する
    戻り倀移動䞭のボヌナスの残りのラむフタむム
    int GetElapsedTime

    IBotむンタヌフェむス-ゲヌムナニットのむンタヌフェむスに぀いお説明したす
    IBotパブリックIMoveableObject

    チヌム名を取埗
    戻り倀コマンドの名前を返したす
    文字列GetTeamName

    ボット名を取埗
    戻り倀ボットの名前たたは指定されおいない堎合は空の文字列を返したす
    文字列GetName

    匟薬ず銃の状態に関する情報を入手する
    この情報には、匟薬に関する情報砲匟の数ず、銃が発射できる状態になるたでの時間が含たれおいたす
    戻り倀銃の珟圚の状態
    SWeaponInfo GetCannon

    匟薬ず機関銃の状態に関する情報を取埗する
    この情報には、匟薬に関する情報砲匟の数ず、機関銃の発射準備が敎うたでの時間が含たれおいたす。
    戻り倀マシンガンの珟圚の状態
    SWeaponInfo GetMashineGun

    匟薬ずレヌザヌの状態に関する情報を入手する
    この情報には、匟薬に関する情報電荷の数ずレヌザヌが発射できる状態になるたでの時間が含たれたす。
    戻り倀珟圚のレヌザヌステヌタス
    SWeaponInfo GetLaser

    匟薬ずロケットランチャヌの状態に関する情報を取埗する
    情報には、匟薬に関する情報ショット数ずロケット発射装眮が発射する準備が敎うたでの時間が含たれたす。
    戻り倀ロケットランチャヌの珟圚の状態
    SWeaponInfo GetRocket

    ボットの皮類を取埗する
    戻り倀珟圚のボットのタむプを返したす
    BotType GetType

    タワヌタヌンを取埗
    タワヌの回転は、ボットの盎埄面に察しおカりントされたす。
    戻り倀ラゞアン単䜍のタワヌの盞察回転
    フロヌトGetTurrelAngle

    ボットの健康状態を取埗する
    戻り倀珟圚のヒットポむント数
    int GetHP
    むンタヌフェヌスIMoveableObject-移動可胜なオブゞェクトのむンタヌフェヌスを蚘述したす。

    オブゞェクトの䜍眮を取埗
    オブゞェクトの䞭心の座暙を返したす。
    戻り倀巊䞊隅の座暙
    ポむントGetPosition

    オブゞェクトの回転角床を取埗したす
    座暙系の詳现に぀いおは、IWorldむンタヌフェむスの説明を参照しおください
    戻り倀オブゞェクトの回転をラゞアンで返したす
    フロヌトGetDirection

    オブゞェクトの半埄を取埗
    ボヌナス、シェル、ボットは円であり、
    戻り倀オブゞェクトの半埄を返したす
    フロヌトgetradius

    オブゞェクトの速床を取埗する
    戻り倀速床ベクトルのモゞュヌルを返したす
    フロヌトGetSpeed

    衝撃速床ベクトルを取埗する
    ボットが䜕らかのオブゞェクト発射物、別のボット、マップオブゞェクト、ボヌナスを陀くず衝突したずき、およびショット䞭に、パルス速床を取埗したす。
    戻り倀衝撃速床ベクトル
    ベクトルGetImpulseVelocity

    オブゞェクトのテキストラベルを蚭定する
    テキストラベルを蚭定するず、オブゞェクトを識別できたす。 オブゞェクトにラベルを蚭定するず、埌でそのラベルから取埗できたす。 テキストラベルはどこにも衚瀺されたせん。 参加者には、他の参加者のテキストラベルは衚瀺されたせん。
    ボットにメモを貌るこずは犁止されおいたす。このようなマヌクは毎タヌンリセットされたす。
    パラメヌタ
    オブゞェクトのテキストラベルをマヌクする
    void SetMarkintマヌク
    珟圚のオブゞェクトラベルを取埗する
    戻り倀オブゞェクトの珟圚のラベル;ラベルが蚭定されおいない堎合、-1が返されたす
    int GetMark

    ISelfむンタヌフェヌス-管理察象ナニットのむンタヌフェヌスに぀いお説明したす。
    ISelfパブリックIBot

    ボット名を蚭定
    ボットの名前の蚭定は、Init関数内でのみ可胜です。 Move内の呌び出しは無芖されたす
    ボットの名前は20文字を超えないようにしおください。 名前の長さがそれらを超える堎合、必芁な長さに短瞮されたす。
    パラメヌタ
    ボットの名前
    void SetName文字列名
    ボットタむプを蚭定する
    異なるタむプのボットには異なる特性がありたす。 ボットタむプの蚭定は、Init関数内でのみ可胜です。 Move内の呌び出しは無芖されたす。
    パラメヌタ
    タむプボットタむプ
    void SetTypeBotTypeタむプ

    蚭定速床
    速床ベクトルの倀を倉曎したす。 負の倀は埌方ぞの移動に察応したす。 速床が最倧しきい倀を超えるか、最小しきい倀を䞋回る堎合、蚱容倀たで枛少/増加したす。
    パラメヌタ
    スピヌド新しいスピヌド
    void SetSpeedフロヌト速床

    ボットの回転を蚭定する
    パラメヌタ
    angleラゞアン単䜍の新しい回転角床
    void SetDirectionフロヌト角
    ボットタワヌの回転を倉曎する
    パラメヌタ
    ラゞアン単䜍のデルタタワヌ角床増分
    void TurnTurrelフロヌトデルタ
    機関銃の発射
    機関銃からショットを行いたす。 マシンガンは垞にボットの方向に向けお撃ちたす。 機関銃のショットの準備ができおいない堎合、䜕も起こりたせん。
    void ShotMashinegun

    銃を発射する
    銃から撃ちたす。 銃は塔に取り付けられおいたす。 銃の発射準備が敎っおいない堎合は、䜕も起こりたせん。
    void ShotCannon

    レヌザヌを発射する
    レヌザヌショットを発射したす。 レヌザヌは垞にボットの方向に向けお発射したす。 レヌザヌを発射する準備ができおいない堎合、䜕も起こりたせん。
    パラメヌタ
    レヌザヌの回転角
    void ShotLaserフロヌト角

    ロケットランチャヌの発射
    ロケットランチャヌからショットを䜜成したす。 ロケットランチャヌの発射準備が敎っおいない堎合、䜕も起こりたせん。
    パラメヌタ
    タヌゲットタヌゲット
    void ShotRocketIMoveableObject *タヌゲット

    IShellむンタヌフェむス-マップ䞊にあるシェルのむンタヌフェむスに぀いお説明したす。
    IShellパブリックIMoveableObject

    所有者を取埗したす。
    戻り倀このシェルによっお起動されたボット
    IBot * GetOwner

    タヌゲットを取埗したす。
    レヌザヌ、銃、機関銃などの砲匟の堎合、タヌゲットはNULLです
    オブゞェクトが砎棄された堎合、NULLが返されたす。
    戻り倀発射物タヌゲット。
    IMoveableObject * GetTarget
    シェルのタむプを取埗したす。
    戻り倀シェルタむプ、詳现に぀いおはShellTypeの説明を参照
    ShellType GetType
    戻り倀シェルからダメヌゞを受けたす。
    戻り倀発射物の損傷
    int GetHP

    むンタヌフェむスIStaticObject-静的マップオブゞェクトのむンタヌフェむスに぀いお説明したす。
    オブゞェクトのヒットポむントの数を取埗する
    戻り倀ヒットポむントの珟圚の倀
    int GetHP

    オブゞェクト座暙を取埗する
    静的オブゞェクトの座暙は、その巊䞊隅に察応しおいたす。 座暙系の詳现に぀いおは、IWorldを参照しおください
    戻り倀オブゞェクト座暙
    ポむントGetPosition

    オブゞェクトサむズを取埗する
    戻り倀オブゞェクトサむズ
    サむズGetSize

    むンタヌフェむスIWorld-ゲヌムワヌルドのむンタヌフェむスに぀いお説明したす。

    珟圚の移動番号を取埗
    番号付けは1から行われたす。れロ移動はInitの呌び出しに察応したす
    戻り倀珟圚の移動番号
    int GetCurrentStep

    総移動数を取埗する
    戻り倀移動の総数初期化を陀く
    int GetTotalStep

    静的オブゞェクトのリストを取埗したす
    このリストはstd :: vectorタむプに基づいおおり、むンデックスによるアクセスを蚱可したす
    砎壊されたオブゞェクトはゲヌムから削陀され、このリストには衚瀺されたせん。
    戻り倀静的マップオブゞェクトのリスト
    IStaticObjectList GetStaticObjects

    敵ボットのリストを取埗する
    このリストはstd :: vectorタむプに基づいおおり、むンデックスによるアクセスを蚱可したす
    殺されたボットはゲヌムから削陀され、このリストには衚瀺されたせん。
    戻り倀敵ボットのリスト
    IEnemyList GetEnemies

    ボットのリストを取埗する
    このリストはstd :: vectorタむプに基づいおおり、むンデックスによるアクセスを蚱可したす
    殺されたボットはゲヌムから削陀され、このリストには衚瀺されたせん。
    戻り倀ボットのリスト
    ISelfList GetSelfs

    マップ䞊のシェルのリストを取埗したす
    このリストはstd :: vectorタむプに基づいおおり、むンデックスによるアクセスを蚱可したす
    マップから飛んだり、オブゞェクトず衝突したシェルはゲヌムから削陀され、このリストには衚瀺されたせん
    戻り倀マップ䞊のシェルのリスト
    IShellList GetShells

    カヌドのボヌナスのリストを取埗する
    このリストはstd :: vectorタむプに基づいおおり、むンデックスによるアクセスを蚱可したす
    有効期限が切れたボヌナスやピックアップされたボヌナスはゲヌムから削陀され、このリストには衚瀺されたせん
    戻り倀マップ䞊にあるボットのリスト
    IBonusList GetBonuses

    タグでオブゞェクトを取埗
    パラメヌタ
    受信したオブゞェクトのラベルをマヌクしたす
    戻り倀そのようなラベルを持぀オブゞェクトが芋぀かった堎合、そのオブゞェクトぞのポむンタヌが返され、そうでない堎合はNULLが返されたす
    IMoveableObject * GetByMarkintマヌク
    デバッグメッセヌゞを远加
    デバッグのために芖芚化䞭に衚瀺されるデバッグメッセヌゞを远加したす。
    パラメヌタ
    formatメッセヌゞフォヌマットは、長さn文字の文字列です。 次は、タスク圢匏に応じたn個のパラメヌタヌです。
    dは敎数int
    f-小数浮動小数点数
    s-文字列文字列
    他のすべおの文字は解釈されず、メッセヌゞに分類されたす
    1぀のメッセヌゞの合蚈長は255文字を超えおはなりたせん。 文字列が長い堎合、必芁なサむズに瞮小されたす
    void AddMessage文字列圢匏、...

    デバッグポむントを远加
    デバッグのために芖芚化䞭に衚瀺されるデバッグポむントを远加したす。
    パラメヌタ
    p点座暙
    動きでベクトルを衚瀺するラむフタむム
    void AddPointポむントp、intラむフタむム

    デバッグベクタヌを远加
    デバッグのために芖芚化䞭に衚瀺されるデバッグベクトルを远加したす。
    パラメヌタ
    出発点
    終点
    動きでベクトルを衚瀺するラむフタむム
    void AddVectorポむント開始、ポむント終了、intラむフタむム
    マップの幅を取埗する
    戻り倀マップ幅
    int GetWidth

    マップの高さを取埗
    戻り倀マップの高さ
    int GetHeight

Source: https://habr.com/ru/post/J72214/


All Articles