Featured image of post AI로 게임 만들기 #11 — 60초 스네이크를 만들었습니다 (공개빌드 #11)

AI로 게임 만들기 #11 — 60초 스네이크를 만들었습니다 (공개빌드 #11)

시간은 60초로 고정, 그 안에 최대한 높은 점수를 내는 스네이크 게임입니다. 먹이보다 중요한 건 지나가는 자리 — 벽과 내 꼬리 사이 한 칸 틈을 스치고 지날수록 점수가 크게 붙고, 트인 곳으로 편하게 돌면 0점입니다. 부딪혀도 판은 끝나지 않고 몸만 처음으로 돌아가니, 누구나 똑같은 60초로 겨룹니다.

AI 게임 랩 열 번째 게임으로 스네이크를 만들었습니다. 점수 나는 방식 하나만 바꿨는데 게임이 꽤 달라졌습니다.

시간은 60초로 고정입니다. 그 안에 최대한 높은 점수를 내면 됩니다. 부딪혀도 판이 끝나지 않아요. 몸이 처음 길이인 세 칸으로 돌아가고 1.2초 멈췄다가 이어집니다. 그동안에도 시계는 흘러가니 결국 누구나 60초를 씁니다. 랭킹으로 겨루려면 쓴 시간이 같아야 해서 이렇게 잡았습니다.

조작은 방향키나 WASD, 휴대폰에서는 화면을 쓸면 됩니다. 격자는 16×16이고 뱀은 초당 여덟 칸씩 움직입니다.

👉 60초 스네이크 하러 가기

점수 규칙

보통 스네이크는 먹이를 먹으면 점수가 오릅니다. 여기서도 먹이가 30점이긴 한데, 그보다 중요한 건 머리가 지나가는 칸의 좌우가 얼마나 막혔는지입니다.

옆이 트여 있으면 0점입니다. 한쪽에 제 몸이 있으면 1점. 양옆이 다 막힌 한 칸 틈을 지나가면 15점이 들어오고, 여기에 HEAT라는 배수가 최대 세 배까지 붙습니다. HEAT는 좁은 틈을 연달아 통과할 때만 올라가고, 넓은 데로 나오면 금방 식습니다.

옆이 어떻게 막혔는지에 따라 점수가 갈린다. 벽만 있으면 0점이다

바깥 벽은 세지 않습니다. 벽에만 붙어서 달려서는 아무 점수도 안 나와요. 왜 그렇게 했는지는 아래에 적었습니다.

좁은 틈은 몸이 길어야 생깁니다. 그래서 먹이도 결국 필요해요. 먹이 하나에 몸이 네 칸 자라고, 좁은 틈에 놓인 먹이를 먹으면 5배인 150점이 들어옵니다. 한 판에서 제일 크게 버는 순간이 여기입니다.

똬리 튼 몸 사이 한 칸 틈을 빠져나오는 중. HEAT가 2.8배까지 올라 42점이 붙었다

왜 이렇게 만들었나

스네이크를 그냥 만들면 두 가지가 걸렸습니다.

하나는 스네이크가 순수 실력 게임이라는 점입니다. 잘하는 사람이 항상 이깁니다. 게임 랩 게임들은 하루 한 판씩 남들과 점수를 겨루는 형태라, 실력 순서가 그대로 고정되면 못하는 사람은 영영 못 이깁니다. 운이 좀 섞여야 뒤집힐 여지가 생깁니다.

다른 하나는 60초라는 시간입니다. 1분 안에는 몸이 별로 안 길어집니다. 스네이크가 조여드는 느낌은 몸이 화면을 채우기 시작할 때 오는데, 거기까지 갈 시간이 없어요.

그래서 점수를 지나간 자리의 위험도로 옮겼습니다. 안전하게만 돌면 점수가 안 나오게 만들어두면, 짧은 시간에도 위험을 감수할 이유가 생기니까요. (지난 편에서는 주사위 게임을 두 번 만들었다 두 번 다 버렸는데, 이번 건 남았습니다.)

