チェス960(フィッシャーランダムチェスとも呼ばれる)は、通常のチェスの駒とルールでプレイするゲームで、まず960通りの駒の配置の中からランダムに1つを選択します。駒の配置は制限されており、キングはルークの間に、ビショップは異なる色のマスに配置されます。有効な配置を選択し、特定のゲームでどのランダムに選択された配置が使用されたかを簡潔に説明するために、チェス960の番号付けスキームが使用されます。0から959までの番号は有効な配置を示し、配置が与えられると番号が決定されます。
番号付けスキームは、単純な2つの表の形で示すことができます。また、0から959までの任意の数に対して、開始配列を直接導出することも可能です。この開始配列と数のマッピングはラインハルト・シャルナグルに由来し、現在ではフィッシャーランダムチェスで世界中で使用されています。この列挙は最初にインターネットで公開され、その後2004年に彼の(ドイツ語の)著書「Fischer-Random-Schach (FRC / Chess960) - Die revolutionäre Zukunft des Schachspiels (inkl. Computerschach)」( ISBN 500)に掲載されました。 3-8334-1322-0。
Chess960における960の合法的な開始局面は、いくつかの同等な方法で導き出すことができる。
---
---
---
3つの方法すべてにおいて、同じ960個の合法的な開始位置が数えられており、導出の一貫性が示されている。
ホワイトの初期配列は、その番号N(0~959)から次のように導き出すことができます。
a) Nを4で割って、商N2と余りB1を得る。B1に対応する明るいマスにビショップを配置する(0=b、1=d、2=f、3=h)。
b) N2 を再び 4 で割ると、商は N3、余りは B2 になります。B2 に対応する黒いマスに 2 番目のビショップを配置します(0=a、1=c、2=e、3=g)。
c) N3 を 6 で割ると、商は N4、余りは Q になります。Qに従ってクイーンを配置します。ここで、0 は a から始まる最初の空きマス、1 は 2 番目の空きマス、などです。
d) N4 は 0 ~ 9 の 1 桁の数字になります。ビショップとクイーンは無視して、残りの 5 つのスペースに2 つのナイトを配置します。次のN5N表を参照して、その値に従ってナイトを配置してください。
e)残りのマスは3つです。 外側の2つのマスに ルークを1つずつ、中央のマスにキングを配置してください。
以下は、0から959までの位置番号を指定すると、適切なChess960の開始配列を含む配列を返すLuaコードです。
ボードに駒を追加する function addPiece(board, piece, place) ローカルカウント = 0 type(board) が 'table' と等しくない場合 falseを返す 終わり type(piece) が 'string' でない場合 ピース = 'b' 終わり type(place) が 'number' と等しくない場合 場所 = 1 終わり for a=1,#board do もし board[a] == " " ならば 場所 = 場所 - 1 場所が 1 未満の場合 ボード[a] = ピース trueを返す 終わり 終わり 終わり falseを返す 終わり function Chess960(setup) type(setup)が'number'でない場合 セットアップ = 1 終わり ローカルセット = セットアップ ローカルボード = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '} local bishop1 = set % 4 set = math.floor(set / 4) bishop1 = bishop1 + 1 bishop1 = bishop1 * 2 board[bishop1] = 'b' local bishop2 = set % 4 set = math.floor(set / 4) bishop2 = bishop2 * 2 ビショップ2 = ビショップ2 + 1 board[bishop2] = 'b' ローカルクイーン = set % 6 女王 = 女王 + 1 set = math.floor(set / 6) addPiece(board,'q',queen) 騎士は厄介だ ローカルナイト = set % 10 騎士 = 騎士 + 1 これは計算で求めることもできますが、今回は騎士だけを対象にするので、2次元配列を使用します。 local knightArray = {{1,1}, {1,2}, {1,3}, {1,4}, {2,2}, {2,3}, {2,4}, {3,3}, {3,4}, {4,4}} addPiece(board,'n',knightArray[knights][1]) addPiece(board,'n',knightArray[knights][2]) -- ビショップ、クイーン、ナイトが配置されたら、 キングは常に2つのルークの間にあるので、この時点で可能な配置は1つだけです。 addPiece(board,'r') addPiece(board,'k') addPiece(board,'r') リターンボード 終わりこれらの 2 つの表は、白の基本列における任意のフィッシャーランダムチェス開始位置 (略称: SP) を 0 から 959 の間の数値に素早くマッピングするために使用します。まず、キングの表から同じまたは最も近い小さい数値を探します。次に、引いた数値との差 (0 から 15) を決定し、ビショップの表から一致するビショップの配置を選択します。これに従って、まず両方のビショップを最初の基本列に配置し、次にキングの表で見つかった列の順序で 6 つの駒を残りの 6 つの空きスペースに配置します。最後に、黒の駒を白の基本列に対して対称に配置します。
SP-518 の配置を考えてみましょう。518 より小さい 16 の倍数で最大のものは 512 なので、キングのテーブルで 512 を探し、ビショップのテーブルで残りの 6 を探します。キングのテーブルでは、512 は「RNQKNR」です。ビショップのテーブルでは、6 番に「--B--B--」があります。キングのテーブルの駒をこれらの空いた場所に挿入すると、伝統的なチェスの開始順序である開始配列「RNBQKBNR」が得られます。
ラインハルト・シャルナグルは長年にわたり、各開始局面(SP)に0~959、あるいは1~960の範囲で固有の識別番号(idn)を割り当てることの望ましさを提唱してきた。彼はインターネットや書籍でその方法を紹介している。外部参照を参照のこと。応用例として、乱数発生器は手持ちの範囲を一度探索して乱数を生成し、ランダムなSPを生成することができる。2005年後半にFritz9プログラムが利用可能になった。このプログラムにはフィッシャーランダムチェスのオプションがあるが、理由は不明だが、IDnをSPに割り当てる方法が異なっている。どちらの方法も、960エントリの巨大なテーブルを必要とする代わりに、より小さなテーブルといくつかの算術演算を使用できる。
以下に説明する方法は、idn 0~959 の範囲に適しています。idn 1~960 の範囲では、960 で割って余りを取る変換方法を推奨しています。これにより、idn 0 には idn 960 にあった SP が割り当てられ、他の idn SP のマッチングは変更されません。この計算を idn 0~959 の範囲に適用した場合、何も変更されません。
どのSPにおいても、ビショップを除いたクイーンは、左から右へ(白の視点から)0、1、2、3、4、5と番号付けされた6つのマスのうちいずれか1つを占めることができます。次に、2つのナイトは、残りの5つのマス(ビショップとクイーンを除いたマス)のいずれかに10通りの方法で配置できます。これらはN5N表に示され、番号が付けられています。
どのSPでも、クイーンの位置とN5N構成はNQスケルトンからすぐに取得できます。クイーンの位置は「Q」の左にある文字数で、標準SPでは2になります。N5N構成は「Q」を省略することで得られ、標準SPでは-NN-となるため、N5Nコードは5です。一般に
idn = (ビショップのコード) + 16 * (クイーンの位置) + 96 * (N5Nコード)
標準SPの場合、idn = 6 + 16*2 + 96*5 = 518
逆の方向で、idn から始めて、それを 16 で割って、
idn = q1*16 + r1。r1はビショップのコードなので、ビショップを盤上に配置します。次に、q1を6で割ります。
q1 = q2*6 + r2。r2はクイーンの位置を表すので、盤上に配置します。
q2はN5Nコードを示しているので、ナイトを盤上に配置します(もちろんビショップとクイーンは飛ばします)。
idn = 518 から始めると、518 = 32*16 + 6、32 = 5*6 + 2 となり、ビショップのコードは 6、クイーンの位置は 2、N5N コードは 5 で構成は -NN- となります。アスタリスクが空白マスを表す場合、第 1 段は次のように埋められます: **B**B** **BQ*B** *NBQ*BN*
以下のNQスケルトン表を使用することで、すべての乗算と除算を省略できます。この表には、考えられる60個のNQスケルトンがすべて含まれており、ビショップコードが0であるすべてのSP、つまりa1とb1にビショップがあるSPを直接参照しています。
SP が与えられた場合、ビショップのコード、NQ スケルトン、およびその N5N 構成を抽出します。表の 10 個のブロックのそれぞれにある 6 つのスケルトンはすべて同じ N5N 構成を持ち、ブロックは上記の N5N 表に従って配置されています。したがって、適切なブロックを見つけて、その中の目的の場所 (たとえば No. M) に「Q」があるエントリを探すのは簡単です。すると idn = (ビショップのコード) + M となります。標準 SP の場合、6 つの -NQ-N- と -NN- を抽出します。目的のブロックは 2 行目の中央のブロックで、目的のスケルトンは No. 512 にあります。idn = 6 + 512 = 518 となります。
逆に、idn が与えられた場合、表の中で idn 以下で最大の数、例えば M を見つけます。次に、idn - M でビショップのコードが求められ、M のスケルトンによって残りのピースを埋める方法がわかります。idn = 518 の場合、表の中で NQ スケルトン -NQ-N- を持つ 512 を見つけ、ビショップのコード = 518 - 512 = 6 を得ます。
どちらの方法も、まずビショップの位置を考慮し、キングとルークの区別は無視します。ビショップ、ナイト、クイーンの位置がわかれば、残りの 3 つのマスには 1 つの可能性しかありません。整数の除算が行われる箇所では、常に商 (q1、q2、... と表記) と余り (r1、r2、... と表記) が与えられます。
2つのビショップを反対色のマスに配置する方法は16通りあります。これらは上の表に示され、番号が付けられています。実際には簡単な算術で計算できますが、表を使った方法の方が間違いが少ないようです。標準的なSPの場合、ビショップのコードは6です。
どの SP でも、ビショップの周りの他の駒の配置を見るときは、その SP の NQ スケルトンを書き留めておくと便利です。これは、ビショップを無視して、「K」と「R」を共通の記号、例えば「-」に置き換えることで行います。標準 SP の NQ スケルトンは -NQ-N- です。以下の Scharnagl の方法と Fritz9 の方法を示すセクションは独立しており、どの順序で読んでも構いません。
フィッシャーランダムチェスを開始すると、Fritz9はユーザーに局面IDNを入力するか、「くじ引き」を行うように促します。ユーザーが駒の第一段配置を選択する場合、IDNの取得方法を知っている必要がありますが、残念ながらFritz9は上記で説明した標準的な方法を使用していません。以下の表は、任意のSPのFritz9 IDNを素早く取得する方法を示しています。
どのSPにおいても、ビショップを無視した後、まずナイト(クイーンではなく)に注目します。6つのマスに2つのナイトを配置する(ビショップはスキップする)と、クイーンには4つの可能性が残ります。0、1、2、3(盤のa側から数え、ビショップとナイトはスキップする)。クイーンの位置は、SPのNQスケルトンの「Q」の左側にあるハイフンの数です。
SPが与えられたら、ビショップのコード、NQスケルトン、クイーンの位置を抽出します。次に、適切な列で、例えばNo. MにあるNQスケルトンを探します。Fritz9 idn = (ビショップのコード) + M。標準SPの場合、6 RNQKNRと1を抽出して、Fritz9 idn = 6 + 353 = 359を得ます。
Fritz9 NQスケルトンテーブル
Fritz9をお持ちの方なら、idnsを入力することでこの表を確認できます。これは、ビショップコードが0のSP、つまりビショップがa1とb1にあるSPのみを直接参照しています。