麻雀-レイアウトに関係なく、少なくとも1つの勝利への道を確保するためにタイルを配置する

StackOverflow https://stackoverflow.com/questions/159547

  •  03-07-2019
  •  | 
  •  

質問

タイルに使用されているレイアウトに関係なく、ゲームの開始時にパズルを完了するためのパスが少なくとも1つ存在することをユーザーに保証できるように、タイルを分割する良い方法があります。ゲームに勝ちますか?

明らかに、ユーザーの動きに応じて、勝つことを断念できます。パズルを上手くプレイすれば勝てるということを常にユーザーに伝えたいと思っています。

ゲームの開始時にタイルをランダムに配置すると、ユーザーがいくつかの動きをして、それ以上できなくなる可能性があります。パズルは少なくとも解けるという知識は、パズルをより楽しくするべきです。

役に立ちましたか?

解決

すべてのタイルを逆に配置します(つまり、ボードを真ん中から始めてレイアウトします)

プレーヤーをさらにいじめるために、目に見える形でそれを非常に高速で行うことができます。

他のヒント

逆にゲームをプレイします。

ピースをペアで、ヒープにスライドできる場所にランダムに配置します。事前に設定されたパターンに一致するヒープになるように、ピースを配置できる場所を知るする方法が必要になりますが、とにかく必要になります。

これは古い質問ですが、問題を自分で解決するときにこれに遭遇しました。ここでの答えはどれも完全なものではなく、それらのいくつかは複雑な注意事項を持っているか、病理学的レイアウトに違反します。ここに私の解決策があります:

マークされていないタイルでボードを解決します(後方ではなく前方)。一度に2つの無料のタイルを削除します。削除した各ペアを「一致したペア」にプッシュします。スタック。多くの場合、これで十分です。

行き止まり(numFreeTiles == 1)に遭遇した場合、ジェネレータをリセットするだけです:)行き止まりにぶつかることは通常ないことがわかりました。私が試したまあまあのレイアウト。 8回再試行したら、あきらめて、残りのタイルをランダムに割り当てます。これにより、プレイヤーが台無しになって100%解決不可能な状態になった場合でも、ボードのセットアップとシャッフル機能の両方に同じジェネレーターを使用できます。

行き止まりになったときの別の解決策は、別の道を進むことができるまでバックアウト(スタックから飛び出し、ボード上のタイルを交換)することです。元のブロックタイルを削除するペアと一致することを確認して、別のパスを選択します。

残念ながら、ボードによっては、これが永久にループする場合があります。 「アウトレットなし」に似たペアを削除した場合、道路、その後のすべての「道路」行き止まりであり、複数の行き止まりがあり、アルゴリズムは決して完了しません。これが当てはまるボードを設計することが可能かどうかはわかりませんが、可能であれば、まだ解決策があります。

この大きな問題を解決するには、考えられる各ボード状態をDAGのノードとして扱い、選択された各ペアはそのグラフのエッジになります。深さ72でリーフノードが見つかるまで、ランダムトラバーサルを実行します。下降を繰り返さないように、トラバーサル履歴を追跡します。

私が使用したレイアウトでは、行き止まりが最初の試行ソリューションよりもまれなので、すぐに思い浮かぶのはハイブリッドソリューションです。まず、最小限のメモリで問題を解決します(選択したペアをスタックに保存します)。最初の行き止まりに達したら、各ノードにアクセスするときに完全なマーキング/エッジ生成を実行します(可能な場合は遅延評価)。

グラフ理論の研究はほとんど行っていないので、DAGのランダムトラバーサル/検索の問題に対するより良い解決策があるかもしれません:

編集:実際には、2008年10月13日の投稿で、ボードを逆に生成した私のソリューションを使用できました。あなたはまだ行き止まりになる可能性があるため、あなたはまだ同じ警告を持っています。ただし、逆にボードを生成するには、より複雑なルールがあります。たとえば、レイアウトの1行が長い場合など、少なくとも一部の行を途中で開始しないと、セットアップが失敗することが保証されます。前方解決ジェネレーターで完全にランダムな(合法的な)最初の動きを選ぶと、解けるボードにつながる可能性が高くなります。

