본문 바로가기

마인크래프트(Minecraft)/Computer Craft

[Computer Craft] 13. <기초강좌> 터틀 채광,블럭감지, 블럭비교 및 블럭놓기 API

0. 개요


이번강좌에서는 어찌보면 매우 중요한 요소가 있다고 볼 수 있는데요.

블럭이 터틀 앞에 놓여 있느냐? 내가 선택한 블럭과 일치하느냐?

이런것을 감지가 가능하게되면서 좀더 스마트하게 블럭 채취행위가 가능했죠.

또한 감지가 됬으면 블럭을 두거나 채취하는 행위가 당연히 뒤따르게 된거죠.

컴퓨터크래프트에서 만들어 두었던 tunnel 명령어를 쳐보면

아래에 블럭이 없을때 선택된 슬롯의 블럭을 놓아두는 것을 볼수있는데요.

이게 블럭감지 함수를 사용했음을 알 수 있다는것이죠.

그만큼 이 함수가 좋다는 의미겠죠?

그러므로 이번 강좌를 통해서 좀더 스마트해진 터틀을 만들어 보도록하죠.



1. 채광 API


터틀이 채광하는 API 함수는 기본적으로 세가지를 지원합니다.

농사 터틀경우에는 땅을 경작하지만, 그외의 터틀은 블럭을 부수는 행위로 자원을 얻어냅니다.

물론 도구에 맞지 않을때는 블럭을 캐낸다 하더라도 자원을 얻어낼 수 없다는점은 작용했죠.

그래서 삽, 도끼 터틀이 말 그대로 잉여가 됬습니다. 곡괭이로는 나무와 흙 둘다 얻어낼 수 있으니까요.

그러면 채광 API를 볼까요?


turtle.dig() - 정면 블럭을 채광 또는 개간한다
turtle.digUp() - 위쪽 블럭을 채광 또는 개간한다
turtle.digDown() - 아래쪽 블럭을 채광 또는 개간한다


역시 쉬운단어로 이루어져 있습니다.

dig(파다) 의미와 위(up)와 아래(down) 방향이 합쳐진 명령어이거든요.

주의하실점은 dig 다음에는 항상 대문자로 시작한다는점을 알아두셔야합니다.

재미있는 점은 물, 용암조차 부순다는점이죠. 자원으로 얻을수 없지만요.


채광 실패 조건


터틀이 채광을 할 수 없는 몇가지 조건이 있는데요.

몇가지 없으니 알아보도록합시다.


- 정해진곳에 블럭이 없을때

- 기반암(Bed Rock)을 캐려고 할때



2. 블럭 감지 API


블럭을 감지하는 요소는 매우 중요합니다.

터틀의 근처에 블럭이 있는가 없는가를 알아보는 것이죠.

주로 나무베기 터틀만들때 많이 쓰이긴 합니다만,

프로그래밍에 따라 다양하게 응용 되기도 합니다.

응용 예 : 사탕수수 자라나는 것을 감지. 농작물중 호박, 수박 감지 등


제가 만든 나무베기 터틀에서 아래에 블럭이 감지되지 않았을때,

터틀이 내려가게끔 처리 해두었으니까요.


이 API도 매우 쉬운단어입니다.

detect : 감지하다, 발견하다


turtle.detect() : 정면 블럭의 존재 유무를 체크

turtle.detectUp() : 위쪽 블럭의 존재 유무를 체크

turtle.detectDown() : 아래쪽 블럭의 존재 유무를 체크


마찬가지로 Up Down 의 대소문자만 주의하면 매우 쉬운 명령어입니다.

블럭을 감지하면 true, 감지하지 못하면 false 를 결과로 돌려줍니다.


3. 블럭 비교 API


블럭을 비교하는것은 자원 채취나 그밖의 쓰임에 있어서 가장중요합니다.

간단하게 터틀이 사탕수수를 들고 있는데, 터틀 앞에 사탕수수가 있다면 true(참) 값을 돌려주거든요.

다만 블럭이 없거나, 사탕수수가 아닌것이 있으면 당연히 false(거짓) 값을 돌려받겠죠.

이것을 쓰면 터틀 쿼리 프로그래밍시에 필요없는 광물 흙, 모래, 자갈, 돌을 캐지 않고 지나가게 처리할 수 있죠.


현재 선택된 슬롯과 비교하기 때문에