봇을 풀어놨더니 테두리만 돌더군요

밸런스를 감으로 잡고 싶지 않아서 자동 플레이어를 만들었습니다. 겁쟁이, 먹이만 쫓는 놈, 위험하게 노는 놈, 무모한 놈. 넷을 각각 80판씩 돌렸습니다.

처음 버전에서는 바깥 벽도 막힌 면으로 셌습니다. 옆이 막혀 있으면 위험한 거라고 봤거든요.

결과가 이상했습니다. 테두리를 따라 60초 내내 뱅뱅 도는 것만으로 2,800점이 나왔고, 그동안 한 번도 부딪히지 않았습니다. 안전하면 점수가 없게 만들겠다고 해놓고 가장 안전한 길을 최고점으로 만들어둔 셈이었습니다.

이유는 간단했습니다. 벽은 움직이지 않습니다. 벽에 붙어 달리는 건 그림으로는 아슬아슬해 보여도 실제로는 아무 일도 일어나지 않아요. 저는 “옆이 막혀 있다"를 위험이라고 착각하고 있었습니다.

그래서 막힌 면 중에 제 몸이 최소 하나는 있어야 점수를 주도록 고쳤습니다.

이번엔 자기 몸 옆에 딱 붙어서

고치고 다시 돌렸습니다. 순서는 맞게 나왔어요. 위험하게 노는 봇이 겁쟁이보다 훨씬 높았습니다. 그런데 그 옆 칸의 숫자를 보고 또 걸렸습니다. 평균 2,911점을 내면서 부딪힌 횟수가 0.0번이었거든요. 480칸 중 393칸에서 점수를 뽑았는데도 말이죠.

자기 몸 옆에 나란히 붙어 달리는 게 안정적인 자세였습니다. 몸이 제 뒤를 그대로 따라오니까 옆은 계속 막혀 있는데, 정작 부딪힐 일은 없습니다. 벽으로 하던 짓을 몸으로 하고 있었을 뿐이었어요.

이번에는 규칙 대신 배점을 손봤습니다. 나란히 달리기는 1점 고정으로 낮추고 HEAT가 안 붙게 했습니다. HEAT는 양옆이 다 막힌 좁은 틈에서만 오릅니다.

돌이켜보면 두 경우 다 같은 착각이었습니다. 벽도, 나란히 가는 제 몸도, 옆에 있기는 한데 저를 쫓아오지는 않습니다. 위험한 건 옆이 막혀 있는 상태가 아니라 제가 다음에 갈 자리를 누가 먼저 차지할 수 있느냐였습니다.

없는 점수를 쫓던 봇

중간에 이상한 일도 있었습니다. 봇 하나가 네 칸을 뱅뱅 돌면서 아무것도 안 했습니다. 로그를 한 수씩 찍어보니 매번 옆이 막혔다고 판단하는데 실제 점수는 0이었어요.

게임 쪽 문제가 아니었습니다. 봇이 후보 칸의 위험도를 이동하기 전 상태로 재고 있었습니다. 뱀은 앞으로 가면 꼬리가 한 칸 빠져나가죠. 그러니까 지금은 막혀 있어도 머리가 도착할 때쯤에는 비어 있을 칸이었던 겁니다. 봇은 있지도 않은 점수를 보고 제자리를 돌고 있었습니다.

로그를 안 찍었으면 멀쩡한 게임을 뜯어고쳤을 겁니다.

봇이 사람보다 잔인한 테스터인 이유

이 두 가지를 봇으로 찾은 데는 이유가 있습니다. 봇에게는 부끄러움이 없습니다.

사람은 테두리만 60초 도는 짓을 잘 안 합니다. 이길 수 있어도 안 해요. 이렇게 이기면 재미없잖아, 하는 감각이 있으니까요. 제가 직접 백 판을 했어도 못 찾았을 겁니다. 자기 게임은 자기가 의도한 방식으로 플레이하게 되거든요. 봇은 그런 게 없고 점수만 봅니다.

