web-dev-qa-db-ja.com

制約/ルールをプログラムする方法

まず、背景、過去のインタビューで、カードゲームのバリエーションをプログラミングパズルとして設計するように何度も依頼され、OOの方法で設計しようとしましたが、自分の解決策に満足したことは一度もありませんでしたが、最近まで間違った方向から問題に取り組んでいることに気づき、具体的には個々のカードをオブジェクトとしてモデル化して問題を解決しようとしていました。

これに伴う問題は、個々のカードに重要な固有の動作がないため、オブジェクトとして適切な(または主要な)候補ではないことです。カードについて興味深く重要なのは、ルールと制約です。たとえば、各スーツには4枚の スーツ 、または13枚のカードしかありません。もちろん、ゲームにはいくつものルールがあります。

だから私の質問は

  1. ルールと制約をプログラムするためのイディオム/構成/パターンはありますか?.
  2. OOパラダイムと組み合わせて適用できる1の数。
6
Gaurav

これらのガイドライン/イディオムは制約プログラミングと呼ばれ、簡単なことではありません。これは、組み合わせ問題(NP困難、NP完全)のモデリングと解決に使用されます。私はあなたに一冊の本をお勧めします- 制約プログラミングの原則 。この本はこの主題についての最高の本の1つですが、それでも、読んだ後でも実際に適用することはできません。
しかし、あなたは Gecode -制約ベースのシステムとアプリケーションを開発するためのツールキットに慣れることでそれを行うことができます。 Gecodeは、モジュール式で拡張可能でありながら、制約ソルバーに最先端のパフォーマンスを提供します。
この科目は非常に興味深いと言えます。これは、私が勉強していた中で最高のコースの1つです。ところで、Gecodeの作者は私の教授だったので、とてもラッキーでした:)

2
Sorantis

Pocoまたはdto'dumb 'オブジェクトを使用すると、このタイプの問題が見つかる傾向があります。

その場合、通常はプレゼンテーション/ロジック/永続性などのレイヤーで区切られたサービスタイプオブジェクトを使用してコードを見つけました。各レイヤーは、dtoの(セット)を提供(または消費)します。

私が好むもう1つのアプローチは、スマートコンテナーを使用することです。ルールを適用するコンテナ(特殊なリストなど)を作成します。したがって、52枚のカードがあるデッキと5枚のカードがあるpokerHandがあり、pokerHandには「isFullHouse」があり、家全体をモデル化できます。 PokerGameは1つのデッキと4つのポーカーハンドを持ちます。カードオブジェクトは些細な(またはダム)ままですが、コンテナはより動作指向(スマート)です。

2
DerekK