2016-09-12 4 views
-2

これはMAZEアルゴリズムの一部です。機能に含まれるこのコードの短縮された部分はあまり明確ではありません。私の提案は正しいですか?Cで短縮されたコードの意味(int_wall関数内)

... 
#define UP 1 
#define RIGHT 2 
#define DOWN 4 
#define LEFT 8 
... 
int wall_ahead(int m[MAZE_SIZE][MAZE_SIZE], int x, int y, int dir){ 
    x = (dir == LEFT) ? --x : 
     (dir == RIGHT) ? ++x : x; 
    y = (dir == UP) ? --y : 
     (dir == DOWN) ? ++y : y; 

    return m[x][y]; 
} 

私の提案は次のとおりです。

if(dir == LEFT){ 
    x -= 1; 
    if(dir==RIGHT){ 
     x += 1; 
    } else { 
     x = x; 
    } 
} 
+0

2番目の 'if'の前に' else'を置きます。 – Evert

+0

あなたの実際の質問は何ですか? – Evert

+0

'x - = x'?それは '-x'が意味するものではありません。おそらく 'x - = 1'です。 – Evert

答えて

0

あなたはこのように、switchステートメントを使用したい:

switch (dir) { 
case UP: 
    --y; break; 
case DOWN: 
    ++y; break; 
case LEFT: 
    --x; break; 
case RIGHT: 
    ++x; break; 
} 

は、元のリストのような割り当てを行うには、これらの接頭演算子は、すでに値を変更し、平野間違っています。

OTOH、UPDOWNは相互に排他的になるようだが、ないにRIGHTLEFTと同じことが他の方法で回避を適用するので、これは、より正確になります:

x += !!(dir & DOWN) - !!(dir & UP); 
y += !!(dir & RIGHT) - !!(dir & LEFT); 

また、それほど重要ではありませんしかし、元のリストにはいくつかのタイプミスがあります。それらをチェックしてください。配列の次元を与える必要があります。そうしないと、コンパイラはアドレス計算を行うことができません。

+0

私が探していたことありがとうございました。 – Johny

+0

斜め方向に進むことについての編集をチェックしてください。 –

+0

1.値渡しの引数の値を変更することはできません(OPがそのコード内で行うように、IMOを指摘する必要があります)。 2.あなたの 'switch/case'は' UP/RIGHT'、 'UP/LEFT'などの組み合わせを許可しません。 –

0
if(dir == LEFT){ 
    x -= 1; 
    if(dir==RIGHT){ 
     x += 1 
    } else { 
     x = x; 
    } 
} 

が正しくありません。最初のコードブロックが行うことはしません。

それはする必要があります:

if(dir == LEFT){ 
    x -= 1; 
} 
else if(dir==RIGHT){ 
    x += 1 
} 

コードの意味が今従うことは簡単です。

dirLEFTであれば、dirRIGHTであれば、xで何もしないそうでなければ1
xをインクリメント1.
xをデクリメント。

最初のコードブロック内のコードの残りの部分の意味:

dirUPある場合dirDOWNであれば、y
1によりをデクリメント、行わないエルス1
yをインクリメントyのもの

関連する問題