8

私はチェス サーバーとチェス用の 1 つまたは複数のクライアントを作成するつもりであり、プログラミング言語に依存しない方法で、チェスのルール (たとえば、ゲームの状態に基づいて許容される動き、ゲームが完了したときのルール) を記述したいと考えています。一部のチェス ルール (キング キャスリング、アンパッサン、3 回以上の繰り返しの動きに基づく引き分けなど) はボード レイアウトだけでなく、動きの履歴にも基づいているため、これは少し注意が必要です。

形式は次のようにすることをお勧めします。

  • 原文
  • 人間が読める
  • 標準に基づく (YAML、XML など)
  • さまざまな言語で簡単に解析可能

しかし、適切な解決策を得るために、これらのいずれかを喜んで犠牲にします。

私の主な質問は次のとおりです。データ形式からこのような複雑な状態で動作するような複雑なアルゴリズムを構築するにはどうすればよいですか?

フォローアップの質問は次のとおりです。出発点として機能する同様の方法で解決された同様の問題の例を提供できますか?

編集:明確にするためのリクエストに応えて、Pythonで記述されたサーバー、C#で記述された1つのクライアント、およびJavaで記述された別のクライアントがあると考えてください。場所ごとにルール(駒の移動の許容範囲、チェックの状況など)を明記するのは避けたいと思います。これらのルールは、言語に依存しない方法で一度指定することをお勧めします。

4

9 に答える 9

4

考えましょう。オブジェクト (場所とピース) を状態と動作で記述しています。現在の状態と、現在の状態から変化する許可された状態の絶え間なく変化するセットに注意する必要があります。

これがプログラミングです。通常のプログラミング言語で解析できる「メタ言語」は必要ありません。プログラミング言語を使用するだけです。

通常の言語での通常のクラス定義から始めます。すべてを機能させます。そして、それらのクラス定義がチェスの定義です。

ごくわずかな例外を除いて、すべてのプログラミング言語は

  • テキスト
  • 人間が読める
  • 合理的に標準化された
  • それぞれのコンパイラまたはインタープリタによって簡単に解析されます。

言語を選択するだけで完了です。ニュアンスを理解するには時間がかかるため、Java や C# などの静的言語よりも、Python や Ruby などの動的言語の方が満足できるでしょう。

携帯性を求めるなら。移植可能な言語を選択してください。「より大きな」アプリケーションに言語を埋め込む場合は、「より大きな」アプリケーション用の言語を選択してください。


元の要件が不完全だったので、副次的な小さな問題は、複数のクライアントと連携して実行されるコードを作成する方法です。

  1. 複数の言語でクライアントを持たないでください。一つを選ぶ。たとえば、Java に固執します。

  2. 複数言語のクライアントが必要な場合は、3 つの言語ランタイム環境すべてに組み込むことができる言語が必要です。選択肢は 2 つあります。

    • インタープリターを組み込みます。たとえば、Python、Tcl、および JavaScript は、C または C# プログラムから呼び出すことができる軽量のインタープリターです。このアプローチはブラウザで機能し、あなたにも機能します。Java は、JNI を介してこれを利用することもできます。これを試すことができる BPEL ルール エンジンがあります。

    • インタプリタを別のサブプロセスとして生成します。アプリと生成されたインタープリターの間で、名前付きパイプまたはソケットなどを開きます。Java および C# クライアントは、Python サブプロセスと通信できます。Python サーバーは、このコードをそのまま使用できます。

于 2008-10-11T16:48:28.680 に答える
2

PortableGameNotationと呼ばれるチェスに固有の広く使用されている形式がすでにあります。多くの異なるゲームに適応できるSmartGameFormatあります。

于 2008-10-11T17:09:30.310 に答える
2

ルールを説明するためのPrologをお勧めします。

于 2008-10-11T17:14:31.173 に答える
2

編集:過度に冗長な回答が削除されました。

簡単に言えば、Python でルールを記述します。Iron Python を使用して C# クライアントに接続し、Jython を Java クライアントに接続します。

于 2008-10-11T16:57:04.453 に答える
2

これはフォローアップの質問に答えています:-)

最も人気のあるチェス サーバーの 1 つがそのプロトコルをここに文書化していることを指摘できます(警告、FTP リンク、およびパッシブ FTP はサポートされていません) 。学習経験として、このサーバーのクライアントの作成を開始できます。

