programing tip

체스 프로그램을 개발할 때 주어진 값으로 아래 방향 배열을 초기화하는 것의 중요성은 무엇입니까?

itbloger 2020. 8. 10. 07:46
반응형

체스 프로그램을 개발할 때 주어진 값으로 아래 방향 배열을 초기화하는 것의 중요성은 무엇입니까?


저는 경쟁적인 프로그래밍을 처음 접했고, 많은 훌륭한 코더들이 코드에 다음 네 줄을 가지고 있다는 것을 자주 알아 차 렸습니다 (특히 배열과 관련된 것들).

int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int diK[] = { -2, -2, -1, 1, 2, 2, 1, -1 };
int djK[] = { -1, 1, 2, 2, 1, -1, -2, -2 };

이것이 실제로 의미하는 것은 무엇이며 기술은 무엇을 위해 사용됩니까?


이것은 모든 방향을 배열로 인코딩하는 기술입니다. 모든 쌍은 di[i],dj[i]다른 방향입니다.

x, y 위치에 조각이 있다고 상상하고 x와 y 값에 더하여 가까운 위치로 이동하려면 1,0은 동쪽, -1,0은 서쪽, 0,1 남쪽, 0, -1은 북쪽입니다.

(여기에서 왼쪽 상단이 0,0이고 오른쪽 하단이 4,4라고 말했으며 배열의 각 인덱스가 2,2의 중심점 X에서 이동하는 것을 보여주었습니다.)

.....
.536.
.1X0.
.724.
.....

방법은 그것은 당신이 할 경우, 설정 ^1( ^인덱스에있는 비트 XOR)을 당신은 반대 방향을 얻을 - 0과 1은 2, 3 쪽 등이다, 반대이다. (설정하는 또 다른 방법은 북쪽에서 시작하여 시계 방향으로 이동 한 다음 ^4반대 방향으로 이동하는 것입니다.)

이제 각 방향을 자체 라인 (총 8 개)에 작성하는 대신, didj배열 을 반복하여 주어진 지점에서 모든 방향을 테스트 할 수 있습니다 (경계 확인을 잊지 마세요 :))

diKdjK모든 형태 의 기사 방향 이 아닌 모든 방향에 인접한다. 여기에서 ^1한 축을 따라 뒤집고 ^4반대쪽 기사 도약을 제공합니다.

.7.6.
0...5
..K..
1...4
.2.3.

Patashu의 설명을 따르기가 어렵다고 생각하는 사람들을 위해 명확히하려고 노력할 것입니다.

체스 판의 주어진 지점에서 가능한 모든 움직임을 고려하려고한다고 상상해보십시오.

di 및 dj 배열을 반복하여 di 값을 x 오프셋으로 해석하고 dj 값을 y 오프셋으로 해석하면 가능한 8 개 방향 각각을 다룹니다.

양수 x가 동쪽이고 양수 y가 남쪽이라고 가정하면 (Patashu의 답변에서와 같이) 다음과 같이 표시됩니다.

  | di / x | dj / y | 방향
-+ ------ + ------ + -----------
0 | 1 | 0 | 동쪽
1 | -1 | 0 | 서쪽
2 | 0 | 1 | 남쪽
3 | 0 | -1 | 북쪽
4 | 1 | 1 | 남동
5 | -1 | -1 | 북서
6 | 1 | -1 | 북동
7 | -1 | 1 | 남서부

diK 및 djK 배열은 Knight 조각의 가능한 이동을 설정하는 동일한 방식으로 해석 될 수 있습니다. 체스에 익숙하지 않은 경우 기사는 L 패턴으로 이동합니다. 한 방향으로 두 개의 사각형을 이동 한 다음 그에 대해 직각으로 하나의 사각형을 이동합니다 (또는 그 반대).

  | diK / x | djK / y | 방향
-+ ------- + ------- + ----------------
0 | -2 | -1 | 서쪽 2 개, 북쪽 1 개
1 | -2 | 1 | 서쪽 2 개, 남쪽 1 개
2 | -1 | 2 | 서쪽 1 개, 남쪽 2 개
3 | 1 | 2 | 동쪽 1 개, 남쪽 2 개
4 | 2 | 1 | 동쪽 2 개, 남쪽 1 개
5 | 2 | -1 | 동쪽 2 개, 북쪽 1 개
6 | 1 | -2 | 동쪽 1 개, 북쪽 2 개
7 | -1 | -2 | 서쪽 1 개, 북쪽 2 개

정의 된 배열을 사용하여 모든 방향에서 가능한 이동량을 확인하는 작은 코드 스 니펫.

int di[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
int dj[] = { 0, 0, 1, -1, 1, -1, -1, 1 };
int movesPossible[8];
int move = 0;
int posx, posy; // position of the figure we are checking

for (int d=0; d<8; d++) {
  for (move = 1; board.getElt(posx+di[d]*move, posy+dj[d]*move)==EMPTY; move++) ;
  movesPossible[d] = move-1;
}

참고URL : https://stackoverflow.com/questions/16349925/what-is-the-significance-of-initializing-direction-arrays-below-with-given-value

반응형