오토너츠(Autonuats)는
PC 게임으로서, 로봇들이 어떻게 움직일지를 지정(코딩)해서 자원을 채집하고 기술을 개발하며 생산 시설을 확장해 가는 게임이다. 이 게임의 기본적인 놀이 방식은 유튜브에 많이 있으니 참조하시고, 이 글에서는 코딩에 대한 설명과 몇 가지 팁을 소개하겠다.
나는 프로그래밍 업무를 4년 넘게 했는데 이 게임이 참 재미있다. 이 게임은 프로그래밍치고는 매우 단순하다. 보통 프로그래밍이라고 하면 IF, AND, OR 등이 기본적으로 나오는데, 이 게임은 그런 거 없다. 그러나 있는 기능을 조합하면 나름 복잡한 생산 시설을 만들 수 있다.
참고: 2020. 03. 13에 글 내용 갱신함. 최신 패치된 게임의 내용 반영.
코딩: 충전 로봇
우선 간단한 것부터. 일부 지역을 맡아서 충전하는 로봇의 코드이다. 반복(Repeat)절을 만드는 방법은 1) 왼쪽 하단의 반복 아이콘(ㄷ자 모양)을 한 번 클릭하여 전체 코드를 감싸는 반복절을 만들거나, 2) 왼쪽 하단의 반복절 아이콘을 끌고와서 코드 안에 집어 넣으면 된다. 주로 2번 방법이 유용하다.
충전 로봇은 많이 필요하므로 그림 우측과 같이 많이 만들어 놓고 필요할 때마다 지역만 바꿔서 보내면 편리하다. 단, 기술 개발이 좀 진행되어 복사 아이템이 나와야 로봇 코드를 복사할 수 있다.
참고: 코드 일부를 지우려면 마우스 오른쪽 클릭하면 된다.
코딩: 도구 제작 로봇
예를 들어 도끼를 제작하려면 나뭇가지와 돌이 필요하다. 그런데 로봇 하나로 둘 다 가져오는 코드를 만들면 복잡하다. 안 그래도 이 게임은 나중에 상당히 복잡해진다. 따라서 작업을 최대한 나눠서 코드를 짧게 만드는 것이 정신 건강에 유리하다. 혹시 프로그래밍 해 보셨는가? 긴 코드에서 문제점, 소위 버그를 잡아내려면 고행이다.
그림은 도끼 제작에 필요한 돌을 집어넣는 로봇 코드를 보여 준다. 상자에서 물건을 가져오거나 집어 넣을 때 이동(Move) 명령과 작업(Take, Add)는 분리하여 반복절을 써야 로봇이 멈춤 없이 빨리 실행한다. 예를 들어,
<첫 번째 방식>
[Move to Storage 1]
[Repeat until hands full]
[Take from Storage 1]
이렇게 하면 한 번만 움직이고 집어 드는 작업만 반복하므로 빠르다.
<두 번째 방식>
[Repeat until hands full]
[Move to Storage 1]
[Take from Storage 1]
이렇게 하면 반복절 안에 이동(Move)이 포함되어 있어, 실제로 반복하여 이동을 하지는 않지만 로봇이 잠깐씩 멈추게 된다.
그리고 그림에서 첫 번째 반복절은 무한 반복(Forever)이고, 두 번째 반복절은 작업대에 뭔가가 있을 때까지 반복하므로(until Workbench 1 full), 생산한 도끼를 누가 가져갈 때까지 기다리게 된다. 이런 식으로 해도 되고, 도끼를 담는 상자가 가득 찰 때까지(예: until Axe Storage 1 full)로 해도 된다. 아무튼 모든 도구는 별도 상자를 만들어서 담아야 나중에 코딩하기 편하다.
코딩: 물건을 주워 상자에 채우는 로봇
나뭇가지를 줍거나 생산된 도끼를 주우려면 손이 가득 찰 때까지(until hands full)로 하면 된다(참고: 도끼는 하나밖에 못 들지만 그래도 손이 가득 찰 때까지로 하는 것이 좋다). 반대로, 물건을 상자에 집어 넣을 때는 손이 빌 때까지(until hands empty)로 하면 된다.
물건을 주울 때는 반복절 안에 이동과 줍는 행동이 같이 포함될 수밖에 없으므로 좀 느리고, 상자에 넣을 때는 한 번만 이동하면 되므로 빠르게 실행된다.
코딩: 도구 사용 로봇
예를 들어 도끼를 사용하여 나무를 자르는 로봇을 생각해 보자. 도끼질을 멈춰야 하는 상황은 두 가지이다. 첫째, 나무 담는 창고가 가득 차서 도끼질을 더 이상 할 필요가 없을 경우, 둘째, 들고 있는 도끼가 닳아 없어져서 도끼질을 할 수 없는 경우이다. 이 문제는 일반적인 프로그래밍에 익숙한 나에게는 풀기 어려웠다. 왜냐하면 이 게임에는 여러 조건들을 동시에 따지는 AND나 OR가 없고, 반복절을 중지하기 위한 탈출 조건을 넣을 수 없기 때문이다.
게임을 한 지 몇 달이 지난 지금에서야 깨달았다. 그림에서와 같이, 큰 반복절에서는 통나무 창고가 가득 찬다는 조건을 넣고, 그 안에서 손에 도끼를 안 들고 있다면 도끼를 가져오라는 반복절을 매번 실행하면 된다. 이 생각을 못해서 그간 복잡하게 처리했었다.
참고: 반복절(Repeat) 막대 맨 우측의 하얀 사각 상자를 클릭하면 아래쪽 화살표가 붙으면서 반복절 탈출이 가능하다. 그러나 탈출 조건을 원하는 대로 지정할 수 없고, 어떤 문제든 문제가 발생하면 무조건 반복절을 멈추고 그 다음 코드로 넘어 간다. 이렇게 하면 다른 로봇 때문에 작업이 일시적으로 처리 불가능할 때에 기다리지 않고 그냥 반복절을 멈추므로 곤란한 경우가 가끔 있다. 나는 이제 반복절 탈출 기능을 전혀 사용하지 않는다.
코딩: 물 담아 오는 로봇
물이나 우유, 벌꿀 등은 물통(bucket)에 담아서 이동한다. 이 작업은 반복절에서 들고 있는 도구가 가득 찼는지, 비었는지를 조건으로 사용하면 된다.
그림에서는 물통이 가득 찰 때까지(until held object full) 물을 퍼담고, 작업대로 이동하여 물통이 빌 때까지(until held object empty) 물을 붓는다.
이 작업을 손이 빌 때까지(until hands empty) 하는데, 즉, 물통이 닳아서 없어질 때까지 한다. 그래서 손이 비면 새 물통을 집어오게 된다. 이 방식은 내가 예전에 쓰던 방식인데, 이렇게 하지 말고 위에서 설명한 도끼질 로봇 코드 방식, 즉, 매번 빈 손인지 확인하여 도구를 가져오는 방식을 사용하시라(더 융통성이 있으므로).
코딩: 우유 등 액체를 버리는 로봇
젖소는 우유를 짜줘야 그 다음 행동, 즉, 먹고 싸는 행동을 신속하게 진행한다. 특히 소똥을 활용하여 곡식을 키우거나 나무 모종을 키우는 경우 대량의 소똥이 필요하다. 그래서 우유 저장소가 가득차면 좀 비워줘야 젖을 짤 수 있는데, 문제는 액체는 땅바닥에 버릴 수 없다는 것이다. 이상한 방법으로 해결 가능한데, 우유가 담긴 물통을 상자에 담으면 물통이 비게 되고 빈 물통을 다시 꺼내면 된다. 우측 그림 코드에서는 우유 저장소가 가득 찰 때까지 기다리다가 가득 차면 한 번씩 버리는 내용이 담겨 있고, 완전히 비우지는 않는다.
코딩: 건설 로봇
건설을 하려면 돌이나 나뭇가지 등 건설 재료를 집어 넣어야 하는데, 각 재료별로 로봇을 만든다.
이 게임은 건설한 건물을 마음대로 삭제하고, 삭제했던 건물을 꺼내서 아무 곳에나 놓을 수 있으므로 보통은 공사장을 한 군데 만들어 놓고 거기서만 건설을 하는데, 가끔 공사장을 바꾸고 싶은 경우가 있다. 따라서 그림에서와 같이 표지판(Sign)을 만들어 두고 공사 지역을 표지판 지역으로 하면, 나중에 표지판을 옮겼을 때 공사 지역이 변경된다.
표지판이 나타내는 지역을 바꾸려면 표지판을 들고 다른 곳으로 이동하거나, 표지판을 든 채로 Z 키를 눌러 지정하면 된다. 표지판은 통나무 생산지, 곡식 생산지, 큰 돌(Hard rock) 채취지, 주민(Colonist) 주거지 등에 응용할 수 있다. 또한 표지판을 사용하면 관련된 로봇마다 수작업으로 작업 지역을 지정하지 않고 통일하여 지정할 수 있으므로 편리하다.
참고로, MK2 로봇이 나오면 코드를 직접 수정하여 상자 위치를 지정할 수 있으므로, 새로운 건설 재료가 나올 때마다 해당 재료를 들었다, 놨다 하면서 새 건설 로봇을 코딩할 필요가 없다. 기존 건설 로봇 코드를 복사해서 새 로봇에 넣고 해당 상자 위치를 마우스로 지정하여 코드를 변경하면 된다.
코딩: 카트 이동 관련 로봇
작은 물품 50개를 담아 이동할 수 있는 카트는 나는 잘 쓰지 않는다. MK2 로봇에 손과 가방 업그레이드까지 적용하면 손에 8개, 가방에 4개, 총 12개를 옮길 수 있으므로 로봇 4개를 쓰면 카트보다 편리하다. 그러나 물, 우유, 모래 등은 물통으로 담아 옮기려면, 쇠물통을 쓰더라도 겨우 5단위밖에 못 옮기므로 카트가 낫다.
카트를 쓰려면 좀 복잡하다. 한 로봇으로 모든 일을 시키지 않는 것이 좋기 때문에, 카트를 끄는 로봇, 카트에 물건을 담는 로봇, 카트의 물건을 내리는 로봇이 필요하다. 우측 그림은 카트를 끄는 로봇의 코드다. 우선 담는 위치와 내리는 위치에 상자를 하나씩 만들어 둔다. 그리고 카트 끄는 로봇이 담는 위치로 이동하여, 본인이 든 카트가 가득 찰 때까지 기다린다. 가득 차면 내리는 위치로 이동한다. 로봇에게 카트를 전달하려면, 우선 플레이어가 Ctrl + 왼쪽 마우스 클릭을 하여 카트를 든 다음, 로봇을 우측 마우스 클릭하면 된다.
담는 로봇은 물이나 우유 등을 퍼담아 카트에 넣는 작업을 무한 반복하면 된다. 해당 지역에 카트가 없으면, 즉, 카트가 떠나면 작동을 멈추고 올 때까지 대기하게 된다.
팁: 마을 구획
내가 만든 레벨 4 마을을 소개한다. 몇 달 동안 게임을 하면서 레벨 4 이상의 마을을 만든 게 이번이 네 번째이다. 우선 중앙에는 통나무(log)와 널빤지(plank) 등의 창고가 있다. 가장 핵심적인 자원이다. 그 아래에는 널판지, 각목 등 나무 가공 작업대가 있다. 나무 소비가 많아서 나무 가공 작업대가 종류별로 5개씩 있는데, 각 생산대에 작업 로봇이 1대씩 있는 게 아니라 2대씩 있다. 한 작업대에 동일한 로봇을 두 대 이상 붙여 놓으면 생산이 멈추는 시간을 줄여서 생산량을 늘릴 수 있다. 이 게임은 공간 정리가 중요하다. 따라서 하나의 작업대에서 최대한 많이 생산하도록 하는 것이 좋다.
팁: 로봇 생산과 코드 관리
위 그림의 마을 왼편에는 로봇 보관소가 있다. 로봇이 계속 생산되면 땅에 일자로 늘어서게 되는데, 10개까지는 땅에 그냥 둬서 쉽게 사용할 수 있도록 했고, 10개가 넘어가는 로봇은 자동으로 로봇 보관소로 저장되게 했다(특정 지역에 서 있는 노는 로봇들을 보관소로 운송하는 로봇을 만듦). 땅 위에 있는 로봇을 다 쓰면 로봇 보관소에서 로봇을 꺼내는데, 그러면 자동으로 로봇이 추가 생산된다.
그 옆에는 디스켓이 줄줄이 놓여 있다. 로봇은 대략 4가지 유형(생산, 운송, 충전, 건설)로 나뉘고, 생산과 운송은 각각 세부 유형이 있다. 나는 이런 유형별로 디스켓을 만들어서 새 로봇에게 코드를 붙여 넣는다.
유형별로 로봇을 미리 만들어두고 보관소에 넣어 둘 수도 있다. 최근 패치 이후, 보관소에 로봇이 들어갔다 나오더라도 기존 기억이 유지되므로, 코드까지 심어 놓은 로봇들을 종류별로 보관소에 담아 둘 수도 있다.
그런데 레벨4 중반에 나오는 데이터베이스 건물을 짓고 나면 디스켓이 필요없어진다. 로봇 이름으로 검색, 로봇의 스크립트를 데이터베이스에 복사해 두기, 다른 로봇에 붙여 넣기가 가능하기 때문이다. 프로그래밍을 하려면 이런 코드 관리가 기본적으로 가능해야 하는데, 이 게임에서는 초반에는 안 되고 나중에 가능한 것이 좀 아쉽다.
팁: 팀 관리 - 안 함
나는 팀을 많이 만들었다가 이제는 만들지 않는다. 로봇이 수백 대가 넘는데 일일이 팀 만들기가 번거롭기 때문이다. 그냥 이름만 일관적으로 지정하고, 정렬 아이콘(위/아래 화살표 모양)을 눌러 이름으로 정렬하면 로봇을 비교적 쉽게 찾을 수 있다. 나중에 기술이 많이 발전되어 로봇을 이름으로 검색할 수 있는 데이터베이스 건물을 지을 수 있는데 레벨 4의 필요 기술을 개발하면 만들 수 있다. 이 건물이 있으면 아주 쉽게 로봇을 찾아서 어디에 있는지 확인할 수 있다.
참고: 초반에는 그룹을 몇 개 만들어야 관련 특별 아이템이 해금되어 만들 수 있게 된다.
우측 그림과 같이, 임시 팀 만들기 기능도 편리하다. 스페이스바를 누른 후 드래그하여 몇 대의 로봇을 선택하면 임시 팀이 된다. 임시 팀 전체에 대해 모두 재시작, 들고 있는 물건들을 내리기, 플레이어의 위치로 부르기 등이 가능하다.
팁: 생산지는 좀 떨어뜨림
통나무 생산지, 곡물 생산지 등은 마을 중심에서 좀 떨어진 곳이 좋다. 마을 가까이 인접해 있으면 나중에 마을이 번잡해져서 마음이 심란하다. 마을 중심지는 늘 여유가 있는 것이 좋다. 대신 멀리 떨어진 생산지에 창고를 짓고, 마을 중앙에도 같은 창고를 지은 후에, 운송 로봇이 물품을 중앙 창고로 옮기도록 하면 된다. 나중에 레벨 3쯤 되면 카트나 도로 등을 이용하여 이동 속도를 높일 수 있는데, 그런 게 없더라도 어차피 로봇은 무제한 만들 수 있으므로 물건 옮기는 데 어려움은 없다.
팁: 업그레이드되는 도구/물품이 담긴 상자
일부 물품은 업그레이드가 되는데, 예를 들어 물통은 점점 더 용량이 큰 좋은 물통이 나오고, 주민의 사랑(Wuv)은 1짜리, 10짜리, 100짜리 등으로 점점 큰 것들이 나온다. 더 좋은 물품이 나왔을 때 새로 상자를 만들어 별도 보관할 필요 없이, 기존 상자 내용물을 모두 꺼내면 다른 물품이 자동으로 들어 갈 수 있고, 가져 가는 로봇의 코드를 바꾸지 않아도 자동으로 업그레이드된 물품을 꺼내 간다. 단, 로봇이 기존 물품과 새 물품을 동시에 들고 있을 수는 없으므로, 로봇이 손에 든 기존 물품을 내려 놓도록 수동 조작이 필요할 수도 있다.
예를 들어, 기본 물통(bucket) 상자에서 많은 로봇들이 물통을 가져가서 작업을 하는데, 그 물통 상자에 대용량 물통이 담기면 그 로봇들이 자동으로 대용량 물통을 가져간다. 마찬가지로, 돌도끼 상자에 쇠도끼가 담기면 로봇들이 쇠도끼를 들고 간다. 돌도끼/쇠도끼의 작업 속도가 두 배 정도 차이 나므로 업그레이드된 도구를 준비해주는 것이 좋다.
팁: 생산지에서 필요한 도구 운송
예를 들어 철 생산지가 멀리 떨어져 있으면 도구 운송 로봇을 만들어서 곡괭이를 현지 도구 상자에 쌓아 두는 것이 좋다. 이때 카트를 사용할 수도 있지만, 간단하게 백팩으로 옮겨도 된다.
곡괭이를 든 후에 Q 키를 누르면 백팩으로 넣는다. 이 작업을 녹화한 후 백팩이 가득 찰 때까지 반복하도록 코드를 짜면 된다. 백팩이 가득 찬 후에 마지막으로 손에 곡괭이를 하나 더 들 수 있는데, 이건 빼도록 하자. 나중에 이 로봇을 멈췄다가 재실행할 일이 생길 수 있는데, 이때 손에 이미 곡괭이를 들고 있으면 추가로 곡괭이를 들 수 없으므로 작동이 중지되기 때문이다. 모든 로봇들을 언제든 일시 정지, 재시작하더라도 코드가 꼬이지 않도록 만드는 것이 좋다.
No comments:
Post a Comment