터틀이 어떤 슬롯으로 비교할것인가를 미리 정해두는것이 좋습니다.


이 API도 매우 쉬운단어로 이루어져 있습니다.

compare : 비교하다


turtle.compare() : 정면 블럭과 선택된 슬롯과의 아이템 비교

turtle.compareUp() : 위쪽 블럭과 선택된 슬롯과의 아이템 비교

turtle.compareDown() : 아래쪽 블럭과 선택된 슬롯과의 아이템 비교


Up, Down 의 대소문자만 주의하세요.

선택된 아이템과 일치할시 참(true)

선택된 아이템과 불일치할시 거짓(false)


4. 블럭 놓기 API

블럭을 놓는 행위는 건축할때 매우 유리하게 작용하는데요.

특히 계단 형태로 블럭을 두려고 하면 ㄴ 자 처럼 블럭을 3번 두어야 하는 불편함이 있었죠.

허나 터틀은 공중에서 블럭을 둘 수 있다는점이 매우 큰 장점으로 작용했는데요.

이것으로 터틀로 집짓기 하는 프로그래머도 있을정도입니다.

건축외에도. 뼛가루 뿌리기, 씨 심기, 묘목 심기, 액체가 든 양동이 액체놓기, 빈 양동이로 액체 담기 정도로 쓰입니다.

하나더 있는데 표지판 설치시에는 문구도 삽입 할 수 있습니다.


이 API도 매우 쉬운단어로 이루어져 있습니다.

place : 놓다, 두다, 설치하다 [동사]


turtle.place() : 정면에 선택된 슬롯의 아이템 놓기

turtle.placeUp() : 위쪽에 선택된 슬롯의 아이템 놓기

turtle.placeDown() : 아래쪽에 선택된 슬롯의 아이템 놓기


Up, Down 의 대소문자만 주의하세요.



다양한 사용 방법


- 건축. 공중에서도 작업이 가능.

- 뼛가루 사용

- 씨심기

- 묘묙 심기

- 표지판 설치(위쪽은 설치 불가)

- 양동이 사용가능



표지판 사용시


표지판을 설치할때는 좀 다르게 쓰이는데요.

API는 같으나 함수안에 문자열값을 넣을수 있습니다.

turtle.place("표지판 내용") : 정면에 표지판 설치. "표지판 내용"의 문구를 삽입

turtle.placeDown("표지판 내용") : 아래쪽에 표지판 설치. "표지판 내용"의 문구를 삽입


참고로 터틀 위쪽으로는 표지판 설치가 불가능 합니다. :)


5. 공통적 요소

터틀은 정면, 위, 아랫만 감지가 가능하다.

Down Up 단어는 항상 대문자로 시작한다.

반환값은 true 와 false 을 사용한다 (BOOLEN)


6 샘플 소스

샘플소스는 주석을 달아주며, 유니코드를 지원하지 않는 컴퓨터와 맞지 않으므로
복붙용으로 적합하지 않음을 알려드립니다.


while true do - 반복문 (조건이 항상 참이므로 무한으로 반복 수행)
  term.clear() -- 화면을 청소한다
  term.setCursorPos(1,1) -- 커서 좌표를 x=1 y=1로 옮긴다.


-- 메시지 출력 구간

  print("Where is a block?")
  print("1 : Check Forward")
  print("2 : Check Up")
  print("3 : Check Down")
  print("4 : Terminated")


-- 표지판에 적을 내용을 변수로 담아준다.

-- turtle.place()

-- API

-- Hello

-- ^^;

-- 로 출력된다. \n 은 개행문자로 새 라인을 의미한다.

  sign = "turtle.place()\nAPI\nHello\n^^;"


