CodeCraftは、
プログラミングゲームのジャンルに属します。 あなたの多くは、おそらく
HabraWarsプロジェクトまたは
他のプログラミングゲームについて知っています。 つまり、多くの人々の間でプログラマーの戦いのための環境を書きたいという欲求が生じました。 たとえば、私はこの考えを持っていました。
彼女の特徴的な機能:
- ゲームの世界は2つの宇宙船艦隊の戦いです。
- 対戦相手に対する戦略的優位性の必要性
- 個々のユニットとグループの両方で管理が可能
- 3種類のユニット
- 戦術的および戦略的見解
- 2D
- プレーヤー-ライブラリプラグイン
- ゲームと対話するための抽象化の2つのレベル。 それらについては後で
- 便利なデバッグ
- プレイヤーを書くプロセスが大幅に簡素化されました
- ドキュメント、マニュアル、例があります
なぜプログラマーの戦いの環境はそれだけであると決めたのですか?
はい、私は常に単一のユニットではなく、戦略の競争として精神的な決闘を想像していました。 そうでない場合、戦略ではなく動作がプログラマーによってプログラムされている可能性が高くなります。
軍隊の行動アルゴリズムを見ると、はるかにカラフルです:敵を系統的に移動させる指骨の列、前方に突進するユニットの群れ、速いユニットによる巧妙な操縦、後方からの予期しない攻撃、環境のおかげでより強い敵に対する古典的な勝利など 多くの点で、ゲームは歴史の教科書からの描画に触発され、軍隊のさまざまな支部とその動きの条件付きグラフィック画像がマークされています。 退屈なカップルでは、想像力がそれらを動かし、CodeCraftコンセプトを作成します。
物語
ゲームを作成するというアイデアは次のように思いつきました。私は誕生日を多様化しなければなりませんでした。 したがって、プロジェクトの作成を開始しました。 彼はこのアイデアを支持し、すぐに
Mad_Fishの開発に参加しました。 当初、ユニット管理はHabraWarsでの管理に少し似ていました。 プレーヤーは、ユニットを回転させ、前方に飛んで、充電されると撃つことができます。 違いは、単一の戦闘ではほとんど意味のないラムの可能性と、速度ではなく加速の制御にありました。 DRに招待されたすべての人に、プレーヤーと一緒に来るというタスクが与えられました。 つまり、フラッシュドライブに持ち込みます。 作成されたプレイヤーは非常に愚かであることが判明しました-勝者は、少なくとも自分で撃たず、彼らを叩きつけなかった人でした。 したがって、非射撃および不動のプレイヤーが時々非常に自信を持って勝ちました。 休日の後、私は雄羊や友好的な火などを避けることは、ゲームにとって面白くない日常的なことであることに気付きました。
シンプルさ
実際には、ユニット管理の極端な簡素化の必要性が明らかになりました。 したがって、興味深いものだけを書く機会が利用可能になりました。 EtalonAIライブラリーという、ユニットとユニットのグループの動作の標準的な実装を作成しました。
たとえば、コード
foreach (UnitPilot pilot in friends) <br> pilot.AttackClosest(); <br><br> * This source code was highlighted with Source Code Highlighter .
すでに適切な戦闘アルゴリズムです。 また、ユニットは、位置を維持する、特定の敵を攻撃する、指定された座標に飛行する、または注文を待つように注文できます。 ユニットには、それに近いユニット、ユニット、それを狙う敵のリストがあります。 また、すべてのユニットは友人と敵のリストで利用できます。
ユニットのグループを制御するために、分隊を作成できます。 この例では、10人の戦闘機の分遣隊が作成されます。
DestroyersSquad1 = new SquadronColonel(friends[0], game);<br> for ( int i=0;i<10;i++)<br> DestroyersSquad1.AddUnit(friends[i]); <br>
さらに、チーム全体を特定のポイントに送ることができます
DestroyersSquad1.GoToOrder( new GameVector(-3000, -2000)); <br>
「攻撃を通過する」ように命令することができます
DestroyersSquad1.AttackOrder( new GameVector(-3000, -2000)); <br><br>
フォーメーションのタイプ-ライン、長方形、ウェッジ、パック(フォーメーションなし)を指定できます。
DestroyersSquad1.SetFormationTypeLine(WidthBetweenUnits, AngleForward); <br>
独自の構築ジオメトリを作成することもできます。
また、最も近い敵を攻撃し、敵を突っ込む命令もあります(ところで、戦闘機で敵の巡洋艦を破壊するのは良いことです)
また、敵を探索することもできます-EnemyAnalyzingクラスは定期的に敵をクラスター化します-つまり、敵が艦隊を分割したユニットを簡単に見つけることができます
ジオメトリの操作も考慮されます-GameVectorベクトルクラスには回転のためのメソッドが含まれ、ベクトル数学演算子はオーバーロードされます。 千度を取得することを恐れずに角度を追加したり、差や角度間の距離などを見つけたりできる角度クラスがあります。 詳細-ドキュメントを参照してください。
もちろん、そのような程度の標準化は、特にクールなジェダイ・チャクノリの戦闘機であるユニットに固有の動作を作成する可能性を排除しますが、ゲームはイデオロギー的に戦略的です。 さらに、前述のように、ゲームとの相互作用には2つのレベルの抽象化があります。1つ目は高レベルで、プレイヤーは攻撃する場所または分遣隊が飛行する場所をどの順序で示すかです。 2番目のレベルでは、プレーヤーは直線加速度、ユニットの旋回加速度、およびショットの瞬間を直接示します。 したがって、ユニットは誕生日の前に制御されました。 悔い改めてチャック・ノリスを作る機会が残っていることがわかりました。
デバッグ
デバッグするにはいくつかの方法があります。
- プレーヤーに代わってテキストを出力します。 ゲームクラスにはSetText(文字列テキスト)メソッドがあります。 改行を使用できます\ n
- ユニットに代わってテキストを出力します。 ユニットにはテキストフィールドがあり、その内容が画面に表示されます。 行の折り返しも使用できます。
- ジオメトリ出力。 ゲームクラスにはGeometryViewerフィールドがあり、そのクラスには長方形、円、線、および点を描画するためのメソッドがあります。 色が設定され(透明度が許可され)、フィギュア自体が設定されます。 ちなみに、図の構造も独自のものであり、交差計算方法があります。
設定ファイルにより
- デバッグ出力を有効または無効にする
- 全画面モードまたはウィンドウモードでプログラムを実行する
- 各側の各タイプのユニット数を個別に変更します(たとえば、これにより、100人の戦闘機が13〜15コルベットを「コスト」にしたことがわかりました)
プレイヤーの書き方
「Hello world」と適切なアルゴリズムを書くのに数分しかかかりません。 プレーヤーは、任意の.NET言語で作成できます。
これを行うには、次のものが必要です。
- MiniGameInterfaces.dllライブラリと、必要に応じてEtalonAI.dllを接続して、快適な文章を作成します。
- AIクラスを継承し、InitおよびUpdateメソッドをオーバーロードします。
それがすべてで、ほぼ完全なガイドです。
詳細
ゲームはC#でXNAを使用して作成されたため、申し訳ありませんが、Windows専用です。 結局のところ、彼は彼の友人以外の誰にも見せたいとは思わずに書いたが、それでもC#は確かな便利さだ。 Mad Fishは現在、ゲームをLinuxに移植しています。
コントロールキー
- ページアップおよびページダウン-シミュレーションの速度を上げ、下げます
- ホームとエンド-カメラの距離と近接。
- 矢印-カメラの動き
- 一時停止-一時停止
- Esc-終了
おわりに
プロジェクトをさらに発展させていきたいと思います。 たとえば、人間が作成したグラフィックスなど。
Mad_Fishは現在CodeCraftをOpenGLに移植しており、Microsoftに依存すべきではないと言っています)
しかし、最も興味深いのは、もちろん、あなたが書いたプレイヤーをダウンロードすることです。 彼の戦術を見てください。 彼を倒す方法を見つけます。 プレイヤーを倒してプレイヤーを倒し、対戦相手が反応するのを待ちます。
ここで見知らぬ人をダウンロードして、プレーヤーを追加できます
。参照資料
CodeCraftのゲームの記録。 参加者-プレーヤーの例
素敵なゲームを