본문 바로가기

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

[Computer Craft] 12. <기초강좌> 터틀 이동API 및 방향 API

0. 개요


터틀의 이동은 자원 채취에 있어서 매우 중요한 요소입니다.

이동을 하지 않고서는 제자리에서 자원을 얻는 것은 조약돌(cobble stone)생성기 외에는 방법이 없거든요.

참고로 터틀이 이동할때는 1블럭당 연료1을 소모하므로 연료가 모자르지 않은가를 체크해주어야합니다.

기본적으로 refuel 숫자 또는 refuel all 명령어로 연료 충전을 할 수 있습니다



1. 이동API


1-1. 이동API 요소


터틀이 이동하는 API 함수는 기본적으로 네가지를 제공합니다.

전진과 후진 그리고 위와 아래로 이동하는것이죠.

그러면 이동 API를 볼까요?


turtle.forward() -- 1블럭 전진
turtle.back() --  1블럭 후진

turtle.up() -- 1블럭 상승

turtle.down() -- 1블럭 하강


굉장히 직관적인 명령어입니다. 영어 단어만 알아도 충분히 이해할수있습니다.


명령어를 수행시 결과값으로 BOOLEN 값을 주는데요.

이동이 성공하면 true, 이동이 실패하면 false 를 결과값으로 되돌려 줍니다.


1-2. 이동 실패 조건


이동이 실패하는 경우는 터틀의 진로를 방해하는 어떤게 있을경우에 실패하게 됩니다.

아래에 다양한 사레의 실패 조건을 나열 해두었으니 참조 하고 넘어가도록 합시다.


- 블럭이 놓여있을때

- 유저가 길을 막고 있을때

- NPC가 길을 막고 있을때

- ANIMAL(동물)이 길을 막고 있을때

- MOB(괴물)이 길을 막고 있을때

- 묘목 심어져 있을때

- 농작물 있을때 (씨앗 조차 블럭으로 인식합니다)

- 연료가 없을때



2. 방향 API


2-0 개요.

터틀의 이동방향은 네가지라고 앞서 말을 해두었죠.

그런데 이동API로는 다른 방향으로 이동하고 싶은데 이것을 제어를 할 수 없었습니다.

심지어 좌 또는 우로 이동 함수가 없다는점도 있었죠.

그래서 터틀의 방향을 돌리는 함수 2개를 제공하는데요.

일단 API를 보도록 합시다.


2-1 API

turtle.turnLeft() -- 터틀을 좌측방향으로 90도 회전한다.

turtle.turnRight() -- 터틀을 우측방향으로 90도 회전한다.


이것도 꽤나 직관적인 명령어입니다.

주의하실점은. turn 다음에는 항상 대문자L 이나 R로 시작함을 유의해주셔야됩니다.


turtle.turnLeft() -- 올바른 예

turtle.turnleft() -- 올바르지 않음 ( left 의 l을 소문자로 작성 )

turtle.turnLEFT() -- 올바르지 않음 ( left 단어를 모두 대문자로 작성 )



3. 샘플 소스

샘플소스는 주석을 달아주며, 유니코드를 지원하지 않는 컴퓨터와 맞지 않으므로

복붙용으로 적합하지 않음을 알려드립니다.


while true do -- 반복문 ( 조건이 항상 참 이므로 무한으로 반복 수행 )
  term.clear() -- 화면을 청소한다.
  term.setCursorPos(1,1) -- 커서위치를 화면 좌측상단으로 이동


-- 메시지 출력 구간 ( print 와 write 의 차이점을 느껴보세요 )


  print("Where are we going?")
  print("1 : Forward")
  print("2 : Back")
  print("3 : Up")
  print("4 : Down")
  print("5 : Turn Left")
  print("6 : Turn Right")
  print("7 : Terminated")
  write("Input number : ")
  local move = read() -- local 선언을 해주었으므로 지역변수이며, 변수명은 move 입니다. move 변수에 키보드 입력을 받을때 까지 대기하죠.


-- 조건문 입니다. 1 ~7의 값이 들어올때 특정조건을 수행하고, 그외의값이 들어오면 잘못된 값이라는것을 출력합니다 )

-- print 에 터틀 함수가 들어가는것은 결과물이 참(true)또는 거짓(false) 결과물을 출력해주는  일종의 장치라 볼 수 있습니다. 물론 이동API를 수행하면서 그 결과를 돌려주는 것입니다

-- 7을 입력시엔 프로그램을 종료합니다.


  if move == '1' then
    write('turtle.forawrd() : ')
    print(turtle.forward())
  elseif move == '2' then
    write('turtle.back() : ')
    print(turtle.back())
  elseif move == '3' then
    write('turtle.up() : ')
    print(turtle.up())
  elseif move == '4' then
    write('turtle.down() : ')
    print(turtle.down())
  elseif move == '5' then
    write('turtle.turnLeft() : ')
    print(turtle.turnLeft())
  elseif move == '6' then
    write('turtle.turnRight() : ')
    print(turtle.turnRight())
  elseif move == '7' then -- 종료 연산
    term.clear()
    term.setCursorPos(1,1)
    print('Terminated')
    break
  else
    print('Sorry Wrong Command')
  end
  os.sleep(3)
end


4. 복붙용 소스

while true do
  term.clear()
  term.setCursorPos(1,1)
  print("Where are we going?")
  print("1 : Forward")
  print("2 : Back")
  print("3 : Up")
  print("4 : Down")
  print("5 : Turn Left")
  print("6 : Turn Right")
  print("7 : Terminated")
  write("Input number : ")
  local move = read()
  if move == '1' then
    write('turtle.forawrd() : ')
    print(turtle.forward())
  elseif move == '2' then
    write('turtle.back() : ')
    print(turtle.back())
  elseif move == '3' then
    write('turtle.up() : ')
    print(turtle.up())
  elseif move == '4' then
    write('turtle.down() : ')
    print(turtle.down())
  elseif move == '5' then
    write('turtle.turnLeft() : ')
    print(turtle.turnLeft())
  elseif move == '6' then
    write('turtle.turnRight() : ')
    print(turtle.turnRight())
  elseif move == '7' then
    term.clear()
    term.setCursorPos(1,1)
    print('Terminated')
    break
  else
    print('Sorry Wrong Command')
  end
  os.sleep(3)
end


5. 시연영상





6. 구시렁 구시렁


그동안 블로그에 오류가 있어 재대로 포스팅을 할 수 없었습니다. 제가 쓰는 불여우(firefox)와 맞지 않는 ie(iexplorer) 기준으로 답변을 하는 매크로식 답변에 경악을 금치 못했지만, 다행이도 몇줄 때문에 해결을 보았네요. 이것을 좋아해야할지 말아야할지.


구글 크롬, 오페라, 사파리, 불여우 등 여러가지 브라우저가 많으니 각각에 맞는 설명이 동봉 되었으면 좋았을텐데.

역시 액티브X의 강국다운 답변을 받았네요.

여태까지 구시렁 구시렁 이였습니다.