私が思いついた唯一のことは、逆の麻雀ソリティアゲームのように、タイルを一致するペアに配置することです。そのため、タイルの配置中のどの時点でも、ボードは実際のゲームの途中にあるように見えるはずです(つまり、他のタイルの上に3層浮かぶタイルがない)。

リバースゲームでタイルが一致するペアに配置されている場合、ゲームを解決するために常に少なくとも1つのフォワードパスが必要です。

他のアイデアを聞きたいです。

ベストアンサーはすでに押し上げられていると思います。「逆に」解決することでセットを作成します。 -つまり、空白のボードから始めて、どこかにペアを追加し、解決可能な位置に別のペアを追加します...

「Big Bang」を好む場合アプローチ(最初にセット全体をランダムに生成する)、非常にマッチョの開発者であるか、今日は単に自虐的だと感じる場合、特定のセットから取り出すことができるすべてのペアとそれらがそれぞれに依存する方法を表すことができます有向グラフによるその他。

そこから、そのセットの推移閉包を取得し、最初の正当なペアの少なくとも1つから、目的の終了につながるパスが少なくとも1つあるかどうかを判断するだけです(タイルペアは残りません)。

このソリューションの実装は、読者への課題として残されています:D

実装で使用したルールを以下に示します。

ヒープを構築するとき、ペアのフレットごとに個別に、セル(場所)を見つけます。

  • 下位レベルのすべてのセルがすでに満たされている
  • 最初のフレットがすでにオンボードされているかどうかを考慮すると、2番目のフレットの場所は最初にブロックされません
  • 両方の場所が「端に」あります;すでに構築されたヒープの:
    • 左側または右側に少なくとも1人の隣人がいます
    • または、最初のフレットが連続している(左右のすべてのセルが再帰的に空いている)

これらのルールは、ビルドが常に成功することを保証するものではありません-最後の2つのフリーセルがセルフブロッキングのままになることがあり、ビルドを再試行する必要があります(または少なくとも最後の数フレット) 実際には、「亀」再構築は6回までです。

既存のゲームのほとんどは、最初のフレット(「最初の行」)のフレットを中央のどこかに置くことを制限しているようです。これにより、非常に長い行の端にフレットがなく、最後のプレーヤーが移動するまで起き続けるときに、より便利な構成ができます。ただし、「中間」構成によって異なります。

幸運:)

PS 1ターンで解決可能なヒープを構築するアルゴリズムを見つけた場合はお知らせください。

ゲームには144個のタイルがあり、144個のタイルにはそれぞれブロックリストがあります。 (スタックの一番上のタイルには空のブロックリストがあります)

すべての有効な移動には、" current__vertical_Block_list"空になります。これは144x144マトリックスであるため、20kのメモリと、それぞれ20kのLEFTおよびRIGHTブロックリストを追加できます。

(remaning_tiles)AND((empty CURRENT VERTICAL BLOCK LIST)および((empty CURRENT LEFT BLOCK LIST)または(empty CURRENT RIGHT BLOCK LIST)))から有効な移動テーブルを生成します)

有効な移動テーブルから2つのランダムなタイルを選択し、記録します (現在のテーブルVert、左および右)を更新し、スタックに削除されたタイルを記録します

これで、有効なゲームを構成する動きのリストができました。 72の動きのそれぞれに一致するタイルタイプを割り当てます。

やりがいのあるゲームの場合、各タイルが利用可能になるタイミングを追跡します。空白であるため、(早い早い早い早い遅い)および(遅い遅い遅い早い早い)であるセットを見つけなさい、2のLEブロックの1つのEE 1 LLおよび2つのLEブロックを見つけます。左側のピースを右ブロックすることを除く)
有効なゲームプレイを入手したら、注文します。

ソリティア?推測ではありますが、これを判断するには、コンピューターがゲームに勝つ(またはそれに近い)必要があると思います。

別のオプションとして、いくつかの事前設定されたレイアウトを使用することもできます(これにより、現在のレベルと混合して勝つことができます。

ある程度、4つのタイルのうちの1つが別のXの下のXレイヤー以下であることを確認できます。

ほとんどのゲームには、誰かが動けなくなったときのシャッフルコマンドがあります。

さまざまなことを試して、何が最適かを確認します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top