-- 키보드 입력을 받아 patten 변수로 넣는다.
  local patten = read()
  if patten == '1' then
    write('turtle.detect() : ')
    if turtle.detect() then -- 정면에 블럭이 있는가를 체크
      print('true')
      write('turtle.compare() : ')
      if not turtle.compare() then -- 정면의 블럭과 비교 not을 썼으므로 false 가 되어야 조건 만족
        print('false')
        write('turtle.dig() : ')
        print(turtle.dig()) -- 정면 블럭 채굴
      end
    else
      print('false')
      write('turtle.place(sign) : ')
      print(turtle.place(sign)) -- 정면에 블럭이 없으므로 블럭 설치
    end
  elseif patten == '2' then
    write('turtle.detectUp() : ')
    if turtle.detectUp() then -- 위쪽에 블럭이 있는가를 체크
      print('true')
      write('turtle.compareUp() : ')
      if not turtle.compareUp() then -- 위쪽의 블럭과 비교 not을 썼으므로 false 가 되어야 조건 만족
        print('false')
        write('turtle.digUp() : ')
        print(turtle.digUp()) -- 위쪽 블럭 채굴
      end
    else
      print('false')
      write('turtle.placeUp : ')
      print(turtle.placeUp()) -- 위쪽에 블럭이 없으므로 블럭 설치
    end
  elseif patten == '3' then
    write('turtle.detectDown() : ')
    if turtle.detectDown() then -- 아래쪽에 블럭이 있는가를 체크
      print('true')
      write('turtle.compareDown() : ')
      if not turtle.compareDown() then -- 아래쪽의 블럭과 비교 not을 썼으므로 false 가 되어야 조건 만족
        print('false')
        write('turtle.digDown() : ')
        print(turtle.digDown()) -- 아래쪽 블럭 채굴
      end
    else
      print('false')
      write('turtle.placeDown(sign) : ')
      print(turtle.placeDown(sign)) -- 아래쪽에 블럭이 없으므로 블럭 설치
    end
  elseif patten == '4' then -- 4입력시 프로그램 종료
    term.clear()
    term.setCursorPos(1,1)
    print('Terminated')
    break
  else -- 1~4외의 값이 오면 에러 메시지출력
    print('Sorry Wrong Command')
  end
  os.sleep(5) -- 5초간 대기
end



7. 시연영상



8. 복붙용 소스

while true do
  term.clear()
  term.setCursorPos(1,1)
  print("Where is a block?")
  print("1 : Check Forward")
  print("2 : Check Up")
  print("3 : Check Down")
  print("4 : Terminated")
  sign = "turtle.place()\nAPI\nHello\n^^;"
  local patten = read()
  if patten == '1' then
    write('turtle.detect() : ')
    if turtle.detect() then
      print('true')
      write('turtle.compare() : ')
      if not turtle.compare() then
        print('false')
        write('turtle.dig() : ')
        print(turtle.dig())
      end
    else
      print('false')
      write('turtle.place(sign) : ')
      print(turtle.place(sign))
    end
  elseif patten == '2' then
    write('turtle.detectUp() : ')
    if turtle.detectUp() then
      print('true')
      write('turtle.compareUp() : ')
      if not turtle.compareUp() then
        print('false')
        write('turtle.digUp() : ')
        print(turtle.digUp())
      end
    else
      print('false')
      write('turtle.placeUp : ')
      print(turtle.placeUp())
    end
  elseif patten == '3' then
    write('turtle.detectDown() : ')
    if turtle.detectDown() then
      print('true')
      write('turtle.compareDown() : ')
      if not turtle.compareDown() then
        print('false')
        write('turtle.digDown() : ')
        print(turtle.digDown())
      end
    else
      print('false')
      write('turtle.placeDown(sign) : ')
      print(turtle.placeDown(sign))
    end
  elseif patten == '4' then
    term.clear()
    term.setCursorPos(1,1)
    print('Terminated')
    break
  else
    print('Sorry Wrong Command')
  end
  os.sleep(5)
end


9. 구시렁구시렁

이번 강좌는 사실 간단한 영어단어만 알면 쉽게 배울 수 있습니다.

turtle. 로 시작하며

dig, place, detect, compare 단어와 Up Down 만 알면 쉽게 이해하거든요.

어려워 보이지만 영어단어만 알면 결코 어렵지 않은 API 들입니다.

이번 강좌에 쓰인 API들은 총 12개로써 아래에 나열해두었습니다.

참고로 대괄호[] 처리한것은 있어도 되고 없어도 된다는 의미입니다.

turtle.place("HAYO") 도 되고

turtle.place() 이것도 된다는 의미가 되죠.


채굴 API

turtle.dig()
turtle.digUp()
turtle.digDown()


놓기 API
turtle.place([string signText])
turtle.placeUp()
turtle.placeDown([string signText])


감지 API

turtle.detect()
turtle.detectUp()
turtle.detectDown()


비교 API

turtle.compare()
turtle.compareUp()
turtle.compareDown()