>> ROB 보덴 : 안녕하세요.
롭 해요, 나는 당신의 희망 15 게임을위한 게임.
이제, 당신이 필요로하는 네 가지 기능이 있습니다 이 프로그램에 구현하는 - 초기화하는 것은,
그릴 이동 이겼다.
그래서, 초기화를 살펴 보자.
>> 여기에서, 우리는 우리가하고있는 제일 먼저 참조 하기 위하여려고하는 변수를 선언합니다
카운터했다.
이 초기화 될 것 D 번 D 마이너스 1.
d는 차원이라는 것을 기억 우리의 보드.
어떻게 초기화 작업하려고하는 것은 무슨이다 전체 보드를 반복합니다
우리는 시작하는거야 왼쪽 상단.
>> 그리고 그냥 가정 해 봅시다 우리 4 × 4 보드가있다.
그래서 최고는 우리가있어 남아 말을하려고하면 15입니다.
그리고 우리는 단지 계산거야 보드를 통해, 15, 14, 13 말
12, 11, 10, 9, 8, 7, 6, 5, 4, 등등.
그래서 왼쪽, 우리는 D 배 예상 D 마이너스 1, 4로 4하는
경우는 16 마이너스가 될 것입니다 1, 정확하게 15입니다.
>> 우리가가는 곳 그리고 지금 여기 전체 보드를 통해 반복.
그리고 우리는 각각의 위치를​​ 설정하는거야 의 전류치 보드
우리의 카운터 다음 카운터는 것입니다 감소하는, 그래야 다음
우리가 도달 위치는해야 할 것입니다 카운터 이상이어야
이전 위치.
그래서 우리는 처음에 15을했고 카운터를 감소시킵니다.
그래서 우리는 14을 할당하는거야 다음 위치, 감소 카운터,
우리는 할당에가는거야 13, 등등.
>> 마지막으로, 우리는 그 코너를 처리 할 필요가 경우 경우, 보드가 더있는 경우
치수는 다음 단지, 15, 14, 13 일 (12)는 모든 방법 아래로 3, 2, 1이고,
우리를 떠나려고 해결 못하는 보드.
그리고 우리는 1과 2를 교체해야합니다.
D의 모드 2 0에 해당한다면, 그건 우리는 확인하는 것입니다 방법
그것도의 경우에 볼 수 있습니다.
D의 모드 2는 0, 다음 행 D 마이너스에 동일한 경우 1, 어떤 아래 행이며,
위치 D 마이너스 2, 또는 열 D 마이너스 2, 우리는 2 부분을 설정하려고하고있어
D 열 마이너스 3 우리가있어 1로 설정하는 것.
그래서 그냥 반전 어디에 도 1 및 2는 현재.
>> 마지막으로, 우리는 매우를 설정하는거야 오른쪽 아래 빈 같 곳
빈 해시가 정의되어 있습니다 0으로 상단에.
그래서, 즉, 꼭 필요하지 않았다 루프이해야 할 것입니다 때문에
0으로 오른쪽 아래, 이후 설정 카운터는 자연적으로 0에 도달 할 것입니다.
하지만 알고 우리에 의존하는 빈은 0을 찾기 위해 해시했다.
나중에이 프로그램으로 이동 한 경우 100에 상단에 공백을 변경 그것을
여전히 작동합니다.
>> 그래서 이것은 단지 있는지 확인하고있다 오른쪽 아래는 실제로 동일하다 우리의
빈 값.
마지막으로, 우리는 두 개의 전역 변수를 가지고, 그래서 빈 J 빈, 우리는 참조
사람들은 상단에 선언했다.
그리고 우리는 그 두 개의 전역을 사용하는 것입니다 추적 할 변수
빈의 위치, 우리가하지 않도록 전체를 볼 필요가
빈은 매일 찾을 수있는 보드 우리는 움직임을 만들려고 시간.
따라서 블랭크의 위치는 항상 오른쪽 아래에 시작하는 것.
그래서 오른쪽 아래가 주어진다 인덱스 D - 1, D - 1.
그래서, 그 초기화합니다.
>> 이제 우리는 그리로 이동합니다.
그래서, 무승부는 유사 할 것입니다 우리는 반복하는가는 곳
전체 보드 위에.
그리고 우리는 단지 값을 인쇄 할 그 보드의 각 위치에 있습니다.
그래서 여기, 우리의 가치를 인쇄하는 보드의 각 위치에있다.
그리고 우리가하고있는 것을 알 수 -.
그리고 그것은 단지의 printf를 말하고 그 에 관계없이 한 자리 또는의 경우의
두 자리 숫자로, 우리는 여전히 그것을 원하는 프린트 아웃 두 개의 열을 차지
그 때문에 우리는 두 개의 숫자와 하나가있는 경우 동일한 보드의 자리 숫자, 우리의
보드는 여전히 좋은 사각 볼 것이다.
>> 그래서 우리는 모든 값을 위해 그렇게 할 보드, 빈을 제외하고.
따라서, 경우 보드의 위치는 동일 빈, 우리 특별히
그냥 밑줄을 인쇄 할 빈을 나타내는 대신합니다
의 어떤 값 빈 사실이다.
>> 마지막으로, 우리는 인쇄 할 새로운 라인 아웃.
이 안에 여전히 있음을 알 외부 루프에 대한 외부하지만,
루프 내부.
루프이 외부가 반복되기 때문에 모든 행에 대해, 그래서이 printf와는
단지 새로운 라인을 인쇄, 그래서가는 우리 다음 행을 인쇄로 이동합니다.
그리고 그 끌기 위해의.
>> 그래서, 지금의이 이동하는 이동하자.
이제, 우리는, 타일을 이동에 합격 사용자는 게임에 입력 - 그들이
그들이 이동할 타일을 입력합니다 - 및 당신은 부울을 반환하는데, 그렇게하고
참 또는 거짓에 따라 하나 그 움직임은 사실 여부
유효 - 타일이 될 수 있는지 여부 빈 공간으로 이동했다.
>> 그래서 여기, 우리는 지역 변수를 선언, tile_1과에 가고있다 tile_j,
blank_i 및 blank_j 비슷할, 그것은 추적 것 제외
타일​​의 위치.
지금 여기, 우리는 blank_i 사용하는거야 그리고 blank_j 등 모든 권리를 말한다
여기 보드의 빈이다.
>> 이제 빈 위의 타일은?
빈의 왼쪽에있는 타일인가?
블랭크의 오른쪽 타일인가?
빈 아래의 타일인가?
그래서, 타일은 그 중 하나에있는 경우 위치는, 우리가 알고있는 타일
빈 자리로 이동 할 수 있습니다 빈은 이동 될 수 있습니다
타일​​은 현재.
>> 그래서 여기, 우리가 말을하면 위치 보드 blank_i - 1 blank_j.
그래서이 말하고있는이 타일입니다 현재 빈 위?
그리고, 우리가 기억하는거야 즉, 타일의 위치입니다.
타일​​ 위치 blank_i에 마이너스 1 blank_j.
이제 첫 번째, 우리는 또한이 검사를 바로 여기에, 그래서 blank_i입니다
0보다 크다.
>> 왜 우리는 그렇게 할 수 있습니까?
음, 빈은 맨 위의 행에있는 경우 보드의, 우리는하고 싶지 않아
이후 타일의 빈 위에보고 맨 위의 것은 없다
보드의 행.
이것은 당신이 그만 둘 수있는 방법입니다 세그먼트 오류 또는 같은
프로그램은 작동하지 않을 수 있습니다 예상치 못한 방법으로.
그래서, 이것은 우리가하지 않는 것을 확인하고있다 유효하지 않은 곳에서 찾는다.
>> 지금 우리를 위해 같은 일을 할거야 다른 모든 가능한 조합.
그래서 여기, 우리는 빈 아래 찾고 그 타일의 경우에 볼 수 있습니다.
그리고 우리는 확실히 우리가있어 확인해야 하지 맨 아래 행에, 그렇지 않으면 우리
타일​​을 찾을 수 없습니다.
여기에서, 우리는 왼쪽에 보는거야 이 타일의 경우 빈 확인합니다.
그리고 우리는 왼쪽으로 보면 안 되죠 우리는 왼쪽 열에 있다면.
그리고 여기에 우리는에 보는거야 오른쪽 빈의, 우리는하지 말아야
우리가 있다면 오른쪽에 보면 맨 오른쪽 열에서.
>> 그래서, 그런 것들 중 어느 것도 사실이 없을 경우, 그 타일이 인접하지 않았다 의미
빈과에 우리는 false를 반환 할 수 있습니다.
움직임은 유효하지 않습니다.
하지만, 그 중 하나가 사실이라면, 다음에 이 점은, 우리는 tile_i을 알고
tile_j은 동일하다 타일​​의 위치.
그래서, 우리는에서 보드를 업데이트 할 수 있습니다 포지션 tile_i 및 tile_j.
우리는 새 값이 비어있게됩니다 알고 그 위치 blank_i
blank_j, 원래 있던 빈 - 우리는 타일 것입니다 알고
이 이동합니다.
>> 우리가 실제로 할 필요가 없습니다주의 여기에 실제 스왑, 우리가 알고 있기 때문에
삽입해야 할 값 그 위치에.
우리는 임시을 필요로하지 않는다 주변 변수입니다.
>> 마지막으로, 우리는 우리를 기억해야합니다 우리의 글로벌 변수가
위치 추적 유지 빈.
그래서 우리의 위치를​​ 업데이트 할 여기서 타일 될 수있는 빈
원래이었다.
마지막으로, 우리는 (때문에), true를 반환 이동 성공했습니다.
우리는 성공적으로 교체 타일​​ 빈.
>> 좋아요, 마지막으로 우리 원을 확인해야합니다.
그래서, 원 마찬가지로 부울을 반환 곳 true를 표시하는 것입니다 그
사용자는 게임을 수상했다.
false를 나타내는된다 게임은 여전히​​ 것입니다.
사용자가 원 않았습니다.
그래서,이 꽤 많이 될 것입니다 INIT의 반대, 위치 초기화,
우리는 보드를 초기화 기억 그래서 15, 14, 13, 12,.
수상 반면, 우리는 당신을 검사 할 경우 보드는 1, 2, 3, 4, 5, 및이다.
>> 그래서, 우리는 초기화거야 우리 그 어떤 정상이기 때문에 1로 대응
보드의 왼쪽이 있어야합니다.
그리고, 우리는 루프에가는거야 전체 보드 위에.
의이 조건을 무시하자 초.
그리고이 조건은 예정 검사는이 위치에서 보드
현재 카운트에 해당?
그렇다면, 카운트를 증가되도록 우리가 볼 다음 위치는 하나의 높은
우리는 현재에있다 위치보다.
>> 그래서 우리가 얻는 방법 왼쪽은 1이어야한다.
2 카운트를 증가.
다음 위치에서 봐.
이 2?
그렇다면, 3 카운트를 증가.
다음 위치는 3인가?
그렇다면, 카운트를 증분 4 등.
그래서,에 대한 위치가있는 경우 우리의 수를 동일하지 않습니다 보드,
우리는 그 이후 false를 반환 할 일부 타일이 있다는 뜻
하지 올바른 위치에있다.
>> 그래서 여기,이 조건은 무엇을하고 있습니까?
음, 공백이 있음을 유의 오른쪽 하단에 가기로되어.
그리고 빈의 값이 그렇지 않을 수 있습니다 반드시 값을 같게
그 도달 할 것입니다 카운터 오른쪽 아래에.
그래서 우리는 구체적으로 확인 싶다면 동일은 D - 1과 J 같음 같음
D - 1에 해당 - 말하는 경우 우리 오른쪽 하단의에서 찾고 있습니다
보드 - 우리 단지 계속하려면.
우리는이 특정를 건너 뛰 For 루프의 반복.
>> 그래서, 우리는이를 통해 얻을 관리하는 경우 루프 중첩, 그 의미
에 있던 어떤 타일은 없었다 잘못된 위치.
그리고 우리는 루프의 탈옥과 올 여기에, 우리는 어디에서 true를 반환 할 수 있습니다.
모든 타일이 올바른 위치에 있었다 그것은 사용자가 가지고있는 의미
게임을 이겼다.
그리고 바로 그거야.
내 이름은 롭 보우 든,이 15이었다.