関連することの 1 つは、優れたチェス サーバーは単なるムーブ リレーよりも多くの機能を提供するということです。

とはいえ、チェス エンジンとのインターフェイスに使用される、より基本的なプロトコルがあり、ここに文書化されています。

ああ、ちなみに:ウィキペディアの理事会の代表者

多くの人がすでに指摘しているように、ボードの表現を超えたものはすべてプログラム自体に属します。

于 2008-10-11T17:00:56.987 に答える
2

これまでの回答から私が集めたもの:

チェス盤のデータ表現の場合:

[チェス盤の表現]( http://en.wikipedia.org/wiki/Board_representation_(chess))に関するウィキペディアの記事を参照してください。

チェスの移動データ表現の場合:

Portable Game NotationおよびAlgebraic Chess Notationに関するウィキペディアの記事を参照してください。

チェスのルール表現の場合:

これは、プログラミング言語を使用して行う必要があります。ルールが複数の言語で実装される場合に記述されるコードの量を減らしたい場合は、いくつかのオプションがあります。

  1. ターゲット言語用の埋め込み可能なインタープリターが存在する言語 (Lua、Python など) を使用します。
  2. 一般的な言語をコンパイルできる仮想マシンを使用します (例: C# の場合は IronPython、Java の場合は JPython)。
  3. ターゲット言語が通信できるルールには、バックグラウンド デーモンまたはサブプロセスを使用します。
  4. 各ターゲット言語でルール アルゴリズムを再実装します。

チェスのルールを強制するために複数の言語で解釈できる宣言型の構文があればよかったのですが、私の研究では、候補となる可能性のあるものは見つかりませんでした。多くの言語にソルバーが存在することを考えると、制約ベースのプログラミングが可能なルートである可能性があるのではないかと疑っていますが、それらがこの要件を本当に満たすかどうかはわかりません。すべての注意を払っていただきありがとうございます。おそらく将来的に回答が表示されるでしょう。

于 2008-10-13T22:22:23.233 に答える
0

ΤΖΩΤΖΙΟΥが残したコメントに同意します。サーバーに検証を行わせ、クライアントに潜在的な移動を送信させるだけです。それが設計の方法ではない場合は、S。Lottや他の人が提案したように、Pythonでルールを記述してください。

それほど難しいことではありません。ルールは次の3つの主要なカテゴリに分類できます
。-ボードの状態に依存するルール(キャスリング、アンパッサン、ドロー、チェック、チェックメイト、パススルーチェック、このプレーヤーの番かどうかなど)
-ルールすべてのピースに適用されます(自分の色の別のピースと同じ正方形を占めることはできません。対戦相手のピースのある正方形に移動する==キャプチャ、ボードから移動することはできません)
-個々のピースに適用されるルール。(ポーンは後方に移動できません、城は斜めに移動できませんなど)

各ルールは関数として実装でき、その後、半移動ごとに、すべての検証に合格するかどうかを確認することで有効性が判断されます。

提出される可能性のある移動ごとに、次の順序でルールを確認する必要があります。

  1. 提案された動きは潜在的に有効ですか?(作品の正しい「形」)
  2. ボードの拘束に適合しますか?(ピースがブロックされている場合、エッジから移動しますか)
  3. 移動は州の要件に違反しますか?(私はこの移動の後にチェックしていますか?チェックを通過しますか?このアンパッサンの捕獲は合法ですか?)

これらすべてに問題がなければ、サーバーは移動を合法として受け入れる必要があります…</ p>

于 2008-11-18T03:48:18.067 に答える
0

Drools には、人間が読める最新のルール実装 ( https://www.jboss.org/drools/ ) があります。ユーザーが Excel でルールを入力できる方法があります。他のツールよりも多くのユーザーが Excel の内容を理解できます。

于 2008-10-11T18:31:16.570 に答える
0

ボードの現在の状態 (キャスリングの可能性などを含む) を 表すには、短い ASCII 表現を提供するForsyth-Edwards Notationを使用できます。例えば:

rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1

オープニングボードポジションになります。

次に、ある位置からの特定の動きを表すために、 (通信チェスで使用されるように)数字の動き表記を使用できます。これにより、ボード上の動きの短い (4 ~ 5 桁) 表現が得られます。

ルールを表すために - 私は自分自身を知りたい. 現在、私のチェス エンジンのルールは Python で書かれているだけで、おそらく私が望むほど宣言的ではありません。

于 2008-10-19T21:53:34.927 に答える