2017-01-12 11 views
0

私は非常に単純なチェスプログラムを作っています。私は部分的にやっているナイトの動きを作っていますが、私は騎士がボードから出るのを避ける方法に固執しています。 R =行、C =列、V =ボード(8×8)チェス(騎士)の動き、ボードを外すことを避ける

マイコード:

public static boolean[][] knightMoves(int r, int c, boolean[][] v){ 
    if(r <= 7 && c >= 0) v[r+2][c-1] = true; 
    if(r <= 7 && c >= 0) v[r+1][c-2] = true; 

    if(r <= 7 && c >= 0) v[r+2][c+1] = true; 
    if(r <= 7 && c >= 0) v[r+1][c+2] = true; 

    if(r <= 7 && c >= 0) v[r-2][c-1] = true; 
    if(r <= 7 && c >= 0) v[r-1][c-2] = true; 

    if(r <= 7 && c >= 0) v[r-2][c+1] = true; 
    if(r <= 7 && c >= 0) v[r-1][c+2] = true; 

    return v; 
} 

すべてのヘルプは理解されるであろう!

+1

あなたの 'で'あなたは有効な**目的地**点を確認する必要があります。また、Java配列はゼロベースなので、 '> 0'ではなく'> 0'である理由が明確ではありません。 –

+0

はい、私はそれを逃した@ PM –

+0

この答えの上半分をチェックしてください:http://stackoverflow.com/a/41623648/2341336それは役に立つかもしれません – Chris

答えて

0

これは実際に数年前のACMプログラミングコンテストの問題の一部でした。だから、コードの行の最小数は、このようなものです:

boolean check(int r, int c) { 
    return r<8 && r>= 0 && c < 8 && c>=0; 
} 

その後、あなたはそれが有効であるかどうかを確認するために(x、y)とから、それぞれの潜在的動きをチェックすることができ:

if check(x+1, y+2) ... 
if check(x+2, y+1) ... 
if check(x-1, y+2) ... 
if (check(x-2, y+1) ... 
if check(x+1, y-2) ... 
if check(x+2, y-1) ... 
if check(x+1, y+2) ... 
if (check(x+2, y+1) ... 

..あなたが法的な動きをするために行うことです。 「V」は、あなたのボードであり、あなたは(x、y)に開始した場合、これらは、私は私のチェスエンジンに使用する技術は、すべて私が必要とするので、起動時にすべての騎士の動きを事前に生成することである

if (check(x+1, y+1)) 
    v(x+1, y+1) = true; // indicated knight can move there 
+0

これはさらにdx/dyで最適化することができます。詳細については、この回答のトップを参照してください:) http://stackoverflow.com/a/41623648/2341336(上半分の最後の例はチェスのナイトについてです) – Chris

+0

{void(r、int c、boolean [] [] v){if(r => 0 && r < 8 && c > = 0 && c <= 8){v [r] [c] = true ; }} ' –

0

かもしれません知るためには、騎士がオンになっている正方形であり、私は、例えば、単一のアレイ・ルックアップで可能なすべての騎士に移動し、生成することができます:私の騎士がE4上にある場合

// Pre-generated knight moves 
public static final long[] KNIGHT_MOVES = new long[] { 
    0b00000000_00000000_00000000_00000000_00000000_00000010_00000100_00000000L, 
    0b00000000_00000000_00000000_00000000_00000000_00000101_00001000_00000000L, 
    0b00000000_00000000_00000000_00000000_00000000_00001010_00010001_00000000L, 
    // ... etc. 

だから、私は単にKNIGHT_MOVES [4 * 8 + 3を必要とします]、そしてそのビットパターンは、私にその広場からすべての動きを与えます。それは可能な限り最速の方法で、チェスエンジンを書く場合にはあなたが望むものです。

関連する問題