「終了するまでに1分かかる迷路を作成するのに2分かかります。」
コブ、始まり
約1年前、迷路を描くのが面白くなってきました。その通過には少なくとも時間がかかります。 私はこれを長い間試みましたが、多くの問題に遭遇しました:
- 出口から、そのような迷路は「ワンツー」歩いた。
- あなたが正しい道を進んでいるかどうかを見て、理解することはほとんど常に可能でした。
- 迷路を描くのに時間がかかりました。
それから私は見られてはいけないものを隠し、同時に迷宮を生成するプログラムを書くことにしました。
そして、彼はOpenGLを使用して3Dで迷路を持ち上げました。
そして、彼はそれにネットワーク、ストリーム、フロアを追加しました。
だから会う:
Labyrusは、OpenGlとQtを使用して記述されたオープンクロスプラットフォームマルチスレッドネットワークゲームです。
指定
迷路は「セル」で構成されています。 壁はセルの間にのみ立つことができます。
nは迷路の幅です。
nは迷路の長さです(迷路の底は正方形です)。
hは迷路の高さです。
カード生成
最初に、中空の立方体が作成されます。 次に、このキューブ内のすべての可能な壁のリストがランダムな順序で作成されます。 この後、順番に壁を追加しようとします。 追加するたびに、dfによってカードの接続性がチェックされます。 合計はツリーです。
推定労働時間
セルの数: n * n * h 、
壁の数: 3 * n * n * h 、
dfs操作時間: n ^ 4 * h ^ 2 (グラフを最適に保存しません)、
生成時間: O(n ^ 6 * h ^ 3) 。
原則として、生成は大幅に加速できます。 しかし:
- 書くのが面倒。
- 完了するのに10分ほどかかるカードは、0.4秒で生成され、原則としてタスクを実行します。 (怠lazの正当化)
h = 1のラビリンス。 開発者モード トップビュー。
実行可能ファイルの説明
- labyrus-server:迷路を生成し、接続を待ちます。
- labyrus-server-gui:サーバーへのGUI-コンソールが気に入らない人向け。
- labyrus-client:ゲームのクライアント部分-ゲームはその中に入ります(実行中のサーバーが必要です)
- labyrus-switchlanguage:言語を変更します(デフォルトはシステムです)。 %language%のアプリケーションが好きな人向け。 当然、私が作成した言語(英語とロシア語)のみが機能します。
運営管理
- 管理は標準です-矢印とキー[ wasd ]。
- チャットとコマンド-[ Enter ] コマンド [ Enter ]を押します。
- 全画面モードでは、マウスを使用できます。
- 全画面モードに切り替える、またはその逆-ホットキーz
- メニューを開きます- エスケープします。
- コントロール -双眼鏡。 私はそれを書くことに興味がありました。
- 開発者モード(デバッグモード)では、キーを使用できます[ qe ]-垂直離着陸、壁との交差のテストなし。
一般的なスキーム
まず、サーバーを上げる必要があります。 その後、プレーヤーはサーバーに接続します。 サーバーで指定されたプレーヤーの数が接続されると、ゲームが開始されます。 誰もが最初から壁を抜け落ちます。 最初は、終了することに集中しています。 それは常にあなたと同じ階にあります-反対側の角に。 --strongパラメーターを使用すると、 それ以上の接続はできません 。 最初に出口に到達したプレイヤーが勝ちます。 最後のプレイヤーがフィニッシュラインに到達すると、新しいマップが生成され、ゲームが再開されます。
システム要件
それらを定義する方法はわかりませんが、大きくはありません。 OpenGLハードウェアアクセラレーションは大歓迎です。 (最大の迷路で〜40,000ポリゴン)
コメント
プロジェクトの執筆中に、私は多くの新しいことを学びました。
- Qtの開発が真剣に進んだ。
- 何らかの形でOpenGlを操作する方法を学びました。
- 私はGitで働いていました。正直に言うと、Gitは私には向いていません。 ライナス、許して。
- ある時点であまりにも多くのことをやり直さなければならないので、少なくとも何らかの形でプログラムを設計する価値があることに気付きました。 特に、離散座標から実際の座標への移行は非常に苦痛であり、壁を設定および解体する機能を伴いました。
- 私はたくさんの興味深いバグに出くわしました。 特に、WindowsのQt5でLabyrusをコンパイルすることはできませんでした。
- 依存関係のあるLinuxでは、すべてがそれほど美しくないことを認識しました。Qtで同様のプログラムを使用して経験的に計算する必要がありました。
- テスターの重要性に気付きました。
- オブジェクトの交差がどのように書かれているかを学ぶことは非常に興味深いものでした。
- ゲームでは通常、画面の解像度が固定されている理由を理解しています。 私には固定されておらず、プログラムを再起動せずに全画面モードに移行します。 実装が困難でした。 さらに、これはユーザーの良心に任せるバグの束を作成します。 つまり、前方に実行して別のウィンドウに切り替えた場合-実行を継続する方法を確認する準備をしてください。
- 迷路を通過するボットを書いた。 本当に複雑なボットを作成する方法は非常に興味深いです。
...そして、私は地獄デバッグアプリケーションの9つの円を知っていました。
- グラフィック。
- Opengl
- Qt。 (誰がこのスロットを呼び出したのか、そしてプログラムがQt部分のどこかでクラッシュした理由は明らかではありません)
- マルチスレッド。
- ネットワーク
- クロスプラットフォーム。 (Linuxでコンパイルしますが、Windowsではコンパイルしません。しかしifdefsはコンパイルしました)
- 多言語(ロシア語+英語)。 もちろん、Qtは素晴らしい翻訳システムを提供しますが、ある言語ではテキストが適切な領域に配置され、別の言語ではそうでない場合はひどいものになります。
- 多くのファイルで構成されます(グラフィックをロードし、別のプログラムの出力をインターセプトします)。 非常に長い間、私はすべてが私の下でWindowsの下で機能する理由を理解していませんでしたが、他の人は白いテクスチャを持っています。 その結果、いくつかの残っているライブラリが欠落していることが判明しました。
- バージョン管理が必要です。 いいえ、Git、もちろん、マスターしました。 しかし、ここでは、xx.xx.xx-buildxxのスタイルでバージョンをどのように認識するか、私にはわかりません。 これまでのところ、通常はArchLinuxに対してのみ行われます。 少なくともパッケージの作成日があります。
著者
プロジェクトは、エンジンを使用せずに完全に私によって書かれました。- スキン-お母さん、ありがとう。
- 関数begin2d()end2d()-gamedev.ruから取得。
- クラスメートのダンポールをテストしてくれてありがとう。
デモ
ソースコード
Windows(Qt4)
Linux-x86(Qt4)
Linux-x86_64(Qt5)
ArchLinux(AUR)(Qt5)
UPD 4月27日:
Windowsのアーカイブに余分なファイルをたくさん入れることができました。
LabyrusPortable.zipの更新(-8Mb)