나중에 찾아보니 게임 디자인에서는 오래된 이야기더군요. 게임 디자이너 소렌 존슨이 남긴 말인데, 기회만 주면 플레이어가 게임에서 재미를 최적화해 없애버린다는 겁니다. 플레이어가 최적화하는 건 재미가 아니라 승리니까요.

숫자로 본 결과

전략별로 80판씩 돌린 최종 수치입니다.

전략평균상위 10%최고부딪힘
트인 곳만 달림1,1551,4652,2481.1번
먹이만 쫓음1,9492,6273,7881.0번
몸 옆 나란히1,6822,1382,6350.0번
좁은 틈 사냥1,9352,3906,6712.9번

노린 데까지는 왔습니다. 몸 옆에 나란히 달리기가 그냥 잘 두는 것보다 낮아졌으니까요. 위험을 하나도 안 지는 전략이 최적해 자리에서 내려온 겁니다.

다만 좁은 틈 사냥이 압도적으로 유리하지는 않습니다. 평균이나 상위 10%로 보면 먹이만 착실히 쫓는 쪽과 비슷해요. 다른 건 분포입니다. 6,671점 같은 판은 틈을 노린 쪽에서만 나오는데, 그 대신 열에 한 번쯤은 부딪힙니다.

궁금해서 위험 감수 정도만 바꿔가며 한 번 더 재봤습니다. 앞을 안 보고 틈에 들이받는 쪽은 중앙값이 1,755점, 적당히 조심하는 쪽은 1,747점으로 거의 같았습니다. 최고 기록만 7,981점 대 2,872점으로 크게 갈렸고요. 죽는 게 이득은 아니라는 뜻입니다. 부딪히면 몸이 초기화되는데 이 게임에서 몸은 점수를 뽑는 도구라서, 1.2초 멈추는 것보다 몸을 다시 키우는 10여 초가 훨씬 비쌉니다. 크게 터지는 판이 죽을 자리에 들어간 쪽에서만 나올 뿐입니다.

몇 점이면 잘한 걸까

봇 기준으로는 트인 곳으로만 다니면 1,100점대, 먹이를 착실히 쫓으면 1,900점대가 나옵니다. 좁은 틈까지 노리면 운이 따를 때 6,000점을 넘고요.

다만 봇은 매 수마다 남은 공간을 전부 계산해서 움직입니다. 사람은 그렇게 못 하니 실제로는 더 낮게 나올 겁니다. 저는 2,000점 넘기기가 쉽지 않았습니다.

해보실 때 참고하실 만한 것 몇 가지입니다.

  • 처음 10초쯤은 먹이를 먹어 몸을 키우는 게 낫습니다. 몸이 짧으면 좁은 틈 자체가 생기지 않습니다.
  • HEAT는 좁은 틈을 연달아 지나야 오릅니다. 한 번 통과하고 넓은 데로 나오면 금방 식어요.
  • 후반에 부딪히면 회복할 시간이 없습니다. 몸이 길어졌을 때가 제일 벌기 좋으면서 제일 위험합니다.

그림 없이 만들기

이 게임에는 이미지 파일이 한 장도 없습니다. 뱀도 먹이도 파티클도, 소리까지 전부 코드로 만들었고 파일 하나에 44KB입니다.

지난 편에서 “그래픽을 줄이자"를 “화면이 안 움직여도 된다"로 잘못 읽고 게임을 두 개 버렸던 터라 이번엔 신경을 썼습니다. 도형과 선만으로도 움직일 건 다 움직이더군요.


60초 스네이크 한 판 해보시고 몇 점 나왔는지 알려주세요. 혹시 제가 아직 못 막은 지름길을 찾으시면 그것도 알려주시고요. 바로 막겠습니다. 🐍

다음 편은 새 게임을 들고 오겠습니다.