概念的には、ゲームのルール/制約(グラフィックス/物理学ではない)エンジンをどのように作成するか


16

自分で選んだアドベンチャーの本に似たシンプルなゲームを作りたい。プレイヤーには物語のテキストが表示され、可能性のリストからアクションを選択できます。これは、新しい物語のテキスト、広告無限につながります。唯一の問題は、以前の決定に応じて、可能性のリストが異なる可能性があることです。

一見すると、これは大量のif-elseステートメントのように聞こえるので、ルールエンジンが適切に機能することを意味します。しかし、それは私にとって有限状態マシンのようにも聞こえます。

これをJavaまたはGroovyで記述しようとしています。私は現在、概念的な問題、つまりこれを広範なレベルでどのように行うべきか(とにかく人々はチェスやカードゲームをどのように実装するのでしょうか)に興味がありますが、特定のライブラリに関するアドバイスも歓迎します。

明らかに、タイトルの「ゲームエンジン」は、衝突検出やその他の物理/グラフィックメカニクスを指すのではなく、プレイヤーが状況と彼の現在の状態に与えたオプションを決定するロジックです。


1
この質問はgamedevにより適してますか?
ウーヴェプロナス

2
@Uwe Plonusそれを考慮したが、私はそうは思わない。私の質問は単なる概念であり、グラフィックライブラリ、3D、およびgamedevを支配する他のトピックとは何の関係もありません。考えてみると、この質問はゲーム自体とはほとんど関係ありませんが、タイトルをより良くする方法はわかりません。
kaqqao

チェスとカードゲームは、アドベンチャーとは大きく異なります。
鹿ハンター

1
あなたの質問は専門家のシステム開発もカバーしているようです。フォローアップの質問の範囲と可能な診断は、選択されたすべての回答で制限されます。たぶんそれは、さらに「入力」を見つけるために探すべきものでしょうか?
マルジャンヴェネマ

回答:


7

あなたがコメントで言ったことに基づいて、これは私がそれを処理する方法です:

ストーリーを有限状態マシンとして、ひねりを加えて実装します。各状態はストーリーのページであり、各遷移はあるページから別のページへのリンクです。ただし、各遷移には条件もあります。条件はnullの場合があります。この場合、遷移は常に使用可能なオプションとして表示されますが、そうでない場合は、ページが表示されるときに評価する必要がありますFalse

条件を実装できる基本的な方法は2つあります。1つ目は、ゲーム内で本格的なスクリプトエンジンをセットアップすることreturn player.inventory.contains(GUN)です。その後、Conditionはのようになります。これは、最初は設定がより複雑ですが、より高度なスクリプト作成が可能です。

2つ目は、可能な条件を何らかのオブジェクトにハードコーディングすることです。RequiredItemフィールドを持つことができ、そのフィールドに値がある場合は、条件が満たされているかどうかを確認します。このシステムはセットアップが簡単です。スクリプティングよりもはるかに多くのことができることを制限しますが、スクリプトエンジンが提供する柔軟性が必要ない場合は、おそらくはるかに使いやすいでしょう。


1
実際、このようなものは完全にゲームに関係しないWebアプリで使用します。ユーザーには多数の状態があり、任意の数のイベントをコードで起動できます。イベントの多くは、ユーザーをある状態から別の状態に移行するように事前設定されています。説明されている質問の場合、条件/トリガーを定義するためのある種の初歩的なスクリプト言語(またはPython / Luaのような完全なもの)を使用することも役立ちます。
Katana314

私はこのアプローチがかなり好きです。ありがとう!さらに調査します。役に立つライブラリを知っている可能性はありますか?
kaqqao

@veggen:いいえ、ごめんなさい。Java開発者ではありません。
メイソンウィーラー

@MasonWheeler:ラザロをどう思いますか?
ロバートハーヴェイ

1
この質問は今日人気のある質問リストに載っているので、前のコメントで言ったとおりにこれを実装したと報告します。素晴らしいDSLを作成し、FSMロジックを自分で実装しました。ソリューションにこれ以上満足することはできませんでした。@MasonWheelerすばらしいアドバイスをありがとうございます!
kaqqao

5

答えはタイトルにあると思います:ルールエンジンが必要です。Javaを使用してアプリケーションを作成する予定がある場合は、Gilbert Le Blancが提案したように独自に作成することもできます。または、ルールエンジンであるDroolsを確認することもできます。

プレイヤーが状況と彼の現在の状態を与えたオプションは何ですか

Drools、または実際には他のルールエンジンを使用すると、可能なアクションのリストを出力するパラメーター化された状況を定義できます。sucが持つ簡単なルールをエンコードできます:

  • プレーヤーはpageXにあります:

    • 選択肢1:タイトル:「左へ」、アクション:「45ページ」
    • 選択肢2:タイトル:「右へ」、アクション:「56ページ」
    • プレイヤーにFireballsのスタッフがある場合、選択肢3:タイトル「fireballを起動する」、アクション:「page32」
    • プレイヤーの知覚スキルが10の場合、選択肢4:タイトル「壁の文章をチェック」、アクション:「ページ67」

Droolsで興味深いのは、すべてのルールをExcelファイルにエンコードし、ゲームの開始時にDroolsにそのファイルを読み取らせることができることです。すべてがメモリに保存された後は、ユーザーインターフェイスを気にするだけです。

Droolsの使用を開始するのに役立つリソースを次に示します。


一般的には-レーテアルゴリズムの表情が実装どんなお好みのルールエンジン。
鹿ハンター

うん、Droolsは私が始めたものの1つでした。ルールのパッケージを一度に1つだけ評価できるかどうかを確認するには、もう少し調査する必要があります。これは、私の場合はかなり重要だからです。ありがとう!
kaqqao

@veggenは喜んでお手伝いします!
ジャレイン


2

概念的には、ゲームは簡単です。psudeocodeでは、次のようになります。

while not at end of adventure story
    display text
    get response

ここで、すべてのテキストをチェーン化して、あるアクションから次のアクションに流れることが難しい部分です。リレーショナルデータベースを使用できます。ツリーを使用できます。

使用したいコンピューター言語を知らずに、より具体的にするのは少し難しいです。あなたがJavaについて言及したので、私はツリー構造にもっと傾いたでしょう。

1つの応答とテキストクラスへのリンクを保持する応答クラスを作成します。

アドベンチャーテキストを保持するテキストクラスと、応答クラスのインスタンスとしての応答のリストを作成します。

コメントに答えるために編集されました:

このモデルに基づいて計算することはありません。あなたの例を使用すると、ツリーは次のようになります。Tはテキストで、Aはアクションの選択です。

T You stumble on a dead police officer
    A Take the gun
    T You hear footsteps
      A Run away
      A Hide and see who comes
    A Don't touch anything
    T You hear footsteps
      A Run away

はい、テキストの重複がありますが、チェーンに従うことにより、将来のアクションは過去の決定を考慮に入れることができます。それは大きな決定木です。


私の問題は、考えられる応答を計算することです。過去の決定は現在のオプションに影響します。したがって、「あなたが死んだ警察官につまずく」と提示されたプレーヤーが「何も触らない」ではなく「彼のピストルを盗む」を選択した場合、彼は「これは、以前に銃を取得していなかった場合の唯一の選択肢だったでしょう。
kaqqao

@veggen:最新の回答をご覧ください。
ギルバートルブラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.