可能なチェスの動きはいくつありますか?
標準の初期位置から始めて、この位置とそれに続くすべての可能な位置で、可能な合法的なチェスの動きはいくつありますか?
たとえば、開始位置を無視すると、ビショップは32マスに移動でき(ただし、もう一方は他の32マスをカバーします)、ルークは64マスに移動できます。両側を考慮に入れると、ポーンは64マスすべてに到達でき、騎士、王、クイーンは64のポジションすべてに到達することもできます。
つまり、合計で384の移動ターゲット-正方形+ピースの組み合わせになります。これは正しいです?
しかし、開始位置が無視されない場合の移動数はいくつですか?
次に、16のポーンダブルステップアドバンスと4つのキャスリングムーブ(各プレーヤーに2、クイーンとキングサイド)を追加する必要があります。そして、アンパッサンは、左に7つ、右に7つあるはずで、両方のプレーヤーで2倍になります。そして、他のすべてのピースのすべての可能なソースとターゲットの正方形の組み合わせ!
回答
ホワイトキングは、内側の36フィールドから8フィールド、4コーナーフィールドから4フィールド、残りの24境界フィールドから5フィールドに移動できます。これは、白い王の場合は420移動、キャスリングの場合は2を追加して422に到達します。キャプチャを区別すると、これは842にほぼ2倍になります(キャスリングはキャプチャできません)。次に、黒い王がこれを2倍にできるようにします(1684)。または、両方が行うことができる動きを特定しますか(つまり、キャスリング以外のすべて-844)?
ルークはいつでも(自由な視線が与えられれば)14マスに移動できます。それは896の動きです。キャプチャを区別する場合は、1792に倍増します。色を区別したい場合は、もう一度2倍にします(3584)。
長さnの対角線(たとえば、北西から南東)で、ビショップはn(n -1)の移動を行うことができます(開始フィールドと個別の終了フィールドを選択します)。n = 1,2,3,4,5,6,7,8,7,6,5,4,3,2,1(つまり、ビショップの色を無視)を合計して、280ムーブ、ダブルに到達します。対角線の両方向をカウントするには、560まで。キャプチャを区別したい場合はダブル(1120)、色で区別したい場合はもう一度ダブル(2240)します。
女王の場合は、ルークとビショップを追加するだけで、1456、2912、または5824の動きを数えます。
騎士は通常8回の移動が可能ですが、王と同様に、近くの境界を考慮する必要があります。方向で数える方が簡単です。たとえば、42(6 x 7)のフィールドがあり、そこから右に2つ、上に1つ進むことができます。8つの方向すべてで同じ数42(ただし、フィールドは異なります)があるため、合計336のナイトが移動します。キャプチャを区別する場合はダブル(672)。色で区別する場合は、もう一度2倍にします(1344)。
白いポーンは、初期位置から2フィールド先に移動できます(8移動)。行2から6に1つ先に移動できます(40移動)。行7から先に進み、クイーン、ルーク、ビショップ、またはナイトに昇格できます(32移動)。ポーンの場合、キャプチャを区別する必要があります。8列のうち7列でのみ右にキャプチャでき、8列のうち7列で左にキャプチャできます。これにより、行2から6への70回のキャプチャ移動と、プロモーション付きの56回のキャプチャが可能になります。これまでのところ206。ポーンの同じ動き(開始フィールドと終了フィールド)による通常のキャプチャとアンパッサンのキャプチャを区別したい場合は、14を追加して220に到達します。繰り返しますが、少なくともポーンの場合は、プレーヤーで区別すると便利です。 440に到着します。
要約すると、可能な動きを数える最も寛大な方法は、1684 + 3584 + 2240 + 5824 + 1344 + 440 = 15116の異なる動きにつながる可能性があります。チェックまたはチェックメイトを与える動きを区別することによって、またはキャプチャされたピースに従ってキャプチャを区別することによって、数をさらに増やすことができます。
ボードが与えられ、ソースとターゲットの正方形のみ、およびプロモーションの選択が考慮される場合(UCI形式の場合のように)、1968年の可能な移動があるように見えます。
# Python
# pip install python-chess
import chess
moves = 0
# Queen, covers all lines and diagonals
for x in range(8):
for y in range(8):
board = chess.Board("8/8/8/8/8/8/8/8")
board.set_piece_at(chess.square(x,y), chess.Piece(chess.QUEEN, chess.WHITE))
moves += len(list(board.generate_legal_moves()))
# Knight jumps
for x in range(8):
for y in range(8):
board = chess.Board("8/8/8/8/8/8/8/8")
board.set_piece_at(chess.square(x,y), chess.Piece(chess.KNIGHT, chess.WHITE))
moves += len(list(board.generate_legal_moves()))
# Straight pawn promotions, 2 players, 8 ranks each, 4 choices (queen, rook, bishop, knight)
moves += 2*8*4
# Diagonal pawn promotions, when capturing a piece
# 2 players, 14 diagonals (12 in the center and 1 each in the first and last ranks), 4 choices
moves += 2*14*4
print(moves)
キャスリングは、キングを2ステップ動かすことによって示されると想定されます。
ここでは、すべての可能なUCIの文字列があると、ここでそれらを生成するためのコードです。