최근 수정 시각 : 2023-09-04 10:05:15

Playbot

1. 개요

1. 개요

플레이봇 / playbot
공식 홈페이지

고등학교 정보 교사들이 만든 교육용 프로그래밍 언어 플랫폼. 알만툴처럼 기본적으로 캐릭터(봇)이 있어 이 녀석에게 무언가를 시킬 수 있다. 독자적인 스크립트 언어(?)를 사용하는데 코드 만들기에서 맨 밑으로 내려가 명령어 사전을 눌러보면 이 플랫폼의 언어를 보고 배울 수 있다.[1] 나중에 C언어, 자바, C#, C++같은 프로그래밍언어나 자바스크립트, 파이썬과 같은 스크립트 언어를 배우는데 실질적으로 도움이 안되지만, 적어도 프로그래밍에 관해 백지인 상태에선 컴퓨터가 컴파일을 하는 방식을 이해하는데 그 언어들보다는 훨씬 더 도움이 된다. 배우기 훨씬 쉬우니 당연하다.

로그인을 하면 플랫폼의 클라우드에 작업한 파일의 내용을 저장해 놓을 수 있다. 이 저장에는 코드 저장과 월드 저장이 있는데, 웬만해서는 그냥 코드 저장으로 하는 것이 좋다. 그 이유는 월드 저장은 코드를 저장해 주지 않고 코드를 따로 저장해도 월드 불러오기가 코드를 안 불러와 주는데 코드 저장은 월드를 같이 저장해 주고 코드 불러오기는 코드와 월드를 같이 불러와 주기 때문이다. 잘 못하겠다면 분홍색 코드 블록의 모두 부분을 이용하자. 이걸 배워야 하는 사람은 손으로 move()를 치는 것보다 마우스로 누르는 것이 빠를 수 있다.

알만툴 이야기를 다시 하자면, 이 플랫폼에도 물품이라는 것이 있어 기본 오브젝트를 이용하여 배경을 꾸밀 수 있다. 물건, 비퍼 란에서 할 수 있다. 그런데 여기 물건 주기에 공식 물건과 사용자 물건이 있는데 이 사용자 물건은 요청하여 업로드 하는 것. 시작할 때 월드 설정에서 크기를 원하는 바에 맞게 알맞게 조정하는 일을 첫번째로 하길 추천한다. 30*20이 최대 크기이고 기본 크기는 10*10인데 나중에 바꾸려고 들면 미리 맵에 작업해 놓은 오브젝트와 맵 편집이 다 사라질 수 있기 때문. 방금 말한 월드 편집으로 벽을 만들 수 있다.

오브젝트를 맵에 추가하는 방법은 '월드 편집'을 누르고 원하는 칸을 클릭하고 토마토를 누르자. 그러면 그냥 '물건, 비퍼'를 눌렀을 때 나오는 창이 나온다. 참고로 이 창을 이용하면 봇한테 물건을 줄 수 있다.
어지간해서는 로봇을 둘 이상 만들지 말자. 모든 코드마다 어떤 로봇한테 일을 행하는지 다 붙여줘야 하고 로봇을 다시 지워도 스크립트 찌꺼기가 남는지 계속 붙이라고 한다. 만약 실수로 만들었는데 못해먹겠다면 코드는 복사하고 맵은 포기해서 다시 시작하는 것이 나을 수도 있다. 이게 코드 줄도 아낀다... 월드 불러오기에서 예제가 있는 사람은 예제를 가져올 수 있다. 이 경우 내 월드를 제외한 월드에서는 코드도 같이 가져와 지니 참고.

이 예제들 중 플레이 봇 샘플 예제 15번 미로 찾기 예제의 코드를 가져와도, 다른 맵에서는 미로의 섬에서 헤어나오지 못하고 허우적 대는 등 모든 미로를 통과할 수 있는 예제는 아니다. 우수법이라는, 100% 미로 찾기가 가능하다고[2] 어떤 수학자가 증명한 방식을 이용하면 위의 사태가 일어나지 않는데 그 예시는 다음과 같다. (아래는 플레이봇 코드에 맞게 설정된 우수법이다.)

#!syntax javascript
function turn_right() {
	turn_left()
	turn_left()
	turn_left()
	}
function a()
{
if(front_is_clear())
{if(right_is_wall()){move()}
}
}
function b() {
if(front_is_wall())
{
if(right_is_wall())
{turn_left()}
}
}
function c()
{
if(right_is_wall())
{if(front_is_clear()){move()}
}
}
function d()
{
if(front_is_clear())
{
if(right_is_clear())
{turn_right()
move()
}
}
}
function e()
{
if(front_is_wall())
{
if(right_is_clear())
{turn_right()
move()
}
}
}
function z()
{
if(a())
{}
else{
b()
c()
d()
e()
}
}
repeat("z()",999999999999999999999999999999999999999999999999999999999999999999999999999999999999999)

이런 식으로 예제라고 모두 믿을 수 있는 것은 아니다. 다만 그런 예제들은 위 처럼 조잡하게 프로그래밍되어있지 않고 체계적으로 잘 되어있으므로 예제를 잘 이해하고 그런 방식들을 익히면 알고리즘 면에서나 최적화 면에서 이득을 보는 법을 깨닫게 되므로 이후 프로그래밍을 배울 때 도움을 받을 수 있을 것이다.
여담으로 프로그래밍 창에서 캐릭터를 계속 클릭하면 그만 누르라고 하고, 그래도 계속 누르면 짜증나니까 답하지 않겠다고 하면서 응답하지 않는다.[3] 1~10번 누르면 내 이름은 r1 입니다. 라고 하고, 11번째부터 말이 달라지다가 16~20번째 누르면 .....이라고 한다. 21번째 누르면 1번째 누른 것과 결과가 같다.

[1] ; 등이 필요하지 않지만 /*과 같은 주석은 먹히는 것으로 봐서 대략 자바스크립트와 비슷한 것으로 추측된다. [2] 얘도 시작할 때 우수, 플레이 봇의 경우 시작하는 곳의 봇의 오른쪽이 미로의 섬일 경우에는 불가능하다. 이 경우 밑에 나오는 코드를 좌수법으로 바꾸고 위에서 설명한 예시의 스택제를 적용하여 섬에 스택이 쫙 쌓이는 것을 감지할 수 있게 하고 그럴 경우 좌수법을 이용하게 if문 등을 이용해 코드를 설정해 놓으면 해결된다. 참고로 좌수법도 시작할 때 왼손이 미로의 섬만 아니면 모든 맵을 통과할 수 있기에 두 가지를 조합하면 완벽하다. 다만 우수법이나 좌수법을 옳게 사용하고 있는 상황에서 스택제가 문제를 또 발생 시킬 수 있으니 스택이 적어도 3번 이상 쌓였을 때 반응하게 만드는 것이 좋다. 무슨 말이냐면 우수법이나 좌수법이나 지나가다 보면 분명 막힌 길을 돌아 나오면서 갔던 길을 다시 되돌아오는 경우가 많기에 스택2로서는 미로의 섬만 감지할 수는 없다는 것. [3] 근데 5번 더 누르면 다시 자기 이름을 이야기한다.

\