최근 수정 시각 : 2025-10-30 21:17:49

<농부는 대체되었다()_

#!if 링크 == null
{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:#fff; color:fff;"
{{{#!html <농부는}}}}}}
#!if 링크 != null
[[#|{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:fff;"
{{{#!html <농부는}}}}}}]]
#!if 링크 == null
{{{#!wiki style="display:inline; text-shadow:0 0 6px ffd400; text-shadow:0 0 6 ffd400; color:#ffd400; text-shadow:0 0 6px #ffd400; text-shadow:0 0 6 #ffd400; color:#ffd400; color:ffd400;"
{{{#!html 대체되었다}}}}}}
#!if 링크 != null
[[#|{{{#!wiki style="display:inline; text-shadow:0 0 6px ffd400; text-shadow:0 0 6 ffd400; color:#ffd400; text-shadow:0 0 6px #ffd400; text-shadow:0 0 6 #ffd400; color:ffd400;"
{{{#!html 대체되었다}}}}}}]]
#!if 링크 == null
{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:#fff; color:fff;"
{{{#!html ()_}}}}}}
#!if 링크 != null
[[#|{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:fff;"
{{{#!html ()_}}}}}}]]

#!if 링크 == null
{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:#fff; color:fff;"
{{{#!html >The Farmer Was}}}}}}
#!if 링크 != null
[[#|{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:fff;"
{{{#!html >The Farmer Was}}}}}}]]
#!if 링크 == null
{{{#!wiki style="display:inline; text-shadow:0 0 6px ffd400; text-shadow:0 0 6 ffd400; color:#ffd400; text-shadow:0 0 6px #ffd400; text-shadow:0 0 6 #ffd400; color:#ffd400; color:ffd400;"
{{{#!html Replaced}}}}}}
#!if 링크 != null
[[#|{{{#!wiki style="display:inline; text-shadow:0 0 6px ffd400; text-shadow:0 0 6 ffd400; color:#ffd400; text-shadow:0 0 6px #ffd400; text-shadow:0 0 6 #ffd400; color:ffd400;"
{{{#!html Replaced}}}}}}]]
#!if 링크 == null
{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:#fff; color:fff;"
{{{#!html ()_}}}}}}
#!if 링크 != null
[[#|{{{#!wiki style="display:inline; text-shadow:0 0 6px fff; text-shadow:0 0 6 fff; color:#fff; text-shadow:0 0 6px #fff; text-shadow:0 0 6 #fff; color:fff;"
{{{#!html ()_}}}}}}]]
<nopad> 파일:coai4w.jpg
<colbgcolor=#2b2840,#2b2840><colcolor=#ffffff,#ffffff> 개발 Timon Herzog
유통 Metaroot, Timon Herzog
플랫폼 Windows
ESD Steam
장르 캐주얼, 인디, 시뮬레이션, 전략
출시 앞서 해보기
2023년 2월 11일
정식 출시
2025년 10월 10일
엔진
한국어 지원 지원
심의 등급 파일:게관위_전체이용가.svg 미정
해외 등급
상점 페이지 파일:스팀 아이콘.svg

1. 개요2. 시스템 요구 사항3. 데모 버전
3.1. 데모 버전과의 차이
4. 게임 플레이
4.1. 아이템 목록
4.1.1. 건초4.1.2. 당근4.1.3. 나무4.1.4. 호박4.1.5. 선인장4.1.6. 뼈4.1.7. 기묘한 물질4.1.8. 금4.1.9. 물4.1.10. 비료4.1.11. 파워
4.2. 프로그래밍 기능
4.2.1. 루프
4.2.1.1. while4.2.1.2. for
4.2.2. 디버그4.2.3. 연산자4.2.4. 디버그_24.2.5. 타이밍4.2.6. 감각4.2.7. 변수4.2.8. 시뮬레이션4.2.9. 리스트4.2.10. 함수4.2.11. 딕셔너리4.2.12. 가져오기4.2.13. 유틸리티4.2.14. 비용4.2.15. 유틸리티4.2.16. 자동 해금
5. 팁
5.1. 미로 길찾기5.2. 선인장 정렬5.3. 혼합 재배5.4. 뱀 게임5.5. 멀티 드론
6. 평가7. 여담8. 관련 문서

1. 개요

<nopad>
출시 트레일러

드론을 프로그래밍하고 최적화하여 농장을 자동화하는 코딩 전략 게임이다.
자원을 모아 더 나은 기술을 잠금 해제하고 가장 효율적인 농부가 되는 것이 게임의 목표다.
문제 해결 능력과 코딩 기술을 적극활용해야 한다.

프래그래밍 언어는 파이썬이다.

2. 시스템 요구 사항

시스템 요구 최소 사양
운영체제 Windows
그래픽 카드 Nvidia Geforce GTX 550 이상
4GB
하드 디스크 드라이브 1GB

3. 데모 버전

3.1. 데모 버전과의 차이


주요 변경 사항:
  • 기술 트리의 개편으로 인해 이전 저장 파일의 업그레이드 수치가 더 이상 유효하지 않다. 이전 저장 파일을 열면 게임이 모든 업그레이드를 적절한 수준으로 재설정한다.
  • 미로를 재사용할 때는 이제 먼저 보물을 재배치한 다음 위치를 측정해야 한다. 이전처럼 먼저 측정한 뒤 재배치하는 방식은 더 이상 사용할 수 없다.

게임플레이:
  • 농장의 타일 위에 마우스를 올리면 유용한 정보를 표시하는 툴팁이 추가되었다.
  • 이제 미로의 어느 위치에서 measure() 를 사용하더라도 현재 보물의 위치를 반환한다. 더 이상 보물만 따로 측정할 필요가 없다.
  • 미로에 can_move() 함수가 추가되었다.
  • 호박의 최대 크기가 5x5에서 6x6으로 늘어났다.
  • 땅이 마르는 동작이 약간 변경되었다. 기존에는 0.8~1.2초마다 1%씩 말랐지만, 이제 각 땅 타일이 0.1초마다 10% 확률로 마른다.
  • 선인장의 성장 시간이 이제 항상 정확히 1초로 고정되었다.
  • 호박이 죽으면 이제 시든 호박이 남아 죽었음을 표시한다.
  • pet_the_piggy() 함수가 추가되었다.
  • num_unlocked() 가 이제 "Senses" 와 함께 잠금 해제된다.

오디오:
  • 오디오가 완전히 새로 제작되었다.
  • 이제 게임 시작 시 음악이 재생된다.

비주얼:
  • 기술 트리의 비주얼이 전면적으로 개선되었다.
  • 화면 왼쪽 상단의 인벤토리 패널에 아이템을 획득할 때 시각 효과가 추가되었다.
  • 선인장이 올바르게 정렬되지 않았을 경우 갈색으로 표시되어 더 눈에 잘 띄게 되었다.
  • 식물은 이제 심은 즉시 표시되며, 아직 성장하지 않았더라도 볼 수 있다.

코드 에디터:
  • 밑줄이 포함된 식별자를 더블 클릭하면 이제 전체 식별자가 선택된다.
  • "탭을 공백으로 변환" 옵션이 꺼져 있을 때 들여쓰기 공백이 탭으로 변환된다.
  • 확대 및 축소 기능이 훨씬 부드러워졌다.
  • 코드 자동 완성 기능이 올바르게 import 를 인식하며, 다른 파일의 제안도 제공한다.
  • 텍스트 편집 및 창 크기 조정을 위한 서로 다른 커서가 추가되었다.
  • 디버거의 단계 진행이 이제 시뮬레이션 틱이 아닌 코드 라인을 기준으로 작동한다.

기타:
  • 이제 Python처럼 비교 연산자를 연결할 수 있다.
  • get_cost(Entities.Hedge) 와 get_cost(Entities.Treasure) 가 이제 1x1 미로의 비용을 반환한다.
  • 해상도 설정이 추가되었다.
  • 코드 실행 중 깜빡이는 하이라이트를 끌 수 있는 설정이 추가되었다.
  • 코드 실행이 더욱 최적화되어 코드 실행 중에도 게임이 더 부드럽게 작동한다.
  • "HUD 토글" 키 설정이 추가되었다.

4. 게임 플레이

파일:68c16439f9c5c4f29340edda_3 Level_Scale_GifTheFarmerWasReplacedGIF.gif
게임 내 플레이 방식
Program and optimize a drone to automate a farm and watch it do the work for you.
Collect resources to unlock better technology and become the most efficient farmer in the world.
Improve your problem solving and coding skills.

드론을 프로그래밍하고 최적화하여 농장을 자동화하고 드론의 작업을 지켜보세요.
자원을 모아 더 나은 기술을 잠금 해제하고 세계에서 가장 효율적인 농부가 되어보세요.
문제 해결 능력과 코딩 기술을 향상시키세요.
스팀의 게임 소개

4.1. 아이템 목록

파일:스크린샷 2025-10-30 200146.png

4.1.1. 건초

풀을 수확하면 건초를 얻을 수 있다.

4.1.2. 당근

plant(Entities.Carrot)으로 당근을 심기 전에, 땅을 갈아야 한다.
땅을 갈려면 till()을 호출하면 된다.
그러면 땅이 Grounds.Soil로 바뀐다.

till()을 다시 호출하면 Grounds.Grassland로 다시 바뀐다.

당근을 심는 데는 나무와 건초가 소모된다.
이 아이템들은 plant(Entities.Carrot)을 호출할 때 자동으로 제거된다.

어떤 식물이든 그 소모 아이템 비용은 자체 페이지에서 볼 수 있다.

4.1.3. 나무

덤불을 수확하면 나무를 얻을 수 있다.

하지만 덤불 말고 나무를 심으면 덤불보다 나무를 얻기에 더 좋은 방법이다.
각각 5개의 나무를 주며, 덤불처럼 풀이나 흙 위에 심을 수 있다.

나무는 공간을 좀 확보하는 것을 좋아해서 바로 옆에 심으면 성장이 느려진다.
바로 북쪽, 동쪽, 서쪽, 남쪽에 있는 타일에 다른 나무가 있을 때마다 성장 시간이 두 배가 된다.
그래서 모든 타일에 나무를 심으면 자라는 데 2*2*2*2 = 16배 더 오래 걸린다.

4.1.4. 호박

호박은 당근처럼 경작된 흙에서 자란다. 심는 데는 당근이 들어간다.

사각형 안의 모든 호박이 다 자라면, 함께 자라 거대한 호박을 형성한다.
호박은 다 자라면 20% 확률로 죽기 때문에, 합쳐지게 하려면 죽은 호박을 다시 심어야 한다.

호박이 죽으면, 수확해도 아무것도 주지 않는 죽은 호박을 남긴다.
그 자리에 새 식물을 심으면 자동으로 죽은 호박이 제거되므로, 수확할 필요가 없다.
can_harvest()는 죽은 호박에 대해 항상 False를 반환한다.

거대한 호박의 수확량은 호박의 크기에 따라 달라진다.
  • 수확량 계산
1x1 호박: 1*1*1 = 1개
2x2 호박: 2*2*2 = 8개.
3x3 호박: 3*3*3 = 27개
4x4 호박: 4*4*4 = 64개
5x5 호박: 5*5*5 = 125개
nxn 호박: n >= 6일 때 n*n*6개

최대 배율을 얻으려면 최소 6x6 크기의 호박을 얻는 것이 좋다.

이것은 사각형의 모든 타일에 호박을 심어도,
호박 중 하나가 죽어서 거대 호박이 자라는 것을 막을 수 있다는 의미다.

4.1.5. 선인장

당근처럼, 선인장도 흙에서 키우고 평소처럼 수확할 수 있다.
하지만, 선인장은 다양한 크기로 자라며 순서 감각을 가지고 있다.

다 자란 선인장을 수확할 때 모든 이웃 선인장이 정렬된 순서라면, 모든 이웃 선인장도 재귀적으로 수확한다.

North와 East 방향의 모든 이웃 선인장이 다 자랐고 크기가 같거나 더 크고, South와 West 방향의 모든 이웃 선인장이 다 자랐고 크기가 같거나 더 작으면, 그 선인장은 정렬된 것으로 간주된다.

수확은 모든 인접한 선인장이 다 자랐고 정렬된 순서일 경우에만 퍼져나간다.
즉, 다 자란 선인장 사각형이 크기 순으로 정렬되어 있고 그중 하나를 수확하면, 사각형 전체가 수확된다는 뜻이다.

다 자란 선인장은 정렬되지 않았으면 갈색으로 보인다. 정렬되면 다시 녹색으로 변한다.

수확한 선인장 개수의 제곱만큼 선인장을 받게 된다. 따라서 n개의 선인장을 동시에 수확하면 n**2개의 Items.Cactus를 받게 된다.

선인장의 크기는 measure()로 측정할 수 있다.
크기는 항상 0,1,2,3,4,5,6,7,8,9 중 하나다.

measure(direction)에 방향을 전달하여 드론의 해당 방향에 있는 이웃 타일을 측정할 수도 있다.

swap() 명령을 사용하여 어떤 방향으로든 이웃한 선인장과 위치를 바꿀 수 있다.
swap(direction)은 드론 아래의 객체와 드론의 direction 방향으로 한 칸 떨어진 객체를 교환한다.
* 예시
다음 각 격자에서 모든 선인장은 정렬된 순서이며 수확은 밭 전체로 퍼져나간다:
#!syntax python
3 4 5
2 3 4
1 2 3

#!syntax python
3 3 3
2 2 2
1 1 1

#!syntax python
1 2 3
1 2 3
1 2 3

#!syntax python
1 5 9
1 3 8
1 3 4

이 격자에서는 왼쪽 아래 선인장만 정렬된 순서이며, 이는 수확이 퍼져나가기에 충분하지 않다:
#!syntax python
1 5 3
4 9 7
3 3 2

4.1.6.

고대 뼈를 얻기 위해 모자는 다음으로 장착할 수 있다.
#!syntax python
change_hat(Hats.Dinosaur_Hat)

공룡 모자를 장착하고 선인장이 충분하면, 사과가 자동으로 구매되어 드론 아래에 놓인다.
드론이 사과 위에 있다가 다시 움직이면, 사과를 먹고 꼬리가 하나 길어진다.
여유가 있다면, 새 사과가 구매되어 무작위 위치에 놓인다.

사과가 생성되려는 곳에 다른 것이 심어져 있으면 사과는 생성될 수 없다.

공룡의 꼬리는 드론 뒤에 끌리면서 드론이 이전에 지나간 타일을 채운다.
드론이 꼬리 위로 움직이려고 하면 move()는 실패하고 False를 반환한다.
꼬리의 마지막 부분은 이동 중에 비켜나므로 그 위로 움직일 수 있다.
하지만, 뱀이 농장 전체를 채우면 더 이상 움직일 수 없게 된다.
따라서 더 이상 움직일 수 없는지 확인하여 뱀이 다 자랐는지 확인할 수 있다.
공룡 모자를 착용하는 동안 드론은 농장 경계를 넘어 다른 쪽으로 갈 수 없다.

사과에 measure()를 사용하면 다음 사과의 위치를 튜플로 반환한다.
#!syntax python
next_x, next_y = measure()

다른 모자를 장착하여 모자를 다시 벗으면, 꼬리가 수확된다.
꼬리 길이의 제곱만큼 뼈를 받게 된다. 따라서 길이가 n인 꼬리는 n**2개의 Items.Bone을 받게 된다.
  • 예시
길이 1 => 뼈 1개
길이 2 => 뼈 4개
길이 3 => 뼈 9개
길이 4 => 뼈 16개
길이 16 => 뼈 256개
길이 100 => 뼈 10000개

공룡 모자는 장착하면 move()가 200틱 대신 400틱이 걸린다.
하지만, 사과를 집을 때마다 꼬리가 길어지면 움직이는 데 도움이 되므로 move()가 사용하는 틱 수가 3% 감소한다(내림).

4.1.7. 기묘한 물질

미로 생성 및 감염된 식물을 치료하는데 사용된다.

4.1.8.

드론이 덤불 위에 있을 때 use_item(Items.Weird_Substance, amount)를 호출하면 덤불이 울타리 미로로 자라난다.
미로의 크기는 사용된 Items.Weird_Substance의 양(use_item() 호출의 두 번째 인수)에 따라 달라진다.
미로 업그레이드가 없으면 n개의 Items.Weird_Substance를 사용하면 nxn 미로가 생긴다.
각 미로 업그레이드 레벨은 보물을 두 배로 만들지만, 필요한 Items.Weird_Substance의 양도 두 배로 늘린다.
  • 밭 전체 크기의 미로를 만들려면
#!syntax python
plant(Entities.Bush)
substance = get_world_size() * 2**(num_unlocked(Unlocks.Mazes) - 1)
use_item(Items.Weird_Substance, substance)

드론은 울타리 위로 날아갈 수 없다.
울타리 어딘가에 보물이 숨겨져 있다.
보물에 harvest()를 사용하면 미로 면적과 같은 양의 금을 받는다. (예를 들어, 5x5 미로는 25 금을 준다.)
다른 곳에서 harvest()를 사용하면 미로는 그냥 사라진다.

get_entity_type()은 드론이 보물 위에 있으면 Entities.Treasure와 같고,
미로의 다른 모든 곳에서는 Entities.Hedge와 같다.

미로를 재사용하지 않는 한 미로에는 루프가 없다.
그래서 되돌아가지 않고는 드론이 같은 위치에 다시 도달할 방법이 없다.

벽을 통과하려고 시도하여 벽이 있는지 확인할 수 있다.
move()는 성공하면 True를, 그렇지 않으면 False를 반환한다.

can_move()는 움직이지 않고 벽이 있는지 확인하는 데 사용할 수 있다.

미로 어디에서든 measure()를 사용하면 보물의 위치를 반환한다.
#!syntax python
x, y = measure()

추가 도전 과제로, 보물에 다시 같은 양의 Items.Weird_Substance를 사용하여 미로를 재사용할 수도 있다.
이렇게 하면 보물의 금의 양이 전체 미로 하나만큼 증가하고, 미로 안의 무작위 위치로 이동한다.

보물이 이동할 때마다, 미로의 벽 일부가 무작위로 제거될 수 있다. 그래서 재사용된 미로에는 루프가 포함될 수 있다.

미로에 루프가 있으면 되돌아가지 않고도 같은 위치에 다시 도달할 수 있다는 의미이므로 훨씬 더 어려워진다.
미로를 재사용해도 그냥 수확하고 새 미로를 생성하는 것보다 더 많은 금을 주지는 않는다.
이것은 100% 추가 도전 과제이므로 그냥 건너뛸 수 있다.
추가 정보와 지름길이 미로를 더 빨리 해결하는 데 도움이 될 때만 가치가 있다.

보물은 최대 300번까지 재배치될 수 있다. 그 후에는 보물에 기묘한 물질을 사용해도 금이 더 이상 늘어나지 않고 더 이상 움직이지 않는다.

4.1.9.

식물은 물을 주면 더 빨리 자란다. 땅은 0에서 1 범위의 물 수위를 가진다.
get_water() 함수는 드론이 위치한 땅의 물 수위를 반환한다.

식물의 성장 속도는 물 수위 0에서 1배 속도, 물 수위 1에서 5배 속도로 선형적으로 증가한다.

땅은 시간이 지나면서 마른다.
평균적으로 초당 현재 물의 1%를 잃지만, 여기에는 약간의 무작위 변동이 있다.
높은 물 수위를 유지하는 것은 낮은 물 수위를 유지하는 것보다 훨씬 더 많은 물을 소비한다.

10초마다 물 한 탱크가 자동으로 인벤토리에 추가된다.
Unlocks.Watering을 업그레이드하면 10초마다 얻는 물의 양이 두 배가 된다.

use_item(Items.Water)를 호출하여 땅에 물을 주면 된다.

4.1.10. 비료

비료는 식물이 즉시 자라게 할 수 있다.
use_item(Items.Fertilizer)는 드론 아래 식물의 남은 성장 시간을 2초 줄여준다.

이것은 몇 가지 부작용이 있는데, 비료로 자란 식물은 감염된다.

식물이 감염되면, 수확할 때 수확량의 절반이 Items.Weird_Substance로 바뀐다.
기묘한 물질은 식물에도 사용할 수 있는데, 식물과 모든 인접한 식물의 감염 상태를 토글하는 효과가 있다.

따라서 감염된 식물에 use_item(Items.Weird_Substance)를 호출하면 치료되지만,
건강한 식물에 사용하면 감염시킨다.

건강한 이웃이 있는 감염된 식물에 사용하면,
그 식물은 치료되지만 이웃은 감염되고, 그 반대도 마찬가지다.

4.1.11. 파워

해바라기를 수확하면 파워를 얻을 수 있다.
농장에 해바라기가 10개 이상 있고 꽃잎이 가장 많은 해바라기를 수확하면 5배 더 많은 파워를 얻는다.

measure()는 드론 아래에 있는 해바라기의 꽃잎 수를 반환한다.
해바라기는 최소 7개, 최대 15개의 꽃잎을 가진다.
다 자라기 전에도 측정할 수 있다.

여러 해바라기가 같은 수의 꽃잎을 가질 수 있으므로,
꽃잎이 가장 많은 해바라기도 여러 개일 수 있다.
이 경우에는 어느 것을 수확하든 상관없다.

파워가 있는 동안 드론은 파워를 사용해서 두 배 더 빠르게 움직인다.
30번의 행동(이동, 수확, 심기 등)마다 1 파워를 소모하다.
다른 코드 문장을 실행할 때도 파워를 사용할 수 있지만,
드론 행동보다는 훨씬 적게 사용한다.

일반적으로, 속도 업그레이드로 빨라지는 모든 것은 파워로도 빨라지다.
파워로 빨라지는 모든 것은 속도 업그레이드를 무시하고 실행에 걸리는 시간에 비례하여 파워를 사용한다.

4.2. 프로그래밍 기능

4.2.1. 루프

4.2.1.1. while
harvest()
harvest()
harvest()

이렇게 하면 한 번의 프로그램 실행으로 여러 번 수확할 수 있다.
하지만 세 번 이상 수확하고 싶을 텐데, 같은 코드를 여러 번 쓰는 것은 좋지 않다.
루프를 사용하면 같은 코드를 여러 번 실행할 수 있다.

while 루프는 조건을 받는데, 이것은 True 또는 False 두 가지 상태 중 하나만 가질 수 있는 논리값이다.
그런 다음 루프는 조건이 False가 될 때까지 루프 안의 코드를 실행한다.
  • 예시
#!syntax python
while condition:
	#루프 본문
	#루프 본문
	#...

#!syntax python
while True:
	do_a_flip()

들여쓰기를 추가하려면 Tab 키를, 제거하려면 Shift + Tab(또는 Backspace)을 누르면 된다.
4.2.1.2. for
#!syntax python
for i in sequence:
	# i로 무언가 하기

while 루프와 유사하게, for 루프도 코드 블록을 반복적으로 호출한다.
조건에 따라 반복하는 대신, 시퀀스의 각 요소에 대해 한 번씩 루프 본문을 실행한다.
#!syntax python
for variable_name in sequence:
	#코드 블록

variable_name은 당신이 선택한 어떤 이름이든 될 수 있다. 이것은 시퀀스의 현재 요소를 저장하는 변수다.
sequence는 숫자 범위처럼 반복할 수 있는 값이어야 한다. 코드 블록은 루프 변수가 해당 요소에 할당된 상태로 모든 요소에 대해 실행된다.
  • 시퀀스
범위, 리스트, 튜플, 딕셔너리, 세트
  • 예시
#!syntax python
for i in range(5):
    harvest()

이 루프는 본문을 정해진 횟수만큼 실행한다.
이것은 본질적으로 다음과 같이 쓰는 것과 같다.
#!syntax python
i = 0
harvest()
i = 1
harvest()
i = 2
harvest()
i = 3
harvest()
i = 4
harvest()

그래서 harvest()를 5번 호출한다.

4.2.2. 디버그

4.2.3. 연산자

4.2.4. 디버그_2

4.2.5. 타이밍

4.2.6. 감각

4.2.7. 변수

4.2.8. 시뮬레이션

4.2.9. 리스트

4.2.10. 함수

4.2.11. 딕셔너리

4.2.12. 가져오기

4.2.13. 유틸리티

4.2.14. 비용

4.2.15. 유틸리티

4.2.16. 자동 해금

5.

5.1. 미로 길찾기

5.2. 선인장 정렬

5.3. 혼합 재배

풀, 덤불, 나무, 당근은 올바른 동반 식물이 있을 때 더 많은 수확량을 낸다.
동반 식물 선호도는 각 개별 식물마다 다르며 예측할 수 없다. 드론 아래 식물의 동반 식물 선호도는 get_companion()을 사용하여 측정할 수 있다.
첫 번째 요소가 동반 식물로 원하는 식물의 종류이고 두 번째 요소가 동반 식물을 원하는 위치인 튜플을 반환한다.
#!syntax python
plant_type, (x, y) = get_companion()

예를 들어, 덤불을 심은 다음 get_companion()을 호출하면 (Entities.Carrot, (3, 5))와 같은 것을 반환한다.
이것은 이 덤불이 (3,5) 위치에 당근이 있기를 원한다는 의미다.
그래서 (3,5)에 당근을 심고 덤불을 수확하면 더 많은 나무를 수확한다. 당근의 성장 단계는 상관없다.

식물의 동반 식물 선호도는 Entities.Grass, Entities.Bush, Entities.Tree, Entities.Carrot 중 하나다.
각 식물은 이것을 무작위로 선택하지만, 항상 자신과 다른 식물을 선택한다.
위치는 식물 자체 위치를 제외하고 식물로부터 3번 이동 이내의 어떤 위치든 될 수 있다.

드론 아래에 동반 식물 선호도가 있는 식물이 없으면 get_companion()은 None을 반환한다.

혼합 재배가 해금되기 전에는 수확량 배율이 5이다. 업그레이드할 때마다 두 배가 된다.

5.4. 뱀 게임

5.5. 멀티 드론

추가 드론은 먼저 생성해야 하며 프로그램이 종료된 후 사라진다.
각 드론은 자신만의 별도 프로그램을 실행한다. 새 드론은 spawn_drone(function) 함수를 사용하여 생성할 수 있다.
#!syntax python
def drone_function():
    move(North)
    do_a_flip()

spawn_drone(drone_function)

이것은 spawn_drone(function) 명령을 실행한 드론과 같은 위치에 새 드론을 생성한다.
새 드론은 그런 다음 지정된 함수를 실행하기 시작한다. 끝나면 자동으로 사라진다.
드론들은 서로 충돌하지 않는다.

생성할 수 있는 최대 드론 수를 얻으려면 max_drones()를 사용하다.
농장에 이미 있는 드론 수를 얻으려면 num_drones()를 사용한다.
  • 예시
#!syntax python
def harvest_column():
    for _ in range(get_world_size()):
        harvest()
        move(North)

while True:
    if spawn_drone(harvest_column):
        move(East)

이것은 첫 번째 드론이 수평으로 움직이면서 더 많은 드론을 생성하게 한다.
생성된 드론들은 그런 다음 수직으로 움직이며 경로상의 모든 것을 수확할 것이다.

사용 가능한 모든 드론이 이미 생성되었다면, spawn_drone()은 아무것도 하지 않고 None을 반환한ㄷ.
  • 각 드론에 다른 방향을 전달하는 또 다른 예시 (함수 래핑)
#!syntax python
for dir in [North, East, South, West]:
    def task():
        move(dir)
        do_a_flip()
    spawn_drone(task)

다른 드론이 끝날 때까지 기다리려면 wait_for(drone) 함수를 사용하면 된다. 드론을 생성할 때 drone 핸들을 받는다.
wait_for(drone)는 다른 드론이 실행하던 함수의 반환 값을 반환한다.
#!syntax python
def get_entity_type_in_direction(dir):
    move(dir)
    return get_entity_type()

def zero_arg_wrapper():
    return get_entity_type_in_direction(North)
drone = spawn_drone(zero_arg_wrapper)
print(wait_for(drone))

has_finished(drone)을 쓰면 기다리지 않고 드론이 끝났는지 확인할 수 있다.

각 드론은 자신만의 메모리를 가지고 있으며 다른 드론의 전역 변수를 직접 읽거나 쓸 수 없다.
#!syntax python
x = 0

def increment():
    global x
    x += 1

wait_for(spawn_drone(increment))
print(x)

새 드론이 자신만의 전역 x 사본을 증가시켰고, 이것이 첫 번째 드론의 x에 영향을 주지 않기 때문에 0을 출력할 것이다.

여러 드론이 동시에 같은 농장 타일과 상호 작용할 수 있다.
두 드론이 같은 tick 동안 같은 타일과 상호 작용하면, 두 상호 작용 모두 발생하지만 결과는 상호 작용 순서에 따라 달라질 수 있다.

예를 들어, 드론 0과 1이 거의 다 자란 같은 나무 위에 있다고 상상해보자.
드론 0은 다음을 호출한다.
#!syntax python
use_item(Items.Fertilizer)

드론 1은 다음을 호출한다.
#!syntax python
harvest()

이 동작들이 동시에 발생하면, 나무는 먼저 비료를 받고 그 다음에 수확될 것이다.
그 경우, 나무에서 목재를 얻게 될 것이다.
하지만, 드론 1이 약간 더 빠르다면, 나무는 비료를 받기 전에 수확될 것이고, 목재를 얻지 못할 것이다.
이것을 "경쟁 상태"라고 한다. 병렬 프로그래밍에서 흔한 문제이며, 결과가 작업이 수행되는 순서에 따라 달라지는 경우이다.
  • 여러 드론이 동시에 같은 위치에서 같은 코드를 실행할 때 발생할 수 있는 또 다른 문제
#!syntax python
if get_water() < 0.5:
    use_item(Items.Water)

여러 드론이 이것을 동시에 실행하면, 모두 첫 번째 줄을 실행하여 if 블록으로 들어가게 된다.
그런 다음, 모두 물을 사용하여 많이 낭비하게 될 것이다.
드론이 두 번째 줄에 도달할 때쯤이면, 다른 드론이 그 사이에 타일에 물을 주었기 때문에 get_water()가 더 이상 0.5 미만이 아닐 수도 있다.

6. 평가

기준일:
2025-10-30
파일:스팀 로고 화이트.svg
<rowcolor=#fff> 종합 평가 최근 평가
[[https://store.steampowered.com/app/2060160/#app_reviews_hash|압도적으로 긍정적 (95%) {{{#!wiki style="display:inline-block; font-size:.9em"]] [[https://store.steampowered.com/app/2060160/#app_reviews_hash|매우 긍정적 (93%) {{{#!wiki style="display:inline-block; font-size:.9em"]]

7. 여담

  • 링크: 이 게임을 다루는 국내 커뮤니티이다. 해당 게임 관련 공략과 팁은 이곳에서 찾아볼 수 있다.

8. 관련 문서