세 번째 게임
퐁 도감에 이어 벽돌깨기 도감까지 만들면서 이 표가 다음 게임을 만들 때 실제로 참고가 되더라고. 그래서 스네이크도 만들고 나서 똑같이 남겨.
이번 표의 관점도 똑같아. 앞의 두 게임에는 없었던 게 뭐였나. 벽돌깨기 도감 마지막에 "이제 얇아질 줄 알았는데 일곱 줄이었다"고 적었는데 이번에도 그래. 다섯 줄이 나왔어.
스네이크에서 처음 만난 것들
| 개념 | 벽돌깨기까지 | 스네이크에서는 |
|---|---|---|
| 좌표계 | 픽셀 단위(x, y가 실수) | 격자 단위(칸 번호가 정수) — 충돌 판정이 === 비교로 단순해짐 |
| 이동 방식 | 매 프레임 속도 × dt만큼 조금씩 |
moveTimer가 dt만큼 줄어들다 0 이하일 때만 한 칸 툭 이동(틱 기반) |
| 배열 활용 | push/splice(벽돌 만들기·제거) |
unshift+pop 조합으로 "이동"과 "성장"을 한 번에 표현 |
| 방향 입력 | keys 객체에 기록 후 매 프레임 확인(패들 연속 이동) |
keydown 즉시 처리(칸 단위라 누르는 순간만 의미 있음) + 반전 방지 필터 |
| 빈 칸 찾기 | (해당 없음) | 점유된 칸을 표시해두고 빈 칸 목록에서 랜덤 선택(무한루프 예방) |
칸으로 바꾸니 충돌 판정이 짧아졌어
첫 줄이 나머지를 다 끌고 왔어. 앞의 두 게임은 공이 픽셀 위를 미끄러졌거든. 그래서 부딪혔는지 보려면 네모 두 개가 겹치는지를 좌표 네 개로 따져야 했어.
칸 단위는 그게 없어져. 뱀 머리가 3번 칸에 있고 몸통 한 마디도 3번 칸에 있으면 그냥 같은 칸인 거야. 겹친 폭을 잴 일이 없으니 비교 한 번으로 끝나.
대신 이동이 뚝뚝 끊겨. 한 칸을 반쯤 걸쳐 있을 수가 없으니까 제자리에 있다가 툭 하고 다음 칸으로 건너뛰는 식이지. 그래서 시간을 재다가 정해진 시간이 되면 한 칸 옮기는 방식으로 갈아탔어.
몸통을 늘리는 데 줄 두 개면 되더라
셋째 줄이 제일 재미있었어. 나는 뱀이 길어지는 걸 마디를 하나씩 붙이는 일이라고 생각했거든.
그런데 실제로 돌아가는 방식이 딴판이야. 머리 쪽에 새 칸을 하나 밀어 넣고, 꼬리 쪽에서 한 칸을 뺀다는 거야. 이걸 반복하면 길이는 그대로인 채 뱀이 앞으로 나아가는 것처럼 보여.
여기서 먹이를 먹었을 때만 꼬리를 안 빼. 그러면 그 순간에 몸이 한 마디 늘어나는 거지. 이동과 성장이 같은 코드로 처리되고 차이는 꼬리를 빼느냐 마느냐 하나뿐이야. 이런 게 코드로 짜인 걸 보면 참 얄미울 만큼 깔끔하더라고.
요청문 표에 또 두 줄
벽돌깨기 도감에서 이어지는 요청법 표에 이번엔 두 줄이 더 붙어. 실제로 플레이 중에 발생한 문제였지만 굳이 에러노트에 적지는 않았어.
| 하고 싶은 것 | 이렇게 요청하면 더 좋다 | 왜 |
|---|---|---|
| 방향키로 캐릭터를 조종하고 싶다 | "지금 가는 방향이랑 정반대 입력은 무시하게 해줘" | 반대로 꺾으면 머리가 자기 몸통에 바로 파고들어 즉사하는 게 스네이크류 게임의 대표적인 억울사 버그임 |
| 랜덤한 자리에 아이템을 두고 싶다 | "빈 칸 목록을 먼저 만들고 그중 하나를 뽑는 방식으로 해줘 (좌표 뽑고 맞는지 확인하는 방식 말고)" | 판이 거의 다 차면 랜덤 좌표 뽑기가 계속 실패해서 영원히 못 찾을 수 있음 |
아랫줄은 겪기 전엔 상상도 못 할 종류야. 먹이를 아무 데나 놓는 건 좌표를 하나 뽑아서 거기 뭐가 있는지 보고, 있으면 다시 뽑으면 되잖아. 판이 텅 비어 있을 땐 그래도 돼.
문제는 뱀이 길어졌을 때야. 판이 거의 다 찼는데 빈 칸을 무작위로 찾으라고 하면 계속 헛다리를 짚어. 그래서 빈 칸을 먼저 다 세어놓고 그중에서 뽑는 방식으로 뒤집었어.
이번엔 터지기 전에 막았다는 게 달라
두 줄 다 버그가 터져서 고친 게 아니야. 만들기 전에 미리 막은 거지. 벽돌깨기에서 "앞으로 뭐가 터질 것 같아?"를 물어본 게 이번엔 습관이 된 거야.
도감을 세 권 채우고 나니 표가 쌓이는 방식이 보이더라고. 게임 하나가 늘 때마다 개념 표는 대여섯 줄씩 늘고, 요청문 표는 두 줄씩 붙어. 개념은 게임마다 다르지만 요청문은 다음 게임에도 그대로 쓰이거든.
다음 기계에서도 두 줄이 붙을지는 만들어봐야 알겠지.






