The Farmer Was Replaced— 코딩 게임 완전 해부
Chapter 02 · 기초

격자 위의 발자국 — go0에서 goto_fast까지

NxN 격자에서 가장 기본이 되는 이동 패턴 세 가지: 원점 복귀(go0), 직선 목적지 이동(goPos/goto_fast), 그리고 전체 순회(snake/zigzag). 모든 자동화의 시작점이다.

Navigation Snake Pattern Manhattan Distance

§ 1원점 복귀: go0()

가장 많이 호출되는 함수. 어디서든 (0,0)으로 돌아온다.

go0()는 현재 x좌표만큼 West로, y좌표만큼 South로 이동한다. 벽이 없는 열린 농장에서만 작동한다 — 미로에서는 벽에 막힌다.

go0()
def go0():
    for i in range(get_pos_x()):
        move(West)
    for i in range(get_pos_y()):
        move(South)

§ 2뱀 패턴 순회

격자 전체를 한 칸도 빠짐없이 순회하는 기본 패턴. 풀 베기, 씨앗 심기, 수확 — 모든 곳에 쓰인다.

North로 끝까지 올라가고 → East로 한 칸 이동 → South로 끝까지 내려가고 → East로 한 칸 이동. 이걸 while True로 반복하면 격자 전체를 빗질한다.

뱀 패턴 (Snake/Zigzag) 순회 STEP 01 / 6
space 재생 · ← → 단계 · R 리셋
snake() — 뱀 패턴
def snake():
    while True:
        for i in range(N-1):
            harvest()
            move(North)
        harvest()
        move(East)
        for i in range(N-1):
            harvest()
            move(South)
        harvest()
        move(East)
직관 농부가 논밭을 가로질러 가는 것과 같다. 한 줄을 끝까지 갔다가, 옆줄로 넘어가서 반대 방향으로 돌아온다. 이 패턴은 모든 타일을 정확히 한 번씩 방문하므로 O(N²) 시간에 전체 격자를 커버한다.

§ 3goto_fast: 토러스 최단경로

게임 세계는 토러스(torus)다. 오른쪽 끝에서 East로 가면 왼쪽 끝으로 나온다. 이걸 이용한 최단경로 계산이 goto_fast()다.

직선 거리 vs 토러스 랩어라운드 거리를 비교하여 더 짧은 쪽으로 이동한다. NxN 맵에서 (0,0) → (N-2,0)로 갈 때 East로 N-2칸 가는 것보다 West로 2칸 가는 게 빠르다.

goto_fast() — 토러스 최단경로
def goto_fast(x, y):
    M = get_world_size()
    cx = get_pos_x() + 1
    cy = get_pos_y() + 1
    # x축: 오른쪽 vs 왼쪽 거리 비교
    if x > cx:
        left = M + cx - x
        right = x - cx
    else:
        right = M - cx + x
        left = cx - x
    # 짧은 쪽으로 이동
    if right > left:
        for i in range(left): move(West)
    else:
        for i in range(right): move(East)
    # y축도 동일
토러스 랩어라운드 — 최단경로 선택 STEP 01 / 4
space 재생 · ← → 단계 · R 리셋

§ 4실전 코드 해부

실제 f0.py에서 사용하는 이동 함수들을 살펴보자. go0()는 원점 복귀, goPos()는 목적지 직선 이동, 그리고 다양한 작물 심기 함수(grass, grabush, pl)가 모두 뱀 패턴 위에 구축되어 있다.

핵심 pl(enti)는 "심기만" 함수다. 엔티티를 인자로 받아 while True 뱀 패턴으로 전체 격자에 harvest + plant를 반복한다. grass(), grabush()도 같은 구조의 변형이다.